Use when you have a written implementation plan to execute in a separate session with review checkpoints
npx skills add pluginagentmarketplace/custom-plugin-game-developer --skill "gameplay-mechanics"
Install specific skill from multi-skill repository
# Description
|
# SKILL.md
name: gameplay-mechanics
version: "2.0.0"
description: |
Core gameplay mechanics implementation, system interactions, feedback loops,
and iterative balance refinement for engaging player experiences.
sasmp_version: "1.3.0"
bonded_agent: 01-game-designer
bond_type: PRIMARY_BOND
parameters:
- name: mechanic_type
type: string
required: false
validation:
enum: [combat, movement, puzzle, progression, economy]
- name: complexity
type: string
required: false
validation:
enum: [simple, moderate, complex]
retry_policy:
enabled: true
max_attempts: 3
backoff: exponential
observability:
log_events: [start, complete, error]
metrics: [engagement_time, action_frequency, balance_score]
Gameplay Mechanics Implementation
Core Mechanics Framework
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β ACTION β EFFECT LOOP β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€
β INPUT PROCESS OUTPUT FEEDBACK β
β βββββββ βββββββββββ βββββββββββ βββββββββββ β
β βPressβββββββββValidate ββββββββUpdate ββββββVisual β β
β βButtonβ β& Executeβ βState β βAudio β β
β βββββββ βββββββββββ βββββββββββ βHaptic β β
β βββββββββββ β
β β
β TIMING REQUIREMENTS: β
β β’ Input β Response: < 100ms (feels responsive) β
β β’ Animation start: < 50ms (feels instant) β
β β’ Audio feedback: < 20ms (in sync with action) β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
Feedback Loop Design
FEEDBACK TIMING LAYERS:
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β IMMEDIATE (0-100ms): β
β ββ Button press sound β
β ββ Animation start β
β ββ Screen shake β
β ββ Controller vibration β
β β
β SHORT-TERM (100ms-1s): β
β ββ Damage numbers appear β
β ββ Health bar updates β
β ββ Enemy reaction animation β
β ββ Particle effects β
β β
β LONG-TERM (1s+): β
β ββ XP/Score increase β
β ββ Level up notification β
β ββ Achievement unlock β
β ββ Story progression β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
Combat Mechanics
// β
Production-Ready: Combat State Machine
public class CombatStateMachine : MonoBehaviour
{
public enum CombatState { Idle, Attacking, Blocking, Recovering, Staggered }
[Header("Combat Parameters")]
[SerializeField] private float attackDamage = 10f;
[SerializeField] private float attackRange = 2f;
[SerializeField] private float attackCooldown = 0.5f;
[SerializeField] private float blockDamageReduction = 0.7f;
[SerializeField] private float staggerDuration = 0.3f;
private CombatState _currentState = CombatState.Idle;
private float _stateTimer;
public event Action<CombatState> OnStateChanged;
public event Action<float> OnDamageDealt;
public event Action<float> OnDamageTaken;
public bool TryAttack()
{
if (_currentState != CombatState.Idle) return false;
TransitionTo(CombatState.Attacking);
StartCoroutine(AttackSequence());
return true;
}
private IEnumerator AttackSequence()
{
// Wind-up phase
yield return new WaitForSeconds(0.1f);
// Active hit frame
var hits = Physics.OverlapSphere(transform.position + transform.forward, attackRange);
foreach (var hit in hits)
{
if (hit.TryGetComponent<IDamageable>(out var target))
{
target.TakeDamage(attackDamage);
OnDamageDealt?.Invoke(attackDamage);
}
}
// Recovery phase
yield return new WaitForSeconds(attackCooldown);
TransitionTo(CombatState.Idle);
}
public float TakeDamage(float damage)
{
float finalDamage = _currentState == CombatState.Blocking
? damage * (1f - blockDamageReduction)
: damage;
OnDamageTaken?.Invoke(finalDamage);
if (finalDamage > 5f) // Stagger threshold
{
TransitionTo(CombatState.Staggered);
StartCoroutine(RecoverFromStagger());
}
return finalDamage;
}
private void TransitionTo(CombatState newState)
{
_currentState = newState;
_stateTimer = 0f;
OnStateChanged?.Invoke(newState);
}
}
Resource Economy System
ECONOMY BALANCE FORMULA:
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β INCOME vs EXPENDITURE: β
β β
β Hourly Income = (Enemies/hr Γ Gold/Enemy) + PassiveIncome β
β Hourly Spend = (Upgrades + Consumables + Deaths) β
β β
β BALANCE RATIO: β
β β’ < 0.8: Too scarce (frustrating) β
β β’ 0.8-1.2: Balanced (meaningful choices) β
β β’ > 1.2: Too abundant (no tension) β
β β
β EXAMPLE STAMINA SYSTEM: β
β βββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β Max: 100 β Regen: 20/sec β On Hit: +10 β β
β βββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€ β
β β Light Attack: -10 β Heavy Attack: -25 β β
β β Dodge: -15 β Block: -5/hit β β
β β Sprint: -5/sec β Jump: -8 β β
β βββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
Progression Systems
PROGRESSION CURVE:
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β Power β
β β β
β β β±βββββ Late Game β
β β β±βββββ± (slow, goals) β
β β β±βββββ± β
β β β±βββββ± β
β β β±βββββ± Mid Game β
β β β±βββββ± (steady progress) β
β β β±ββββ± β
β ββ± Early Game (fast, hook player) β
β ββββββββββββββββββββββββββββββββββββββββββββββββββ Time β
β β
β XP CURVE FORMULA: β
β XP_needed(level) = base_xp Γ (level ^ growth_rate) β
β β’ growth_rate 1.5: Gentle curve (casual) β
β β’ growth_rate 2.0: Standard curve (balanced) β
β β’ growth_rate 2.5: Steep curve (hardcore) β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
// β
Production-Ready: Progression Manager
public class ProgressionManager : MonoBehaviour
{
[Header("Progression Config")]
[SerializeField] private int baseXP = 100;
[SerializeField] private float growthRate = 2.0f;
[SerializeField] private int maxLevel = 50;
private int _currentLevel = 1;
private int _currentXP = 0;
public event Action<int> OnLevelUp;
public event Action<int, int> OnXPGained; // current, required
public int XPForLevel(int level)
{
return Mathf.RoundToInt(baseXP * Mathf.Pow(level, growthRate));
}
public void AddXP(int amount)
{
_currentXP += amount;
int required = XPForLevel(_currentLevel);
OnXPGained?.Invoke(_currentXP, required);
while (_currentXP >= required && _currentLevel < maxLevel)
{
_currentXP -= required;
_currentLevel++;
OnLevelUp?.Invoke(_currentLevel);
required = XPForLevel(_currentLevel);
}
}
public float GetProgressToNextLevel()
{
return (float)_currentXP / XPForLevel(_currentLevel);
}
}
Movement Mechanics
PLATFORMER FEEL PARAMETERS:
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β MOVEMENT: β
β β’ Walk Speed: 5-8 units/sec β
β β’ Run Speed: 10-15 units/sec β
β β’ Acceleration: 20-50 units/secΒ² β
β β’ Deceleration: 30-60 units/secΒ² (snappier = higher) β
β β
β JUMP: β
β β’ Jump Height: 2-4 units β
β β’ Jump Duration: 0.3-0.5 sec β
β β’ Gravity: 20-40 units/secΒ² β
β β’ Fall Multiplier: 1.5-2.5x (faster fall = tighter) β
β β
β FEEL ENHANCERS: β
β β’ Coyote Time: 0.1-0.15 sec (jump after leaving edge) β
β β’ Jump Buffer: 0.1-0.15 sec (early jump input) β
β β’ Variable Jump: Release = shorter jump β
β β’ Air Control: 50-80% of ground control β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
Event-Driven Architecture
EVENT SYSTEM PATTERN:
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β ACTION EXECUTED β
β β β
β βΌ β
β βββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β EVENT DISPATCHER β β
β β DamageDealt(amount, position, type) β β
β βββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β β
β ββββ VFX System: Spawn damage numbers β
β ββββ Audio System: Play hit sound β
β ββββ UI System: Update health bar β
β ββββ Camera System: Screen shake β
β ββββ AI System: Alert nearby enemies β
β ββββ Analytics: Log combat event β
β β
β BENEFITS: β
β β’ Systems don't need direct references β
β β’ Easy to add/remove observers β
β β’ Same event triggers multiple effects β
β β’ Easy networking (replicate events) β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
Balance Iteration
RAPID BALANCE WORKFLOW:
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β 1. PLAYTEST (15-30 min) β
β β Watch players, note friction points β
β β
β 2. ANALYZE (5-15 min) β
β β What felt wrong? Too easy/hard? β
β β Check telemetry data β
β β
β 3. ADJUST (5-10 min) β
β β Change ONE variable at a time β
β β Document the change β
β β
β 4. TEST (5 min) β
β β Verify change has intended effect β
β β
β 5. REPEAT β
β β Target: 4-6 iterations per hour β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
BALANCE SPREADSHEET FORMAT:
ββββββββββββ¬βββββββββ¬ββββββββββ¬ββββββββββ¬βββββββββββ
β Weapon β Damage β Speed β Range β DPS β
ββββββββββββΌβββββββββΌββββββββββΌββββββββββΌβββββββββββ€
β Sword β 10 β 1.0/sec β 2m β 10.0 β
β Axe β 20 β 0.5/sec β 1.5m β 10.0 β
β Dagger β 5 β 2.0/sec β 1m β 10.0 β
β Spear β 12 β 0.8/sec β 3m β 9.6 β
ββββββββββββ΄βββββββββ΄ββββββββββ΄ββββββββββ΄βββββββββββ
π§ Troubleshooting
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β PROBLEM: Controls feel unresponsive β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€
β SOLUTIONS: β
β β Add immediate audio/visual feedback on input β
β β Reduce input-to-action delay (< 100ms) β
β β Add input buffering for combo actions β
β β Check for frame rate issues β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β PROBLEM: One strategy dominates all others β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€
β SOLUTIONS: β
β β Nerf dominant option OR buff alternatives β
β β Add situational counters β
β β Create rock-paper-scissors relationships β
β β Add resource costs to powerful options β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β PROBLEM: Players don't understand mechanic β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€
β SOLUTIONS: β
β β Add clearer visual/audio feedback β
β β Create safe tutorial space β
β β Use consistent visual language β
β β Add UI hints or tooltips β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β PROBLEM: Progression feels grindy β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€
β SOLUTIONS: β
β β Reduce XP requirements β
β β Add more XP sources β
β β Give meaningful rewards more frequently β
β β Add catch-up mechanics for late content β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
Mechanic Comparison
| Mechanic | Skill Floor | Skill Ceiling | Feedback Speed |
|---|---|---|---|
| Button Mash | Low | Low | Instant |
| Timing-Based | Medium | High | Instant |
| Resource Management | Medium | High | Delayed |
| Combo System | High | Very High | Instant |
| Strategic | Medium | Very High | Delayed |
Use this skill: When implementing core mechanics, balancing systems, or designing player feedback.
# Supported AI Coding Agents
This skill is compatible with the SKILL.md standard and works with all major AI coding agents:
Learn more about the SKILL.md standard and how to use these skills with your preferred AI coding agent.