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

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

  1. ^ abcdeCeleste Classic stores a fresh jump press in jbuffer for 4 updates, counts it down by 1 on later updates, and clears it when a normal or wall jump starts.CodeNoelFB/Celeste
    How 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.

    In the claim ledger

  2. ^ abcdeGrounded updates refill jumpGraceTimer; airborne ones subtract Engine.DeltaTime before NormalUpdate, which jumps on a press while it is above zero.CodeNoelFB/Celeste
    How 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.

    In the claim ledger

  3. ^ 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_JumpFlyFlutter decrements the count before testing it, so those values leave 4, 7, or 15 updates in which a press of A jumps.CodeSouthbird's SMB3 disassemblyrevised
    How we know
    1279	Player_AllowAirJump:	.ds 1	; Counts down to zero, but while set, you can jump in the air
    
    smb3.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.

    In the claim ledger

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

    In the claim ledger

Sources

Code