Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Build a first-person shooter: move+mouse-look controller, hitscan or projectile shooting, weapons, health, and enemy AI. Use for an FPS, or tuning aim feel, time-to-kill, recoil, or spread.
.claude/skills/gamedev-skills-fps-shooter/SKILL.md| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-07 | ✗→✓ | ▲ Improved | 71% | 0% |
| case-08 | ✗→✓ | ▲ Improved | 53% | 0% |
| case-09 | ✗→✓ | ▲ Improved | 57% | 0% |
| case-21 | ✗→✓ | ▲ Improved | 27% | 0% |
| case-22 | ✓→✗ | ▼ Worse | 54% | 0% |
A playbook for first-person shooters — the look/move controller, the shooting model, weapon feel, and combat. This is a compositional skill: it wires a 3D controller, input, and AI into a shooter. It does not re-teach 3D nodes or raycasts; it defines the shooting model and the feel knobs (TTK, recoil, spread) that decide whether the guns feel good.
tactical FPS, PvE shooter, boomer-shooter.
When not to use: third-person/2D shooting → reuse the shooting model here but build the camera/controller from the relevant genre. Wave survival with towers → tower-defense. For the camera/character body itself, use godot-3d-essentials / unreal-cpp-gameplay.
Scan → acquire a target → aim and fire → confirm the kill (feedback) → reposition / reload / advance. The whole experience rests on the aim-and-fire micro-loop feeling crisp: responsive look, clear hit feedback, and a death that reads instantly.
game-ai).| Knob | Effect | Sane default | |------|--------|--------------| | Time-to-kill (TTK) | lethality, forgiveness | Tune dmg × fire-rate × HP together (refs). | | Hitscan vs projectile | aim skill type | Hitscan = flick; projectile = lead/dodge. | | Damage falloff | range limiting | Full to ~20 m, floor by ~60 m. | | Headshot multiplier | skill reward | ~1.5–2.0×. | | Recoil pattern | learnable kick | Fixed pattern > pure random. | | Spread (bloom) | suppress laser-accuracy | First shot accurate; grows while firing. | | Fire rate / magazine / reload | rhythm, downtime | Reload = vulnerability window. | | Mouse sensitivity / FOV | comfort, readability | Always expose both as options. | | Aim assist (pad) | controller parity | Magnetism/slowdown near targets. |
python# Pseudocode. Cast from the camera; first hit takes damage scaled by range + headshot. direction = apply_spread(camera.forward, current_spread) hit = raycast(camera.world_position, direction, max_dist=RANGE, mask=SHOOTABLE) if hit: dmg = base_damage * falloff(hit.distance) if hit.is_head: dmg *= HEADSHOT_MULT hit.actor.take_damage(dmg) spawn_impact_fx(hit.point, hit.normal) # decal + sound + hitmarker
python# Pseudocode. Spawn a moving body; it deals damage on its own collision. p = spawn(projectile_scene, at=muzzle.world_position) p.velocity = camera.forward * PROJECTILE_SPEED p.on_hit = lambda other, point: (other.take_damage(base_damage), explode_fx(point)) p.lifetime = RANGE / PROJECTILE_SPEED # despawn so shots don't live forever
python# Pseudocode. TTK falls out of HP, per-shot damage, and fire rate — tune as one system. shots_to_kill = ceil(target_hp / damage_per_shot) ttk_seconds = (shots_to_kill - 1) / fire_rate_per_second # first shot at t=0
dt → sensitivity changes with FPS. Look shouldbe driven by raw mouse delta; movement integration uses dt (see physics-tuning).
pattern; keep the first shot accurate.
a distinct kill confirm.
fire rate, and HP as one system (Pattern 3).
server-side; use lag compensation (refs) and defer netcode to the engine multiplayer skill.
godot-3d-essentials (Godot) or unreal-cpp-gameplay / unreal-blueprints; Unity uses unity-physics + a character controller.input-systems (or unreal-enhanced-input) for look/move, rebinding, and gamepad aim assist.godot-physics / unity-physics for raycasts and projectile collision.game-ai with unity-navmesh / unreal-behavior-trees / Godot navigation.camera-systems for FOV/recoil kick and look smoothing; game-feel for hit-stop, screen shake, and impact juice.audio-design for weapon/impact sound; shader-programming for muzzle/impact VFX.prototype-fast to validate aim feel before building content.registration/lag compensation, and enemy AI states, read references/shooting-and-feel.md.
| Case | Status | Duration (ms) | Turns | Tokens | Tool calls | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Without | With | Δ | Without | With | Δ | Without | With | Δ | Without | With | Δ | ||
case-12 | pass→pass | 11,948 | 10,353 | -13% | 1 | 1 | 0% | 2,056 | 3,428 | +67% | 0 | 0 | — |
case-01 | pass→pass | 16,550 | 16,722 | +1% | 1 | 1 | 0% | 2,972 | 4,850 | +63% | 0 | 0 | — |
case-02 | fail→fail | 21,757 | 17,233 | -21% | 1 | 1 | 0% | 3,652 | 4,828 | +32% | 0 | 0 | — |
case-03 | pass→pass | 12,910 | 11,269 | -13% | 1 | 1 | 0% | 2,570 | 3,334 | +30% | 0 | 0 | — |
case-04 | pass→pass | 14,544 | 11,709 | -19% | 1 | 1 | 0% | 2,377 | 4,068 | +71% | 0 | 0 | — |
case-05 | pass→pass | 10,115 | 7,122 | -30% | 1 | 1 | 0% | 1,834 | 2,890 | +58% | 0 | 0 | — |
case-06 | pass→pass | 17,642 | 14,614 | -17% | 1 | 1 | 0% | 2,493 | 4,014 | +61% | 0 | 0 | — |
case-07 | fail→pass | 12,562 | 11,130 | -11% | 1 | 1 | 0% | 2,153 | 3,674 | +71% | 0 | 0 | — |
case-08 | fail→pass | 14,568 | 12,308 | -16% | 1 | 1 | 0% | 2,513 | 3,838 | +53% | 0 | 0 | — |
case-09 | fail→pass | 15,707 | 13,465 | -14% | 1 | 1 | 0% | 2,297 | 3,617 | +57% | 0 | 0 | — |
case-10 | pass→pass | 14,041 | 8,735 | -38% | 1 | 1 | 0% | 2,246 | 3,008 | +34% | 0 | 0 | — |
case-11 | pass→pass | 13,450 | 8,900 | -34% | 1 | 1 | 0% | 2,371 | 3,133 | +32% | 0 | 0 | — |
case-13 | pass→pass | 13,525 | 10,090 | -25% | 1 | 1 | 0% | 2,166 | 3,198 | +48% | 0 | 0 | — |
case-14 | fail→fail | 7,315 | 4,195 | -43% | 1 | 1 | 0% | 1,069 | 2,250 | +110% | 0 | 0 | — |
case-15 | pass→pass | 16,988 | 8,513 | -50% | 1 | 1 | 0% | 2,852 | 3,561 | +25% | 0 | 0 | — |
case-16 | pass→pass | 21,742 | 23,200 | +7% | 1 | 1 | 0% | 3,219 | 5,441 | +69% | 0 | 0 | — |
case-17 | pass→pass | 17,617 | 6,612 | -62% | 1 | 1 | 0% | 2,844 | 2,775 | -2% | 0 | 0 | — |
case-18 | pass→pass | 17,037 | 18,506 | +9% | 1 | 1 | 0% | 2,803 | 4,425 | +58% | 0 | 0 | — |
case-19 | pass→pass | 16,238 | 16,180 | -0% | 1 | 1 | 0% | 2,553 | 4,457 | +75% | 0 | 0 | — |
case-20 | pass→pass | 16,817 | 12,117 | -28% | 1 | 1 | 0% | 2,643 | 3,470 | +31% | 0 | 0 | — |
case-21 | fail→pass | 16,562 | 11,076 | -33% | 1 | 1 | 0% | 2,737 | 3,481 | +27% | 0 | 0 | — |
case-22 | pass→fail | 14,927 | 12,138 | -19% | 1 | 1 | 0% | 2,314 | 3,560 | +54% | 0 | 0 | — |
case-23 | pass→pass | 13,872 | 9,986 | -28% | 1 | 1 | 0% | 2,116 | 3,183 | +50% | 0 | 0 | — |
DecimalAI ran this skill against gemini-3.6-flash twice over the same eval suite — once with the skill loaded and once without — and compared the two runs case by case. 23 cases were attempted. The headline lift of +13 percentage points is the difference between those two pass rates over the 23 comparable cases. 1 case got worse with the skill loaded, and it is included in that figure.
Without the skill loaded, the model failed this case. With it loaded, the same prompt on the same model passed. This is one improved case from the latest verified run; every case, including any that regressed, is in the table above.
Other measured skills in the registry, with their headline benchmark lift.