Gameplay (you should now be able to lose balls):
- flipper length 170 -> 154, so the rest-position tips meet with a ~50px
gap instead of ~18px - balls dropping down the middle now drain freely
- keep the outlane guard posts so side drains stay fair (all drains now
happen through the widened centre), and verify with autoplay: centre
drains = 40, side = 0, ~10s average ball life for the bot
Audio (was a harsh machine-gun):
- completely rewrote both music loops: no more square waves or noise
hats in the music; sparse triangle bass + soft melody with rests, at
lower volume (play loop now ~47% audible windows, was a solid wall)
- softened the wall-hit thud (frequent during rallies) and the charge
ticks
The right flipper's arm was computed with the same +cos(angle) direction
as the left one, so it pointed into the right wall, off the 480px canvas
- only the left paddle was ever visible/playable.
- add physics.flipper_tip() which mirrors the right flipper (and use it
in both collision and rendering)
- derive the flipper's surface velocity from actual tip displacement
(scaled by contact radius), instead of a hand-signed angular formula
- advance flipper angles inside the collision substeps (6/frame while
pressed) so a fast sweep can't jump past a resting ball; resting balls
now get a real 'scoop' from either paddle
- verify: pixel probe shows both paddles on screen (L=1007, R=999 blue
px); physics probe confirms each paddle launches a resting ball
Native pygame-ce game with fully procedural pixel art and chiptune
audio (no asset files). Pure-logic physics module with flipper angular
momentum, plus headless autoplay/screenshot/probe dev tools.