# PLAN — all phases shipped (v2 complete, 2026-07-12) Phases 1–13 are implemented, verified, and deployed. See git log for the per-phase record and HANDOFF.md for the current system map. This file now only records what was DECIDED, so nobody re-litigates it. ## The shape of the game (as shipped) - **The scoreboard is the progression.** Waves = games (spawn director scales with G.runGames), 6 games = a set = a horde, odd games end in changeovers, deliveries follow the new-balls rule. Permadeath: eaten = run over, best run persisted. - **Game-end theater**: at every game end the surviving wave collapses (sweepCourt), a real beat plays (gameBeatT / changeoverT), and 'GAME N' announces the next wave. - **An opponent, always**: every game you win spawns a racket zombie if none is alive. With the court clear and an un-dueled opponent waiting, the umpire restores order: SUDDEN DEATH — one point under real tennis line calls. Win = the next tin on the spot; lose = a game on their scoreboard + a 5-shambler surge. One duel per opponent. - **Weapon ladder** (deliveries cycle): BOMB → TRIPLE → FIRE → GUN. One tin at a time. Specials fire ONLY on deliberate serves: flick = aim + commit, tap = keep the stock. - **Free-aim**: a flick maps to a landing point (length = depth, zSnap magnetism); taps keep the auto-target assist. - **Roster**: runner (set 1 game 3+, shriek, solo), brute (set 2, hp 2, pushback-proof), shield zombie (set 3, chair blocks front, stagger = kill window). Touch is honest: eatenR 0.9 sprite-overlap = eaten. ## Feedback-round decisions (Oliver, 2026-07-12) - Zombies pass-through: resolved as (a) — touch HURTS (radius honest), not avoidance. - Interlude frequency: currently every game won (fresh opponent each game). If it overstays its welcome, gate it to every 2nd opponent — one-line change in the trigger (gameplay.js, `dueled`). - Multi-ball stays "one proper serve per fan" (triple serve), never rapid-fire. ## Tuning surface (T panel) All pacing knobs are in config.js TUNE — spawn director (zSpawnEvery/Min/Step, zMax, zMaxCap), beats (changeoverT, gameBeatT), deliveries (ballChangeFirst/Every), roster (runnerSpeed, bruteHp, shieldDown), aim (zSnap), stakes (eatenR). ## If a next arc happens, candidates in rough order of value 1. Balance pass from phone playtests (Oliver tunes, nothing to build). 2. Boss variety: a second duel opponent type (sprite session first, as before). 3. Meta between runs: unlock/records screen beyond best-run.