Rotate the playfield to portrait like a real pinball machine:
- canvas 480x360 landscape -> 360x480 portrait; playfield 308px wide,
~390px tall, with HUD, title/game-over screens and HUD re-laid out
for the narrow format (score/best top row, balls/stars/fever below)
- flippers reduced to a regular ~quarter-width size (82px) pivoting at
the lower corners, tips meeting over a wide centre drain
- table elements re-placed for the taller field: 3 star lanes up top,
candy bumpers mid-field, slingshots and floor-level outlane guard
posts at the bottom; data-checked with the autoplay bot (~350 bumper
hits / 30k frames, centre+side drains, no stuck balls)
- probes & autoplay policy updated for the portrait geometry; all 13
pixel-probes pass
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.