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
-1
@@ -388,9 +388,19 @@ function buildCrowd() {
|
||||
// while the crowd is on its feet, which is the "slightly increase during applause" — a stand that
|
||||
// went white during a point would be a different, much louder feature.
|
||||
const flashes = []; // {x, y, r, t0}
|
||||
let flashNext = 0;
|
||||
let flashNext = 0, flashLast = 0;
|
||||
function tickFlashes(standsBottom) {
|
||||
const now = G.idleT, top = Math.max(4, standsBottom - AD_H - 4);
|
||||
// THE CLOCK CAN GO BACKWARDS AND THIS STATE CANNOT. `resetState` puts G.idleT back to 0 for every
|
||||
// new run, while `flashes` and `flashNext` live in this module and survive it — so a fresh match
|
||||
// inherited a `flashNext` from the last one (no photographs at all until the clock climbed back
|
||||
// past it) and any flash still alive was left with a t0 in its future, which makes its fade
|
||||
// `1 - (now - t0)/life` permanently greater than 1: a shutter frozen at full brightness in the
|
||||
// stand, for ever. Oliver, 2026-08-21: "at a random place in the crowd some frozen midflash circle
|
||||
// is visible. after a few points the flashes unfreeze". One guard, here, because this is the only
|
||||
// place that owns the state — and it covers any future mode that rewinds the clock too.
|
||||
if (now < flashLast) { flashes.length = 0; flashNext = now; }
|
||||
flashLast = now;
|
||||
if (now >= flashNext) {
|
||||
// THE BIGGER THE MOMENT, THE MORE SHUTTERS. cheer() queues crowd.burst shutters proportional to
|
||||
// its own vol, and they fire back to back at a fifth of the normal gap — a match point empties
|
||||
|
||||
Reference in new issue
Block a user