Mechanic · movement · video pinball
Flipper
The player's bat in a pinball game, swung by a button to hit the ball back up the table.
On this page
A flipper swings up while its button is held and falls back when it’s released. In Pokémon Pinball a swing takes 5 frames1, and the push it gives grows with the contact’s distance from the pivot2.
- By the contact pointPokémon Pinball (1999). 5 frames a swing; the push is the contact's distance from the pivot times the swing this frame, up to 12.6 px per frame at the tip.1,2
Games
| Game | Year | How | Note |
|---|---|---|---|
| Pokémon Pinball | 1999 | By the contact point | 5 frames a swing; the push is the contact's distance from the pivot times the swing this frame, up to 12.6 px per frame at the tip |
Every claim about this mechanic, by game (2)
References
- ^ abEach flipper's position runs from 0 to 15 in 8.8 fixed point. Holding its button adds 0x0333 (3.2 positions) each frame and releasing it subtracts 0x0333, so a flipper swings fully up in 5 frames and fully down in 5 (computed). While the flippers are disabled, a held button counts as released. A flipper resting at either end records no change.Codepret/pokepinballrevised
How we know
14UpdateFlipperStates: ; 0xe118 ⋮ 20 ld hl, wKeyConfigLeftFlipper 21 call IsKeyPressed2 22 ld hl, -$0333 23 jr z, .checkLeftStateBounds 24 ld a, [wFlippersDisabled] 25 and a 26 jr nz, .checkLeftStateBounds 27 ld hl, $0333 28.checkLeftStateBounds ⋮ 30 and a ⋮ 35 cp $f ⋮
engine/pinball_game/flippers.asm lines 14–76 at 0a6f6dc · upstream ↗ Checked against the evidence by its author, an AI model, 2026-10-22.
Revised after a check by a second AI model, 2026-10-22.
- ^ abFlipper collisions come from precomputed tables. For each flipper position from last frame's to this frame's, a 48 × 32-pixel grid gives the contact's distance from the pivot and the surface normal there; the right flipper reads the left's grid mirrored. A hit bounces the ball with amplification 1, then pushes it out along the normal by
FlipperRadiusMagnitudesat that distance times 4 × the flipper's change this frame. A still flipper adds no push, and one moving down adds none either. The push at the tip of a rising flipper is 12.6 px per frame (computed); next frame's cap holds each axis to under 8.Codepret/pokepinballHow we know
202ReadFlipperCollisionAttributes: ; 0xe25a 203 ldh a, [hBallXPos + 1] 204 sub 43 ; check if ball is in horizontal range of flippers 205 ret c 206 cp 48 207 ret nc ⋮ 211 sub 123 ; check if ball is in vertical range of flippers 212 ret c 213 cp 32 214 ret nc ⋮ 218.collisionCheckLoop ⋮ 275.collision ⋮
engine/pinball_game/flippers.asm lines 202–297 at 0a6f6dc · upstream ↗ 167CheckRightFlipperCollision: ; 0xe226 168; ball is in right half of screen ⋮ 171 ld a, [hli] ; Invert the ball's x position, so that the flipper collision bytes are mirrored.
engine/pinball_game/flippers.asm lines 167–171 at 0a6f6dc · upstream ↗ 622HandleFlipperCollision: ; 0xe442 ⋮ 625 ld a, 1 ⋮ 637 ld hl, FlipperRadiusMagnitudes ⋮ 648 rl d ⋮ 650 rl d ; multiplied flipper state change by 4 651 call CalculateFlipperYForce ⋮ 660 cpl ; mirror the normal angle across the y axis ⋮ 664 ld a, 1 665 ld [wCollisionForceAmplification], a ⋮ 669 ; don't apply any y force if the ball is being forced downwards into the flipper
engine/pinball_game/flippers.asm lines 622–673 at 0a6f6dc · upstream ↗ 423CalculateFlipperYForce: ; 0xe379 424; Calculates the y force that's added to the ball's velocity when colliding with a flipper. 425; Flippers rotate around a point, and the further away from that rotation point that ball is, the 426; higher the magnitude value is (bc). This magnitude is multiplied by the flipper state change to
engine/pinball_game/flippers.asm lines 423–430 at 0a6f6dc · upstream ↗ 800; Each entry corresponds to a distance from the flipper's rotation point. 801FlipperRadiusMagnitudes: ; 0xe538 802 dw $0000 803 dw $000C ⋮ 818 dw $00F8 819 dw $00FC 820 dw $00FC 821 dw $00FC 822 dw $00FC 823 dw $00FC 824 dw $00FC 825 dw $00FC ⋮
engine/pinball_game/flippers.asm lines 800–833 at 0a6f6dc · upstream ↗ 115 ; de -= *wFlipperYForce 116 ld hl, wFlipperYForce 117 ld a, [hli] 118 ld h, [hl] 119 ld l, a 120 ld a, e 121 sub l 122 ld e, a 123 ld a, d 124 sbc h 125 ld d, a
engine/pinball_game.asm lines 115–125 at 0a6f6dc · upstream ↗ Checked against the evidence by its author, an AI model, 2026-10-25.
Checked by a second AI model, 2026-10-22.
Checked by a second AI model, 2026-10-25.
Sources
Code
- pret contributors. 2026. “pokepinball: disassembly of Pokémon Pinball.” pret. Commit 0a6f6dc. pret/pokepinball @ 0a6f6dc · licence, all uses