On this page
  1. Related
  2. Games
  3. References
  4. Sources

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

GameYearHowNote
Pokémon Pinball1999By the contact point5 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

  1. ^ 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.

    In the claim ledger

  2. ^ 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 FlipperRadiusMagnitudes at 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/pokepinball
    How 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.

    In the claim ledger

Sources

Code