Agent skill

Godot Ability System

by jame581 in jame581/GodotPrompter

Builds a data-driven ability system in Godot 4 from Resources and a component node, with cooldowns, buffs, stat modifiers, gameplay tags and HUD binding.

MITAuto-check passedGame Development

Install Godot Ability System

skills CLI
$ npx skills add jame581/GodotPrompter --skill ability-system -a claude-code

Project install by default; add -g for ~/.claude/skills/.

GitHub CLI
$ gh skill install jame581/GodotPrompter ability-system --agent claude-code

Project scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).

Manual copy
$ git clone --depth 1 https://github.com/jame581/GodotPrompter.git skills-src && mkdir -p .claude/skills && cp -r skills-src/skills/ability-system .claude/skills/ability-system && rm -rf skills-src

Use ~/.claude/skills/ instead of .claude/skills for a personal install. The folder must contain SKILL.md.

Claude Code skills documentation · loads skills from .claude/skills/

Facts

Skill name
ability-system
GitHub stars
795
Token cost
~3k tokens
SKILL.md length
460 words
Files
4 (incl. references)
Skills in repo
58
Repo updated
First seen
Licence
MIT

At a glance

Builds a data-driven ability system in Godot 4 from Resources and a component node, with cooldowns, buffs, stat modifiers, gameplay tags and HUD binding.

  • Works in 3 steps: Architecture overview → Abilities (cost / cooldown / cast) → Buffs & debuffs (timed effects)
  • Building spells or skills with cost, cooldown and cast time in a Godot game
  • SKILL.md covers 1. Architecture overview, 2. Abilities (cost / cooldown…, 3. Buffs & debuffs (timed… and Implementation checklist
  • Instructions only: no scripts, shell commands, URLs or credentials in SKILL.md

What it does

Abilities are Resource subclasses with exported fields such as name, cost, cooldown and cast time, plus can_activate and activate methods, so designers can balance them in the editor. An AbilityComponent node on any entity holds the granted set, enforces cost and cooldown, and runs activation, announcing results through four signals: activated, failed, cooldown started and cooldown finished. Abilities are granted at runtime and triggered by name.

Effects sit on top. A StatSet resource owns named StatModifier entries for temporary or permanent stat changes, and a GameplayTagContainer node can block activation, for example with a stunned tag. Reference files cover stat modifiers, tags and conditions, and binding cooldowns and resource bars to the HUD. No third-party addon is needed, and the skill points to sibling skills for resource patterns, components, event buses, state machines and HUDs.

When your agent uses it

  • Building spells or skills with cost, cooldown and cast time in a Godot game
  • Adding buffs, debuffs and stat modifiers to characters
  • Gating abilities with gameplay tags such as stunned
  • Showing ability cooldowns on the HUD

Example prompts

  • “Add a fireball ability with a mana cost, a two-second cooldown and a cast time.”
  • “Make a slow debuff that lowers move speed for a few seconds using StatSet.”
  • “Bind the dash cooldown to a radial progress bar on the HUD.”

Requirements

  • A Godot 4.x project

Workflow steps

3 steps, taken from the step headings in SKILL.md.

  1. Architecture overview
  2. Abilities (cost / cooldown / cast)
  3. Buffs & debuffs (timed effects)

What it can do on your machine

Read from SKILL.md and the folder at commit 1e7d79d. It shows what the files ask for, not the result of running them.

  • Tool permissions

    Pre-approves nothing: there is no allowed-tools line, so your agent's usual permission prompts apply.

    From allowed-tools in the SKILL.md frontmatter.

  • Runs code

    No scripts in the folder and no shell commands in SKILL.md (its code samples are gdscript and csharp).

    From the folder's file list and the shell code blocks in SKILL.md.

  • Network

    No URLs in SKILL.md.

    From URLs in SKILL.md, links to its own repository left out.

  • Credentials

    Names no API keys, tokens, secrets or passwords.

    From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.

Context cost

Godot Ability System loads about 3k tokens when it runs, and up to ~14k if it reads all its reference files. Until then it costs about 42 tokens; SKILL.md has 460 words of instructions outside code blocks.

Always · name and description, kept in context so the agent knows when to use it
~42
When it runs · the whole SKILL.md, loaded when a task matches
~3k
With references · SKILL.md plus every file in references/, read only if the agent opens them
~14k

Estimates: characters ÷ 4, the usual rule of thumb; real counts depend on the model's tokenizer. Scripts and assets cost tokens only if the agent reads them.

Safety

Auto-check passed

The automated check found no risky patterns in SKILL.md.

Automated static check — not a guarantee. Review scripts before installing. It scans the text of SKILL.md for risky patterns (piping downloads into a shell, reading credential files, hidden Unicode, destructive commands); files beside SKILL.md are not scanned.

SKILL.md

The full file from jame581/GodotPrompter at commit 1e7d79d, republished under its MIT licence (© jame581). 460 words, ~3,035 tokens.

Download SKILL.mdSave it as .claude/skills/ability-system/SKILL.md (or your agent's skills folder). This skill also uses 3 other files; get the full folder from GitHub.
name
ability-system
description
Use when building character abilities — Resource-based abilities with cost/cooldown/cast, buffs/debuffs, stat modifiers, gameplay tags, and HUD binding

Ability System

Build a data-driven ability system from Godot-native parts: abilities are Resources, an AbilityComponent node owns and runs them, and effects/stats/tags compose on top. No third-party addon required.

Related skills: resource-pattern for the Resource data containers, component-system for the component node pattern, event-bus for cross-system ability events, state-machine for caster states (e.g. casting/stunned), hud-system for cooldown UI.


1. Architecture overview

An ability system in Godot 4.x is built from three collaborating layers:

  • Data layer — Ability (Resource): Each ability is a Resource subclass with exported fields (ability_name, cost, cooldown, cast_time) and two methods: can_activate(caster) -> bool to validate preconditions, and activate(caster) -> void to execute the effect. Storing abilities as Resources lets designers create and balance them in the Godot editor without touching code.

  • Behaviour layer — AbilityComponent (Node): A single node added to any entity that should use abilities. It holds the granted ability set, enforces cost/cooldown, and drives the Ability.activate() call. Four signals keep the rest of the game informed without coupling: ability_activated(ability), ability_failed(ability, reason), cooldown_started(ability, duration), and cooldown_finished(ability). Grant new abilities at runtime with grant(ability) and trigger them with try_activate(ability_name).

  • Effects layer — stat modifiers, buffs/debuffs, and gameplay tags: Abilities can read from and write to a caster's StatSet (a Resource that owns a dictionary of named StatModifier entries) to apply temporary or permanent stat changes. A GameplayTagContainer node (a child of the caster) gates activation — for example, a "stunned" tag can prevent any ability from firing. These three deep-dives are covered in the reference documents:

Core rule: Data in Resources, behavior in the component, communication via signals.

This separation means an Ability resource carries no Node references and can be safely duplicated, saved, and loaded as any other Godot Resource. The AbilityComponent owns runtime state (cooldown timers, active ability set), keeping Ability resources stateless and reusable across multiple casters simultaneously.


Show full SKILL.md (145 more words)Show less

2. Abilities (cost / cooldown / cast)

GDScript
gdscript
# ability.gd
class_name Ability
extends Resource

@export var ability_name: String
@export var cost: float = 0.0
@export var cooldown: float = 1.0
@export var cast_time: float = 0.0

# Override in subclasses or compose via exported effect resources.
func can_activate(caster: Node) -> bool:
    return true

func activate(caster: Node) -> void:
    pass
gdscript
# ability_component.gd
class_name AbilityComponent
extends Node

signal ability_activated(ability: Ability)
signal ability_failed(ability: Ability, reason: String)
signal cooldown_started(ability: Ability, duration: float)
signal cooldown_finished(ability: Ability)

@export var resource_pool: float = 100.0

var _granted: Dictionary = {}        # ability_name -> Ability
var _cooldowns: Dictionary = {}      # ability_name -> seconds remaining

func grant(ability: Ability) -> void:
    _granted[ability.ability_name] = ability

func _process(delta: float) -> void:
    for name in _cooldowns.keys():
        _cooldowns[name] -= delta
        if _cooldowns[name] <= 0.0:
            _cooldowns.erase(name)
            if _granted.has(name):
                cooldown_finished.emit(_granted[name])

func try_activate(ability_name: String) -> bool:
    var ability: Ability = _granted.get(ability_name)
    if ability == null:
        return false
    if _cooldowns.has(ability_name):
        ability_failed.emit(ability, "on_cooldown")
        return false
    if resource_pool < ability.cost:
        ability_failed.emit(ability, "insufficient_resource")
        return false
    if not ability.can_activate(get_parent()):
        ability_failed.emit(ability, "conditions_unmet")
        return false
    resource_pool -= ability.cost
    ability.activate(get_parent())
    _cooldowns[ability_name] = ability.cooldown
    cooldown_started.emit(ability, ability.cooldown)
    ability_activated.emit(ability)
    return true
C#
csharp
// Ability.cs
using Godot;

[GlobalClass]
public partial class Ability : Resource
{
    [Export] public string AbilityName { get; set; } = "";
    [Export] public float Cost { get; set; } = 0.0f;
    [Export] public float Cooldown { get; set; } = 1.0f;
    [Export] public float CastTime { get; set; } = 0.0f;

    public virtual bool CanActivate(Node caster) => true;
    public virtual void Activate(Node caster) { }
}
csharp
// AbilityComponent.cs
using Godot;
using System.Collections.Generic;

public partial class AbilityComponent : Node
{
    [Signal] public delegate void AbilityActivatedEventHandler(Ability ability);
    [Signal] public delegate void AbilityFailedEventHandler(Ability ability, string reason);
    [Signal] public delegate void CooldownStartedEventHandler(Ability ability, float duration);
    [Signal] public delegate void CooldownFinishedEventHandler(Ability ability);

    [Export] public float ResourcePool { get; set; } = 100.0f;

    private readonly Dictionary<string, Ability> _granted = new();
    private readonly Dictionary<string, float> _cooldowns = new();

    public void Grant(Ability ability) => _granted[ability.AbilityName] = ability;

    public override void _Process(double delta)
    {
        foreach (var name in new List<string>(_cooldowns.Keys))
        {
            _cooldowns[name] -= (float)delta;
            if (_cooldowns[name] <= 0.0f)
            {
                _cooldowns.Remove(name);
                if (_granted.TryGetValue(name, out var finished))
                    EmitSignal(SignalName.CooldownFinished, finished);
            }
        }
    }

    public bool TryActivate(string abilityName)
    {
        if (!_granted.TryGetValue(abilityName, out var ability)) return false;
        if (_cooldowns.ContainsKey(abilityName))
        {
            EmitSignal(SignalName.AbilityFailed, ability, "on_cooldown");
            return false;
        }
        if (ResourcePool < ability.Cost)
        {
            EmitSignal(SignalName.AbilityFailed, ability, "insufficient_resource");
            return false;
        }
        if (!ability.CanActivate(GetParent()))
        {
            EmitSignal(SignalName.AbilityFailed, ability, "conditions_unmet");
            return false;
        }
        ResourcePool -= ability.Cost;
        ability.Activate(GetParent());
        _cooldowns[abilityName] = ability.Cooldown;
        EmitSignal(SignalName.CooldownStarted, ability, ability.Cooldown);
        EmitSignal(SignalName.AbilityActivated, ability);
        return true;
    }
}

3. Buffs & debuffs (timed effects)

Effects are Resource subclasses — designers create them in the editor and abilities apply them. An EffectHolder node owns the runtime: it tracks elapsed time, calls periodic ticks, and removes effects when they expire.

GDScript
gdscript
# effect.gd
class_name Effect
extends Resource

@export var effect_name: String
@export var duration: float = 5.0       # seconds; <= 0 means instant
@export var tick_interval: float = 0.0  # 0 = no periodic tick

func on_apply(target: Node) -> void: pass
func on_tick(target: Node) -> void: pass
func on_expire(target: Node) -> void: pass
gdscript
# effect_holder.gd
class_name EffectHolder
extends Node

signal effect_applied(effect: Effect)
signal effect_expired(effect: Effect)

# effect -> [elapsed, tick_accum]
var _active: Dictionary = {}

func apply_effect(effect: Effect) -> void:
    effect.on_apply(get_parent())
    effect_applied.emit(effect)
    if effect.duration <= 0.0:
        effect.on_expire(get_parent())
        effect_expired.emit(effect)
        return
    _active[effect] = [0.0, 0.0]

func _process(delta: float) -> void:
    var to_remove: Array = []
    for effect in _active:
        _active[effect][0] += delta
        if effect.tick_interval > 0.0:
            _active[effect][1] += delta
            if _active[effect][1] >= effect.tick_interval:
                _active[effect][1] -= effect.tick_interval
                effect.on_tick(get_parent())
        if effect.duration > 0.0 and _active[effect][0] >= effect.duration:
            to_remove.append(effect)
    for effect in to_remove:
        _active.erase(effect)
        effect.on_expire(get_parent())
        effect_expired.emit(effect)
C#
csharp
// Effect.cs
using Godot;

[GlobalClass]
public partial class Effect : Resource
{
    [Export] public string EffectName { get; set; } = "";
    [Export] public float Duration { get; set; } = 5.0f;     // <= 0 = instant
    [Export] public float TickInterval { get; set; } = 0.0f; // 0 = no tick

    public virtual void OnApply(Node target) { }
    public virtual void OnTick(Node target) { }
    public virtual void OnExpire(Node target) { }
}
csharp
// EffectHolder.cs
using Godot;
using System.Collections.Generic;

public partial class EffectHolder : Node
{
    [Signal] public delegate void EffectAppliedEventHandler(Effect effect);
    [Signal] public delegate void EffectExpiredEventHandler(Effect effect);

    private readonly Dictionary<Effect, (float Elapsed, float TickAccum)> _active = new();

    public void ApplyEffect(Effect effect)
    {
        effect.OnApply(GetParent());
        EmitSignal(SignalName.EffectApplied, effect);
        if (effect.Duration <= 0f)
        {
            effect.OnExpire(GetParent());
            EmitSignal(SignalName.EffectExpired, effect);
            return;
        }
        _active[effect] = (0f, 0f);
    }

    public override void _Process(double delta)
    {
        var toRemove = new List<Effect>();
        foreach (var effect in new List<Effect>(_active.Keys))
        {
            var (elapsed, tickAccum) = _active[effect];
            elapsed += (float)delta;
            if (effect.TickInterval > 0f)
            {
                tickAccum += (float)delta;
                if (tickAccum >= effect.TickInterval)
                {
                    tickAccum -= effect.TickInterval;
                    effect.OnTick(GetParent());
                }
            }
            if (effect.Duration > 0f && elapsed >= effect.Duration)
                toRemove.Add(effect);
            else
                _active[effect] = (elapsed, tickAccum); // still active — write back updated elapsed and tick accumulator
        }
        foreach (var effect in toRemove)
        {
            _active.Remove(effect);
            effect.OnExpire(GetParent());
            EmitSignal(SignalName.EffectExpired, effect);
        }
    }
}

Footgun: Never iterate _active directly while removing entries. GDScript builds a to_remove list and erases after the loop; C# iterates new List<Effect>(_active.Keys) for the same reason.


Implementation checklist

  • Abilities are Resources; behavior lives in AbilityComponent, not in the data.
  • Activation validates cost, cooldown, and can_activate() before spending resources.
  • Cooldowns tick in _process/_Process and emit start/finish signals.
  • Buffs/debuffs apply → tick → expire and emit signals; durations refresh or stack by source.
  • Stat modifiers recompute deterministically (ADD → MULTIPLY → OVERRIDE) and clamp.
  • Ability gating uses the gameplay-tag container; immunities block effects.
  • HUD binds to component signals — no per-frame polling of cooldown state.

© jame581, MIT. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file

Files

SKILL.md and 3 other files (references) in skills/ability-system of jame581/GodotPrompter.

  • SKILL.md
  • references/stat-modifiers.md
  • references/tags-and-conditions.md
  • references/ui-binding.md

Open the folder on GitHubat commit 1e7d79d

Compare with similar skills

Godot Ability System next to the 5 skills that share the most tags, products or categories with it. Stars are the repository's; “used in” counts other GitHub owners with a copy.

Godot Ability System compared with similar skills
SkillStarsUsed inTokensAuto-checkLicenceRepo updated
Godot Ability System this skilljame581/GodotPrompter795—~3kAutomated safety check: PassMIT
Godot Gdscript Patterns925236118/AlphaAgent10310 repos~5kAutomated safety check: PassMIT
Godot 3D World Buildingthedivergentai/GD-Agentic-Skills809—~3.3kAutomated safety check: PassLGPL-3.0
Godot Compositionthedivergentai/GD-Agentic-Skills809—~3.7kAutomated safety check: PassLGPL-3.0
Input MapperRandallLiuXin/GodotMaker5491 repos~727Automated safety check: PassCustom licence
Godot Game Loop Harvestthedivergentai/GD-Agentic-Skills809—~2.6kAutomated safety check: PassLGPL-3.0

Similar skills

  • Godot Gdscript Patterns

    925236118/AlphaAgent

    Master Godot 4 GDScript patterns including signals, scenes, state machines, and optimization.

    103 GitHub starsUsed in 10 repos~5k tokens
    Game DevelopmentAuto-check passed
  • Godot 3D World Building

    thedivergentai/GD-Agentic-Skills

    Expert patterns for 3D level design using GridMap with MeshLibrary, CSG constructive solid geometry, occlusion, and runtime GridMap builders.

    809 GitHub stars~3.3k tokensUpdated 29 days ago
    Game DevelopmentAuto-check passed
  • Godot Composition

    thedivergentai/GD-Agentic-Skills

    Expert architectural standards for building scalable Godot GAMES (RPGs, Platformers, Shooters) using the Composition pattern (Entity-Component).

    809 GitHub stars~3.7k tokensUpdated 29 days ago
    Game DevelopmentAuto-check passed
  • Input Mapper

    RandallLiuXin/GodotMaker

    Manage Godot input action mappings in project.godot. An agent skill from RandallLiuXin/GodotMaker.

    549 GitHub starsUsed in 1 repo~727 tokens
    Game DevelopmentAuto-check passed
  • Godot Game Loop Harvest

    thedivergentai/GD-Agentic-Skills

    Data-driven resource harvesting (mining, logging, foraging) for Godot 4: applyhit tool/tier validation via HarvestToolData enums, HarvestResourceData yields, harvestablenode shake/deplete…

    809 GitHub stars~2.6k tokensUpdated 29 days ago
    Game DevelopmentAuto-check passed
  • Godot Genre Platformer

    thedivergentai/GD-Agentic-Skills

    Expert blueprint for platformer games including precision movement (coyote time, jump buffering, variable jump height), game feel polish (squash/stretch, particle trails, camera shake), level design…

    809 GitHub stars~3.5k tokensUpdated 29 days ago
    Game DevelopmentAuto-check passed

More from jame581/GodotPrompter

All 58 skills in this repo
  • Godot 2D Essentials

    jame581/GodotPrompter

    Covers Godot 4.3+ 2D systems with GDScript and C# examples: canvas layers, draw order, TileMaps, parallax, lights and shadows, particles and custom drawing.

    795 GitHub stars~2.3k tokensUpdated yesterday
    Auto-check passed
  • Godot 3D Essentials

    jame581/GodotPrompter

    Covers Godot 4.3+ 3D systems such as materials, lighting, shadows, environment, global illumination, fog, LOD, occlusion culling and decals, with GDScript first and C# second.

    795 GitHub stars~3.7k tokensUpdated yesterday
    Auto-check passed
  • Godot Addon Development

    jame581/GodotPrompter

    Covers Godot 4.3+ editor plugins: plugin folders, @tool scripts, the EditorPlugin lifecycle, custom inspectors, dock panels and gizmos, in GDScript and C#.

    795 GitHub stars~3.3k tokensUpdated yesterday
    Auto-check passed
  • Godot AI Navigation

    jame581/GodotPrompter

    Covers pathfinding and enemy movement in Godot 4.3 and later: navigation regions, NavigationAgent nodes, steering, behavior trees and patrol routes.

    795 GitHub stars~3.5k tokensUpdated yesterday
    Auto-check passed
  • Godot Animation System

    jame581/GodotPrompter

    Covers animation in Godot 4.3 and later: AnimationPlayer basics, AnimationTree blend trees and state machines, sprite animation, skeleton IK and code-driven motion.

    795 GitHub stars~3.8k tokensUpdated yesterday
    Auto-check passed
  • Godot Assets Pipeline

    jame581/GodotPrompter

    Explains how Godot 4.3 and later imports assets: image compression modes, 3D scenes, audio and resource formats, and import settings, with GDScript and C# examples.

    795 GitHub stars~3.6k tokensUpdated yesterday
    Auto-check passed

Works with

Questions about Godot Ability System

What does Godot Ability System do?

Builds a data-driven ability system in Godot 4 from Resources and a component node, with cooldowns, buffs, stat modifiers, gameplay tags and HUD binding. Abilities are Resource subclasses with exported fields such as name, cost, cooldown and cast time, plus can_activate and activate methods, so designers can balance them in the editor. An AbilityComponent node on any entity holds the granted set, enforces cost and cooldown, and runs activation, announcing results through four signals: activated, failed, cooldown started and cooldown finished.

When should I use Godot Ability System?

Godot Ability System fits situations like: building spells or skills with cost, cooldown and cast time in a Godot game; adding buffs, debuffs and stat modifiers to characters; gating abilities with gameplay tags such as stunned; showing ability cooldowns on the HUD.

How do I install Godot Ability System in Claude Code?

Run `npx skills add jame581/GodotPrompter --skill ability-system -a claude-code`. Or copy the skill folder (skills/ability-system in jame581/GodotPrompter) into .claude/skills/ability-system in your project. Claude Code loads it when a task matches its description.

How do I install Godot Ability System in Codex?

Run `npx skills add jame581/GodotPrompter --skill ability-system -a codex`. Or copy the skill folder (skills/ability-system in jame581/GodotPrompter) into .agents/skills/ability-system in your project. Codex loads it when a task matches its description.

Can I use Godot Ability System in Cursor, Gemini CLI or GitHub Copilot?

Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add jame581/GodotPrompter --skill ability-system -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/ability-system, .gemini/skills/ability-system, .github/skills/ability-system and .opencode/skills/ability-system in your project.

What does Godot Ability System need to run?

SKILL.md names no scripts, command-line tools or credentials: Godot Ability System is instructions for the agent only. Our summary lists: A Godot 4.x project.

Does Godot Ability System access the network?

SKILL.md contains no URLs. Any network use would come from the scripts or tools the agent runs. This is read from the text; nothing was executed.

Is Godot Ability System safe to install?

Our automated static check of SKILL.md found no risky patterns, such as piping downloads into a shell, reading credential files or hidden Unicode. It is not a guarantee. Review the folder before installing.

What licence does Godot Ability System use?

Godot Ability System is published under the MIT licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.

How many tokens does Godot Ability System use?

About 3k tokens (SKILL.md is roughly 12k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full. Its references folder adds about 11k tokens, read only when the agent opens those files.

What are the alternatives to Godot Ability System?

Skills that share tags, products or a category with Godot Ability System: Godot Gdscript Patterns (925236118/AlphaAgent, 103 stars), Godot 3D World Building (thedivergentai/GD-Agentic-Skills, 809 stars), Godot Composition (thedivergentai/GD-Agentic-Skills, 809 stars) and Input Mapper (RandallLiuXin/GodotMaker, 549 stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.

Who maintains Godot Ability System?

jame581 (a GitHub user) maintains it in jame581/GodotPrompter, which has 795 GitHub stars. The repository holds 58 skills in this directory. The repository was last updated on October 6, 2026.

Source: jame581/GodotPrompter on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.