Feedback round: fire actually spreads, brutes lurch, crowd stops flickering

- Fire never spread in play. The flame ball's full pierce wiped its own lane, so
  the bodies that would have caught were already gone. It now ignites everything
  it FLIES PAST (TUNE.burnBallR), with a wider ignition and spread radius. One
  flame serve into a scattered 10-wave kills 9, nine burning at once.
- Wounded brutes slid along like decals: every wound stage is a single frame and
  the brute now spends most of its life wounded. They get a procedural lumber
  instead of eight more sprites — translate + squash, no rotation, so the pixels
  stay on the grid, and the amplitudes scale with the projection or the whole
  thing goes sub-pixel at range.
- The "scoreboard flicker" was the crowd: the cheer bounce was per-column
  Math.random() every frame, i.e. TV static, showing through the scoreboard art's
  transparent ornate edges. Now a smooth per-column sine on idleT.
- Ball boys: mopping is the default in splatter mode now, and the boy is half
  again as tall — at 1.2m he read as a distant speck. The running fetch-boy
  survives for tennis, where there is nothing on the grass but a ball.
- Changeover 7s -> 5s, with the mop crossing timed to fill it.
- Save-to-homescreen: a bloody tennis ball, wired up as apple-touch-icon +
  favicon + webmanifest. The Dockerfile now ships the manifest and gives it its
  own MIME type via an exact-match location (a bare `types {}` block would have
  replaced nginx's whole map and broken .js and .png with it).

Benchmarks re-run: CPU returns 67/72 serves (93.1%, above the 11/12 bar — a
20/24 sample in between was flub noise), 30 human-tapped points = 50 hits /
0 whiffs.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
wuwiandClaude Opus 5 committed 2026-07-27 05:58:18 +03:00
1 parent a09a5d7559
commit ff77922e85
14 files changed
+92 -19

No files matched your search

+20 -2
View File
@@ -134,8 +134,26 @@ New foundations you must know before touching anything:
0 whiffs** — but you MUST set `T.TUNE.autoAssist = 1.15` first, the Browser pane reports
`pointer: fine` so the assist is off and every ball reads as "never reachable".
- Brute is 5 hp: worst-case (max ramp) it still needs 22.5s to cross, vs ~7s of serves to kill.
- `TUNE.burnSpread` 1.3 m chains reliably through shoulder-to-shoulder shamblers (~1.0 m apart);
at 1.2 m spacing the tail of a line can survive. It is a T-panel knob if Oliver wants it hotter.
## Feedback round on the polish (2026-07-27, same day)
- **Fire never spread in real play.** The flame ball has full pierce and instant-kill, so it wiped
its own lane and left nobody to catch. Fixed by `TUNE.burnBallR` — the ball ignites everything it
FLIES PAST, every frame, whether or not it hits — plus wider `burnIgniteR` 4.5 / `burnSpread` 2.2.
One flame serve into a realistic scattered 10-wave now kills 9, with 9 burning at once.
**When testing fire, fire a real ARC**: a flat ball from z=16 hits the net at y≈0.83 (netH 0.914)
and bounces back at you — the first "fire is broken" reading was my test hitting the tape.
- **Wounded brutes need their own animation.** Every wound stage is a single frame and the brute
now spends most of its life wounded, so it slid along like a decal. Rather than 8 more sprites
they get a procedural lumber in `drawZombie` (translate + squash, no rotation, so pixels stay on
the grid). Amplitudes MUST scale with `p.s` — at a fixed fraction the whole lurch was sub-pixel
at range and read as nothing moving.
- **The scoreboard "flicker" was the crowd.** The cheer bounce was `-Math.random()*2` per column
per frame, i.e. TV static, showing through the scoreboard art's transparent ornate edges. Now a
smooth per-column sine on `idleT`. Test for it: render twice WITHOUT stepping — identical pixels
means nothing in the draw path is rolling dice per frame.
- Ball boys: `sendBoy`'s `mop` now DEFAULTS to `G.mode === 'splatter'`. The running fetch-boy still
exists, but only in tennis mode where there is nothing on the grass but a ball. `BOY_H` 1.2 → 1.5.
- `TUNE.burnSpread` is a T-panel knob if Oliver wants fire hotter still.
## Gotchas learned the hard way
- Browser-pane verification: python http.server sends no cache headers, so edited ES