Mechanic · health & lives · video pinball
Ball saver
A rule that returns a drained pinball to play instead of losing it, usually for a short time after the ball starts.
On this page
A ball saver gives back a ball that drains soon after it starts. In Pokémon Pinball each new ball gets 20 seconds and two saves1, and Catch ‘Em mode adds a 60-second saver without a limit2.
- TimedPokémon Pinball (1999). 20 seconds at each new ball, two saves; 60 seconds without limit during Catch 'Em mode.1,2
Games
| Game | Year | How | Note |
|---|---|---|---|
| Pokémon Pinball | 1999 | Timed | 20 seconds at each new ball, two saves; 60 seconds without limit during Catch 'Em mode |
Every claim about this mechanic, by game (1)
References
- ^ abEach table starts with a 20-second ball saver, and every ball lost for good starts a new one. While it runs, a drained ball is saved: the first save leaves the timer alone, and the second cuts it to 1 second and 1 frame. The timer counts down 60 frames a second, and not while the ball is at x 154 or more. Set to 20 seconds, it lasts 1,259 frames, about 21 seconds, if the ball stays left of x 154 throughout (computed). The slot cave can award 30, 60, or 90 seconds instead.Codepret/pokepinballrevised
How we know
1Start20SecondSaverTimer: ; 0xdbba ⋮ 6 ld a, 59 7 ld [wBallSaverTimerFrames], a 8 ld a, 20 9 ld [wBallSaverTimerSeconds], a 10 ld a, $2 11 ld [wNumTimesBallSavedTextWillDisplay], a
engine/pinball_game/ball_saver/ball_saver_20.asm lines 1–12 at 0a6f6dc · upstream ↗ 1HandleBallLossRedField: ; 0xdd76 2 ld a, [wBallSaverTimerFrames] 3 ld hl, wBallSaverTimerSeconds 4 or [hl] 5 jr z, .youLose 6 ld a, [wNumTimesBallSavedTextWillDisplay] 7 bit 7, a 8 jr nz, .skip_save_text 9 dec a 10 ld [wNumTimesBallSavedTextWillDisplay], a ⋮ 15 jr nz, .skip_save_text 16 ld a, $1 ⋮
engine/pinball_game/ball_loss/ball_loss_red_field.asm lines 1–31 at 0a6f6dc · upstream ↗ 54UpdateBallSaverState: ; 0x146a9 55 ld a, [wBallSaverTimerFrames] 56 ld hl, wBallSaverTimerSeconds 57 or [hl] ;skip if timer ran out 58 ret z 59 ld a, [wBallXPos + 1] 60 cp 154 ;if high? Byte of ball X pos is >= 154, don't update timers 61 jr nc, .SkipSecondsOrFramesUpdate 62 ld a, [wBallSaverTimerFrames] 63 dec a 64 ld [wBallSaverTimerFrames], a 65 bit 7, a ⋮
engine/pinball_game/object_collision/red_stage_resolve_collision.asm lines 53–75 at 0a6f6dc · upstream ↗ 43 callba Start20SecondSaverTimerengine/pinball_game/stage_init/init_red_field.asm line 43 at 0a6f6dc · upstream ↗ 161SlotRewards_CallTable: ; 0xeeca 162 dw Start30SecondSaverTimer 163 dw Start60SecondSaverTimer 164 dw Start90SecondSaverTimer
engine/pinball_game/slot.asm lines 161–164 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.
- ^ abEvery Pokémon gets the same 2 minutes to be caught: all 151 entries of
CatchEmTimerDataare 0 seconds and 2 minutes. Starting the mode also starts a 60-second ball saver that saves without limit, and the saver from before is restored when the mode ends.Codepret/pokepinballrevisedHow we know
1CatchEmTimerData: ; 0x12a22 2; Each 2-byte entry represents the total time you have to catch a Pokemon. 3; They're all exactly 2 minutes, 0 seconds, but they can be changed to make 4; different pokemon have different times, in order to add difficulty. 5; First byte = seconds value 6; Second byte = minutes value 7 db $00, $02 ; BULBASAUR ⋮ 157 db $00, $02 ; MEW
data/catchem_timer_values.asm lines 1–157 at 0a6f6dc · upstream ↗ 123 ld hl, CatchEmTimerData ;contains how long each mon stays on screen, all are 2 minutes by default ⋮ 129 callba StartTimer 130 callba InitBallSaverForCatchEmMode
engine/pinball_game/catchem_mode.asm lines 118–131 at 0a6f6dc · upstream ↗ 1InitBallSaverForCatchEmMode: ; 0xdbd4 ⋮ 10 ld a, $ff ⋮ 14 ld a, 60 15 ld [wBallSaverTimerSeconds], a 16 ld a, $ff 17 ld [wNumTimesBallSavedTextWillDisplay], a 18 ret ⋮ 20RestoreBallSaverAfterCatchEmMode: ; 0xdc00 ⋮ 24 ld [wBallSaverTimerSeconds], a ⋮ 26 ld [wNumTimesBallSavedTextWillDisplay], a
engine/pinball_game/ball_saver/ball_saver_catchem_mode.asm lines 1–32 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.
Sources
Code
- pret contributors. 2026. “pokepinball: disassembly of Pokémon Pinball.” pret. Commit 0a6f6dc. pret/pokepinball @ 0a6f6dc · licence, all uses