da9cca2f23c89d751b2d77d5bbd2a04364985de7
The mg racket is gone, not moved. It was a procedural racket drawn over a sprite that already holds one: straight up-court it projected onto the player's back as a floating oval, and offset to the side it just stuck out. The laser's far edge was pinned to the middle of the ad strip two commits ago and nothing appeared to change, twice. The geometry was always right -- each wedge layer faded to alpha 0 along its length, so the beam went invisible before it reached its own far corners and the VISIBLE end sat well short of the pinned one. The far stop is lit now, so the two are the same line. Verified by recomputing the projection: far corners at y 113.8, the ads' middle, against 110.2 unpinned. It also falls off with distance now, brightest at the strings and thinning down the court -- but never to zero, which is the trap above. Fixes a third instance of the empties-under-the-iterator bug: a rocket blast can bank the last kill of a game, and the duel or chapter boss that follows clears pellets[] mid-loop. shots, pellets, extras and the body loop all carry the guard. Also records that two consecutive render() calls do not produce the same frame -- render mutates camera smoothing as a side effect -- so frame-diffing to find where something was drawn measures the camera drift instead. It claimed the beam reached 16 px above where its own geometry could go. 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%