Widen centre drain gap; calm the music down

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
This commit is contained in:
georgios
2026-09-09 16:51:56 +02:00
parent 973dd870fd
commit 996918ff8c
15 changed files with 73 additions and 45 deletions
+5 -4
View File
@@ -17,7 +17,7 @@ MAX_SPEED = 13.0 # speed cap (prevents tunneling; ~300px of rise)
RESTITUTION = 0.42
BALL_R = 7.0
FLIP_LEN = 170.0
FLIP_LEN = 154.0
FLIP_REST = math.radians(6.0) # tips slightly lowered toward center drain
FLIP_UP = -math.radians(52.0) # fired position
FLIP_PIVOT_L = (62.0, 338.0)
@@ -36,10 +36,11 @@ BUMPERS = [
SLING_KICK_L = (0.60, -0.80)
SLING_KICK_R = (-0.60, -0.80)
SLINGS = [
# upper slingshots by the lower bumpers - kick toward table center
# upper slingshots just below the two outer bumpers - kick toward centre
dict(pos=(150.0, 282.0), r=11.0, kick=SLING_KICK_L),
dict(pos=(330.0, 282.0), r=11.0, kick=SLING_KICK_R),
# guard posts at the outlane mouths - protect the corners
# guard posts at the outlane mouths: wall-huggers get bounced back into
# play instead of silently draining - the centre gap is the real risk
dict(pos=(44.0, 314.0), r=12.0, kick=(0.80, -0.60)),
dict(pos=(436.0, 314.0), r=12.0, kick=(-0.80, -0.60)),
]
@@ -137,7 +138,7 @@ class Table:
for b in BUMPERS]
self.slings = [
dict(x=s["pos"][0], y=s["pos"][1], r=s["r"], cool=0, flash=0,
kick=s["kick"], guard=(i >= 2))
kick=s["kick"])
for i, s in enumerate(SLINGS)]
self.stars = [dict(x=x, y=y, r=13.0, lit=False, cool=0, pulse=0)
for x, y in STARS]