Files
splatter-tennis/PLAN.md
T
wuwiandClaude Fable 5 2f1419b1f2 Feedback round + Phase 13: the duel, free-aim, honest stakes
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>
2026-07-12 11:50:18 +02:00

41 lines
2.5 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 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.