game-ai — Claude Code skill: what it does, how to install
Designs NPC decision-making, behavior trees, steering forces, and A* pathfinding. Useful when building game enemy logic across engines.
npx skills add gamedev-skills/awesome-gamedev-agent-skills --skill game-ai -a claude-codeWhat game-ai does
The skill organizes NPC logic into three decoupled layers: decision-making, pathfinding, and steering. Instead of piling up conditional statements, it separates what an entity decides to do from how it navigates the map and moves between waypoints.
Included patterns cover object-oriented finite state machines, composite behavior tree nodes (Sequence and Selector), and steering forces like seek and arrive. For grid and graph navigation, it details admissible A* heuristics for 4-direction and 8-direction grids. The workflow warns against computing paths every frame, showing how to cache waypoints so frame rates stay stable.
This skill delivers engine-neutral algorithms rather than concrete navmesh baking. For engine-specific agent APIs in Unity, Unreal Engine, or Godot, pair it with the corresponding platform guides.
What it helps with
- separate NPC decision logic from movement steering
- build a behavior tree with Sequence and Selector nodes
- implement A* pathfinding using Manhattan or octile heuristics
- smooth out movement forces with seek and arrive steering
Example prompts for the agent
- Design an FSM for an enemy patrol and chase routine without nesting boolean flags.
- Write a behavior tree in GDScript with a selector that checks line of sight before chasing.
- Show the octile heuristic function for A* grid pathfinding with diagonal steps.
How to install game-ai
1Skills CLI (Vercel)
npx skills add gamedev-skills/awesome-gamedev-agent-skills --skill game-ai -a claude-code2Manually: put the files in place
~/.claude/skills/game-ai/SKILL.mdCopy the whole skill folder; for one project use .claude/skills/game-ai/
1Skills CLI (Vercel)
npx skills add gamedev-skills/awesome-gamedev-agent-skills --skill game-ai -a codex2Manually: put the files in place
.agents/skills/game-ai/SKILL.mdFor all projects use ~/.agents/skills/
1Skills CLI (Vercel)
npx skills add gamedev-skills/awesome-gamedev-agent-skills --skill game-ai -a cursor2Manually: put the files in place
.cursor/skills/game-ai/SKILL.mdCursor also reads .agents/skills/ and .claude/skills/
1GitHub CLI
gh skill install gamedev-skills/awesome-gamedev-agent-skills game-ai2Manually: put the files in place
.github/skills/game-ai/SKILL.md1Skills CLI (Vercel)
npx skills add gamedev-skills/awesome-gamedev-agent-skills --skill game-ai -a gemini-cli2Platform CLI
gemini skills install https://github.com/gamedev-skills/awesome-gamedev-agent-skills --path skills/disciplines/game-aiManually: put the files in place
.devin/skills/game-ai/SKILL.mdThe legacy .windsurf/skills/ path still works
Skills CLI (Vercel)
npx skills add gamedev-skills/awesome-gamedev-agent-skills --skill game-ai -a opencodeClaude.ai
Zip the folder and upload it in Settings → Capabilities → Skills
From the same set40
The whole set →Similar
Questions about game-ai
How do I install game-ai in Claude Code?
Run npx skills add gamedev-skills/awesome-gamedev-agent-skills --skill game-ai -a claude-code in your terminal.
What does the game-ai skill do?
It provides patterns for enemy decision-making, behavior trees, local steering forces, and optimal A* pathfinding.
When should you not use this skill?
It does not handle engine-specific navmesh baking, collision physics tuning, or tower defense wave spawning.
Source text
SKILL.md · Apache-2.0
---
name: game-ai
description: >
Design NPC and enemy decision-making with finite state machines, behavior
trees, steering behaviors, and A* pathfinding — engine-neutral algorithms
that pair with the detected engine's navigation API. Use when building enemy
AI, an FSM or behavior tree, steering/flocking, or pathfinding, or when the
user mentions state machine, behavior tree, blackboard, A*, navmesh, seek, or
patrol/chase.
---
# Game AI: decisions, steering, and pathfinding
Build believable NPC behavior from three separable layers: **decide** (what to
do), **steer** (how to move there), and **path** (how to route around the map).
Keep them decoupled — a behavior tree picks a target, the pathfinder produces
waypoints, steering follows them. This skill teaches the engine-neutral
algorithms; bind them to your engine via the related skills below.
## When to use
- Use when implementing enemy/NPC logic: patrols, chase/flee, guard states,
group movement, or "find a path to the player".
- Use to choose between an **FSM** (few clear states), a **behavior tree** (many
reactive behaviors with priorities), or **steering** (smooth local movement).
- Use when integrating pathfinding: A* on a grid/graph, or driving an engine
navmesh agent.
**When *not* to use:** for the engine's concrete navmesh/agent API and baking,
use `unity-navmesh`, `unreal-behavior-trees`, or Godot's `NavigationAgent2D/3D`
(see that engine skill). For movement/collision feel, use `physics-tuning`. For
spawning waves along lanes, see the `tower-defense` genre skill.
## Core workflow
1. **Pick the decision model by complexity.** 2–5 states with obvious
transitions → FSM. Many behaviors, priorities, interruption, reuse → behavior
tree. Continuous "how strongly do I want each option" → utility scoring.
2. **Separate decision from motion.** The decision layer outputs an *intent*
(target position, action). Steering or pathfinding turns intent into motion.
3. **Path on the right graph.** Grid tiles, waypoint graph, or a baked navmesh.
Fewer nodes = faster A*. Prefer the engine's navmesh for 3D; A* on a grid for
tile games.
4. **Steer along the path**, not straight to the goal — follow the next waypoint,
advancing when close, so agents round corners.
5. **Recompute paths sparingly.** Pathfind on a timer or when the goal moves a
tile, not every frame. Cache the path; only the waypoint index advances.
6. **Verify by observation.** Watch the agent: does it reach the goal, get stuck
on corners, oscillate between states? Draw the path and current state on
screen while tuning.
## Patterns
### 1. Finite state machine (one state object, explicit transitions)
```gdscript
# Godot 4.7, one class per file.
# state.gd: each state is a small object with enter/update/exit.
class_name State extends RefCounted
func enter(_agent) -> void: pass
func update(_agent, _dt: float) -> State: return null # return a state to transition
func exit(_agent) -> void: pass
# chase.gd: returns Patrol when the player escapes sight range.
class_name Chase extends State
func update(agent, dt: float) -> State:
if not agent.can_see(agent.target):
return Patrol.new() # transition by returning the next state
agent.move_toward(agent.target.position, dt)
return null # null = stay in this state
# enemy.gd: the agent owns `current` and ticks it once per frame.
var current: State = Patrol.new() # call current.enter(self) in _ready()
func tick(dt: float) -> void:
var next := current.update(self, dt)
if next != null:
current.exit(self)
next.enter(self)
current = next
```
Keep transition logic *inside* states (or in a table), never as a growing pile
of `if` flags. One state owns one behavior; that is what keeps an FSM readable.
### 2. Behavior tree tick (composite nodes return a status)
```gdscript
# A node's tick() returns SUCCESS, FAILURE, or RUNNING (still working this frame).
enum Status { SUCCESS, FAILURE, RUNNING }
# Sequence: run children in order; stop at the first non-SUCCESS (logical AND).
func sequence_tick(children, agent, dt) -> int:
for child in children:
var s = child.tick(agent, dt)
if s != Status.SUCCESS:
return s # FAILURE or RUNNING short-circuits the sequence
return Status.SUCCESS
# Selector: try children until one succeeds or is RUNNING (logical OR / fallback).
func selector_tick(children, agent, dt) -> int:
for child in children:
var s = child.tick(agent, dt)
if s != Status.FAILURE:
return s # SUCCESS or RUNNING stops the search
return Status.FAILURE
```
A guard AI reads top-down: `Selector[ Sequence[CanSeePlayer?, Chase], Patrol ]`
— chase if visible, otherwise patrol. See `references/behavior-trees.md` for
leaf nodes, decorators (Inverter, Cooldown), and a blackboard.
### 3. Steering: seek and arrive (smooth, frame-rate independent)
```gdscript
# Seek: accelerate toward a target at full speed. Steering = desired - current.
func seek(pos, vel, target, max_speed, max_force) -> Vector2:
var desired = (target - pos).normalized() * max_speed
return (desired - vel).limit_length(max_force) # a force, not a teleport
# Arrive: like seek, but ramp speed down inside slow_radius so it stops cleanly.
func arrive(pos, vel, target, max_speed, max_force, slow_radius) -> Vector2:
var offset = target - pos
var dist = offset.length()
if dist < 0.001: return (-vel).limit_length(max_force) # already there: brake
var ramped = max_speed * min(dist / slow_radius, 1.0)
var desired = offset / dist * ramped
return (desired - vel).limit_length(max_force)
# Per frame: vel += steering * dt; pos += vel * dt (always scale by dt)
```
### 4. A* heuristic must not overestimate (or paths stop being shortest)
```python
# Match the heuristic to the movement. An ADMISSIBLE heuristic (never larger
# than the true remaining cost) keeps A* optimal.
def heuristic(a, b): # a, b are (x, y) grid cells
dx, dy = abs(a[0] - b[0]), abs(a[1] - b[1])
# return dx + dy # Manhattan: 4-direction grids (no diagonals)
return (dx + dy) + (1.414 - 2) * min(dx, dy) # octile: 8-direction grids
# f(n) = g(n) + h(n): g = cost from start, h = heuristic to goal.
# Overestimating h is faster but no longer guarantees the shortest path.
```
The full A* loop (priority queue, `came_from` reconstruction, grid + waypoint
graphs) is in `references/pathfinding.md`.
## Pitfalls
- **Pathfinding every frame** tanks the frame rate. Recompute on a timer or only
when the target moves to a new tile; follow the cached waypoints in between.
- **Steering straight to the goal** instead of to the next waypoint makes agents
hug walls and corners. Follow the path; advance the waypoint when within radius.
- **Inadmissible A\* heuristic** (e.g. Euclidean distance scaled up, or Manhattan
on a diagonal grid) returns fast but *non-shortest* paths. Pick the heuristic
that matches your allowed moves.
- **Behavior tree leaves that never return RUNNING** for multi-frame actions
(walking, playing an animation) cause the tree to restart the action every
tick. Return RUNNING until the action completes.
- **FSM transition spaghetti**: scattering `if state == ...` checks everywhere
recreates the mess an FSM exists to prevent. Keep transitions in the state.
- **No line-of-sight or stuck check** → agents grind into walls forever. Add a
timeout that forces a repath or a state change.
## References
- `references/pathfinding.md` — complete A* (priority queue, reconstruction),
grid vs waypoint graphs, when to defer to an engine navmesh.
- `references/behavior-trees.md` — node taxonomy, leaf/decorator implementations,
blackboard, and FSM-vs-BT selection.
## Related skills
- `ai-behavior-trees-utility-ai` — deeper behavior-tree and utility-AI design.
- `unity-navmesh`, `unreal-behavior-trees` — concrete engine AI/navigation APIs.
- `physics-tuning` — movement, collision response, and agent radius.
- `procedural-gen` — generating the graph/level the AI navigates.
- `tower-defense`, `fps-shooter` — genres that compose this skill.
© gamedev-skills · Apache-2.0 · gamedev-skills/awesome-gamedev-agent-skills