Oliver's six complaints, addressed:
1. Opponent never came — a racket zombie now spawns on EVERY game you win
(if none alive); endHorde no longer double-spawns
2. No wave-cleared feeling — sweepCourt: at game end the surviving wave
collapses, every game gets a real beat (gameBeatT 1.6 / changeover 4.5),
and 'GAME N' announces the next wave when play re-arms
3. Serve-posture lockup during machine gun — root cause: any 'over' beat
expiring into setupPoint() -> pretoss during auto-fire (no movement outside
rally, no serving during horde/GUN). The over-expiry now returns auto-fire
modes to 'rally', never the serve loop
4. Forced bomb spending — specials commit ONLY on deliberate serves: flick
(or arrow-aimed keyboard serve) fires the tin, plain tap keeps it; serve
prompt teaches it ('FLICK FIRES THE BOMB - TAP KEEPS IT')
5. Auto-aim — free-aim: the flick vector maps to a landing point (length =
depth, up to 22m), zombies within zSnap 1.4 magnet the shot, otherwise the
ball lands exactly where flicked; taps keep the old auto-target assist;
flicks now also work at the toss apex
6. Zombies walking through you — option (a): touch is honest. eatenR 0.9
(brute +0.2) matches the visual sprite overlap
Phase 13 — SUDDEN DEATH interlude: court clear + un-dueled racket zombie +
about to serve -> 'Quiet, please. Play will resume.' / 'Sudden death.' One
point under REAL tennis rules (line calls live, the boss plays every ball,
spawns paused). Win (line call, double bounce, or regicide by any weapon) =
the next tin delivered on the spot; lose (out, or its return passes you) =
a game on their scoreboard + an instant 5-shambler surge. One duel per
opponent. New lines: play_resume.m4a, sudden_death.m4a.
Verified in browser: horde 'over' beat -> rally (lockup dead); game win ->
sweep + boss + beat -> SUDDEN DEATH chains naturally; duel lose path (GAME.
THEM., surge 5, scoreboard), no re-duel, fresh-boss duel, bomb regicide ->
tin on the spot; tap serve keeps stock, real touch-flick consumes + lands
at the flicked point, magnet snaps when near; eaten at 0.85m; tennis 11/12;
no console errors. PLAN.md/HANDOFF updated: plan v2 complete.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2.5 KiB
2.5 KiB
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
- Balance pass from phone playtests (Oliver tunes, nothing to build).
- Boss variety: a second duel opponent type (sprite session first, as before).
- Meta between runs: unlock/records screen beyond best-run.