3d7e66449a2b1f127388a85c065c4ce3b64b1a5a
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>
Languages
JavaScript
75.2%
Python
15.8%
HTML
7.3%
Shell
1.4%
Swift
0.2%