All skills
thedivergentai avatar

/godot-rpg-stats

@9d6e91e

Expert blueprint for RPG stat systems (attributes, leveling, modifiers, damage formulas) using Resource-based stats, stackable modifiers, and derived stat calculations. Use when implementing character progression OR equipment/buff systems. Keywords stats, attributes, leveling, modifiers, CharacterStats, derived stats, damage calculation, XP.

Use this Skill: https://skilld.dev/gh/thedivergentai/gd-agentic-skills/godot-rpg-stats

This session only. Nothing lands on disk.

SKILL.md

β‰ˆ90 tokens always: the name and description. β‰ˆ3k when used: this file. β‰ˆ1.4k more on demand in 2 files.

Available Scripts

MANDATORY by scenario β€” read before implementing:

base_stats_resource.gd

Core data container for base attributes (Str, Dex, Int) and derived scaling rules.

status_effect_data.gd

Serialized buff/debuff definition using StatusEffectData.Type { ADDITIVE, MULTIPLICATIVE, OVERRIDE }.

stats_component_reactive.gd

Orchestrator for JIT (Just-In-Time) stat calculation with active modifier stacking.

exp_progression_resource.gd

Data-driven level-up curve definition using growth factors and base XP.

dynamic_stat_label_sync.gd

Reactive UI hook for syncing Labels to stat changes without polling.

damage_formula_handler.gd

Centralized RefCounted utility for complex combat math and damage calculations.

stat_modifier_stacking.gd

Logic for handling unique vs. stackable buffs and refreshing durations.

resource_stat_inheritance.gd

Pattern for extending base stats with specialized attributes (Elemental Resists).

persistent_character_stats.gd

Managing the serialization of character progression to .tres files.

level_up_system.gd

Logic for awarding experience and triggering level-up benefits.

rpg_stat_resource.gd

Capped base stat Resource with setter clamps + stat_changed signal.

derived_stat_resource.gd

Derived stat that recalculates when base stat dependencies change.

equipment_tooltip_helper.gd

BBCode equipment comparison tooltips (_make_custom_tooltip).

NEVER Do in RPG Stats

  • NEVER use integers for percentages β€” Always use float (0.0–1.0 or 0.0–100.0) to avoid truncation.
  • NEVER modify current_health without emitting signals β€” UI desyncs without broadcasts.
  • NEVER rely solely on additive modifiers β€” Use multiplicative or hybrid scaling for long progressions.
  • NEVER add modifiers without a unique ID or Key β€” Required to remove specific effects.
  • NEVER use exponential XP formulas without a growth cap β€” Uncapped pow() overflows or soft-locks levels.
  • NEVER forget to clamp derived values β€” Negative vitality must not yield negative max HP (maxi(val, 1)).
  • NEVER perform heavy stat recalculations in _process() β€” Recalc only on modifier/base change (reactive).
  • NEVER hardcode stat names in logic β€” Use StringNames or enums.
  • NEVER store temporary runtime buffs in a permanent Save Resource β€” Strip short-duration modifiers before serialize.
  • NEVER calculate damage directly in the Character script β€” Centralize in damage_formula_handler.gd.
  • NEVER invent Dictionary-only modifier APIs in examples β€” Align with StatusEffectData.Type and the stacking scripts.

Decision Tree

Layer Responsibility Script
Resource template Designer-authored base attributes, curves, inheritance base_stats_resource.gd, exp_progression_resource.gd, resource_stat_inheritance.gd
Runtime StatsComponent Duplicate/instance template, apply/remove modifiers, emit signals, JIT derived stats MANDATORY stats_component_reactive.gd + stat_modifier_stacking.gd
StatusEffectData Typed buff rows (ADDITIVE / MULTIPLICATIVE / OVERRIDE) status_effect_data.gd
DamageFormula (RefCounted) Pure combat math shared by Player/NPC MANDATORY damage_formula_handler.gd
Persistence Save progression; strip runtime buffs first persistent_character_stats.gd
UI sync Labels listen to signals β€” no polling dynamic_stat_label_sync.gd

