A new run rewinds the clock; the camera flashes did not rewind with it
Oliver: "I start a new zombie tennis match. when playing and scoring no fotograph flashes appear, but at a random place in the crowd some frozen midflash circle is visible. after a few points the flashes unfreeze." Both halves are the same cause. resetState() puts G.idleT back to 0 for every new run, while the flash list and its "next at" live in render.js's own closure and survive it. So the new run inherited a flashNext from the old one — no photographs at all until the clock climbed back past it — and any flash still in flight was left with a t0 in its own future, which makes its fade 1 - (now - t0)/life permanently greater than 1: a shutter stuck at full brightness in the stand until something else cleared it. tickFlashes now notices the clock moving backwards and clears and re-arms. One guard, in the only place that owns the state, so it covers any future mode that rewinds the clock as well. Verified on the canvas: after a rewind there is no permanently-bright pixel in the stand, and the photographers resume within seconds instead of staying dark. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
1 parent
ca3e72d0a9
commit
3d7e66449a
3 files changed
+23
-2
No files matched your search
+11
@@ -3732,6 +3732,17 @@ scaled so the BODY matches the standing frame (98% of sprite height) and the rac
|
||||
this on any new pose with a raised prop.
|
||||
|
||||
## Gotchas learned the hard way
|
||||
|
||||
- **MODULE-LEVEL STATE CLOCKED OFF `G.idleT` MUST SURVIVE THE CLOCK GOING BACK TO ZERO.**
|
||||
`resetState()` rewinds `G.idleT` for every new run; anything living in a module's own closure does
|
||||
not rewind with it. The camera flashes had both halves of that bug at once (2026-08-21): a
|
||||
`flashNext` inherited from the previous run meant NO photographs until the new run's clock climbed
|
||||
past it, and any flash still in flight was left with a `t0` in its own future, which makes
|
||||
`1 - (now - t0)/life` permanently greater than 1 — a shutter frozen at full brightness in the
|
||||
stand for the rest of the session. Oliver: "at a random place in the crowd some frozen midflash
|
||||
circle is visible. after a few points the flashes unfreeze." `tickFlashes` now clears and re-arms
|
||||
whenever the clock moves backwards. **If you add anything else with a remembered `t0` or a "next
|
||||
at" in render.js, give it the same guard** — the reset path will not do it for you.
|
||||
- **Nothing outside the four slot accessors may know how many slots there are.** `endBurst` had
|
||||
`[0, 1, 2, 3, 4].find(i => slotId(i) === id)`, which was correct for exactly as long as the rack
|
||||
held five. `RACK_MAX` 4 → 9 and a burst weapon in slot 5..9 was suddenly unfindable, so it was
|
||||
|
||||
Reference in new issue
Block a user