The staff learn your habits, the walk-on waits for your tap, and the club opens a practice court

Four answers to one phone report:
- THE READ: repeat a lane and the opponent anticipates it; break the habit
  and it is wrong-footed for that ball — scaled by rung, so surprise is the
  weapon that opens the ladder past the HEAD COACH (TUNE block THE READ).
- The opponent walk-on is a real modal now (head, punchline, tap to dismiss)
  in arcade, tournament and training — readable without a clock.
- THE TRAINING COURT: third card under ZOMBIE TENNIS, pick any rung, one
  game at a time, the felled body walks straight back on, nothing banks,
  bleeding out is a popup instead of a death. mode_train.png rolled in the
  banner style.
- MOVEMENT READS: sprinting feet kick per-court dust and fast bodies leave
  a two-ghost speed streak (trailMin gates both; feel verdict pending).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
wuwiandClaude Fable 5 committed 2026-08-28 16:08:18 +02:00
1 parent a42dc6fc81
commit 43784c5b33
9 files changed
+360 -43

No files matched your search

+65
View File
@@ -491,6 +491,71 @@ zombie (now an occasional opponent, `TUNE.racketEvery`, not the every-game fixtu
`RETURNED`, `DOUBLE KILL`) is a footnote to something you already watched happen. Sharing the loud
FACE with the milestone cards is right; sharing their SIZE made every footnote read as a milestone.
## Session log: THE READ, the walk-on modal, the training court, movement reads (2026-08-28)
Four items from one phone report. PHONE VERDICT PENDING on all of them.
### 1. THE READ — the twist for the post-COACH wall
Oliver: past the HEAD COACH *"the opponents are very fast and barely make mistakes any more — we
need a twist, maybe a kind of cognitive fatigue when you make the same move ten times and then
surprise them."* Built as HABITUATION, his own idea with the numbers made playable:
- **doHit buckets every aimed player rally shot into three lanes** (target x at ±1.1) and keeps a
same-lane run on `G.match.laneRun`. `TUNE.readHabit` (3) same-lane shots = the habit is learned.
- **One more of the same lane is `expected`**: the opponent's `aiRead` climbs toward
`TUNE.readAnticipate` (0.97) — spam feeds the machine, so the late ladder punishes one-note play.
- **Breaking the habit is `surprised`, for that one flight**: the read collapses (`surpRead`), the
chase speed drops (`surpSlow`, applied inside `rzChaseSpeed` so the intercept planner and the
early-fall test believe it too), and `surpFlub` lands on top of a whiff rate the champion had
reduced to almost nothing. A "WRONG-FOOTED." flash announces it (rungs past ~20% only).
- **Everything scales with the rung** (`learnK`, (opp−1)/(LADDER−1)): the shambler never learns,
the champion — "HE RETURNS EVERYTHING" — is exactly the one you beat by setting a habit and
breaking it on the big point. Solo match only (netplay's opponent is a human), rally lanes only
(serves keep their own game — open: should serve placement feed the same book?). The one-ball
states are cleared at the racket and at every point end (`matchReady`); a fresh walk-on resets
the book. Tests pin the state machine (real swings through `keyPressed`) and the dial
relationships (a wrong-footed champion runs slower than the head coach at full stride).
### 2. THE WALK-ON IS A MODAL (tournament + arcade + training)
Oliver: *"die Intros der einzelnen Spieler bitte als richtiges Modal, das man wegtappen muss —
man kann dann wirklich lesen was da steht, und schnell wegklicken wenn man es schon 100x gelesen
hat."* `matchOpponent` now calls `showModal` (head icon `z_<fam>head`, the punchline, the cup's
round line) instead of the timed 4 s card. The walk-on court is guaranteed-calm (the mop beat has
just ended), so the popup policy allows it; the freeze holds the 1.6 s intro bar until the tap.
The mode-rules popup fires BEFORE `matchOpponent` in `startMatch` so it lands first and the
opponent queues behind it. Netplay untouched (no walk-on there at all). The test harness's
`passMopBeat` now taps the walk-on away like a player would.
### 3. THE TRAINING COURT (`MODES` id `train`, third kid of ZOMBIE TENNIS)
Oliver: *"ein Trainingsbereich — Auswahl des Gegners, ein Spiel, tap to replay, bis man keine
Lust mehr hat."* One flag (`d.train`, set by `startMatch(false, null, rung)`) on the whole match
machinery:
- SERVE UP routes to a picker screen (`#train`, built from the roster like the boss picker, the
same `z_*head` crops the draw uses); tapping a rung IS the start — tap-advances, like every
other screen. `mode_train.png` rolled in the banner style (golden-hour practice court, ball
basket, cones, no text) via the famroll OpenRouter route.
- The rung is PARKED: `d.opp` never advances, a felled body walks back on as itself, and the
walk-on modal (item 2) is the "tap to replay" gate for free. Between reps the blood resets
silently (no WOUNDS TREATED ceremony — a popup per rep is the tap-tax the mode avoids).
- NOTHING BANKS: no `G.runGames`, no `endRun` (pagehide guarded), and bleeding out is a modal
("IT BLED YOU OUT") plus a fresh pool, never the death screen. The quit chip is the exit.
- The board's progress slot reads `TRAINING · <SHORT>`; the setup footer says "NOTHING AT STAKE".
### 4. MOVEMENT READS — dust and speed ghosts (feel-tunable, verdict pending)
Oliver: *"die Bewegung der Spieler optisch anreichern — motion blur / particles / shader, hier
bin ich auf deinen Input angewiesen."* Two cheap effects in the existing registers, no shaders:
- **Sprint dust**: feet crossing `TUNE.trailMin` (3.6 m/s — above every shamble) kick one
per-court `dustPuff` per `runDustEvery` metres. racketAI's chase and the player's mover
(auto-run, horde steer) both emit; the mover measures its travel AFTER the clamps so a body
pinned at a bound reads as standing.
- **Speed ghosts**: `drawZombie`/`drawChar` draw two alpha ghosts sampled back along the body's
own velocity (`trailK` s × 1 and 2) — the modal masthead's speed-streak trick applied to
bodies. Only genuine sprints qualify; never during a named frame (`showFrame` — a collapsing
corpse must not smear on stale velocity). racketAI now records `vz` beside `vx`; the player's
`P.vx/vz` are written by the mover and zeroed outside it.
Both are panel-tunable (`trailMin` 0 kills both). Not tried, on the shelf if these fail the
phone: a one-frame lean/skid sprite on hard direction changes (needs drawn frames, per the
draw-frames rule), and court-colored skid streaks on the ground behind a hard stop.
## Session log: THE LOB (BUILT, THEN CUT) AND TWO THINGS THE MULTIPLAYER TEST FOUND (2026-08-22, same day)
### THE LOB WAS BUILT AND REMOVED THE SAME DAY — and the reason is the useful part