Encode the splatter bed too, and give the opponent his racket back

zombie-mode: 5.9 MB of 24-bit WAV down to 287 KB. Its master is 982597 frames
at 48 kHz, so loopEnd is the un-round 20.47077 — the decoder hands back
20.4787, and those 7.9 ms of AAC padding would tick once a loop. Nothing in
assets/audio/ is a multi-megabyte WAV any more.

o_run1/o_run2 had no racket in either hand. The cause was the batch prompt:
opponent_run never said "racket", and its reference sheet was built from the
racket-less frames it was replacing, so there was nothing to copy one from. It
is a ref_only batch off o_idle1 now — same man, front-facing, racket in his
right hand — with the subject spelling out that he still carries it mid-stride.
The stride reads as well as the old one did.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
wuwiandClaude Opus 5 committed 2026-08-01 10:55:18 +02:00
1 parent cf3498c049
commit cd1c7a0cd8
9 files changed
+23 -8

No files matched your search

+10 -2
View File
@@ -463,8 +463,16 @@ included, or a duck silently no-ops.
48.000 s master to a 48.0174 s buffer — 17 ms of silence spliced in at every seam, once a loop, on
the title screen. `menuMusic` passes `48`. Re-encode the file and re-measure:
`fetch(f).then(r=>r.arrayBuffer()).then(a=>new AudioContext().decodeAudioData(a)).then(b=>b.duration)`.
`zombie-mode.wav` (5.9 MB) is the other candidate for this treatment, and it loads mid-match rather
than up front, so it matters less.
`zombie-mode` got the same treatment: 5.9 MB of 24-bit WAV to 287 KB, `loopEnd` 20.47077 (982597
frames at 48 kHz — an un-round master, and the decoder returns 20.4787, so 7.9 ms of padding is
trimmed). Both beds are AAC now; nothing in `assets/audio/` is still a multi-megabyte WAV.
**The opponent was running with empty hands.** `o_run1`/`o_run2` had no racket in either fist, and
the cause was the batch prompt: `opponent_run` never said the word "racket" and its reference sheet
was built from the racket-less frames it was replacing, so the generator had nothing to copy one
from. Fixed by making it a `ref_only` batch off `o_idle1` — same man, front-facing, racket
unmistakably in his right hand — with the subject spelling out that he still carries it mid-stride.
**When a prop goes missing from a sprite, check the batch's `subject` before blaming the roll.**
Measuring which audio files actually loaded: `performance.getEntriesByType('resource')` is USELESS
here — the ~200 sprite PNGs blow past the 250-entry resource-timing buffer and every later fetch is