thedivergentai/godot-turn-system
Expert blueprint for turn-based combat with turn order, action points, phase management, and timeline systems for strategy/RPG games. Covers speed-based initiative, interrupts, and simultaneous turns. Use when implementing turn-based combat OR tactical systems. Keywords turn-based, initiative, action points, phase, round, turn order, combat.
npx skills add https://github.com/thedivergentai/GD-Agentic-Skills --skill godot-turn-system
Turn order calculation, action points, phase management, and timeline systems define turn-based combat.
duplicate() or apply queue modifications after the loop.call_group(); strictly use call_group_flags(SceneTree.GROUP_CALL_DEFERRED, ...) to prevent frame spikes when notifying hundreds of units.can_perform_action(cost) before applying current_ap -= cost to prevent exploits.if phase == 0); strictly use an enum + match or a dedicated State Machine for Draw/Main/End phases.==) for AP checks; strictly use >= or is_equal_approx() for robust comparisons.AStar2D for tile grids; strictly use AStarGrid2D for 10x faster pathfinding and native diagonal handling.update() on AStarGrid2D after changing obstacle states; if you toggle set_point_solid(), the grid MUST refresh before the next query.while loops for input; strictly use the await keyword or signals to yield execution back to the Tree.is_action_pressed(); strictly use is_action_just_pressed() for discrete, frame-locked menu input.| Need | Choose | MANDATORY script |
|------|--------|----------------------|
| Discrete rounds (chess / tactics / card phases) | Round + initiative queue + AP phases | turn_system_patterns.gd |
| Continuous gauges (FF-style ATB) | Per-actor gauge fill in _process | active_time_battle.gd |
| Timeline / CTB with interrupts & prediction | Event timeline + predictive UI | timeline_turn_manager.gd |
> Do NOT invent a fourth model inline. Read the matching script before coding.
AStarGrid2D board helpers.Keep the Autoload thin. Do not paste full queue math here — implement in the script chosen above.
# turn_manager.gd (AutoLoad) — contract only
extends Node
signal turn_started(combatant: Node)
signal turn_ended(combatant: Node)
signal round_ended
signal turn_timed_out(combatant: Node) # multiplayer: server default-pass
func start_combat(participants: Array[Node]) -> void: pass
func end_turn() -> void: pass
func request_pass(combatant: Node) -> void: pass # default action on timeout
Referenced from NEVER: server owns the clock; clients never decide "pass."
turn_started, server starts a one-shot Timer / SceneTreeTimer (authoritative).request_pass(current) (or auto-end-turn), then emits turn_timed_out.func can_perform_action(cost: int) -> bool:
return current_action_points >= cost
func perform_action(cost: int) -> bool:
if not can_perform_action(cost):
return false
current_action_points -= cost
return true
Phases: prefer enum Phase { DRAW, MAIN, END } + match, or route to godot-state-machine-advanced. Full ATB / timeline math lives in the MANDATORY scripts — do not duplicate Elite snippets here.
> LLM-ignorance rule: if a general agent would not know it before reading, it lives here or in scripts/ — never delete, only move.
| Topic | Reference |
|-------|-----------|
| ATB / prediction / previews | elite-turn-patterns.md |
> Progressive disclosure: open Official Documentation links only when researching a specific API;
> load Related Skills when routing work to a peer domain — do not preload the whole lattice.
_process vs _physics_process vs pure event steps.await sequencing for multi-phase turns.Take thedivergentai/godot-turn-system 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.