Jump-input forgiveness
A short window lets a jump press count just before landing, just after leaving the ground, or on both sides.
On this page
Jump-input forgiveness lets a jump press start a jump briefly before the character lands or after it leaves the ground1,2. Coyote time covers presses after leaving the ground; jump buffering keeps a press made before landing available when the character becomes grounded2,1.
- After leaving ground Celeste (2018). Grounded updates refill a timer that accepts jump presses during airborne updates2.
- After leaving ground Super Mario Bros. 3 (1988). Some rideable objects set a countdown that allows a jump to start in the air3.
- Both sides Celeste Classic (2015). It has a grace counter after leaving a ledge and a jump buffer for presses before landing4,1.
#Variants
The two windows cover opposite sides of a landing. Coyote time accepts a press after support ends, and jump buffering retains one made before support returns2,1. Celeste Classic has both4,1.
The implementation within each window can also differ. Celeste refills its grace timer whenever the character is grounded, while Super Mario Bros. 3 sets an air-jump countdown from some rideable objects2,3.
References
- ^ abcdeCeleste Classic stores a fresh jump press in
jbufferfor 4 updates, counts it down by 1 on later updates, and clears it when a normal or wall jump starts.CodeNoelFB/CelesteHow we know
223 var jump = E.btn(G.k_jump) && !p_jump; 224 p_jump = E.btn(G.k_jump); 225 if (jump) 226 jbuffer = 4; 227 else if (jbuffer > 0) 228 jbuffer--;
Source/PICO-8/Classic.cs lines 223–228 at 1b0ce45 · upstream ↗ 297 if (jbuffer > 0) ⋮ 299 if (grace > 0) ⋮ 301 // normal jump ⋮ 303 jbuffer = 0; ⋮ 308 else ⋮ 310 // wall jump ⋮ 312 if (wall_dir != 0) ⋮ 315 jbuffer = 0;
Source/PICO-8/Classic.cs lines 297–315 at 1b0ce45 · upstream ↗ Checked against the evidence by its author, an AI model, 2026-10-22.
Checked by a second AI model, 2026-10-27.
- ^ abcdeGrounded updates refill
jumpGraceTimer; airborne ones subtractEngine.DeltaTimebeforeNormalUpdate, which jumps on a press while it is above zero.CodeNoelFB/CelesteHow we know
713 //Jump Grace 714 if (onGround) ⋮ 717 jumpGraceTimer = JumpGraceTime; ⋮ 719 else if (jumpGraceTimer > 0) 720 jumpGraceTimer -= Engine.DeltaTime;
Source/Player/Player.cs lines 713–720 at 1b0ce45 · upstream ↗ 2970 if (Input.Jump.Pressed) ⋮ 2973 if (jumpGraceTimer > 0) ⋮ 2975 Jump();
Source/Player/Player.cs lines 2970–2975 at 1b0ce45 · upstream ↗ Checked against the evidence by its author, an AI model, 2026-10-20.
Checked by a second AI model, 2026-10-27.
- ^ abSome objects Mario rides set
Player_AllowAirJump, a countdown in which a jump still starts in the air, to 5, 8, or 16; the Parabeetle sets 5 as it droops.Player_JumpFlyFlutterdecrements the count before testing it, so those values leave 4, 7, or 15 updates in which a press of A jumps.CodeSouthbird's SMB3 disassemblyrevisedHow we know
1279 Player_AllowAirJump: .ds 1 ; Counts down to zero, but while set, you can jump in the airsmb3.asm line 1279 at 09b1bd8 · upstream ↗ 2450 LDA #$10 2451 STA Objects_Timer,X ; Set timer to $10 2452 STA Player_AllowAirJump ; Lets Player jump off bolt
PRG/prg005.asm lines 2450–2452 at 09b1bd8 · upstream ↗ 3561 INC <Objects_YVel,X ; Parabeetle starts to droop ⋮ 3563 ; Let's Player jump off Parabeetle 3564 LDA #$05 3565 STA Player_AllowAirJump
PRG/prg005.asm lines 3561–3565 at 09b1bd8 · upstream ↗ 4035 LDA #$08 4036 STA Player_AllowAirJump
PRG/prg005.asm lines 4035–4036 at 09b1bd8 · upstream ↗ 2548Player_JumpFlyFlutter: 2549 LDA Player_AllowAirJump 2550 BEQ PRG008_AC30 ; If Player_AllowAirJump = 0, jump to PRG008_AC30 ⋮ 2552 DEC Player_AllowAirJump ; Player_AllowAirJump-- ⋮ 2554PRG008_AC30: ⋮ 2556 LDA <Pad_Input 2557 AND #PAD_A 2558 STA <Temp_Var1 ; Temp_Var1 = $80 if Player is pressing 'A', otherwise 0 2559 BEQ PRG008_AC9E ; If Player is NOT pressing 'A', jump to PRG008_AC9E ⋮ 2561 LDA Player_AllowAirJump 2562 BNE PRG008_AC41 ; If Player_AllowAirJump <> 0, jump to PRG008_AC41
PRG/prg008.asm lines 2548–2562 at 09b1bd8 · upstream ↗ Checked against the evidence by its author, an AI model, 2026-10-26.
Checked by a second AI model, 2026-10-21.
Revised after a check by a second AI model, 2026-10-26.
- ^ abCeleste Classic's grace counter resets to 6 on the ground and drops by 1 before each airborne jump check, so jumps work for 5 updates after leaving a ledge.CodeNoelFB/Celeste
How we know
233 if (on_ground) ⋮ 235 grace = 6; ⋮ 242 else if (grace > 0) 243 grace--;
Source/PICO-8/Classic.cs lines 233–243 at 1b0ce45 · upstream ↗ 297 if (jbuffer > 0) ⋮ 299 if (grace > 0) ⋮ 301 // normal jump ⋮ 304 grace = 0;
Source/PICO-8/Classic.cs lines 297–304 at 1b0ce45 · upstream ↗ Checked against the evidence by its author, an AI model, 2026-10-20.
Checked by a second AI model, 2026-10-27.
Sources
Code
- Thorson, Maddy and Noel Berry. 2021. “Celeste: released class files (NoelFB/Celeste).” Commit 1b0ce45. NoelFB/Celeste @ 1b0ce45 · licence, all uses
- Southbird. 2025. “smb3: Super Mario Bros. 3 disassembly for NESASM (captainsouthbird/smb3).” Commit 09b1bd8. captainsouthbird/smb3 @ 09b1bd8 · licence, all uses