thedivergentai/godot-genre-rts
Expert blueprint for real-time strategy games including unit selection (drag box, shift-add), command systems (move, attack, gather), pathfinding (NavigationAgent2D with RVO avoidance), fog of war (SubViewport mask shader), resource economy (gather/build loop), and AI opponents (behavior trees, utility AI). Use for base-building RTS or tactical combat games. Trigger keywords: RTS, unit_selection, command_system, fog_of_war, pathfinding_RVO, resource_economy, command_queue.
npx skills add https://github.com/thedivergentai/GD-Agentic-Skills --skill godot-genre-rts
Expert blueprint for RTS games balancing strategy, micromanagement, and performance.
NavigationObstacle._process() on hundreds of individual units; strictly use a central UnitManager or _physics_process only when required.WorkerThreadPool and stagger path updates.Array[Command] and implement a "Force Move/Attack" bypass.is_equal_approx() for deterministic triggers.RefCounted or Resource objects for deterministic serialization and netcode.Dictionary or JSON states for save-game and multiplayer playback.MeshInstance3D nodes; strictly use MultiMeshInstance with INSTANCE_CUSTOM data to drive unique GPU-side state animations (walking/attacking/color).WorkerThreadPool to push buffers to RenderingServer.multimesh_set_buffer().CSGShape3D for building placement ghosts; strictly use optimized static ArrayMesh geometry.> MANDATORY: Read the script for the workflow you are implementing — do not re-inline selection/fog recipes in the agent body.
duplicate_deep() isolation for unit Resources.| Phase | Skills | Purpose |
|-------|--------|---------|
| 1. Controls | godot-input-handling, godot-camera-systems | Selection box, camera pan/zoom/edge-scroll |
| 2. Units | godot-navigation-pathfinding, godot-state-machine-advanced | Pathfinding, RVO avoidance, Idle/Move/Attack |
| 3. Systems | godot-shaders-basics, godot-tilemap-mastery, godot-economy-system | Fog masks / TileMap fog, gather-spend ledger |
| 4. AI | godot-ai-navigation, godot-autoload-architecture | Enemy commander routing + army/economy Autoloads |
| 5. Polish | godot-ui-containers, godot-particles | Strategic UI chrome, battle feedback |
| 6. Balance | godot-monte-carlo-balancer | Build-order policies vs extracted AI orders |
| Active units (order of magnitude) | Simulation / pathing | Rendering | Load |
|-----------------------------------|----------------------|-----------|------|
| < ~80 | Per-unit NavigationAgent2D/3D + RVO; set_velocity → velocity_computed | MeshInstance / Sprite nodes OK | MANDATORY rts_unit.gd, crowd_navigation_unit.gd |
| ~80–400 | Stagger path queries; RVO only while moving; static → NavigationObstacle; central commander | Still node visuals; pool path queries | + rts_path_query_pool.gd, rts_army_manager.gd, Batch 09 COM formation |
| > ~400 / thousands | Server sim: logical transforms on WorkerThreadPool; few NavigationServer map queries (COM / squads), not one agent per soldier | MultiMeshInstance + INSTANCE_CUSTOM; push buffers off main thread | rts_army_manager.gd + MultiMesh path in Batch 09; Do NOT Load per-unit _process agents |
Rule: Keep NavigationAgent+RVO while units need individual collision avoidance and micromanage feel. Switch to MultiMesh + server-side transforms when draw-call/node cost dominates — path as squads, not as thousands of agents.
MANDATORY: selection_manager_marquee_2d.gd (2D) or selection_manager_raycast_3d.gd (3D). Maintain a typed selection set (not SceneTree-only) for netcode/save. Overlay: rts_selection_overlay.gd.
MANDATORY: rts_unit.gd for Idle/Move/Attack/Hold + NavigationAgent. Deep state graphs → godot-state-machine-advanced. Always duplicate_deep() shared stat Resources (rts_unit_stat_duplicator.gd).
Avoid clumping on one click target: compute center of mass, apply relative offsets, issue per-unit destinations. For hundreds of units, use one NavigationServer path for the COM (Batch 09) plus rts_group_commander.gd / rts_path_query_pool.gd.
MANDATORY for tile/grid fog: fog_of_war_tile_mask.gd. SubViewport mask + shader overlay is valid for soft vision — implement via docs (Using Viewports) + godot-shaders-basics; Do NOT paste long fog shaders into this skill body when the tile-mask script covers the grid path.
Shift-click chains: store Array of serializable commands; pop on finish; draw queued path lines. Pair with selection scripts' issue-command hooks.
ResourceNode → work timer → DropoffPoint → bank update. Wire bank through global_economy_manager.gd / godot-economy-system.
set_velocity + move on velocity_computed; stagger group path queries._process.NavigationAgent* RVO requires set_velocity() + velocity_computed for the actual move.UnitManager / rts_army_manager.gd for 100+ units.Units, Buildings, Resources for selection filters.For large selections, one NavigationServer path from COM → target, then offset each unit (see decision tree). Keep the algorithm in project code or formation helpers; pair with rts_path_query_pool.gd so path objects are pooled.
# Sketch only — prefer pooled queries from rts_path_query_pool.gd
static func move_group_to_target(units: Array, target: Vector3, map_rid: RID) -> void:
if units.is_empty():
return
var com := Vector3.ZERO
for u in units:
com += u.global_position
com /= units.size()
var path: PackedVector3Array = NavigationServer3D.map_get_path(map_rid, com, target, true)
if path.is_empty():
return
var dest: Vector3 = path[path.size() - 1]
for u in units:
u.set_movement_target(dest + (u.global_position - com))
Pre-allocate instance_count, drive visible_instance_count, push transforms (optionally via WorkerThreadPool → RenderingServer.multimesh_set_buffer). No per-soldier MeshInstance3D. See Official Documentation → Using MultiMesh.
Prefer fog_of_war_tile_mask.gd. SubViewport vision masks: docs + godot-shaders-basics (do not duplicate long shader bodies here).
> MANDATORY for depth beyond decision trees and script catalog: rts-mass-army-deep.md. Do NOT Load on first-pass wiring — use bundled scripts/ first.
> 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.
set_velocity / velocity_computed RVO loop that stops crowd jitter and stuck IDLE timeouts.NavigationPathQueryParameters* patterns for mass move orders without heap churn.MeshInstance per soldier.WorkerThreadPool contracts for army AI batches off the main thread.duplicate(true) so health/armor never mutate a shared template.Take thedivergentai/godot-genre-rts 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.