Jump
A move that launches a character upward off the ground, after which gravity brings it back down.
A jump launches a character upward from the ground, and gravity slows the rise and brings it back down. In the games here a jump starts on the frame the button goes down while the character stands1,2,3,4, or, in Celeste, for a few frames after it leaves the ground5.
- TableCastlevania (1986). Every jump follows the same fixed arc.2,6,7,8Castlevania III: Dracula's Curse (1989). The same arc as Castlevania's jump; Grant has a jump of his own.9,10
- One speedCastlevania II: Simon's Quest (1987). Every jump leaves the ground at the same speed and slows under gravity.11Mega Man (1987). Every jump takes off at the same speed.12,13Mega Man 2 (1988). Every jump takes off at the same speed.3,14Mega Man 3 (1990). Every jump takes off at the same speed; Rush Coil throws him far higher.15,16Mega Man 4 (1991). Every jump takes off at the same speed.17Super Castlevania IV (1991). Every jump leaves the ground at the same speed.18Mega Man 5 (1992). Every jump takes off at Mega Man 4's speed, upside down in Gravity Man's stage.19Sonic the Hedgehog 2 (1992). Out of water every jump takes off at one speed.20Sonic 3 & Knuckles (1994). Sonic and Tails take off at one speed, Knuckles slower.21Castlevania: Symphony of the Night (1997). Every jump leaves the ground at the same speed.22
- Speed from the runSuper Mario World (1990). One of eight take-off speeds, by horizontal speed.4,23,24,25
- Speed by stateSuper Mario Bros. 2 (1988). Each character's table picks the take-off speed by running, a charged crouch, and carrying.26,27,28,29,30,31
#Across games
Games differ in the take-off speed and in whether the press frame already moves the character. What the button does after take-off is variable jump height.
| Take-off | Moves on the press frame | |
|---|---|---|
| Super Mario Bros. | −4 px/frame (−5 running)32 | yes33 |
| Castlevania | no speed; a table of steps, 36 px in 20 steps6 | no8 |
| Mega Man 2 | 4.87 px/frame ($04.$DF)14 | no3 |
| Super Mario World | −5 to −6.06 px/frame (spin −4.63 to −5.63)23 | no24 |
| Sonic the Hedgehog | 6.5 px/frame ($680)34 | no35 |
| Celeste | -105 px/s36 | yes37 |
The two Mario games take off faster from a run: Super Mario Bros. picks one of five rows of its jump tables by horizontal speed38, and Super Mario World one of eight take-off speeds23. Sonic jumps along the ground’s normal, so a slope tilts the jump39.
Prince of Persia moves the kid through fixed sequences of steps with no speed or gravity40, as Castlevania steps its table6. Banjo-Kazooie takes off at 710 units/s41 out of water and Quake III Arena at 270 units/s42, one speed each, like Mega Man 214. Sonic Advance 2 adds 4.875 px/frame43 along the ground’s normal, three quarters of Sonic’s take-off34. In a decompilation that doesn’t yet match, Super Mario Sunshine’s single jump takes off at 42 + ¼ × forward speed44, as Super Mario 64 does45. Metroid Fusion and Metroid: Zero Mission take off faster with the High Jump46,47, where Metroid’s High Jump Boots lower the gravity instead48.
Mega Man 3 takes off at 4.89 px/frame ($04.$E5)15, and Rush Coil launches Mega Man at 6.93 px/frame ($06.$EE)16. Mega Man 4 takes off at 5 px/frame, up from Mega Man 3’s speed17. Mega Man 5 keeps Mega Man 4’s jump, reversed in Gravity Man’s stage19.
Castlevania II: Simon’s Quest replaces Castlevania’s table with a take-off speed and gravity, 4 px/frame, 0.21875 px/frame²11,6. Castlevania III: Dracula’s Curse keeps Castlevania’s 20 rises for every character but Grant, read from entry 9 of a longer table, 36 px in 20 steps, from entry 99. Super Castlevania IV sets Simon’s take-off to 4.5 px/frame up and 1.25 px/frame toward a held direction18. Castlevania: Symphony of the Night sets Alucard’s to 4.875 px/frame up and 1.5 px/frame toward a held direction22.
Sonic the Hedgehog 2 keeps Sonic’s take-off, 6.5 px/frame ($680)20, along the ground’s normal34. In Sonic 3 & Knuckles, the take-off is 6.5 px/frame ($680); Knuckles 6 ($600)21.
#Variants and combinations
- Variable jump height: how long the button is held changes the arc. Every game in the table except Castlevania has it49.
- Air control: how far the jump can be steered once airborne.
- Coyote time: a grace window for a press made after leaving a ledge. Celeste has one5, and Super Mario Bros., Mega Man 2, and Sonic don’t50,51,52.
- Spin jump: Super Mario World’s second jump, on a separate button, takes off slower25.
- Jump buffering: a press made shortly before landing still counts.
Games
| Game | Year | How | Note |
|---|---|---|---|
| Castlevania | 1986 | Table | every jump follows the same fixed arc |
| Castlevania III: Dracula's Curse | 1989 | Table | the same arc as Castlevania's jump; Grant has a jump of his own |
| Prince of Persia | 1989 | Table | two fixed sequences of per-frame steps, 2 blocks (standing) and 3 (running) without a floor check, with the running take-off moved to a block before the edge |
| Super Mario Land | 1989 | Table | a table of per-frame steps, retraced in reverse for the fall; a running jump starts it two steps earlier |
| Metroid II: Return of Samus | 1991 | Table | a held linear rise, then one pixel step per frame from a 79-entry table |
| Metroid | 1986 | One speed | 4 px/frame up for every jump; the High Jump Boots lower the gravity instead |
| Castlevania II: Simon's Quest | 1987 | One speed | every jump leaves the ground at the same speed and slows under gravity |
| Contra | 1987 | One speed | 4.06 px/frame outdoors, 3.44 in the base |
| Mega Man | 1987 | One speed | every jump takes off at the same speed |
| Mega Man 2 | 1988 | One speed | every jump takes off at the same speed |
| Mega Man 3 | 1990 | One speed | every jump takes off at the same speed; Rush Coil throws him far higher |
| Super C | 1990 | One speed | Contra's outdoor 4.06 px/frame, or 3 out of water |
| Mega Man 4 | 1991 | One speed | every jump takes off at the same speed |
| Sonic the Hedgehog | 1991 | One speed | out of water every jump takes off at one speed, straight out from the ground under him |
| Super Castlevania IV | 1991 | One speed | every jump leaves the ground at the same speed |
| Mega Man 5 | 1992 | One speed | every jump takes off at Mega Man 4's speed, upside down in Gravity Man's stage |
| Sonic the Hedgehog 2 | 1992 | One speed | out of water every jump takes off at one speed |
| Mega Man 6 | 1993 | One speed | every jump takes off at the same speed, a little faster than in Mega Man 5 |
| Sonic 3 & Knuckles | 1994 | One speed | Sonic and Tails take off at one speed, Knuckles slower |
| Quake | 1996 | One speed | the QuakeC adds 270 units/s upward, and only after the button has been released since the last jump |
| Castlevania: Symphony of the Night | 1997 | One speed | every jump leaves the ground at the same speed |
| Quake II | 1997 | One speed | adds 270 units/s upward, at least 270 in all, and only after the key has been released since the last jump |
| Banjo-Kazooie | 1998 | One speed | 710 units/s up whatever the run, and the horizontal speed set at once to the stick's target |
| Quake III Arena | 1999 | One speed | the vertical velocity is set to 270, not added to, and only after the key has been released since the last jump |
| Sonic Advance 2 | 2002 | One speed | 4.875 px/frame along the ground's normal, three quarters of Sonic 1's |
| Celeste | 2018 | One speed | every jump takes off at the same speed |
| Super Mario Bros. | 1985 | Speed from the run | the faster Mario moves at take-off, the faster and higher he jumps: standing, walking, and running jumps differ |
| Super Mario Bros.: The Lost Levels | 1986 | Speed from the run | Super Mario Bros.'s jumps: the faster the run-up, the higher the jump |
| Super Mario Bros. 3 | 1988 | Speed from the run | one take-off speed plus a small boost from the run, 3.5 to 4 px/frame |
| Super Mario World | 1990 | Speed from the run | one of eight take-off speeds, by horizontal speed |
| Super Mario 64 | 1996 | Speed from the run | 42 units/frame plus a quarter of the forward speed, with a double and a triple jump chained from landings |
| Super Mario Sunshine | 2002 | Speed from the run | 42 plus a quarter of the forward speed, Super Mario 64's take-off, with each update moving Mario a quarter of his velocity |
| Super Mario Bros. 2 | 1988 | Speed by state | each character's table picks the take-off speed by running, a charged crouch, and carrying |
| Super Metroid | 1994 | Speed by state | a table by medium and the Hi-Jump Boots, 4.875 px/frame in air or 6 with the boots |
| Metroid Fusion | 2002 | Speed by state | 5.3 px/frame up, 6.9 with the High Jump, held to 4 px/frame by the speed cap |
| Metroid: Zero Mission | 2004 | Speed by state | 6 px/frame up, 7.25 with the High Jump, 6.625 without the suit |
Every claim about this mechanic, by game (148)
References
- ^A jump starts only on the frame A goes down while Mario is grounded;
InitJSzeroes the vertical subpixel and sets the jumping state.CodeXkeeper0/smb1How we know
4913 LDA A_B_Buttons ; check for A button press ⋮ 4916 AND PreviousA_B_Buttons ; if button not pressed in previous frame, branch ⋮ 4922 LDA Player_State ; check player state 4923 BEQ InitJS ; if on the ground, branch
src/prg.asm lines 4913–4923 at 1cc3c92 · upstream ↗ 4935 STY Player_YMF_Dummy ⋮ 4941 LDA #$01 ; set player state to jumping/swimming
src/prg.asm lines 4931–4942 at 1cc3c92 · upstream ↗ 4141 STA PreviousA_B_Buttons ; into temp variable to be used on next framesrc/prg.asm lines 4139–4141 at 1cc3c92 · upstream ↗ Checked against the evidence by its author, an AI model, 2026-10-20.
Checked by a second AI model, 2026-10-27.
- ^ abIn Simon's standing state, the frame A goes down starts a jump, unless a block is over his head (ceiling-takeoff); the take-off code points his arc at a fixed table and copies the d-pad's Left and Right bits into his direction.Code“Castlevania (USA) (Rev 1)”revised
How we know
In the cartridge (“Castlevania (USA) (Rev 1)”): bank 6 $9366-$9381, the dispatch on Simon's state; state 0 (standing) runs $9380, state 1 (jumping) $9482; bank 6 $9401-$943B: A pressed this frame, a ceiling check, the table pointer from $9B8D, state 1, then direction = facing | (held Right/Left). We don't reproduce the bytes.
Checked against the evidence by its author, an AI model, 2026-10-22.
Checked by a second AI model, 2026-10-21.
Revised after a check by a second AI model, 2026-10-22.
- ^ abcIn the standing, walking, running, and landing states, a fresh A press (
zjoy1_pressed_bits) copieszjump_speedinto Mega Man's vertical speed after the frame's move, so the press frame doesn't lift him.Codelsmmega/mm2How we know
94_run_megaman_landing_common_1: 95 LDA z:zjoy1_pressed_bits 96 AND #a_button 97 BEQ @not_pressed 98 LDA z:zjump_speed_fraction 99 STA aobject_ycoord_speed_fraction 100 LDA z:zjump_speed 101 STA aobject_ycoord_speed 102 LDA #$06 103 STA z:zmegaman_status
engine/run_megaman.asm lines 94–103 at 94f0bf3 · upstream ↗ 84 JSR _megaman_status_parameter 85 JSR _check_object_horizontal_move 86 JSR _check_object_vertical_move 87 LDA z:z00 88 BNE _run_megaman_landing_common_1
engine/run_megaman.asm lines 84–88 at 94f0bf3 · upstream ↗ 13 JSR _joy 14 LDA z:zjoy1_pressed 15 EOR z:zjoy1_pressed_frame 16 AND z:zjoy1_pressed 17 STA z:zjoy1_pressed_bits
home/nmi_wait.asm lines 13–17 at 94f0bf3 · upstream ↗ Checked against the evidence by its author, an AI model, 2026-10-20.
Checked by a second AI model, 2026-10-21.
- ^ abOn the ground, a fresh press of B (or X) starts Mario's jump and a fresh press of A a spin jump;
CODE_00D5F2takes the take-off speed fromDATA_00D2BDat an index set by his horizontal speed.CodeSMWDisXHow we know
9921CODE_00D5F2: 9922 LDA.B PlayerInAir 9923 BEQ + 9924 JMP CODE_00D682
bank_00.asm lines 9921–9924 at 30643c7 · upstream ↗ 9940 LDA.B byetudlrFrame 9941 ORA.B axlr0000Frame 9942 BMI CODE_00D630
bank_00.asm lines 9940–9942 at 30643c7 · upstream ↗ 9953CODE_00D630: 9954 LDA.B PlayerXSpeed+1 ⋮ 9958 + LSR A 9959 LSR A 9960 AND.B #$FE 9961 TAX 9962 LDA.B axlr0000Frame 9963 BPL CODE_00D65E ⋮ 9975 INX ⋮ 9981 + LDA.W DATA_00D2BD,X 9982 STA.B PlayerYSpeed+1
bank_00.asm lines 9953–9982 at 30643c7 · upstream ↗ Checked against the evidence by its author, an AI model, 2026-10-20.
Checked by a second AI model, 2026-10-21.
- ^ abGrounded 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.
- ^ abcdSimon's jump rises by a fixed table of per-frame steps, 5, 5, 3, 3, 3, 3, 3, 2, 2, 2, 1, 1, 1, 1, 0, 1, 0, 0, 0, and 0 px, 36 px in all.Code“Castlevania (USA) (Rev 1)”
How we know
In the cartridge (“Castlevania (USA) (Rev 1)”): bank 6 $9B8D-$9BA4, the table's address, a $80 start marker, 20 signed steps ($FB = −5, up), and a $81 turn marker; bank 6 $9B1E-$9B8A, the routine that adds one step to Simon's Y each frame and moves the table pointer. We don't reproduce the bytes.
Checked against the evidence by its author, an AI model, 2026-10-20.
Checked by a second AI model, 2026-10-21.
- ^At the table's turn marker the arc routine reverses and reads the same steps backward, negated, so Simon falls the way he rose.Code“Castlevania (USA) (Rev 1)”revised
How we know
In the cartridge (“Castlevania (USA) (Rev 1)”): bank 6 $9B31-$9B40: on $81, flip the direction flag ($0514), step the pointer back, and read again; bank 6 $9B1E-$9B8A; with the flag set, each step is negated and the pointer moves back. We don't reproduce the bytes.
Checked against the evidence by its author, an AI model, 2026-10-20.
Revised after a check by a second AI model, 2026-10-21: The apex lasts 8 frames.
- ^ abMeasured frame by frame, Simon's standing jump follows the table exactly, from a motionless press frame to a landing 40 frames later.Verified“Castlevania (USA) (Rev 1)”
How we know
In the cartridge (“Castlevania (USA) (Rev 1)”): the table. We don't reproduce the bytes.
Measured by a script in MesenCE 2.2.1 (build 4b8a196), on Castlevania (USA) (Rev 1) (SHA-1
4e3ef47de86a…). It fails if the result disagrees with the claim.The numbers come from the run; its author, an AI model, checked the script measures what the claim says, 2026-10-20.
Checked by a second AI model, 2026-10-21.
- ^ abDracula's Curse keeps Castlevania's jump for every character but Grant; the take-off starts the arc at entry 9 of a longer table whose entries from there are Castlevania's 20 rises, 5, 5, 3, 3, 3, 3, 3, 2, 2, 2, 1, 1, 1, 1, 0, 1, 0, 0, 0, and 0 px, and the 8 entries before it, 6 then 5 px, carry a fall below the take-off height down to 6 px/frame, where Castlevania falls at 8 px/frame once its table runs out.Codevinheim3/castlevania3-disasm · “Castlevania III - Dracula's Curse (USA)” · “Castlevania (USA) (Rev 1)”revised
How we know
3740playerState06_jumpStart_exceptGrant:code/playerStateProcessing_b1c.s lines 3740–3751 at 3272648 · upstream ↗ lda $9874, y … cmp #$81 … sta wEntityVertSpeed.w, x … inc $05d8, x … cmp #$80 … dec $05d8, x … eor #$ff … lda $9875, y
code/playerStateProcessing_b1c.s#L4187-L4225 · upstream ↗ 3242processTrevorState: ⋮ 3249 .dw playerState06_jumpStart_exceptGrant 3250 .dw playerState08_jumping_exceptGrant
code/playerStateProcessing_b1c.s lines 3242–3250 at 3272648 · upstream ↗ 4751processSyphaState: ⋮ 4758 .dw playerState06_jumpStart_exceptGrant
code/playerStateProcessing_b1c.s lines 4751–4759 at 3272648 · upstream ↗ 918processAlucardState: ⋮ 926 .dw playerState06_jumpStart_exceptGrant
code/playerStateProcessing_b1d.s lines 918–927 at 3272648 · upstream ↗ 4784processGrantState: ⋮ 4791 .dw playerState06_jumpStart_grant 4792 .dw playerState08_jumping_0c_grant
code/playerStateProcessing_b1c.s lines 4784–4792 at 3272648 · upstream ↗ In the cartridge (“Castlevania III - Dracula's Curse (USA)”): bank $1C $9874-$9891: $80, five $FA (−6), five $FB (−5), five $FD, three $FE, four $FF, $00, $FF, four $00, and $81; the disassembly lists these bytes partly as instructions. We don't reproduce the bytes.
In the cartridge (“Castlevania (USA) (Rev 1)”): Castlevania's table of 20 steps (castlevania/jump-table); Castlevania's 8 px fall past the table (castlevania/table-end-fall). We don't reproduce the bytes.
Checked against the evidence by its author, an AI model, 2026-10-21.
Revised after a check by a second AI model, 2026-10-21.
- ^Grant's jump reads its own table from entry 30, one entry a frame while A is held; once A is up during the rise, or once he falls, the routine moves two entries a frame, so letting go shortens the rise, from 58 px held to the top to 30 px with A up on the first frame, by the table.Codevinheim3/castlevania3-disasm · “Castlevania III - Dracula's Curse (USA)”
How we know
lda #$1e … sta $05d8 … lda #$01 … sta wPixelsToWalkToStairs.w
code/playerStateProcessing_b1c.s#L5156-L5172 · upstream ↗ lda wEntityPhase.w … lda $9d … lda wJoy1ButtonsPressed … and #$80 … inc $9d … lda #$02 … sta wPixelsToWalkToStairs.w
code/playerStateProcessing_b1d.s#L128-L141 · upstream ↗ lda $9e58, y … cmp #$81 … sta wEntityVertSpeed.w … adc wPixelsToWalkToStairs.w … cmp #$39 … sbc wPixelsToWalkToStairs.w … eor #$ff
code/playerStateProcessing_b1d.s#L154-L213 · upstream ↗ In the cartridge (“Castlevania III - Dracula's Curse (USA)”): bank $1C $9E58-$9E91: $80, nineteen $F9 (−7), six $FA, five $FB, five $FC, six $FD, five $FE, five $FF, five $00, and $81. We don't reproduce the bytes.
Checked against the evidence by its author, an AI model, 2026-10-21.
Checked by a second AI model, 2026-10-21.
- ^ abSimon's Quest replaces Castlevania's step table with a speed and gravity; a jump from the ground takes off at 4 px/frame up, every airborne frame adds 0.21875 px/frame² of gravity, and a fall is capped at 3 px/frame, where Castlevania steps a fixed 20-entry table and falls past its end at 8 px/frame.Code“Castlevania II - Simon's Quest (USA)” · “Castlevania (USA) (Rev 1)”
How we know
In the cartridge (“Castlevania II - Simon's Quest (USA)”): bank 3 $88D9-$892A, the take-off: Y speed $036C.$037E = −4.0 ($FC.$00), the action set to jumping, and the held d-pad read into the X speed and facing; bank 3 $89D6-$8A0D, each jumping frame: zero the speed on a ceiling, add $38 to the speed's fraction ($DFE4), and cap a fall at 3.0; bank 7 $DFE4-$DFF9, a 16-bit add of $0008 to object X's Y speed. We don't reproduce the bytes.
In the cartridge (“Castlevania (USA) (Rev 1)”): Castlevania's jump table, 20 signed steps between a $80 and a $81 marker (castlevania/jump-table); Castlevania's fall past the table's end, 8 px per frame (castlevania/table-end-fall). We don't reproduce the bytes.
Checked against the evidence by its author, an AI model, 2026-10-21.
Checked by a second AI model, 2026-10-21.
- ^A fresh A press on the ground sets Mega Man's upward speed to
$04.$DF, 4.87 px/frame.Codelsmmega/mm1How we know
157@bottom: 158 LDA aobject_ycoord 159 STA z:zlast_ycoord 160 LDA z:zjoy1_pressed_bits 161 AND #a_button 162 BNE @start_jump_up
engine/run_megaman.asm lines 157–162 at b606a84 · upstream ↗ 216@start_jump_up: 217 LDA #$04 218 STA aobject_ycoord_speed 219 LDA #$DF 220 STA aobject_ycoord_speed_fraction 221 RTS
engine/run_megaman.asm lines 216–221 at b606a84 · upstream ↗ Checked against the evidence by its author, an AI model, 2026-10-21.
Checked by a second AI model, 2026-10-21.
- ^Mega Man 2 keeps Mega Man's jump and running numbers. Both take off at
$04.$DF, subtract$40of gravity a frame, cap a fall at$F4, cut a rise of 2 px/frame or more to 1 when A is up, and move at 0.125, 1.375, and 1.3125 px/frame stepping, running, and in the air.Codelsmmega/mm1 · lsmmega/mm2How we know
216@start_jump_up: 217 LDA #$04 218 STA aobject_ycoord_speed 219 LDA #$DF
engine/run_megaman.asm lines 216–221 at b606a84 · upstream ↗ 97 LDA aobject_ycoord_speed_fraction, X 98 SBC #$40 ⋮ 103 CMP #$F4
engine/objects_vertical.asm lines 97–103 at b606a84 · upstream ↗ 100@start_jump_down: 101 LDA aobject_ycoord_speed 102 BMI @jumping_down 103 CMP #$01 104 BCC @jumping_down 105 BEQ @jumping_down 106 LDA #$01 107 STA aobject_ycoord_speed
engine/run_megaman.asm lines 100–107 at b606a84 · upstream ↗ 4 .BYTE $00 | $20 ⋮ 10 .BYTE $01 | $50 11 .BYTE $01 | $60
data/special_xcoord_speed_table.asm lines 4–11 at b606a84 · upstream ↗ 175tsa_ycoord_speed_accelerate_fraction_table: 176 .BYTE $40, $1E ⋮ 181tsa_regular_water_jump_speed_table: 182 .BYTE $04, $05 ⋮ 184tsa_regular_water_jump_speed_fraction_table: 185 .BYTE $DF, $80
engine/check_object_horizontal_move.asm lines 175–185 at 94f0bf3 · upstream ↗ 81 BPL @skip 82 CMP #$F4
engine/check_object_vertical_move.asm lines 81–82 at 94f0bf3 · upstream ↗ 208 LDA z:zjoy1_pressed 209 AND #a_button 210 BNE @skip 211 LDA aobject_ycoord_speed 212 BMI @skip 213 CMP #$01 214 BCC @skip 215 BEQ @skip 216 LDA #$01 217 STA aobject_ycoord_speed
engine/run_megaman.asm lines 208–217 at 94f0bf3 · upstream ↗ 222megaman_status_xcoord_speed_table: 223 .BYTE $00 224 .BYTE $00 225 .BYTE $00 226 .BYTE $00 227 .BYTE $00 ⋮ 230 .BYTE $00 231 .BYTE $00 232 .BYTE $00 233 .BYTE $00 ⋮ 235megaman_status_xcoord_speed_fraction_table: 236 .BYTE $00 ⋮
engine/turn_megaman.asm lines 222–243 at 94f0bf3 · upstream ↗ Checked against the evidence by its author, an AI model, 2026-10-21.
Checked by a second AI model, 2026-10-21.
- ^ abcMega Man's jump speed is
$04.$DF, 4.87 px/frame upward, out of water ($05.$80in water).Codelsmmega/mm2How we know
181tsa_regular_water_jump_speed_table: 182 .BYTE $04, $05 ⋮ 184tsa_regular_water_jump_speed_fraction_table: 185 .BYTE $DF, $80
engine/check_object_horizontal_move.asm lines 181–185 at 94f0bf3 · upstream ↗ 82 LDA tsa_regular_water_jump_speed_table, X 83 STA z:zjump_speed 84 LDA tsa_regular_water_jump_speed_fraction_table, X 85 STA z:zjump_speed_fraction
engine/tsa.asm lines 82–85 at 94f0bf3 · upstream ↗ Checked against the evidence by its author, an AI model, 2026-10-20.
Checked by a second AI model, 2026-10-21.
- ^ abA fresh A press on the ground without Down sets Mega Man's upward speed to
$04.$E5, 4.89 px/frame, and runs the airborne state at once.Codeplasticsmoke/megaman3-disassembly-ca65How we know
59player_ground_jump_or_slide: lda joy1_press ; check new button presses 60 and #BTN_A ; A button pressed? 61 beq player_ground_anim_dispatch ; no → animate walk/idle 62 lda joy1_held ; check held buttons 63 and #BTN_DOWN ; holding down? 64 beq player_ground_normal_jump ; not holding down, jump 65 jmp slide_initiate ; initiate slide ⋮ 71player_ground_normal_jump: lda joy2_held ; P2 held buttons 72 and #$01 ; bit 0 = Right held? 73 bne player_ground_super_jump ; yes → debug super jump 74 lda #$E5 ; normal jump: Y vel = $04.E5 75 sta ent_yvel_sub,x ; store Y velocity sub-pixel ⋮
src/fixed/player_ground.asm lines 59–78 at 58ca1c3 · upstream ↗ Checked against the evidence by its author, an AI model, 2026-10-21.
Checked by a second AI model, 2026-10-21.
- ^ abLanding on Rush Coil launches Mega Man at
$06.$EE, 6.93 px/frame, once per bounce, and setsforce_full_jump, so releasing A doesn't cut that rise.Codeplasticsmoke/megaman3-disassembly-ca65How we know
32 lda $05A1 ; if Rush already bounced: skip 33 bne player_ground_normal_walk ; already bounced, normal walk 34 inc force_full_jump ; force full jump (no variable-jump cutoff) 35 lda #$EE ; Y speed = $06.EE (Rush Coil bounce) 36 sta ent_yvel_sub ; strong upward bounce 37 lda #$06 ; Y velocity whole = $06 (upward) 38 sta ent_yvel ; store Y velocity whole
src/fixed/player_ground.asm lines 32–38 at 58ca1c3 · upstream ↗ 260player_airborne: lda ent_yvel ; check Y velocity sign 261 bmi player_airborne_variable_jump ; negative (falling) → skip to clear flag 262 lda force_full_jump ; check force-full-jump flag 263 bne player_airborne_wall_check ; nonzero → skip variable jump
src/fixed/player_ground.asm lines 260–263 at 58ca1c3 · upstream ↗ Checked against the evidence by its author, an AI model, 2026-10-21.
Checked by a second AI model, 2026-10-21.
- ^ abMega Man 4 takes off at exactly 5 px/frame (
$05.$00), up from Mega Man 3's$04.$E5, and a release cuts any rise to a speed of 0 where Mega Man 3 sets 0.25 px/frame downward. Both cut on every rising frame without A.Codeplasticsmoke/megaman4-disassembly-ca65 · “Mega Man 4 (USA) (Rev 1)” · plasticsmoke/megaman3-disassembly-ca65How we know
179L_813E: 180 LDA ent_angle ; player $04B0 flag 181 BNE L_8149 ; nonzero: normal jump 182 LDA joy1_held ; held buttons 183 AND #$04 ; Down held? 184 BNE L_8156 ; Down+A = slide 185L_8149: 186 LDA #$00 ; zero sub-velocity 187 STA ent_yvel_sub ; Y velocity sub = 0 188 LDA #$05 ; jump speed 5 px/frame 189 STA ent_yvel ; Y velocity = +5 (up) 190 JMP L_82C8 ; enter airborne physics
src/bank3C.asm lines 179–190 at a63bb6e · upstream ↗ 420L_8306: 421 LDA ent_yvel ; player Y velocity 422 BMI L_8338 ; moving down: keep falling 423 LDA ent_var6 ; knockback/no-jump-cut flag 424 BNE L_833D ; set: no jump cut 425 LDA joy1_held ; held buttons 426 AND #$80 ; A still held? 427 BNE L_8338 ; held: full jump 428 LDA #$00 ; zero 429 STA ent_yvel_sub ; cut jump: Y vel sub = 0 430 STA ent_yvel ; cut jump: Y vel = 0 431 BEQ L_8338 ; (always taken)
src/bank3C.asm lines 420–431 at a63bb6e · upstream ↗ In the cartridge (“Mega Man 4 (USA) (Rev 1)”): bank $3C $8149, the take-off in the Rev 1 ROM; bank $3C $8312, the cut in the Rev 1 ROM. We don't reproduce the bytes.
74 lda #$E5 ; normal jump: Y vel = $04.E5 75 sta ent_yvel_sub,x ; store Y velocity sub-pixel 76 lda #$04 ; Y velocity whole = $04 77 sta ent_yvel,x ; store Y velocity whole
src/fixed/player_ground.asm lines 74–77 at 58ca1c3 · upstream ↗ 424reset_gravity_player: lda #$C0 ; player rest vel sub = $C0 425 sta ent_yvel_sub,x ; store Y sub velocity 426 lda #$FF ; player rest vel = $FF ($FFC0 = -0.25) 427 sta ent_yvel,x ; store Y velocity whole byte
src/fixed/movement.asm lines 424–427 at 58ca1c3 · upstream ↗ Checked against the evidence by its author, an AI model, 2026-10-21.
Checked by a second AI model, 2026-10-21.
- ^ abSuper Castlevania IV's take-off sets Simon's vertical speed to 4.5 px/frame up and his horizontal speed to 1.25 px/frame toward a held Left or Right, or 0, then puts him in the jumping state.Code“Super Castlevania IV (USA)”
How we know
In the cartridge (“Super Castlevania IV (USA)”): $00:A217-$A230, the dispatch on Simon's state $0552 and its table's first five entries: state 3 runs $A392, state 4 $A3FA; $00:A392-$A3F9 (16-bit A): Y speed $055E.$055C = $FFFB.$8000 (−4.5); held Right ($0100 in pad $20) X speed $055A.$0558 = 1.25, Left −1.25, else 0; state $0552 = 4, jump phase $1F86 = 0. We don't reproduce the bytes.
Checked against the evidence by its author, an AI model, 2026-10-21.
Checked by a second AI model, 2026-10-21.
- ^ abMega Man 5 keeps Mega Man 4's jump. Both write 5 px/frame (
$05.$00) into the vertical speed at$03F0/$03D8on a jump, and set it to 0 on any rising frame without A.Codeplasticsmoke/megaman5-disassembly-ca65 · plasticsmoke/megaman4-disassembly-ca65How we know
L80A4: lda $AF bne L80B5 lda #$00 sta $03D8 lda #$05 sta $03F0 jmp player_st_air
src/bank1B.asm#L122-L128 · upstream ↗ L8259: lda $03F0 bmi L8283 L825E: lda $16 and #$80 bne L8283 lda #$00 sta $03D8 sta $03F0 beq L8283
src/bank1B.asm#L335-L343 · upstream ↗ 186 LDA #$00 ; zero sub-velocity 187 STA ent_yvel_sub ; Y velocity sub = 0 188 LDA #$05 ; jump speed 5 px/frame 189 STA ent_yvel ; Y velocity = +5 (up)
src/bank3C.asm lines 186–189 at a63bb6e · upstream ↗ 425 LDA joy1_held ; held buttons 426 AND #$80 ; A still held? 427 BNE L_8338 ; held: full jump 428 LDA #$00 ; zero 429 STA ent_yvel_sub ; cut jump: Y vel sub = 0 430 STA ent_yvel ; cut jump: Y vel = 0
src/bank3C.asm lines 425–430 at a63bb6e · upstream ↗ Checked against the evidence by its author, an AI model, 2026-10-21.
Checked by a second AI model, 2026-10-21.
- ^ ab
Sonic_Jumptakes off at$680subpixels per frame (6.5 px/frame),$800as Super Sonic, and$380underwater, the same take-off as Sonic 1.Codesonicretro/s2disasm · sonicretro/s1disasmrevisedHow we know
37400 move.w #$680,d2 ⋮ 37403 move.w #$800,d2 ; set higher jump speed if super ⋮ 37407 move.w #$380,d2 ; set lower jump speed if underwater
s2.asm lines 37400–37407 at 4ef457c · upstream ↗ 37411 subi.b #$40,d0 37412 jsr (CalcSine).l ⋮ 37418 add.w d0,y_vel(a0) ; make Sonic jump (in Y)
s2.asm lines 37409–37418 at 4ef457c · upstream ↗ 8son_jumpspeed: equ $680 ; Sonic's jump speed_incObj/01 Sonic.asm line 8 at 15dfa3a · upstream ↗ Checked against the evidence by its author, an AI model, 2026-10-21.
Revised after a check by a second AI model, 2026-10-21.
- ^ abSonic and Tails take off at
$680subpixels per frame (6.5 px/frame) and Knuckles at$600(6 px/frame); underwater the speeds are$380and$300.Codesonicretro/skdisasmHow we know
23342 move.w #$680,d2 ⋮ 23345 move.w #$800,d2 ; set higher jump speed if super ⋮ 23350 move.w #$380,d2 ; set lower jump speed if under
sonic3k.asm lines 23342–23350 at 73de97c · upstream ↗ 28578 move.w #$680,d2 28579 btst #Status_Underwater,status(a0) ⋮ 28581 move.w #$380,d2
sonic3k.asm lines 28578–28581 at 73de97c · upstream ↗ 32494 move.w #$600,d2 32495 btst #Status_Underwater,status(a0) 32496 beq.s loc_1775C 32497 move.w #$300,d2
sonic3k.asm lines 32494–32497 at 73de97c · upstream ↗ Checked against the evidence by its author, an AI model, 2026-10-21.
Checked by a second AI model, 2026-10-21.
- ^ abIn Symphony of the Night a jump from the ground sets Alucard's upward speed to 4.875 px/frame, and his horizontal speed to 1.5 px/frame toward a held direction, or 0.CodeXeeynamo/sotn-decomp
How we know
156 if (CheckMoveDirection()) { ⋮ 158 SetSpeedX(FIX(1.5)); ⋮ 162 PLAYER.velocityX = 0; ⋮ 166 PLAYER.velocityY = FIX(-4.875); 167 SetPlayerStep(Player_Jump);
src/dra/6E42C.c lines 151–167 at 2be55ee · upstream ↗ 95#define FIX(x) ((s32)((x) * 65536.0))include/common.h line 95 at 2be55ee · upstream ↗ Checked against the evidence by its author, an AI model, 2026-10-21.
Checked by a second AI model, 2026-10-21.
- ^ abc
DATA_00D2BDgives a normal jump −80/16 to −97/16 px/frame ($B0–$9F) and a spin jump −74/16 to −90/16 ($B6–$A6), faster for every 0.5 px/frame of horizontal speed.CodeSMWDisXHow we know
9673DATA_00D2BD: 9674 db $B0,$B6,$AE,$B4,$AB,$B2,$A9,$B0 9675 db $A6,$AE,$A4,$AB,$A1,$A9,$9F,$A6
bank_00.asm lines 9673–9675 at 30643c7 · upstream ↗ Checked against the evidence by its author, an AI model, 2026-10-20.
Checked by a second AI model, 2026-10-21.
- ^ abEach frame the player routine moves Mario by his current speed (
CODE_00DC2D), then handles a jump press (CODE_00D5F2), then adds gravity (CODE_00D7E4), so the press frame doesn't lift him and his first step up is the take-off speed plus held gravity.CodeSMWDisXHow we know
8897CODE_00CD24: ⋮ 8904 + JSR CODE_00DC2D 8905 JSR CODE_00E92B
bank_00.asm lines 8897–8905 at 30643c7 · upstream ↗ 8946CODE_00CD82: 8947 JSR CODE_00D5F2 8948 JSR CODE_00D062 8949 JSR CODE_00D7E4
bank_00.asm lines 8946–8949 at 30643c7 · upstream ↗ Checked against the evidence by its author, an AI model, 2026-10-20.
Checked by a second AI model, 2026-10-21.
- ^ abMeasured in the game, a standing spin jump climbs 54.8 px with A held and 28.5 px tapped, against 64.2 and 33.3 for a normal jump.VerifiedSMWDisX
How we know
9673DATA_00D2BD: 9674 db $B0,$B6,$AE,$B4,$AB,$B2,$A9,$B0
bank_00.asm lines 9673–9675 at 30643c7 · upstream ↗ Measured by a script in MesenCE 2.2.1 (build 4b8a196), on . It fails if the result disagrees with the claim.
The numbers come from the run; its author, an AI model, checked the script measures what the claim says, 2026-10-25.
Checked by a second AI model, 2026-10-21.
Checked by a second AI model, 2026-10-25.
- ^
PlayerStartJumpfirst checks quicksand: sunk withQuicksandDepth2 or more, the player takes off atJumpHeightQuicksand,$E0for all four (quicksand), and the table is skipped. Otherwise it picks the take-off speed from the character's table by three bits: running (horizontal speed of$08or more), a charged crouch (CrouchJumpTimerat$3C), and holding an item. A charged jump clears the running bit.CodeSMB2 DiscombobulatedrevisedHow we know
2537; %xxxxxRCI 2538; R = whether the player is running 2539; C = whether the crouch timer is charged 2540; I = whether the player is holding an item ⋮ 2542PlayerStartJump: 2543 LDA QuicksandDepth 2544 CMP #$02 2545 BCC PlayerStartJump_LoadXVelocity ⋮ 2547 ; Quicksand 2548 LDA JumpHeightQuicksand 2549 STA PlayerYVelocity 2550 BNE PlayerStartJump_Exit ⋮
src/prg-0-1.asm lines 2535–2588 at b73415e · 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.
- ^Measured in Mesen (MesenCE 2.2.1) from power-on, on the floor at the bottom of 1-1's first area (probes/super-mario-bros-2/movement.mjs), empty-handed Mario's jumps leave the ground at -5 standing, -5.625 running, and -6.5 px/frame from a charged crouch, and each frame adds 0.25 px/frame with A held and 0.4375 without:
MarioStats'$B0,$A6, and$98, and its gravities$04and$07. With an item, see carry-stats.VerifiedSMB2 DiscombobulatedrevisedHow we know
271MarioStats: ⋮ 278 .db $B0 ; Jump Speed, still - no object ⋮ 280 .db $98 ; Jump Speed, charged - no object ⋮ 282 .db $A6 ; Jump Speed, running - no object ⋮ 286 .db $07 ; Gravity without Jump button pressed 287 .db $04 ; Gravity with Jump button pressed
src/prg-a-b.asm lines 271–290 at b73415e · upstream ↗ Measured by a script in MesenCE 2.2.1 (build 4b8a196), on . It fails if the result disagrees with the claim.
The numbers come from the run; its author, an AI model, checked the script measures what the claim says, 2026-10-26.
Checked by a second AI model, 2026-10-21.
Revised after a check by a second AI model, 2026-10-26.
- ^Luigi takes off far slower but falls under a far lighter gravity. Measured in Mesen (MesenCE 2.2.1) from power-on, on the floor at the bottom of 1-1's first area, empty-handed, his jumps leave the ground at -2.625 standing, -3 running, and -3.4375 px/frame charged, and each frame adds 0.0625 px/frame with A held and 0.125 without:
LuigiStats'$D6,$D0, and$C9, and its gravities$01and$02. With an item, see carry-stats.VerifiedSMB2 DiscombobulatedrevisedHow we know
321LuigiStats: ⋮ 328 .db $D6 ; Jump Speed, still - no object ⋮ 330 .db $C9 ; Jump Speed, charged - no object ⋮ 332 .db $D0 ; Jump Speed, running - no object ⋮ 336 .db $02 ; Gravity without Jump button pressed 337 .db $01 ; Gravity with Jump button pressed
src/prg-a-b.asm lines 321–343 at b73415e · upstream ↗ Measured by a script in MesenCE 2.2.1 (build 4b8a196), on . It fails if the result disagrees with the claim.
The numbers come from the run; its author, an AI model, checked the script measures what the claim says, 2026-10-26.
Checked by a second AI model, 2026-10-21.
Revised after a check by a second AI model, 2026-10-26.
- ^Measured in Mesen (MesenCE 2.2.1) from power-on, on the floor at the bottom of 1-1's first area, empty-handed Toad's jumps leave the ground at -4.875 standing, -5.1875 running, and -6.5 px/frame charged, and fall under Mario's gravity, 0.25 px/frame a frame with A held and 0.4375 without:
ToadStats'$B2,$AD, and$98, and$04and$07. With an item, see carry-stats.VerifiedSMB2 DiscombobulatedrevisedHow we know
296ToadStats: ⋮ 303 .db $B2 ; Jump Speed, still - no object ⋮ 305 .db $98 ; Jump Speed, charged - no object ⋮ 307 .db $AD ; Jump Speed, running - no object ⋮ 311 .db $07 ; Gravity without Jump button pressed 312 .db $04 ; Gravity with Jump button pressed
src/prg-a-b.asm lines 296–318 at b73415e · upstream ↗ Measured by a script in MesenCE 2.2.1 (build 4b8a196), on . It fails if the result disagrees with the claim.
The numbers come from the run; its author, an AI model, checked the script measures what the claim says, 2026-10-26.
Revised after a check by a second AI model, 2026-10-26.
- ^Measured in Mesen (MesenCE 2.2.1) from power-on, on the floor at the bottom of 1-1's first area, the empty-handed Princess's jumps leave the ground at -4.8125 standing, -5.25 running, and -6.5 px/frame charged, and fall under Mario's gravity, 0.25 px/frame a frame with A held and 0.4375 without, apart from her float (float):
PrincessStats'$B3,$AC, and$98, and$04and$07. With an item, see carry-stats.VerifiedSMB2 DiscombobulatedrevisedHow we know
346PrincessStats: ⋮ 353 .db $B3 ; Jump Speed, still - no object ⋮ 355 .db $98 ; Jump Speed, charged - no object ⋮ 357 .db $AC ; Jump Speed, running - no object ⋮ 361 .db $07 ; Gravity without Jump button pressed 362 .db $04 ; Gravity with Jump button pressed
src/prg-a-b.asm lines 346–368 at b73415e · upstream ↗ Measured by a script in MesenCE 2.2.1 (build 4b8a196), on . It fails if the result disagrees with the claim.
The numbers come from the run; its author, an AI model, checked the script measures what the claim says, 2026-10-26.
Revised after a check by a second AI model, 2026-10-26.
- ^Each character's stats table holds a second take-off for each kind of jump, used while carrying something. Standing, charged, and running, they are: Mario
$B0,$98,$AA; Luigi$D6,$C9,$D4; Toad$B2,$98,$AD; the Princess$B3,$98,$B3. Against the empty-handed ones (mario-stats and the rest), an item lowers only the running jump: Mario's and Luigi's by$04, and the Princess's to her standing one; Toad's are unchanged. The same tables hold the ground caps,$18empty-handed for all four, and carrying$18,$16,$1D, and$15(carry-speed).CodeSMB2 DiscombobulatedrevisedHow we know
271MarioStats: ⋮ 279 .db $B0 ; Jump Speed, still - with object ⋮ 281 .db $98 ; Jump Speed, charged - with object ⋮ 283 .db $AA ; Jump Speed, running - with object ⋮ 289 .db $18 ; Running Speed, right - no object 290 .db $18 ; Running Speed, right - with object
src/prg-a-b.asm lines 271–290 at b73415e · upstream ↗ 321LuigiStats: ⋮ 329 .db $D6 ; Jump Speed, still - with object ⋮ 331 .db $C9 ; Jump Speed, charged - with object ⋮ 333 .db $D4 ; Jump Speed, running - with object ⋮ 339 .db $18 ; Running Speed, right - no object 340 .db $16 ; Running Speed, right - with object
src/prg-a-b.asm lines 321–343 at b73415e · upstream ↗ 296ToadStats: ⋮ 304 .db $B2 ; Jump Speed, still - with object ⋮ 306 .db $98 ; Jump Speed, charged - with object ⋮ 308 .db $AD ; Jump Speed, running - with object ⋮ 314 .db $18 ; Running Speed, right - no object 315 .db $1D ; Running Speed, right - with object
src/prg-a-b.asm lines 296–318 at b73415e · upstream ↗ 346PrincessStats: ⋮ 354 .db $B3 ; Jump Speed, still - with object ⋮ 356 .db $98 ; Jump Speed, charged - with object ⋮ 358 .db $B3 ; Jump Speed, running - with object ⋮ 364 .db $18 ; Running Speed, right - no object 365 .db $15 ; Running Speed, right - with object
src/prg-a-b.asm lines 346–368 at b73415e · upstream ↗ Checked against the evidence by its author, an AI model, 2026-10-26.
Revised after a check by a second AI model, 2026-10-26.
- ^
PlayerYSpdDatastarts a jump at −4 px/frame (rows 0–2) or −5 px/frame (rows 3–4).CodeXkeeper0/smb1 · Jdaster64 n.d.How we know
4864PlayerYSpdData: 4865 .db $fc, $fc, $fc, $fb, $fb, $fe, $ff
src/prg.asm lines 4864–4865 at 1cc3c92 · upstream ↗ 4972 LDA PlayerYSpdData,y 4973 STA Player_Y_Speed
src/prg.asm lines 4972–4973 at 1cc3c92 · upstream ↗ 04000 | 04000 | 05000
JUMPING/VERTICAL PHYSICS, Mario table, Initial Velocity (−Y) · archived copy ↗ Checked against the evidence by its author, an AI model, 2026-10-20.
Checked by a second AI model, 2026-10-27.
- ^The press frame already moves Mario, since
PlayerPhysicsSubstarts the jump before the state dispatch runsJumpSwimSubandMovePlayerVertically.CodeXkeeper0/smb1How we know
4713 JSR PlayerPhysicsSub ; run sub related to jumping and swimming ⋮ 4722 JSR JumpEngine ⋮ 4724 .dw OnGroundStateSub 4725 .dw JumpSwimSub
src/prg.asm lines 4713–4725 at 1cc3c92 · upstream ↗ 4796 JMP MovePlayerVertically ; jump to move player vertically, then leavesrc/prg.asm line 4796 at 1cc3c92 · upstream ↗ Checked against the evidence by its author, an AI model, 2026-10-20.
Checked by a second AI model, 2026-10-27.
- ^ abcIn the running game, on flat ground out of water, a jump's press frame sets Sonic's Y speed to −
$680,son_jumpspeed(6.5 px/frame), whether he stands, runs, or rolls.Verifiedsonicretro/s1disasm · Sonic Retro, “Sonic Physics Guide: Jumping”How we know
8son_jumpspeed: equ $680 ; Sonic's jump speed_incObj/01 Sonic.asm line 8 at 15dfa3a · upstream ↗ 1218 move.w #son_jumpspeed,d2 ; set initial jump force_incObj/01 Sonic.asm line 1218 at 15dfa3a · upstream ↗ jump_force 6.5 (6 pixels and 128 supbixels)
Constants · archived copy ↗ Measured by a script. It fails if the result disagrees with the claim.
The numbers come from the run; its author, an AI model, checked the script measures what the claim says, 2026-10-25.
Checked by a second AI model, 2026-10-25.
- ^In the running game, on flat ground, Sonic doesn't move on a jump's press frame, even at top speed: X stays put and Y changes only by the curl (roll-shift), because
Sonic_Jumpdrops its return address, skipping the rest of the grounded routine,SpeedToPosincluded.Verifiedsonicretro/s1disasm · Sonic Retro, “Sonic Physics Guide: Jumping”How we know
1236 addq.l #4,sp ; run in-air subroutines when we return_incObj/01 Sonic.asm line 1236 at 15dfa3a · upstream ↗ 317Sonic_MdNormal: ; While Sonic is on the ground and not rolling 318 bsr.w Sonic_Jump ; check if we need to jump ⋮ 323 jsr (SpeedToPos).l ; update Sonic's position based on his current velocities
_incObj/01 Sonic.asm lines 317–323 at 15dfa3a · upstream ↗ If you do press the jump button, it exits the rest of the cycle - so the Player doesn't move at all during the step in which you jump, vertically or horizontally.
Bugs when Jumping · archived copy ↗ Measured by a script. It fails if the result disagrees with the claim.
The numbers come from the run; its author, an AI model, checked the script measures what the claim says, 2026-10-25.
Checked by a second AI model, 2026-10-25.
- ^A normal jump sets Madeline's vertical speed to
JumpSpeed, −105 px/s.CodeNoelFB/CelesteHow we know
49 private const float JumpSpeed = -105f;Source/Player/Player.cs line 49 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 each update,
Player.Updateticks both jump timers, the state machine runsNormalUpdate(gravity, hold, and new jump), and thenMoveVappliesSpeed.Y * Engine.DeltaTime.CodeNoelFB/Celeste · JamesMcMahon/monocle-engineHow we know
742 //Var Jump 743 if (varJumpTimer > 0) 744 varJumpTimer -= Engine.DeltaTime;
Source/Player/Player.cs lines 742–744 at 1b0ce45 · upstream ↗ 908 base.Update();Source/Player/Player.cs line 908 at 1b0ce45 · upstream ↗ 935 MoveV(Speed.Y * Engine.DeltaTime, onCollideV);Source/Player/Player.cs lines 934–935 at 1b0ce45 · upstream ↗ 323 StateMachine.SetCallbacks(StNormal, NormalUpdate, null, NormalBegin, NormalEnd);Source/Player/Player.cs lines 322–323 at 1b0ce45 · upstream ↗ 97 Components.Update();Monocle/Entity.cs lines 95–98 at 759c15a · upstream ↗ Checked against the evidence by its author, an AI model, 2026-10-20.
Checked by a second AI model, 2026-10-27.
- ^
InitJSpicks one of five jump rows by take-off horizontal speed, stepping up at$09,$10,$19, and$1C.CodeXkeeper0/smb1 · Jdaster64 n.d.How we know
4943 LDA Player_XSpeedAbsolute ; check value related to walking/running speed 4944 CMP #$09 ⋮ 4947 CMP #$10 4948 BCC ChkWtr ⋮ 4950 CMP #$19 4951 BCC ChkWtr ⋮ 4953 CMP #$1c 4954 BCC ChkWtr ; note that for jumping, range is 0-4 for Y
src/prg.asm lines 4943–4955 at 1cc3c92 · upstream ↗ Less than 01000 | 01000 – 024FF | 02500 or greater
JUMPING/VERTICAL PHYSICS, Mario table · archived copy ↗ Checked against the evidence by its author, an AI model, 2026-10-20.
Checked by a second AI model, 2026-10-27.
- ^In the running game, a jump pressed on a 45° ramp built from Green Hill's
$E0ramp block adds the jump speed along the ground normal (CalcSineof his angle −$40) to both his X and Y speeds, and he doesn't move that frame: standing on the ramp, both went from 0 to −1177; running up it, from 395 and −396 to −782 and −1573.Verifiedsonicretro/s1disasm · Sonic Retro, “Sonic Physics Guide: Jumping”How we know
1226 subi.b #$40,d0 ; rotate it perpendicularly for jump trajectory 1227 jsr (CalcSine).l ; find the direction Sonic should jump 1228 muls.w d2,d1 ; apply jump force to the cosine angle 1229 asr.l #8,d1 ; shift it to upper word 1230 add.w d1,obVelX(a0) ; apply to X speed 1231 muls.w d2,d0 ; apply jump force to the sine angle 1232 asr.l #8,d0 ; shift it to upper word 1233 add.w d0,obVelY(a0) ; apply to Y speed
_incObj/01 Sonic.asm lines 1224–1233 at 15dfa3a · upstream ↗ 53 dc.w -$100,-$FF,-$FF,-$FF,-$FE,-$FE,-$FD,-$FC ; =_incObj/sub CalcSine.asm line 53 at 15dfa3a · upstream ↗ both X Speed and Y Speed must have jump_force subtracted from them, using cos() and sin() to get the right values.
Jump Velocity · archived copy ↗ Measured by a script. It fails if the result disagrees with the claim.
The numbers come from the run; its author, an AI model, checked the script measures what the claim says, 2026-10-25.
Checked by a second AI model, 2026-10-25.
- ^Both of the kid's jumps are fixed sequences in
SEQTABLE.S, with no speed or gravity: each cycleANIMCHARreads the sequence up to the next frame number, adding eachchxbyte toCharXin the direction he faces and eachchybyte to his height. The frames of both jumps add no horizontal offset of their own (Fdx0 inFRAMEDEF.S).Codejmechner/Prince-of-Persia-Apple-IIrevisedHow we know
996:next jsr getseq ;get next byte from seqtab ⋮ 999 cmp #chx ;"change x" instruction? 1000 bne :no1 ⋮ 1002 jsr getseq ;next byte is delta-x ⋮ 1004 jsr addcharx 1005 sta CharX ⋮ 1010:no1 cmp #chy ⋮ 1013 jsr getseq ⋮ 1016 adc CharY
01 POP Source/Source/COLL.S lines 996–1016 at 2524355 · upstream ↗ 346* In: A = # pixels to add (+ = fwd, - = bkwd) ⋮ 353ADDCHARX 354 bit CharFace ;-1 = left (normal)
01 POP Source/Source/CTRLSUBS.S lines 346–363 at 2524355 · upstream ↗ 21* Fimage, Fsword, Fdx, Fdy, Fcheck01 POP Source/Source/FRAMEDEF.S line 21 at 2524355 · upstream ↗ 38:16 db $10,0,0,0,$c0+3 ;standjump-9 ⋮ 66:44 db $2c,0,0,0,$c0+4 ;runjump-11
01 POP Source/Source/FRAMEDEF.S lines 38–66 at 2524355 · upstream ↗ 1654 ldy #0 1655 lda (framepoint),y 1656 sta Fimage ⋮ 1659 lda (framepoint),y ⋮ 1663 lda (framepoint),y 1664 sta Fdx
01 POP Source/Source/CTRLSUBS.S lines 1654–1664 at 2524355 · upstream ↗ Checked against the evidence by its author, an AI model, 2026-10-25.
Checked by a second AI model, 2026-10-22.
Revised after a check by a second AI model, 2026-10-25.
- ^A jump sets Banjo's vertical speed to 710 units/s (610 from water) and his gravity to −1350 units/s², half the usual −2700, and sets his horizontal speed at once to the target speed the stick gives on the ground (banjo-kazooie/walking-speed). On a frame of the jump with A up while he still rises,
bsjump_updateresets the gravity to −2700 for the rest of the jump; nothing sets −1350 again, and with A held the lighter gravity lasts past the peak. Until Banjo has learned the ability the code namesABILITY_A_HOLD_A_JUMP_HIGHER, it resets the gravity every frame. A jump entered from a peck sets neither the speed nor the gravity. A take-off from a spring pad sets a flag that skips the reset; the first frame with A up clears it after the check, so the reset starts the frame after. While that flag is set, the jump's second phase turns into the Shock Spring Jump's charge (BS_21_BSHOCK_CHARGE). Leaving the jump state for anything but a peck restores −2700. Computed without the frame steps, a held jump rises about 187 units in 0.53 s, and one released at once about 93. Super Mario 64 instead adds a quarter of the forward speed to its take-off (sm64/jump-speed) and divides the rise by 4 on each frame A is up while Mario rises faster than 20 units/frame (sm64/jump-release).Codebanjo.decomp/banjo-kazooie · n64decomp/sm64revisedHow we know
20f32 D_80364CD0 = 710.0f; 21f32 D_80364CD4 = -1350.0f;
src/core2/bs/jump.c lines 20–21 at e8d31fa · upstream ↗ 25f32 D_80364CE4 = 610.0f;src/core2/bs/jump.c line 25 at e8d31fa · upstream ↗ 41 D_8037D4C2 = baflag_isTrue(BA_FLAG_2_ON_SPRING_PAD);src/core2/bs/jump.c line 41 at e8d31fa · upstream ↗ 47 if(sp30 == BS_11_BPECK){ ⋮ 52 D_8037D4C0 = 1; ⋮ 54 else {
src/core2/bs/jump.c lines 47–54 at e8d31fa · upstream ↗ 55 D_8037D4C1 = (sp30 == BS_2D_SWIM_IDLE) || (sp30 == BS_2E_SWIM);src/core2/bs/jump.c line 55 at e8d31fa · upstream ↗ 69 func_802B6FA8(); 70 baphysics_set_horizontal_velocity(yaw_getIdeal(), baphysics_get_target_horizontal_velocity()); 71 if(D_8037D4C1){ 72 baphysics_set_vertical_velocity(D_80364CE4); 73 } else { 74 baphysics_set_vertical_velocity(D_80364CD0); ⋮ 76 baphysics_set_gravity(D_80364CD4);
src/core2/bs/jump.c lines 69–76 at e8d31fa · upstream ↗ 101 baphysics_get_velocity(velocity); 102 if((bakey_released(BUTTON_A) && 0.0f < velocity[1] && !D_8037D4C2) || !can_control_jump_height()){ 103 baphysics_reset_gravity();
src/core2/bs/jump.c lines 101–104 at e8d31fa · upstream ↗ 121 case 1://L802B14B4 122 if( 500.0f < (playerPosition_getY() - func_80294438())){ 123 sp34 = BS_2F_FALL; ⋮ 125 if(D_8037D4C2){ 126 D_8037D4C2 = 0; 127 sp34 = BS_21_BSHOCK_CHARGE;
src/core2/bs/jump.c lines 121–128 at e8d31fa · upstream ↗ 143 if(bakey_released(BUTTON_A)) 144 D_8037D4C2 = 0;
src/core2/bs/jump.c lines 143–144 at e8d31fa · upstream ↗ 171 if (bs_getNextState() != BS_11_BPECK) { 172 baphysics_reset_gravity();
src/core2/bs/jump.c lines 171–173 at e8d31fa · upstream ↗ 50 bakey.released_count[i] = bakey.pressed_count[i] 51 ? 0 52 : bakey.released_count[i] + 1;
src/core2/bakey.c lines 50–52 at e8d31fa · upstream ↗ 79int bakey_released(s32 button_indx){ 80 return bakey.released_count[button_indx];
src/core2/bakey.c lines 79–81 at e8d31fa · upstream ↗ 10f32 baphysics_default_gravity = -2700.0f; //defaultGravity 11f32 baphysics_default_terminal_velocity = -4000.0f;
src/core2/ba/physics.c lines 10–11 at e8d31fa · upstream ↗ 397void baphysics_reset_gravity(void){ 398 baphysics_set_gravity(baphysics_default_gravity);
src/core2/ba/physics.c lines 397–399 at e8d31fa · upstream ↗ 67s32 can_control_jump_height(void){ 68 return ability_hasLearned(ABILITY_A_HOLD_A_JUMP_HIGHER);
src/core2/playerutils.c lines 67–68 at e8d31fa · upstream ↗ 821 case ACT_JUMP: 822 case ACT_HOLD_JUMP: ⋮ 824 set_mario_y_vel_based_on_fspeed(m, 42.0f, 0.25f); 825 m->forwardVel *= 0.8f;
src/game/mario.c lines 821–826 at 9921382 · upstream ↗ 559 } else if (should_strengthen_gravity_for_jump_ascent(m)) { 560 m->vel[1] /= 4.0f;
src/game/mario_step.c lines 559–560 at 9921382 · upstream ↗ 528 if (!(m->input & INPUT_A_DOWN) && m->vel[1] > 20.0f) { 529 return (m->action & ACT_FLAG_CONTROL_JUMP_HEIGHT) != 0;
src/game/mario_step.c lines 528–529 at 9921382 · 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.
- ^Quake III's jump is in the shared movement code:
PM_CheckJump, called fromPM_WalkMove(so only on walkable ground), needs an up move of at least 10 and the jump-held flag clear, whichPmoveSingleclears only on a step whose up move is under 10, so holding the key never jumps twice; it then sets the vertical velocity toJUMP_VELOCITY(270), where Quake's QuakeC adds 270 to it (quake/jump). Gravity isg_gravity, 800, as in Quake. A landing from a fall faster than 200 units/s sets a land timer of 250 ms that a comment says is to "not allow another jump for a little while", butPM_CheckJumpnever tests it.Codeid-Software/Quake-III-Arena · id-Software/Quake-ToolsHow we know
29#define JUMP_VELOCITY 270code/game/bg_local.h line 29 at dbe4ddb · upstream ↗ 359static qboolean PM_CheckJump( void ) { 360 if ( pm->ps->pm_flags & PMF_RESPAWNED ) { 361 return qfalse; // don't allow jump until all buttons are up ⋮ 364 if ( pm->cmd.upmove < 10 ) { 365 // not holding jump 366 return qfalse; ⋮ 370 if ( pm->ps->pm_flags & PMF_JUMP_HELD ) { ⋮ 373 return qfalse; ⋮ 376 pml.groundPlane = qfalse; // jumping away 377 pml.walking = qfalse; 378 pm->ps->pm_flags |= PMF_JUMP_HELD; ⋮ 380 pm->ps->groundEntityNum = ENTITYNUM_NONE; ⋮
code/game/bg_pmove.c lines 359–393 at dbe4ddb · upstream ↗ 1916 if ( pm->cmd.upmove < 10 ) { 1917 // not holding jump 1918 pm->ps->pm_flags &= ~PMF_JUMP_HELD;
code/game/bg_pmove.c lines 1916–1918 at dbe4ddb · upstream ↗ 1988 } else if ( pml.walking ) { 1989 // walking on ground 1990 PM_WalkMove();
code/game/bg_pmove.c lines 1988–1990 at dbe4ddb · upstream ↗ 710 if ( PM_CheckJump () ) {code/game/bg_pmove.c line 710 at dbe4ddb · upstream ↗ 1183 // don't do landing time if we were just going down a slope 1184 if ( pml.previous_velocity[2] < -200 ) { 1185 // don't allow another jump for a little while 1186 pm->ps->pm_flags |= PMF_TIME_LAND; 1187 pm->ps->pm_time = 250;
code/game/bg_pmove.c lines 1183–1187 at dbe4ddb · upstream ↗ 143 { &g_gravity, "g_gravity", "800", 0, 0, qtrue },code/game/g_main.c line 143 at dbe4ddb · upstream ↗ 840 client->ps.gravity = g_gravity.value;code/game/g_active.c line 840 at dbe4ddb · upstream ↗ 811 self.velocity_z = self.velocity_z + 270;qcc/v101qc/client.qc line 811 at c0d1b91 · upstream ↗ Checked against the evidence by its author, an AI model, 2026-10-22.
Checked by a second AI model, 2026-10-22.
- ^
Player_InitJump, which doesn't test the character, addsPLAYER_JUMP_HEIGHT, 4.875 px/frame (2.625 in water), to the speed along the ground's normal (rotation - 64). Sonic 1'sSonic_Jumpaddsson_jumpspeed,$680(6.5 px/frame), along the normal the same way, so Sonic Advance 2's take-off is three quarters of it (computed).CodeSAT-R/sa2 · sonicretro/s1disasmHow we know
23#define PLAYER_JUMP_HEIGHT (4.875) 24#define PLAYER_JUMP_HEIGHT_UNDER_WATER (2.625)
include/game/shared/parameters/characters.h lines 23–24 at 393357f · upstream ↗ 6939void Player_InitJump(Player *p) ⋮ 6980 jumpHeight = (p->moveState & MOVESTATE_IN_WATER) ? Q(PLAYER_JUMP_HEIGHT_UNDER_WATER) : Q(PLAYER_JUMP_HEIGHT); ⋮ 6985 rot = p->rotation - 64; ⋮ 6987 accelX = I(COS_24_8(rot * 4) * jumpHeight); 6988 p->qSpeedAirX += accelX; ⋮ 6990 accelY = I(SIN_24_8(rot * 4) * jumpHeight); 6991 p->qSpeedAirY += accelY;
src/game/shared/stage/player.c lines 6939–7004 at 393357f · upstream ↗ 8son_jumpspeed: equ $680 ; Sonic's jump speed_incObj/01 Sonic.asm line 8 at 15dfa3a · upstream ↗ 1218 move.w #son_jumpspeed,d2 ; set initial jump force_incObj/01 Sonic.asm line 1218 at 15dfa3a · upstream ↗ 1226 subi.b #$40,d0 ; rotate it perpendicularly for jump trajectory 1227 jsr (CalcSine).l ; find the direction Sonic should jump
_incObj/01 Sonic.asm lines 1224–1233 at 15dfa3a · upstream ↗ Checked against the evidence by its author, an AI model, 2026-10-22.
Checked by a second AI model, 2026-10-22.
- ^In Super Mario Sunshine, by the decompilers' Player code, which doesn't yet match, a press that starts a jump through
changePlayerJumpingfirst goes to a miss jump ifisJumpMissis true, then to a spin jump ifconsiderRotateJumpStartreads the stick's recent turning as a spin, and otherwise to the status it asks for. For the single jump,MARIO_STATUS_JUMP,setStatusToJumpingsets Mario's vertical speed to 42 plus a quarter of his forward speed and multiplies the forward speed by 0.8, constants in the code rather than parameters, and the same take-off as Super Mario 64's single jump (sm64/jump-speed). On two kinds of floor, which the code tells apart only asisThing2andisThing3, the speed is replaced or added to and the jump becomesMARIO_STATUS_FORCE_JUMP; on Yoshi it is multiplied by the parametermJumpYoshiMult, and whileisSinking()is true both speeds are scaled by a factor from themGraffitoParamsset. When the new jumping status carries the bit the code callsMARIO_STATUS_FLAG_UNK2000000(0x2000000), as the single jump, the double jump, and the wall kick do,setStatusToJumpingsets bit 0x100 ofunk78, and it clears that bit for any other jumping status (other code clears it too). While that bit is set, the status has neither bit 0x1000 nor 0x20000, A isn't held, and Mario rises faster than 20,fallProcessmultiplies his vertical speed by 0.75 on each update in place of the gravity. Super Mario 64 divides it by 4 on each frame when A isn't held and Mario rises faster than 20, if itsMARIO_UNKNOWN_08flag is set, the action is neither intangible nor invulnerable, and the action hasACT_FLAG_CONTROL_JUMP_HEIGHT, the same bit, 0x02000000 (sm64/jump-release). The status numbers line up too: Sunshine's single jump is 0x2000000 | 0x800 | 0x080 (computed 0x2000880), and Super Mario 64'sACT_JUMPis 0x03000880.Code notesdoldecomp/sms · n64decomp/sm64revisedHow we know
949 PCHObject(NonMatching, "Player/MarioMove.cpp"), 950 Object(NonMatching, "Player/MarioPhysics.cpp"),
configure.py lines 949–950 at d2cc8f5 · upstream ↗ 764int TMario::changePlayerJumping(u32 param_1, u32 param_2) ⋮ 766 if (isJumpMiss()) { 767 setMissJumping(); 768 } else { 769 if (considerRotateJumpStart()) 770 return 1; ⋮ 772 changePlayerStatus(param_1, param_2, false);
src/Player/MarioMove.cpp lines 764–772 at d2cc8f5 · upstream ↗ 420void TMario::setPlayerJumpSpeed(f32 speed_mult, f32 force) ⋮ 422 mVel.y = (mForwardVel * speed_mult) + force;
src/Player/MarioMove.cpp lines 420–423 at d2cc8f5 · upstream ↗ 434 switch (status) { 435 case MARIO_STATUS_JUMP: 436 case 0x89C: 437 setPlayerJumpSpeed(0.25f, 42.0f); 438 mForwardVel *= 0.8f; ⋮ 441 if (mGroundPlane->isThing2()) { 442 mVel.y = 0.01f * mGroundPlane->getActiveJumpPower(); 443 nextStatus = MARIO_STATUS_FORCE_JUMP; ⋮ 445 } else if (mGroundPlane->isThing3()) { 446 mVel.y += -unkBC + getGroundJumpPower(); ⋮ 453 nextStatus = MARIO_STATUS_FORCE_JUMP;
src/Player/MarioMove.cpp lines 434–456 at d2cc8f5 · upstream ↗ 647 if (isSinking()) { 648 f32 scale = ((mGraffitoParams.mSinkJumpRateMax.get() ⋮ 653 mVel.y *= scale; 654 mForwardVel *= scale;
src/Player/MarioMove.cpp lines 647–654 at d2cc8f5 · upstream ↗ 663 if (onYoshi()) { 664 mVel.y *= mYoshiParams.mJumpYoshiMult.get(); ⋮ 670 if (nextStatus & MARIO_STATUS_FLAG_UNK2000000) 671 unk78 |= 0x100; 672 else 673 unk78 &= ~0x100;
src/Player/MarioMove.cpp lines 663–673 at d2cc8f5 · upstream ↗ 1482 if (mGamePad->checkMeaning(TMarioGamePad::MEANING_A)) 1483 mInput |= 0x80;
src/Player/MarioMove.cpp lines 1482–1483 at d2cc8f5 · upstream ↗ 450BOOL TMario::isFallCancel() ⋮ 452 if (!(unk78 & 0x100 ? true : false)) 453 return false; ⋮ 455 if (mStatus & 0x21000) 456 return false; ⋮ 458 if (!(mInput & 0x80) && mVel.y > 20.0f) 459 return true;
src/Player/MarioPhysics.cpp lines 450–459 at d2cc8f5 · upstream ↗ 471 if (isFallCancel()) { 472 mVel.y *= 0.75f;
src/Player/MarioPhysics.cpp lines 471–472 at d2cc8f5 · upstream ↗ 7 MARIO_STATUS_FLAG_JUMPING = 0x800,include/Player/MarioStatus.hpp line 7 at d2cc8f5 · upstream ↗ 17 MARIO_STATUS_FLAG_UNK2000000 = 0x2000000,include/Player/MarioStatus.hpp line 17 at d2cc8f5 · upstream ↗ 26 MARIO_STATUS_TYPE_JUMPING = 0x080,include/Player/MarioStatus.hpp line 26 at d2cc8f5 · upstream ↗ 119 MARIO_STATUS_JUMP = MARIO_STATUS_FLAG_UNK2000000 | MARIO_STATUS_FLAG_JUMPING 120 | MARIO_STATUS_TYPE_JUMPING | 0x0, // 0x2000880 121 MARIO_STATUS_SECOND_JUMP = MARIO_STATUS_FLAG_UNK2000000 122 | MARIO_STATUS_FLAG_JUMPING ⋮ 130 MARIO_STATUS_WALL_JUMP = MARIO_STATUS_FLAG_UNK2000000 131 | MARIO_STATUS_FLAG_JUMPING
include/Player/MarioStatus.hpp lines 119–133 at d2cc8f5 · upstream ↗ 821 case ACT_JUMP: 822 case ACT_HOLD_JUMP: ⋮ 824 set_mario_y_vel_based_on_fspeed(m, 42.0f, 0.25f); 825 m->forwardVel *= 0.8f;
src/game/mario.c lines 821–825 at 9921382 · upstream ↗ 763static void set_mario_y_vel_based_on_fspeed(struct MarioState *m, f32 initialVelY, f32 multiplier) { ⋮ 766 m->vel[1] = initialVelY + get_additive_y_vel_for_jumps() + m->forwardVel * multiplier;
src/game/mario.c lines 763–766 at 9921382 · upstream ↗ 519u32 should_strengthen_gravity_for_jump_ascent(struct MarioState *m) { 520 if (!(m->flags & MARIO_UNKNOWN_08)) { 521 return FALSE; ⋮ 524 if (m->action & (ACT_FLAG_INTANGIBLE | ACT_FLAG_INVULNERABLE)) { 525 return FALSE; ⋮ 528 if (!(m->input & INPUT_A_DOWN) && m->vel[1] > 20.0f) { 529 return (m->action & ACT_FLAG_CONTROL_JUMP_HEIGHT) != 0;
src/game/mario_step.c lines 519–529 at 9921382 · upstream ↗ 559 } else if (should_strengthen_gravity_for_jump_ascent(m)) { 560 m->vel[1] /= 4.0f;
src/game/mario_step.c lines 559–560 at 9921382 · upstream ↗ 165#define ACT_FLAG_CONTROL_JUMP_HEIGHT /* 0x02000000 */ (1 << 25)include/sm64.h line 165 at 9921382 · upstream ↗ 256#define ACT_JUMP 0x03000880 // (0x080 | ACT_FLAG_AIR | ACT_FLAG_ALLOW_VERTICAL_WIND_ACTION | ACT_FLAG_CONTROL_JUMP_HEIGHT)include/sm64.h line 256 at 9921382 · 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.
- ^A single jump sets Mario's vertical speed to 42 plus a quarter of his forward speed, in units per frame, and multiplies the forward speed by 0.8.Coden64decomp/sm64
How we know
763static void set_mario_y_vel_based_on_fspeed(struct MarioState *m, f32 initialVelY, f32 multiplier) { ⋮ 766 m->vel[1] = initialVelY + get_additive_y_vel_for_jumps() + m->forwardVel * multiplier;
src/game/mario.c lines 763–766 at 9921382 · upstream ↗ 821 case ACT_JUMP: 822 case ACT_HOLD_JUMP: ⋮ 824 set_mario_y_vel_based_on_fspeed(m, 42.0f, 0.25f); 825 m->forwardVel *= 0.8f;
src/game/mario.c lines 821–826 at 9921382 · upstream ↗ Checked against the evidence by its author, an AI model, 2026-10-21.
Checked by a second AI model, 2026-10-21.
- ^A jump sets Samus's upward
yVelocityto 170 (SAMUS_LOW_JUMP_VELOCITY), or 220 with the High Jump, with no separate suitless speed. The velocity counts eighths of a subpixel and a pixel is 4 subpixels, so these are 5.3125 and 6.875 px/frame (computed). Movement caps the velocity at 128 (16 subpixels, 4 px), so a jump's first 8 frames each rise 4 px, and a High Jump's first 16 (computed). Zero Mission's jump takes off at 192, or 232 with the High Jump, under a cap of 192: 6 px/frame from the first frame.Codemetroidret/mf · metroidret/mzmHow we know
4784 case SPOSE_RUNNING: 4785 if (gSamusDataCopy.forcedMovement == FORCED_MOVEMENT_MID_AIR_JUMP) ⋮ 4787 gSamusData.pose = SPOSE_STARTING_SPIN_JUMP; ⋮ 4789 if (gEquipment.suitMiscStatus & SMF_HIGH_JUMP) 4790 gSamusData.yVelocity = SAMUS_HIGH_JUMP_VELOCITY; 4791 else 4792 gSamusData.yVelocity = SAMUS_LOW_JUMP_VELOCITY;
src/samus.c lines 4784–4793 at a6d6187 · upstream ↗ 4929 default: 4930 gSamusData.pose = SPOSE_MID_AIR; ⋮ 4932 if (gSamusDataCopy.forcedMovement == FORCED_MOVEMENT_MID_AIR_JUMP) ⋮ 4936 else 4937 gSamusData.pose = SPOSE_MID_AIR; ⋮ 4939 if (gEquipment.suitMiscStatus & SMF_HIGH_JUMP) 4940 gSamusData.yVelocity = SAMUS_HIGH_JUMP_VELOCITY; 4941 else 4942 gSamusData.yVelocity = SAMUS_LOW_JUMP_VELOCITY;
src/samus.c lines 4929–4942 at a6d6187 · upstream ↗ 321#define SAMUS_HIGH_JUMP_VELOCITY (SUB_PIXEL_TO_VELOCITY(QUARTER_BLOCK_SIZE + EIGHTH_BLOCK_SIZE + PIXEL_SIZE - ONE_SUB_PIXEL * .5f)) 322#define SAMUS_LOW_JUMP_VELOCITY (SUB_PIXEL_TO_VELOCITY(QUARTER_BLOCK_SIZE + PIXEL_SIZE + ONE_SUB_PIXEL + ONE_SUB_PIXEL * .25f)) ⋮ 327#define SAMUS_Y_VELOCITY_CAP (SUB_PIXEL_TO_VELOCITY(QUARTER_BLOCK_SIZE))
include/constants/samus.h lines 321–327 at a6d6187 · upstream ↗ 192#define VELOCITY_TO_SUB_PIXEL(velocity) (DIV_SHIFT((velocity), 8)) 193#define SUB_PIXEL_TO_VELOCITY(velocity) ((s32)((velocity) * 8))
include/macros.h lines 192–193 at a6d6187 · upstream ↗ 43// The amount of sub pixels a single visible pixel contains 44#define SUB_PIXEL_RATIO 4 45// The amount of visible pixels a block contains 46#define PIXEL_PER_BLOCK 16 ⋮ 49#define BLOCK_SIZE (PIXEL_PER_BLOCK * SUB_PIXEL_RATIO) ⋮ 53#define QUARTER_BLOCK_SIZE (BLOCK_SIZE / 4) ⋮ 55#define EIGHTH_BLOCK_SIZE (BLOCK_SIZE / 8) ⋮ 57#define PIXEL_SIZE (BLOCK_SIZE / PIXEL_PER_BLOCK) ⋮ 59#define ONE_SUB_PIXEL (PIXEL_SIZE / PIXEL_SIZE)
include/types.h lines 43–59 at a6d6187 · upstream ↗ 5526 // Check is within the bounds 5527 if (gSamusData.yVelocity > gSamusPhysics.yVelocityCap) 5528 velocity = VELOCITY_TO_SUB_PIXEL(gSamusPhysics.yVelocityCap); 5529 else if (gSamusData.yVelocity < -gSamusPhysics.yVelocityCap) 5530 velocity = VELOCITY_TO_SUB_PIXEL(-gSamusPhysics.yVelocityCap); 5531 else 5532 velocity = VELOCITY_TO_SUB_PIXEL(gSamusData.yVelocity); ⋮ 5538 gSamusData.yPosition -= velocity;
src/samus.c lines 5526–5538 at a6d6187 · upstream ↗ 336#define SAMUS_HIGH_JUMP_VELOCITY (SUB_PIXEL_TO_VELOCITY(QUARTER_BLOCK_SIZE + PIXEL_SIZE * 3 + ONE_SUB_PIXEL)) 337#define SAMUS_LOW_JUMP_VELOCITY (SUB_PIXEL_TO_VELOCITY(QUARTER_BLOCK_SIZE + EIGHTH_BLOCK_SIZE)) 338#define SAMUS_SUITLESS_JUMP_VELOCITY (SUB_PIXEL_TO_VELOCITY(QUARTER_BLOCK_SIZE + EIGHTH_BLOCK_SIZE + PIXEL_SIZE / 2 + ONE_SUB_PIXEL / 2.f))
include/constants/samus.h lines 336–338 at 2aae289 · upstream ↗ 325#define SAMUS_Y_POSITIVE_VELOCITY_CAP 192include/constants/samus.h line 325 at 2aae289 · upstream ↗ Checked against the evidence by its author, an AI model, 2026-10-22.
Checked by a second AI model, 2026-10-22.
- ^A jump sets Samus's upward
yVelocityto 192 (SAMUS_LOW_JUMP_VELOCITY), 232 with the High Jump active, or 212 without the suit, which is checked first. The velocity counts eighths of a subpixel and a pixel is 4 subpixels, so these are 6, 7.25, and 6.625 px/frame (computed). Movement caps the velocity at 192 (24 subpixels, 6 px), so the High Jump's first five frames each rise 6 px (computed). Metroid's jump always takes off at 4 px/frame, and its High Jump Boots lower the gravity instead of raising the speed.Codemetroidret/mzm · nmikstas/metroid-disassemblyrevisedHow we know
1863 if (pCopy->forcedMovement == FORCED_MOVEMENT_MID_AIR_JUMP) ⋮ 1865 // Set mid air pose, spinning if holding a sideways direction 1866 if (gButtonInput & (KEY_RIGHT | KEY_LEFT)) 1867 pData->pose = SPOSE_STARTING_SPIN_JUMP; 1868 else 1869 pData->pose = SPOSE_MIDAIR; ⋮ 1871 // Set Y velocity 1872 if (pEquipment->suitType == SUIT_SUITLESS) 1873 pData->yVelocity = SAMUS_SUITLESS_JUMP_VELOCITY; 1874 else if (pEquipment->suitMiscActivation & SMF_HIGH_JUMP) 1875 pData->yVelocity = SAMUS_HIGH_JUMP_VELOCITY; 1876 else ⋮
src/samus.c lines 1863–1877 at 2aae289 · upstream ↗ 1700 // Starting a jump, always a spin jump because running implies a direction was held 1701 pData->pose = SPOSE_STARTING_SPIN_JUMP; ⋮ 1703 // Set jump velocity 1704 if (pEquipment->suitType == SUIT_SUITLESS) 1705 pData->yVelocity = SAMUS_SUITLESS_JUMP_VELOCITY; 1706 else if (pEquipment->suitMiscActivation & SMF_HIGH_JUMP) 1707 pData->yVelocity = SAMUS_HIGH_JUMP_VELOCITY; 1708 else 1709 pData->yVelocity = SAMUS_LOW_JUMP_VELOCITY;
src/samus.c lines 1700–1709 at 2aae289 · upstream ↗ 336#define SAMUS_HIGH_JUMP_VELOCITY (SUB_PIXEL_TO_VELOCITY(QUARTER_BLOCK_SIZE + PIXEL_SIZE * 3 + ONE_SUB_PIXEL)) 337#define SAMUS_LOW_JUMP_VELOCITY (SUB_PIXEL_TO_VELOCITY(QUARTER_BLOCK_SIZE + EIGHTH_BLOCK_SIZE)) 338#define SAMUS_SUITLESS_JUMP_VELOCITY (SUB_PIXEL_TO_VELOCITY(QUARTER_BLOCK_SIZE + EIGHTH_BLOCK_SIZE + PIXEL_SIZE / 2 + ONE_SUB_PIXEL / 2.f))
include/constants/samus.h lines 336–338 at 2aae289 · upstream ↗ 314#define VELOCITY_TO_SUB_PIXEL(velocity) (DIV_SHIFT((velocity), 8)) 315#define SUB_PIXEL_TO_VELOCITY(velocity) ((s16)((velocity) * 8))
include/constants/samus.h lines 314–315 at 2aae289 · upstream ↗ 47// The amount of sub pixels a single visible pixel contains 48#define SUB_PIXEL_RATIO 4 49// The amount of visible pixels a block contains 50#define PIXEL_PER_BLOCK 16 ⋮ 53#define BLOCK_SIZE (PIXEL_PER_BLOCK * SUB_PIXEL_RATIO) ⋮ 57#define QUARTER_BLOCK_SIZE (BLOCK_SIZE / 4) ⋮ 61#define EIGHTH_BLOCK_SIZE (BLOCK_SIZE / 8) ⋮ 63#define PIXEL_SIZE (BLOCK_SIZE / PIXEL_PER_BLOCK) ⋮ 65#define ONE_SUB_PIXEL (PIXEL_SIZE / PIXEL_SIZE)
include/types.h lines 47–65 at 2aae289 · upstream ↗ 6758 if (pData->yVelocity > gSamusPhysics.positiveYVelocityCap) ⋮ 6760 velocity = DIV_SHIFT(gSamusPhysics.positiveYVelocityCap, 8); ⋮ 6766 else ⋮ 6768 velocity = DIV_SHIFT(pData->yVelocity, 8); ⋮ 6776 pData->yPosition -= velocity;
src/samus.c lines 6758–6776 at 2aae289 · upstream ↗ 325#define SAMUS_Y_POSITIVE_VELOCITY_CAP 192include/constants/samus.h line 325 at 2aae289 · upstream ↗ 2672SetSamusJump: ⋮ 2681 LDA #$FC 2682 STA ObjVertSpeed ⋮ 2686 LDA SamusGear ⋮ 2693LCFF3: LDY #$18 ; gravity (high value -> low jump) 2694 LDA SamusGear 2695 AND #gr_HIGHJUMP 2696 BEQ + ; branch if Samus doesn't have High Jump 2697 LDY #$12 ; lower gravity value -> high jump! 2698* STY SamusGravity
Source_Files/Bank07.asm lines 2672–2698 at 4270d57 · 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.
- ^Every jump takes off with the whole part of Samus's vertical speed at
$FC, 4 px/frame up. The High Jump Boots change the gravity, not the speed:SetSamusJumpsetsSamusGravityto$18, or$12with the boots.Codenmikstas/metroid-disassemblyHow we know
2672SetSamusJump: ⋮ 2681 LDA #$FC 2682 STA ObjVertSpeed ⋮ 2686 LDA SamusGear ⋮ 2693LCFF3: LDY #$18 ; gravity (high value -> low jump) 2694 LDA SamusGear 2695 AND #gr_HIGHJUMP 2696 BEQ + ; branch if Samus doesn't have High Jump 2697 LDY #$12 ; lower gravity value -> high jump! 2698* STY SamusGravity
Source_Files/Bank07.asm lines 2672–2698 at 4270d57 · upstream ↗ Checked against the evidence by its author, an AI model, 2026-10-21.
Checked by a second AI model, 2026-10-21.
- ^Measured in the game, Simon's standing jump is the same with A held 1, 2, 5, 10, 20, or 40 frames, 36 px high on frame 17 and back on the ground on frame 41.Verified“Castlevania (USA) (Rev 1)”
How we know
In the cartridge (“Castlevania (USA) (Rev 1)”): bank 6 $9B1E-$9B8A; the arc routine reads no buttons; bank 6 $94C5-$94C9, where the jumping state runs the arc routine every frame. We don't reproduce the bytes.
Measured by a script in MesenCE 2.2.1 (build 4b8a196), on Castlevania (USA) (Rev 1) (SHA-1
4e3ef47de86a…). It fails if the result disagrees with the claim.The numbers come from the run; its author, an AI model, checked the script measures what the claim says, 2026-10-20.
Checked by a second AI model, 2026-10-21.
- ^Mario gets no grace window after leaving a ledge;
ProcJumpingrefuses airborne jumps unless he is swimming.CodeXkeeper0/smb1How we know
4922 LDA Player_State ; check player state 4923 BEQ InitJS ; if on the ground, branch 4924 LDA SwimmingFlag ; if swimming flag not set, jump to do something else 4925 BEQ NoJump ; to prevent midair jumping, otherwise continue
src/prg.asm lines 4921–4925 at 1cc3c92 · upstream ↗ Checked against the evidence by its author, an AI model, 2026-10-20.
Checked by a second AI model, 2026-10-27.
- ^Mega Man gets no grace window after leaving a ledge; a grounded state that finds no floor switches to the jumping state, which looks for a press only on the frame it lands.Verifiedlsmmega/mm2
How we know
86 JSR _check_object_vertical_move 87 LDA z:z00 88 BNE _run_megaman_landing_common_1 89 LDA #$06 90 STA z:zmegaman_status
engine/run_megaman.asm lines 86–92 at 94f0bf3 · upstream ↗ engine/run_megaman.asm#L160-L242 · upstream ↗ Measured by a script in MesenCE 2.2.1 (build 4b8a196), on . It fails if the result disagrees with the claim.
The numbers come from the run; its author, an AI model, checked the script measures what the claim says, 2026-10-22.
Checked by a second AI model, 2026-10-21.
Checked by a second AI model, 2026-10-22.
- ^In the running game, on flat ground, when Sonic walks off a ledge a jump press on any of the next 5 frames gives him no upward speed, because only the grounded modes,
Sonic_MdNormalandSonic_MdRoll, callSonic_Jump.Verifiedsonicretro/s1disasmrevisedHow we know
113Sonic_Modes: dc.w Sonic_MdNormal-Sonic_Modes ; 0 - while on the ground and not rolling 114 dc.w Sonic_MdJump-Sonic_Modes ; 2 - while in the air and not rolling
_incObj/01 Sonic.asm lines 113–116 at 15dfa3a · upstream ↗ 318 bsr.w Sonic_Jump ; check if we need to jump_incObj/01 Sonic.asm line 318 at 15dfa3a · upstream ↗ 348 bsr.w Sonic_Jump ; check if we need to jump_incObj/01 Sonic.asm line 348 at 15dfa3a · upstream ↗ Measured by a script. It fails if the result disagrees with the claim.
The numbers come from the run; its author, an AI model, checked the script measures what the claim says, 2026-10-25.
Revised after a check by a second AI model, 2026-10-25.
Sources
Code
- doppelganger and Xkeeper. 2022. “smb1: Super Mario Bros. disassembly for asm6f (Xkeeper0/smb1).” Commit 1cc3c92. Xkeeper0/smb1 @ 1cc3c92 · licence, all uses
- 1987. “Castlevania (USA) (Rev 1).” · licence, all uses
- lsmmega. 2026. “mm2: Mega Man 2 disassembly (lsmmega/mm2).” Commit 94f0bf3. lsmmega/mm2 @ 94f0bf3 · licence, all uses
- IsoFrieze, kaizoman666, mikeyk, and loveemu. 2026. “SMWDisX: Super Mario World disassembly (IsoFrieze/SMWDisX).” Commit 30643c7. IsoFrieze/SMWDisX @ 30643c7 · licence, all uses
- Thorson, Maddy and Noel Berry. 2021. “Celeste: released class files (NoelFB/Celeste).” Commit 1b0ce45. NoelFB/Celeste @ 1b0ce45 · licence, all uses
- Sonic Retro contributors. 2026. “s1disasm: Sonic the Hedgehog (16-bit) disassembly (sonicretro/s1disasm).” Commit 15dfa3a. sonicretro/s1disasm @ 15dfa3a · licence, all uses
- Thorson, Maddy. 2018. “Monocle Engine (public source, GitHub mirror JamesMcMahon/monocle-engine).” Commit 759c15a. JamesMcMahon/monocle-engine @ 759c15a · licence, all uses
- Mechner, Jordan. 2024. “Prince of Persia Apple II source code (jmechner/Prince-of-Persia-Apple-II).” Commit 2524355. jmechner/Prince-of-Persia-Apple-II @ 2524355 · licence, all uses
- banjo.decomp. 2026. “banjo-kazooie: a decompilation of Banjo-Kazooie (banjo.decomp/banjo-kazooie).” Commit e8d31fa. banjo.decomp/banjo-kazooie @ e8d31fa · licence, all uses
- n64decomp. 2023. “sm64: a decompilation of Super Mario 64 (n64decomp/sm64).” Commit 9921382. n64decomp/sm64 @ 9921382 · licence, all uses
- Software, id. 2012. “Quake III Arena: the GPL source release (id-Software/Quake-III-Arena, 1.32b).” Commit dbe4ddb. id-Software/Quake-III-Arena @ dbe4ddb · licence, all uses
- Software, id. 2012. “Quake: the QuakeC source and compiler (id-Software/Quake-Tools, qcc/v101qc).” Commit c0d1b91. id-Software/Quake-Tools @ c0d1b91 · licence, all uses
- SAT-R contributors. 2026. “sa2: a decompilation of Sonic Advance 1 and 2 (SAT-R/sa2).” Commit 393357f. SAT-R/sa2 @ 393357f · licence, all uses
- doldecomp. 2026. “sms: a decompilation of Super Mario Sunshine (doldecomp/sms).” Commit d2cc8f5. doldecomp/sms @ d2cc8f5 · licence, all uses
- metroidret contributors. 2026. “mf: a decompilation of Metroid Fusion (metroidret/mf).” Commit a6d6187. metroidret/mf @ a6d6187 · licence, all uses
- metroidret contributors. 2026. “mzm: a decompilation of Metroid: Zero Mission (metroidret/mzm).” Commit 2aae289. metroidret/mzm @ 2aae289 · licence, all uses
- nmikstas and Kent Hansen. 2025. “metroid-disassembly: Metroid software disassembly.” Commit 4270d57. nmikstas/metroid-disassembly @ 4270d57 · licence, all uses
- plasticsmoke. 2026. “Mega Man 3 (U), annotated ca65 disassembly (plasticsmoke).” Commit 58ca1c3. plasticsmoke/megaman3-disassembly-ca65 @ 58ca1c3 · licence, all uses
- plasticsmoke. 2026. “Mega Man 4 (U), annotated ca65 disassembly (plasticsmoke).” Commit a63bb6e. plasticsmoke/megaman4-disassembly-ca65 @ a63bb6e · licence, all uses
- 1992. “Mega Man 4 (USA) (Rev 1).” · licence, all uses
- plasticsmoke. 2026. “Mega Man 5 (U), annotated ca65 disassembly (plasticsmoke).” Commit 7fd6512. plasticsmoke/megaman5-disassembly-ca65 @ 7fd6512 · licence, all uses
- 1988. “Castlevania II - Simon's Quest (USA).” · licence, all uses
- vinheim3. 2020. “castlevania3-disasm: a disassembly of Castlevania III: Dracula's Curse.” Commit 3272648. vinheim3/castlevania3-disasm @ 3272648 · licence, all uses
- 1990. “Castlevania III - Dracula's Curse (USA).” · licence, all uses
- 1991. “Super Castlevania IV (USA).” · licence, all uses
- Xeeynamo and sotn-decomp contributors. 2026. “sotn-decomp: a decompilation of Castlevania: Symphony of the Night.” Commit 2be55ee. Xeeynamo/sotn-decomp @ 2be55ee · licence, all uses
- Sonic Retro contributors. 2026. “s2disasm: Sonic the Hedgehog 2 (16-bit) disassembly (sonicretro/s2disasm).” Commit 4ef457c. sonicretro/s2disasm @ 4ef457c · licence, all uses
- Sonic Retro contributors. 2026. “skdisasm: Sonic 3 & Knuckles disassembly (sonicretro/skdisasm).” Commit 73de97c. sonicretro/skdisasm @ 73de97c · licence, all uses
Secondary
- Jdaster64. n.d. “A Complete Guide to SMB's Physics Engine.” original · archived · licence, all uses
- Sonic Retro contributors. 2023. “Sonic Physics Guide: Jumping.” Sonic Retro. original · archived · licence, all uses