gamedev-skills/rpg
> and combat. Use for an RPG/JRPG, or designing stat, inventory, quest, or combat systems.
npx skills add https://github.com/gamedev-skills/awesome-gamedev-agent-skills --skill rpg
A playbook for role-playing games — stats and progression, inventory/equipment, quests,
dialogue, and combat. This is a compositional skill: it ties data-driven content,
dialogue, and saving together. It does not re-teach those primitives; it defines the systems
that make growth and choice feel meaningful, and points to the skills that implement each.
inventory, quests, dialogue, and persistent progress.
quest state machine.
When *not* to use: permadeath dungeon runs with no persistent character → roguelike.
Pure conversation/branching story → visual-novel. Open-world needs/crafting/base-building →
survival-crafting. For the dialogue engine itself, use dialogue-systems.
**Explore → encounter (fight / talk / solve) → earn rewards (XP, loot, story) → grow
(level up, gear up, unlock) → take on harder content.** The fantasy is *getting stronger and
shaping who your character is*; every system should feed that growth-and-choice loop.
| Knob | Effect | Notes |
|------|--------|-------|
| XP curve shape | pacing of power | Fast early, slow late (see refs). |
| Stat→derived scaling | build diversity | One attribute shouldn't dominate. |
| Damage formula | tactical feel | Subtractive vs. ratio mitigation (refs). |
| Random variance / crit | swinginess | ±10% and ~1.5× crit are safe defaults. |
| Drop rates / economy | reward cadence | Avoid trivializing shops with loot. |
| Power gating | difficulty gating | Level/region/quest locks. |
| Reversible modifiers | buff/gear correctness | Layer mods; never edit base stats. |
| Choice consequence | role-play weight | Quest/dialogue flags should branch outcomes. |
# Pseudocode. Base attributes are the only "truth"; combat stats are derived each time.
def derive(base, mods):
s = apply_modifiers(base, mods) # base + flat adds + percent, then clamp
return {
"max_hp": 20 + s["VIT"] * 8,
"attack": s["STR"] * 2,
"defense": s["VIT"] + s["AGI"] * 0.5,
}
# Equipping pushes a modifier; unequipping pops it. HP/attack recompute automatically.
# Pseudocode. Quadratic curve: fast early levels, long late ones.
def xp_to_next(level, base=100): return base * level * level
def gain_xp(actor, amount):
actor.xp += amount
while actor.xp >= xp_to_next(actor.level):
actor.xp -= xp_to_next(actor.level)
actor.level += 1
actor.base["STR"] += 2; actor.base["VIT"] += 2 # grant gains / skill points
on_level_up(actor) # heal, unlock, notify
# Pseudocode. Game events advance matching objectives; completion grants rewards.
def on_event(kind, data):
for q in active_quests:
for obj in q.objectives:
if obj.event == kind and matches(obj, data) and not obj.done:
obj.count += 1
if obj.count >= obj.needed: obj.done = True
if all(o.done for o in q.objectives):
q.state = "complete" # turn-in grants xp/gold/items
modifier layer; push/pop it (Pattern 1).
formula at huge values. Pick a curve and a formula family deliberately (refs).
data (godot-resources / unity-scriptableobjects).
version and amigration path from day one (see save-systems).
Set flags that actually change later quests/world state.
just completion.
dialogue-systems (Yarn Spinner / Ink) — branching lines, conditions, variables.save-systems — character, inventory, quest flags, world state, versioning.godot-resources / unity-scriptableobjects — items, enemies, quests, skills as assets.game-ai for enemy behavior; for turn order reuse the scheduler idea in roguelike.game-ui-ux for HUD/menu layout, resolution scaling, and controller/keyboard nav; godot-ui-control for the concrete inventory, quest log, character sheet, and dialogue box.level-design plus your engine's tilemap/3D skill (godot-tilemap, godot-3d-essentials).data shapes, and the quest state model, read references/stats-combat-quests.md.
Take gamedev-skills/rpg from the repository into ~/.claude/skills for personal
use, or into .claude/skills inside a project.
The agent identifies a skill by the name field in its header. Two skills with the
same name cannot sit side by side — one of them will be ignored.