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>
41 lines
2.5 KiB
Markdown
41 lines
2.5 KiB
Markdown
# 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.
|