Do not paste beginner class_name Stats / Dictionary equipment tutorials β€” route to the scripts above.


API alignment (StatusEffectData)

# Author buffs as Resources β€” not ad-hoc Dictionary modifiers
var haste := StatusEffectData.new()
haste.name = "Haste"
haste.type = StatusEffectData.Type.MULTIPLICATIVE
haste.attribute = "speed"
haste.value = 1.25
haste.duration = 8.0

var flat_str := StatusEffectData.new()
flat_str.type = StatusEffectData.Type.ADDITIVE
flat_str.attribute = "strength"
flat_str.value = 5.0

var break_def := StatusEffectData.new()
break_def.type = StatusEffectData.Type.OVERRIDE
break_def.attribute = "defense"
break_def.value = 0.0

Stacking / refresh / unique-vs-stackable behavior: MANDATORY stat_modifier_stacking.gd. Apply through stats_component_reactive.gd so derived stats recalc once per change.


Elite reminders (script-backed)

  1. Caps β€” rpg_stat_resource.gd; clamp on setters; never allow overflow attributes.
  2. Dependency graphs β€” derived_stat_resource.gd; derived stats recalc from signals when bases change β€” never _process.
  3. Equipment β€” Register/remove modifier IDs on equip/unequip via stacking API; tooltips via equipment_tooltip_helper.gd.

Deep dive (load on demand)

Equipment hooks, damage formula, skill gates, elite cap/derived/tooltip patterns β€” references/elite-stat-patterns.md.

Reference

Progressive disclosure: open Official Documentation links only when researching a specific API; load Related Skills when routing to a peer domain β€” do not preload the whole lattice.

Official Documentation

  • Resources β€” why base stats, curves, and status effects belong on Resource templates you duplicate or instance per character.
  • Resource β€” duplicate(), resource_local_to_scene, and shared-vs-unique semantics that prevent every enemy sharing one HP Resource.
  • GDScript exported properties β€” @export / @export_group so designers tune attributes and scaling in the Inspector without code edits.
  • Using signals β€” stat_changed / stats_recalculated so UI and derived stats react without _process polling.
  • Saving games β€” serialize progression Resources and strip runtime-only buffs before write.
  • File paths in Godot projects β€” user:// vs res:// for persistent character .tres saves.
  • ResourceSaver β€” write character stats Resources to disk after level-ups.
  • ResourceLoader β€” exists / load paths when restoring progression on boot.
  • RefCounted β€” keep damage formulas and pure combat math off the scene tree.
  • Random number generation β€” seeded crit / variance rolls that stay reproducible in balance tests.
  • Label β€” bind text to signal-driven attribute refresh for HUD sync.
  • SceneTree β€” create_timer for timed buff expiry without a per-effect Node.

Related Skills

Prerequisites
Complements
Downstream / consumers
Master
  • godot-master β€” library router and mirrored module entry for cross-skill discovery.

Source: SKILL.md on GitHub

1 warning16d5 checks Β· Risk SAFE
  • Gen Agent Trust Hub16d

    The skill provides a robust and secure framework for implementing RPG stat systems in Godot. It utilizes Godot Resources for data management, signals for reactive UI updates, and standard 'user://' paths for data persistence, adhering to game development best practices without introducing security vulnerabilities.

  • Socket16d

    No alerts

  • Snyk16d

    Risk: LOW Β· No issues

  • Runlayer7mo

    3/3 files flagged

  • ZeroLeaks5mo

    Score: 93/100 Β· 2 sections analyzed

Signed by skilld at 9d6e91e. This ties the file your Agent reads to that commit on GitHub. It does not review the instructions.

Last checked against GitHub 3 weeks ago.

Activeupdated 2 months ago

README badge

README badge for thedivergentai/gd-agentic-skills/godot-rpg-stats