On this page
  1. Across games
  2. Variants and combinations
  3. Related
  4. Games
  5. References
  6. Sources

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.

Interactive: movement-lab (needs JavaScript)

Take-off: one game from a standstill, a walk, and a run; or three games from the same run

#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-offMoves on the press frame
Super Mario Bros.−4 px/frame (−5 running)32yes33
Castlevaniano speed; a table of steps, 36 px in 20 steps6no8
Mega Man 24.87 px/frame ($04.$DF)14no3
Super Mario World−5 to −6.06 px/frame (spin −4.63 to −5.63)23no24
Sonic the Hedgehog6.5 px/frame ($680)34no35
Celeste-105 px/s36yes37

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

GameYearHowNote
Castlevania1986Tableevery jump follows the same fixed arc
Castlevania III: Dracula's Curse1989Tablethe same arc as Castlevania's jump; Grant has a jump of his own
Prince of Persia1989Tabletwo 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 Land1989Tablea table of per-frame steps, retraced in reverse for the fall; a running jump starts it two steps earlier
Metroid II: Return of Samus1991Tablea held linear rise, then one pixel step per frame from a 79-entry table
Metroid1986One speed4 px/frame up for every jump; the High Jump Boots lower the gravity instead
Castlevania II: Simon's Quest1987One speedevery jump leaves the ground at the same speed and slows under gravity
Contra1987One speed4.06 px/frame outdoors, 3.44 in the base
Mega Man1987One speedevery jump takes off at the same speed
Mega Man 21988One speedevery jump takes off at the same speed
Mega Man 31990One speedevery jump takes off at the same speed; Rush Coil throws him far higher
Super C1990One speedContra's outdoor 4.06 px/frame, or 3 out of water
Mega Man 41991One speedevery jump takes off at the same speed
Sonic the Hedgehog1991One speedout of water every jump takes off at one speed, straight out from the ground under him
Super Castlevania IV1991One speedevery jump leaves the ground at the same speed
Mega Man 51992One speedevery jump takes off at Mega Man 4's speed, upside down in Gravity Man's stage
Sonic the Hedgehog 21992One speedout of water every jump takes off at one speed
Mega Man 61993One speedevery jump takes off at the same speed, a little faster than in Mega Man 5
Sonic 3 & Knuckles1994One speedSonic and Tails take off at one speed, Knuckles slower
Quake1996One speedthe QuakeC adds 270 units/s upward, and only after the button has been released since the last jump
Castlevania: Symphony of the Night1997One speedevery jump leaves the ground at the same speed
Quake II1997One speedadds 270 units/s upward, at least 270 in all, and only after the key has been released since the last jump
Banjo-Kazooie1998One speed710 units/s up whatever the run, and the horizontal speed set at once to the stick's target
Quake III Arena1999One speedthe vertical velocity is set to 270, not added to, and only after the key has been released since the last jump
Sonic Advance 22002One speed4.875 px/frame along the ground's normal, three quarters of Sonic 1's
Celeste2018One speedevery jump takes off at the same speed
Super Mario Bros.1985Speed from the runthe faster Mario moves at take-off, the faster and higher he jumps: standing, walking, and running jumps differ
Super Mario Bros.: The Lost Levels1986Speed from the runSuper Mario Bros.'s jumps: the faster the run-up, the higher the jump
Super Mario Bros. 31988Speed from the runone take-off speed plus a small boost from the run, 3.5 to 4 px/frame
Super Mario World1990Speed from the runone of eight take-off speeds, by horizontal speed
Super Mario 641996Speed from the run42 units/frame plus a quarter of the forward speed, with a double and a triple jump chained from landings
Super Mario Sunshine2002Speed from the run42 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. 21988Speed by stateeach character's table picks the take-off speed by running, a charged crouch, and carrying
Super Metroid1994Speed by statea table by medium and the Hi-Jump Boots, 4.875 px/frame in air or 6 with the boots
Metroid Fusion2002Speed by state5.3 px/frame up, 6.9 with the High Jump, held to 4 px/frame by the speed cap
Metroid: Zero Mission2004Speed by state6 px/frame up, 7.25 with the High Jump, 6.625 without the suit
Every claim about this mechanic, by game (148)
Super Mario Bros. 1985A jump starts only on the frame A goes down while Mario is grounded; InitJS zeroes the vertical subpixel and sets the jumping state.Code
InitJS picks one of five jump rows by take-off horizontal speed, stepping up at $09, $10, $19, and $1C.Code
PlayerYSpdData starts a jump at −4 px/frame (rows 0–2) or −5 px/frame (rows 3–4).Code
InitMForceData gives jump rows 0–4 a zero speed fraction, so take-off is exactly −4.00 or −5.00 px/frame.Code
The press frame already moves Mario, since PlayerPhysicsSub starts the jump before the state dispatch runs JumpSwimSub and MovePlayerVertically.Code
Swimming jumps use row 5 of the jump tables, or row 6 in a whirlpool.Code
InitJS leaves Mario's horizontal speed alone and sets the jumping state before X_Physics runs, so the press frame already uses the air rules, and the take-off speed only picks the jump row.Code
On landing, PlayerBGCollision snaps Mario's Y to a 16 px row and zeroes his vertical speed and its fraction, then sets the ground state; his horizontal speed is untouched, and the ground rules apply from the next frame.Verified
Mario leaves a ledge on the frame his horizontal move leaves neither foot point over a block; the falling state that PlayerBGCollision sets first then stays, so he ends that frame in the air, with a vertical speed of 0, and starts falling on the next. Walking right, the left foot point decides, so he walks 5 px past the edge (measured); walking left, the right foot point decides, 4 px past it (from the code's points).Verified
When a foot point finds an ordinary solid block and Mario isn't moving up, PlayerBGCollision lands him if his Y is less than 5 px into the block's 16 px row; 5 px or more, it calls ImpedePlayerMove in his moving direction instead, which pushes him 1 px back unless he is already moving away, and leaves without checking his sides.Code
Mario can jump off a wall because the foot check counts a block in the wall's side as ground. If his move into a wall puts a foot point in a wall block while he is falling and less than 5 px below a block boundary, PlayerBGCollision lands him there; he starts the next frame on the ground, so a fresh press of A then jumps.Code
A wall jump's press has to come on a frame that starts with Mario caught on the wall's side, which is the frame after the catch and, when his foot went 1 px deeper, the frame after that too. Measured in the cartridge with big Mario, the window was one frame for a walking jump into a wall laid into World 1-1's start, two for a running hop into the level's first pipe, unedited, and one for a running hop from the bricks into World 2-1's last wall (smb1/world-2-1-wall-jump); a press on the catch frame itself, or one frame after the window, did nothing.Verified
Super Mario Wiki counts Super Mario Bros.' wall jump among the glitches that resemble the later, designed Wall Jump, with "frame-perfect timing"; TASVideos' resource page explains it by the floor check running during the push out of a wall, and asks for speed above 16 (1 px/frame) toward the wall and feet meeting it at a block boundary.Wiki
World 1-1's first four pipes stand at block columns 28, 38, 46, and 57, each two blocks wide, with their tops on rows 9, 8, 7, and 7, so 2, 3, 4, and 4 blocks above the floor; the fourth is the one Mario can enter.Code
World 2-1 ends with a column of solid blocks two wide and ten high, at block columns 190 and 191 from the level's start, rows 1 to 10, so its top is 160 px above the floor. Two columns before it is a jumpspring (column 188); over the ground in front of that are two bricks on row 7 (columns 185 and 186, tops 64 px up) and, over the second, a hidden coin block on row 3 (top 128 px up).Verified
No jump from the floor or the bricks in front of it clears World 2-1's last wall, and a wall jump from the bricks does. Measured in the cartridge with big Mario, starting from the wall's screen: after a running hop onto the bricks, a running jump from them with A held peaked 147 px above the floor, short of the wall's top at 160, and he next stood on the floor. From the floor, by arithmetic rather than a run, his highest jump's 83 px rise can't reach 160. A 4-frame hop from the bricks brought his foot to the wall's side 80 px up on the way down, at the end of frame 91; a press on frame 92 jumped him to 163 px and onto the top, and presses on frames 91 and 93 didn't jump. The level has another way up without a wall jump: the hidden coin block over the second brick, once hit, is a ledge 128 px up, and a jump from it reaches the top.Verified
When the head point finds a block in the solid ranges (smb1/head-kinds), PlayerBGCollision sets Mario's vertical speed byte to 1 and plays the bump sound; his position and the speed's fraction are left as they are, so the frame ends with his head inside the block and he starts down on the next. In water levels, and while BlockBounceTimer runs (smb1/bounce-timer), a brick or ? block gets the same speed of 1 without the sound and without being hit.Verified
Castlevania 1986In 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
Simon'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
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
Measured frame by frame, Simon's standing jump follows the table exactly, from a motionless press frame to a landing 40 frames later.Verified
The standing state moves Simon before it checks A, so the press frame walks at 1 px/frame; the take-off then fixes the jump's direction from the d-pad held on that frame, and the jumping state moves him 1 px/frame that way or not at all.Verified
A jump lands during the jumping state's frame, after that frame's move in the take-off direction; from the next frame the standing state takes the d-pad again, so Simon stops at once or walks at 1 px/frame.Verified
Walking off a ledge puts Simon in a falling state that moves him on in his facing direction at 1 px/frame and down 8 px/frame; landing after 8 or more falling frames drops him into a crouch for 16 frames.Verified
From the turn of its table on, the jumping state tests the floor after each frame's step, so a jump lands on any top its floor points meet on the way down, above or below take-off height; the landing snaps Y up to a multiple of 16. Each 8 px frame past the table's end counts in the fall counter the take-off zeroed, and landing with it at 8 or more starts the 16-frame landing crouch. This holds outside stage $0A and when he isn't whipping as he lands (see notes).Verified
Simon can't jump from under a block on his head. On the frame A goes down, after that frame's walk step, the standing state tests three points 19 px above his center, at x−7, x, and x+7; if any is solid (below screen Y 48), the press is dropped. That frame then runs as one with neither A nor Down: he turns to the d-pad but doesn't crouch or whip, and holding A out from under the block doesn't jump, since only a new press does.Verified
Once Simon is in the air, no ceiling is tested: a block over his head doesn't cut a jump short. The jumping state calls no ceiling test; it runs the direction and move routines, the arc step, and from the turn on the floor test. His head rises into the block on the same arc as in the open, and the block stops him moving sideways only where his wall points meet it.Verified
Metroid 1986Every 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: SetSamusJump sets SamusGravity to $18, or $12 with the boots.Code
A jump from a standstill starts after the press frame's move: SamusStand calls SetSamusData, which moves her, and then SetSamusJump, so she first rises on the next frame. A running jump's handler calls SetSamusJump (LCD40) before SetSamusData, so she rises on the press frame, and there it sets her top speed for the jump, SamusHorzSpdMax, to $12.Code
Moving down, and not in the ball, Samus stops when MoveSamusDown finds a solid tile under her: StopVertMovement clears her vertical speed, SamusGravity is set to 0, and the frame goes on to her horizontal move. A jump from a standstill ends on the next frame: SamusJump finds SamusGravity at 0 and calls StopHorzMovement, which stops her and makes her stand, so she doesn't move that frame, and a jump press then does nothing, since the jumping handler starts a jump only in lava. In the ball (sa_Roll), a landing halves her downward speed and turns it upward, a bounce, until the halved whole speed is 0 and she stops.Code
Blocked moving up, Samus's vertical speed, whole byte and fraction, is shifted right one bit with the sign bit set (sec, ror ObjVertSpeed, ror VertCntrLinear). An upward speed is halved and stays upward, though the comment says the shift reverses her direction. The rest of that frame's rise is dropped. Each later frame that would still move her up is blocked and halved again, until gravity turns her speed downward.Code
Super Mario Bros.: The Lost Levels 1986The Lost Levels keeps Super Mario Bros.'s movement tables for Mario byte for byte. Take-off speeds, held and falling gravities, frictions, and top speeds all match.Code
Picking Luigi copies his own gravities and frictions over Mario's: held gravity $18–$22 for the five jump rows against Mario's $1E–$28, falling gravity $3E–$5D against $60–$90, and friction $B4, $68, $A0 against $E4, $98, $D0. It also writes an RTS over the ASL that doubles Mario's friction when he faces away from his motion. His take-off speeds are Mario's. Each area's setup loads the chosen player's set; the axe at the end of a castle loads Mario's set and ASL back for the walk that follows, whoever is playing, until the next area loads the player's own again.Code
The player's control and movement code (GameRoutines through ImposeFriction) is Super Mario Bros.'s, instruction for instruction in 14 of its 19 regions, with these changes: OnGroundStateSub and the jump and swim code move the player through a new JmpMove, which lets the wind push them (BlowPlayerAround) once a disk file beyond worlds 1 to 4 is loaded; PlayerPhysicsSub's friction table moves up to follow the fall forces, inside the 17 bytes that LoadPhysicsData overwrites with Mario's or Luigi's set; PlayerEndLevel queues the level-end music once, guarded by a new FlagpoleMusicFlag, where Super Mario Bros. queues it whenever ScrollLock is set, and sets the hidden 1-up's flag on 10 coins in any world, where Super Mario Bros. reads a per-world table, and starts world 9 over after 9-4; PlayerDeath shares one RTS. The entrances, pipes, size change, injury blink, flagpole slide, falling, climbing, animation speed and ImposeFriction differ only in their addresses.Code
Contra 1987A jump in the US NES Contra sets the 16-bit vertical speed to $FB.$F0, a rise of 4.06 px/frame ($FC.$90, 3.44 px/frame, in the indoor base levels), and the jump routine adds $23 to it every airborne frame, 0.137 px/frame², without reading a button: the jump's height doesn't depend on holding A.Code
Mega Man 1987A fresh A press on the ground sets Mega Man's upward speed to $04.$DF, 4.87 px/frame.Code
Mega Man 2 keeps Mega Man's jump and running numbers. Both take off at $04.$DF, subtract $40 of 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.Code
When a falling Mega Man's floor points find a block, _objects_vertical_moving sets his Y to the top of that 16 px tile less 12, which puts his feet on it, zeroes the Y fraction, and sets the speed to −0.75 px/frame (ground-check); so a fall of up to 12 px a frame always ends on the top of the tile it meets.Verified
No grounded frame tests the ceiling, since Mega Man's vertical speed on the ground is −0.75 px/frame (ground-check) and the vertical move tests only the floor at a negative speed; the jump press then sets the jump speed without testing the ceiling, so a press under a block still starts the jump, and the rise meets the block on a later frame. Measured in Mesen at the start of Bomb Man's stage, under a 16 px block the probe adds to the stage's collision.Verified
A jump press returns before the animation changes, and the jumping animation is set only after the next frame's move, so the press frame and the one after both move at the ground animation's speed (two frames of 1.375 px/frame from a run, of 0.125 from a first step, and none from standing still); from the third frame the air speed applies.Verified
Mega Man lands running, at 1.375 px/frame from the next frame with no first step, only if Left or Right is held on the landing frame itself; with the direction let go on that frame he lands standing, and with nothing held then or the frame before he lands into the landing animation, which moves no faster than standing. A direction pressed fresh on the landing frame starts the first step.Verified
Castlevania II: Simon's Quest 1987Simon'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
Mega Man 2 1988In the standing, walking, running, and landing states, a fresh A press (zjoy1_pressed_bits) copies zjump_speed into Mega Man's vertical speed after the frame's move, so the press frame doesn't lift him.Code
Mega Man's jump speed is $04.$DF, 4.87 px/frame upward, out of water ($05.$80 in water).Code
The jump check runs after the frame's move, so the press frame moves at the ground state's speed, and from the next frame the jumping state's 1.3125 px/frame (or nothing, with no direction held) replaces any run.Verified
Mega Man lands into the running state if Left or Right was held on the frame before landing, at 1.375 px/frame from the next frame with no first step, and into the landing-stop state otherwise.Verified
When a falling Mega Man's floor points find a block, _check_object_vertical_move subtracts (Y + 12) mod 16 from his Y, which puts his feet on that 16 px tile's top, zeroes the Y fraction and the vertical speed, then takes one step of gravity from the speed; so a fall of up to 12 px a frame always ends on the top of the tile it meets.Verified
No grounded state tests the ceiling, since each grounded frame leaves Mega Man's vertical speed at −0.25 px/frame (ground-check) and the vertical move tests only the floor at a negative speed; the jump press then sets the jump speed and the jumping state without a test, so a jump always starts under a ceiling, and the rise first meets it on a later frame.Verified
Under a block 32 px above the floor, 8 px over his head, a standing jump meets the block on its second rising frame and lands on frame 11, with his feet 0, 5, 8, 8, 8, 7, 6, 5, 3, 1, and 0 px up on frames 1-11.Verified
Super Mario Bros. 2 1988PlayerStartJump first checks quicksand: sunk with QuicksandDepth 2 or more, the player takes off at JumpHeightQuicksand, $E0 for 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 $08 or more), a charged crouch (CrouchJumpTimer at $3C), and holding an item. A charged jump clears the running bit.Code
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 $04 and $07. With an item, see carry-stats.Verified
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 $01 and $02. With an item, see carry-stats.Verified
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 $04 and $07. With an item, see carry-stats.Verified
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 $04 and $07. With an item, see carry-stats.Verified
Holding Down on the ground charges the crouch jump for 60 frames, except on a flying carpet or in quicksand. Crouched on the ground, left and right do nothing; in the air, with Down held, they still steer. Let go of Down before then and the charge is lost; let go after and it is kept until left or right is pressed or the player jumps.Code
Doki Doki Panic's disk holds Super Mario Bros. 2's character stats table, 92 bytes in the same layout. Mario's, Toad's, and the Princess's 23 bytes each equal the first, second, and fourth blocks on the disk. Luigi's block, the third, differs only in its six take-off speeds, each $02 lower in SMB2, so read as SMB2 reads them, Luigi leaves the ground 0.125 px/frame faster than the disk's block would. The four offsets before the table hold the same values, with the last two swapped.Code
Both games have the charged crouch jump. Doki Doki Panic's manual says the character flashes while Down is held and then jumps about 1.5 times as high as a standing jump, and Super Mario Bros. 2's manual says the same of its power squat jump. SMB2's code charges it after 60 frames of crouching on the ground (smb2/jump-start).Manual
Super Mario Bros. 3 1988A jump takes off at PLAYER_JUMP, -$38, minus Player_SpeedJumpInc indexed by the whole part of Mario's horizontal speed: -$38, -$3A, -$3C, or -$40. Measured in Mesen from power-on as Raccoon Mario at World 1-1's start, a jump from a standstill and one at the full-meter speed $38 take off at -$38 and -$40 (the first frame's speed, one more after that frame's held-A gravity).Verified
A jump starts on the frame A goes down if Mario is on the ground, or in the air while Player_AllowAirJump is counting down.Code
Castlevania III: Dracula's Curse 1989Dracula'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.Code
Prince of Persia 1989The kid's horizontal position, CharX, counts in units of 14 to a block: the left edges of the blocks (BlockEdge) step by 14, and the screen is 140 units wide, so it holds 10 blocks (computed). A floor is 63 px tall (BlockHeight).Code
Both of the kid's jumps are fixed sequences in SEQTABLE.S, with no speed or gravity: each cycle ANIMCHAR reads the sequence up to the next frame number, adding each chx byte to CharX in the direction he faces and each chy byte to his height. The frames of both jumps add no horizontal offset of their own (Fdx 0 in FRAMEDEF.S).Code
The standing jump (standjump) runs frames 16 to 33. Its chx steps are 2, 2, 2, 2, 2, 7, 9, 5, 1, 4, −3, 5, and 1 units, 39 in all (computed); its only chy steps lift the kid 6 px and set him back down on the next frame. Frames 20 to 25 lack the floor-check bit, so onground doesn't test the floor under him there, and the steps between frame 19 and frame 26 move him 28 units, 2 blocks (computed).Code
The running jump (runjump) runs frames 34 to 44. Its chx steps are 5, 6, 3, 5, 7, 12, 8, 8, 4, 4, and 5 units, 67 in all (computed), and its chy steps raise the kid 14 px over three frames and lower him 14 px over the next two. Frames 39 to 43 lack the floor-check bit, and the steps between frame 38 and frame 44 move him 43 units, 3 blocks and 1 unit (computed).Code
In a run (frames 4 to 14), arunning reaches the running jump only while the joystick is held forward (centered stops the run, back turns it), and then only on a fresh press of up (clrU negative), with forward and up the names Mechner's comments give the joystick signs; in a full run (frame 7 or later) that calls DoRunjump, which Mechner's comment describes as "Calibrate jump so that foot will push off at edge". It looks for a gap or spikes in the next two blocks and measures from the kid's position 4 units on to that floor's end. When the end is 6 to 15 units off, it moves him so the jump starts with CharX 14 units (one block) short of the end (computed). Farther off, it returns without jumping (comment: "still too far away--wait till next frame"); nearer, it moves him 1 unit (computed) and jumps (comment: "He jumped too late; he'll miss edge"). With no gap in sight, he jumps where he is.Code
Super Mario Land 1989A jump starts on the frame A goes down while Mario's jump status ($C207) is 0 and his on-ground flag ($C20A) is set. Unless Mario is running, the jump also sets the jump index $C208 to 2.Code
Measured in the game, a standing jump with A held moves Mario up nothing on the press frame, then 3, 3, and 2 px a frame to 24 px, then 1 px or 0 a frame to an apex of 33 px on frame 23. The fall retraces the rise in reverse, and he lands on frame 49.Verified
Measured, a running jump with A held rises 4, 4, 3, 3, then 2 px a frame and peaks at 41 px on frame 25, higher than the standing jump's 33.Verified
Mega Man 3 1990A 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.Code
Landing on Rush Coil launches Mega Man at $06.$EE, 6.93 px/frame, once per bounce, and sets force_full_jump, so releasing A doesn't cut that rise.Code
When a fall's floor points find a solid tile, snap_y_to_floor subtracts (Y + 12) mod 16 from Mega Man's Y pixel, which puts his feet on the tile's top, and leaves the Y fraction as it was; his vertical speed becomes the resting $FF.$C0, 0.25 px/frame down. Every grounded frame repeats the fall, so standing still his Y pixel holds while the fraction steps by $40 each frame: in Top Man's stage start in Mesen it cycles through $00, $40, $80, and $C0.Verified
A jump lifts Mega Man on its press frame: the ground state sets the jump speed and runs the airborne routine at once, which moves him 4.89 px up from where that frame's floor test left him (the test takes him 0.25 px down, or, when that crosses into the next pixel and the snap puts his feet back on the floor, 0.75 px up), takes gravity, and gives the frame the air move, 1.30 px/frame toward a held direction or none, in place of the ground move. A press in a walking pause still jumps, since the press is read before the walk.Verified
A landing frame moves Mega Man only vertically: the airborne routine snaps him onto the floor, sets the ground state and the turning animation already on its second frame, and returns before the air move. From the next frame he walks at once if a direction is held, with no pause. An A press on the landing frame is lost, since the airborne state reads no presses.Verified
Super Mario World 1990On the ground, a fresh press of B (or X) starts Mario's jump and a fresh press of A a spin jump; CODE_00D5F2 takes the take-off speed from DATA_00D2BD at an index set by his horizontal speed.Code
DATA_00D2BD gives 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.Code
Measured 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.Verified
The jump press sets only Mario's vertical speed and air state, then falls into the horizontal code, so the press frame already uses the air rules and his speed carries over unchanged.Verified
Landing clears PlayerInAir during block collision, before the frame's speed update, so the landing frame already brakes or accelerates by the ground rules; the jump itself leaves the horizontal speed alone.Verified
A foot point in a block's top half lands Mario unless he is moving up; CODE_00EE11 takes the point's row within the block, and below 8 the landing subtracts it from his y, keeping the subpixel, which stands him on the block's top. In the lower half the point doesn't land him.Verified
Mario's head point (x+8, and y+8 big or y+16 small; block-points) is the fourth of collision's six points, after the center and side points and before the feet. In the air, when it is in a solid block, collision moves him down by 15 minus the point's row in the block, keeping the subpixel, so the point ends on the block's bottom row, and zeroes his vertical speed if he was rising. Gravity then acts on that frame as usual. A turn block hit this way skips the move on that frame (turn-block-hit).Verified
On the ground, a head point in a solid block's upper 9 rows (0–8) ejects Mario left: collision marks him blocked on the right and zeroes his horizontal speed's high byte, and the wall push then moves him 1 px left a frame (side-push). In rows 9–15 he isn't moved. Either way it sets the top-blocked bit, and while that bit is set a jump press on the ground doesn't jump.Verified
Metroid II: Return of Samus 1991Past the held ascent, a jump follows a table: each frame poseFunc_jump moves Samus by the next entry of jumpArcTable, a signed whole number of pixels from 2 up to 3 down, and the $80 that ends the table starts a fall.Code
Sonic the Hedgehog 1991In 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.Verified
In the running game, a jump pressed on a 45° ramp built from Green Hill's $E0 ramp block adds the jump speed along the ground normal (CalcSine of 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.Verified
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_Jump drops its return address, skipping the rest of the grounded routine, SpeedToPos included.Verified
In the running game, on flat ground, a standing or running jump curls Sonic up on the press frame, shrinking his height radius by 5 px, from 19 to 14, and adding 5 px to Y, so his feet stay put.Verified
In the running game, on flat ground, the jump adds nothing to Sonic's X speed, and because the press frame skips Sonic_Move, he leaves the ground with the previous frame's speed, whatever the d-pad holds on that frame.Verified
In the running game, on flat ground (FixBugs = 0), a jump from a roll gives Sonic his standing height radius, 5 px more than the ball's, without moving him, so he lands 5 px early and uncurls with his feet 5 px above the floor.Verified
In the running game, a roll jump's landing frame leaves Sonic's feet 5 px above the floor, and the next frame puts them back on it.Verified
In the running game, landing on flat ground keeps Sonic's horizontal speed: on the landing frame his ground speed is that frame's X speed, after its air steering, drag, and move, his Y speed is 0, and he stands uncurled.Verified
A frame-by-frame model of Sonic_MdNormal, Sonic_MdRoll, and Sonic_MdJump2 on flat ground matches Sonic the Hedgehog itself, run in MAME on a floor built of Green Hill Act 1's blocks, on every frame of the movement lab's flat-ground presets and stress scripts and of 100 random input scripts.Verified
In the running game, written into the air above Green Hill's blocks, Sonic falling mostly down landed when a floor sensor was inside the ground unless both were deeper than his Y speed in whole pixels plus 8, and moved up by the deeper one's depth: at Y speed $100 he landed 9 px deep and not 10, at $500 13 and not 14, and with one sensor over a pit, or on a block 5 px lower, 12 px deep. Moving mostly sideways and not rising, he landed 19 px deep, and not 20, where his center's row is in the floor; rising, he didn't land.Verified
In the running game, under Green Hill's full blocks, in one standing jump and in one-frame cases whose position and speeds the probe wrote into RAM, Sonic's head sensors met a ceiling only while he moved mostly up or mostly sideways: inside one, he moved down by the depth, his head sensors to the row below it. Moving mostly up, his Y speed became 0 under a flat block, and under its full $A0 block he landed on the ceiling, taking its angle and a ground speed from his Y speed. Moving sideways, his Y speed became 0 if he was rising and stayed if he was falling, and with his feet in the floor he didn't land that frame. Moving mostly down with his head in a block, he wasn't moved.Verified
In the running game, a jump press went through only when Sonic's head sensors had 6 or more clear pixel rows above them, under Green Hill's full blocks and its 4 px slab on floors of its 9 to 16 px blocks: gaps of 6, 7, and 9 rows jumped, and 5, 3, and less didn't, standing and curled. A block 48 px above his floor left him 9 standing; one 32 px up refused him standing (his head 7 px inside it) and curled (3 px above his head). A refused press ran the rest of the ground frame.Verified
On stages built in Green Hill Act 1 from the act's full flat 16 × 16 block, the movement lab's Sonic model matches Sonic the Hedgehog itself, run in MAME, on every frame of 100 random stages with random input scripts, three in four with floating blocks, and of the lab's stage presets, until a fall into a pit kills him at the bottom boundary or he nears the end of the built floor.Verified
Super Castlevania IV 1991Super 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
Mega Man 5 1992Nothing tests the ceiling before a jump starts: a fresh A press on the ground sets the jump speed and runs the air routine again, whose rise is the first test. So under a block two tiles over the floor, the lowest he can walk under, the jump still starts, and its 3rd frame meets the block: his ceiling points must rise 11 px to reach its bottom row, and the rise is 5, then 4.75, then 4.5 px (9.75 px after two frames, 14.25 after three).Code
The frame a falling Mega Man's floor test finds ground puts him in the ground state with the walking pose ($04) and still moves him by the air's rules. On the next frame he walks on at once if he holds the direction he held on landing; any other direction, or none, starts the step pose. The air state reads no A press, so a press on the landing frame is lost, and the next frame's press jumps.Code
Sonic the Hedgehog 2 1992Sonic_Jump takes off at $680 subpixels per frame (6.5 px/frame), $800 as Super Sonic, and $380 underwater, the same take-off as Sonic 1.Code
A frame-by-frame model of Obj01_MdNormal_Checks, Obj01_MdNormal, Obj01_MdRoll, and the air modes, with Sonic_Animate's timing for the standing and blinking animations, matches Sonic the Hedgehog 2 itself, run in MAME with Sonic alone on a floor built of Emerald Hill Act 1's blocks, on every frame of the movement lab's flat-ground presets, eleven scripts of Sonic 2's own moves, and 100 random input scripts.Verified
On stages built in Emerald Hill Act 1 from the act's full flat 16 × 16 block, solid on the collision path Sonic starts on, the movement lab's Sonic 2 model matches Sonic the Hedgehog 2 itself, run in MAME, on every frame of 100 random stages with random input scripts, three in four with floating blocks, and of the lab's stage presets, until a fall into a pit kills him at the bottom boundary or he nears the end of the built floor.Verified
A jump press jumps only if both head sensors find 6 px or more of room above his head, as in Sonic 1; the check writes $80 to both angle buffers first.Code
A jump adds nothing to Sonic's X speed on flat ground, and the rest of that frame's mode (the move and the floor snap) doesn't run, as in Sonic 1.Code
With fixBugs off, a jump sets the standing collision radii before checking for a roll, so a roll jump keeps them while curled, and lands 5 px early; landing then lifts his center 5 px more, as in Sonic 1.Code
Landing on flat ground sets his ground speed to his X speed and his Y speed to 0, and clears the jump, roll-jump, and in-air flags, as in Sonic 1; out of pinball mode it also uncurls him (the standing radii, his center 5 px up), as Sonic 1 always does.Code
Mega Man 6 1993On a fresh A press with no slide, on ordinary floor, Mega Man 6's standing loop sets his vertical speed to $FA.$CC, 5.20 px/frame up, where Mega Man 5 writes 5 px/frame ($05.$00); in tile type $09 it writes the slower $FB.$CC instead (slow-surface). The air loop adds gravity before each move, so the first frame lifts him 0.25 less, 4.95 px. Measured in Mesen from power-on, standing where he lands at the start of Tomahawk Man's stage, the first frame of a jump moves him up at that 4.95 px/frame.Verified
Computed from the ordinary take-off and gravity, outside tile types $08 and $09 (fall-limits, slow-surface), a jump with A held peaks 51.6 px above the floor on its 20th frame. Measured in Mesen from power-on, at the start of Tomahawk Man's stage, the held jump rose 51.56 px and turned to fall after frame 20.Verified
A Mega Man 6 falling onto a floor has his vertical speed set to 0, fraction included, by the floor push (floor-snap). The air loop reads the landing on the next frame, from the fraction being 0, and goes into the walking loop at once: that frame he turns to a held direction and walks at 1.30 px/frame with no step, or a fresh A press jumps again. A press on the touchdown frame itself is never read, since only the air loop runs then, and it reads A only as held.Code
Rising into a solid tile, Mega Man 6 is pushed down below it and 1 px further, and the whole byte of his vertical speed is set to 0 while its fraction stays, so on the next frame, gravity added, he moves down 0.30 to 1.05 px (under the normal gravity). He stays in the air loop, and the jump's release cut, which needs the whole byte negative, no longer applies.Code
Nothing in Mega Man 6's ground loops tests the ceiling before a jump or a slide: a fresh A press sets the take-off speed or starts the slide outright, and a jump under a low ceiling meets it on its first move (ceiling-hit). Mega Man 5 tests a point over his head before a slide starts.Code
Mega Man 6's ordinary-floor movement isn't Mega Man 5's: the first difference is a jump's take-off. Mega Man 6 sets his vertical speed to $FA.$CC, 5.20 px/frame up; Mega Man 5 sets its whole byte $03F0 to $05 and its fraction $03D8 to $00, 5 px/frame (jump-speed). Letting go of A sets only the whole byte to 0 in Mega Man 6 and both bytes in Mega Man 5 (release-cut), and Mega Man 5 tests for headroom before a slide where Mega Man 6 doesn't (jump-under-ceiling). The two run different code: Mega Man 5's player is a state machine dispatched each frame from $30, Mega Man 6's a coroutine of loops (coroutine-scheduler).Code
Sonic 3 & Knuckles 1994Sonic and Tails take off at $680 subpixels per frame (6.5 px/frame) and Knuckles at $600 (6 px/frame); underwater the speeds are $380 and $300.Code
With room overhead (jump-headroom), a jump press adds the jump speed along the ground's normal, -$680 straight up on flat ground with normal gravity (jump-speed gives the underwater and Super speeds), keeps the X speed, and ends the frame: the jump frame moves nothing. Standing, the jump curls Sonic and moves his center 5 px down (up with reverse gravity); from a roll he keeps the standing size (roll-jump-size).Code
A jump from a roll resets Sonic's sensors to the standing size, 19 px below his center, while his ball stays drawn, so he lands 5 px higher than a standing jump would, and landing moves him by the difference, 0. Sonic 2 has the same order of instructions.Code
Landing on flat ground keeps Sonic's horizontal speed as his ground speed, sets his Y speed to 0, and, if he was curled and spin_dash_flag is clear (not pinball mode), uncurls him; with normal gravity a ball from a standing jump or a roll moves 5 px up, one from a roll jump doesn't move. It clears the jump, roll-jump, and insta-shield flags; with the bubble shield used, it bounces him instead (shield-moves).Code
Sonic's head sensors are read in the air only while he moves mostly up, left, or right. Inside a ceiling he moves down by the depth; moving up under a flat ceiling his Y speed becomes 0, moving sideways only if he was rising, and the floor isn't tested that frame. Moving mostly left, a head 20 px or more inside a ceiling is instead pushed off a wall on his right, a check Sonic 2 lacks.Code
Falling mostly down, Sonic lands when a floor sensor is inside the ground unless both are deeper than his Y speed's whole pixels plus 8, and moves up by the deeper one's depth; moving mostly left or right and not rising, any depth lands him; rising, he doesn't land, except in a wind tunnel.Code
Standing or rolling on flat ground with normal gravity, a jump press goes through only when the head sensors find 6 or more clear pixel rows above them; refused, the rest of the ground frame runs. On slopes and walls, and with reverse gravity, the sensors used turn with the angle.Code
A frame-by-frame model of Sonic_MdNormal, Sonic_MdRoll, Sonic_MdJump, and SonicKnux_Spindash on flat ground, with the insta-shield, matches Sonic 3 & Knuckles itself, run in MAME with Sonic alone on a floor built of Angel Island Act 1's blocks, on every frame of the movement lab's flat-ground presets, stress scripts, and spin-dash and roll scripts and of 100 random input scripts.Verified
On stages built in Angel Island Act 1 from the act's full 16 × 16 block, the movement lab's Sonic 3 & Knuckles model matches the game itself, run in MAME, on every frame of 100 random stages with random input scripts, three in four with floating blocks, and of the lab's stage presets, until a fall into a pit kills him at the bottom boundary or he nears the end of the built floor.Verified
Super Metroid 1994Make_Samus_Jump picks the take-off speed from a table by medium and the Hi-Jump Boots: 4.875 px/frame up in air, 1.75 in water, 2.75 in lava or acid, and 6, 2.5, and 3.5 with the boots. With the Speed Booster equipped, it adds Samus's extra run speed, the whole part halved.Code
The three games build the high jump three ways. Metroid's High Jump Boots lower the jump's gravity from $18 to $12 and keep the take-off speed. Metroid II's Hi-Jump starts the held rise at a lower counter and adds 1 px/frame to it, 3 px/frame for up to 31 frames against 2 for up to 15. Super Metroid's Hi-Jump Boots raise the take-off speed from 4.875 to 6 px/frame, with gravity unchanged.Code
Quake 1996Quake's jump is QuakeC (1.01's client.qc): each frame PlayerPreThink calls PlayerJump while the jump button is held and otherwise sets FL_JUMPRELEASED; on land (water level under 2, not in a water jump), PlayerJump acts only when the player is on the ground and has released the button since the last jump, then clears both flags and adds 270 to the vertical velocity. Holding the button never jumps twice.Code
Computed from the jump and gravity, ignoring frame steps: a Quake jump from flat ground at the default gravity of 800 rises 270² / (2 × 800) ≈ 45.6 units and lands after 2 × 270 / 800 = 0.675 seconds.Code
Super Mario 64 1996A 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.Code
A press while Mario lands from a jump or a fall starts a double jump, at 52 units/frame plus a quarter of his forward speed. The landing lasts 4 frames, and each of them sets doubleJumpTimer to 5; that timer counts down once a frame, and while it runs a press from the stop action that follows the landing still double-jumps, because set_jump_from_landing checks the timer and the previous action. With the stick held, the stop action turns into walking at once, and walking's previous action is the stop, so only a Mario standing still can double-jump after the 4-frame landing.Code
A press while Mario lands from a double jump starts a triple jump if his forward speed is above 20 units/frame, and a single jump otherwise. With the wing cap, the press always starts a different action, the flying triple jump (ACT_FLYING_TRIPLE_JUMP, 82 units/frame). The triple jump takes off at 69 units/frame whatever the speed, and releasing A doesn't cut it.Code
Quake II 1997Quake II's PM_CheckJump, which Pmove runs before friction, does nothing while the landing timer flag is set; otherwise it needs an up move of at least 10 and the jump-held flag clear, which only a command with the key released clears, so holding the key never jumps twice. On ground it adds 270 to the vertical velocity, raising it to at least 270, and clears the ground entity; in water at level 2 or more it sets an upward swim speed instead (100 in water, 80 in slime, 50 in lava). Quake's QuakeC jump and QuakeWorld's movement code also add 270. Gravity is sv_gravity, 800.Code
Castlevania: Symphony of the Night 1997In 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.Code
Banjo-Kazooie 1998A 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_update resets 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 names ABILITY_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).Code
Quake III Arena 1999Quake III's jump is in the shared movement code: PM_CheckJump, called from PM_WalkMove (so only on walkable ground), needs an up move of at least 10 and the jump-held flag clear, which PmoveSingle clears only on a step whose up move is under 10, so holding the key never jumps twice; it then sets the vertical velocity to JUMP_VELOCITY (270), where Quake's QuakeC adds 270 to it (quake/jump). Gravity is g_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", but PM_CheckJump never tests it.Code
Metroid Fusion 2002A jump sets Samus's upward yVelocity to 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.Code
Stepping the code's arithmetic with A held, out of liquid, a jump from the ground peaks about 71 px up (283 subpixels) on its 28th frame, and a High Jump 104 px (416 subpixels) on its 36th (computed: each frame moves yVelocity capped at 128 and shifted right 3, then takes 6 from it). The same stepping gives Zero Mission about 59 px on the 19th frame and 83 px on the 23rd (mzm/jump-height), so Fusion's jump is higher and slower.Code
Sonic Advance 2 2002Player_InitJump, which doesn't test the character, adds PLAYER_JUMP_HEIGHT, 4.875 px/frame (2.625 in water), to the speed along the ground's normal (rotation - 64). Sonic 1's Sonic_Jump adds son_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).Code
Super Mario Sunshine 2002In Super Mario Sunshine, by the decompilers' Player code, which doesn't yet match, a press that starts a jump through changePlayerJumping first goes to a miss jump if isJumpMiss is true, then to a spin jump if considerRotateJumpStart reads the stick's recent turning as a spin, and otherwise to the status it asks for. For the single jump, MARIO_STATUS_JUMP, setStatusToJumping sets 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 as isThing2 and isThing3, the speed is replaced or added to and the jump becomes MARIO_STATUS_FORCE_JUMP; on Yoshi it is multiplied by the parameter mJumpYoshiMult, and while isSinking() is true both speeds are scaled by a factor from the mGraffitoParams set. When the new jumping status carries the bit the code calls MARIO_STATUS_FLAG_UNK2000000 (0x2000000), as the single jump, the double jump, and the wall kick do, setStatusToJumping sets bit 0x100 of unk78, 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, fallProcess multiplies 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 its MARIO_UNKNOWN_08 flag is set, the action is neither intangible nor invulnerable, and the action has ACT_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's ACT_JUMP is 0x03000880.Code notes
Metroid: Zero Mission 2004A jump sets Samus's upward yVelocity to 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.Code
Stepping the code's arithmetic with A held, out of liquid, a jump from the ground peaks about 59 px up (235 subpixels) on its 19th frame, and a High Jump about 83 px (331 subpixels) on its 23rd (computed: each frame moves yVelocity capped at 192 and shifted right 3, then takes 10 from it).Code
Celeste 2018A normal jump sets Madeline's vertical speed to JumpSpeed, −105 px/s.Code
Jumping while ducked keeps Madeline's 8 × 6 px ducking hitbox until she is falling with room to stand, because Jump() leaves Ducking alone and only the falling check, which tests CanUnDuck, clears it in the air.Code
Jump() adds JumpHBoost, 40 px/s, times the d-pad direction to Madeline's horizontal speed, after that update's running step, so a running jump leaves at 130 px/s.Code
Landing zeroes Madeline's vertical speed and leaves her horizontal speed alone; the landing update has already used the air rates, and the ground rates start on the next.Code
Each update starts by looking for ground; while Speed.Y is 0 or more, Madeline is on the ground if her hitbox, moved 1 px down, overlaps a solid or a jump-through platform.Code
Simulating the code, a running jump leaves at 130 px/s and slows back to 90 px/s in 10 airborne updates with the d-pad held; a jump from a standstill with the d-pad held leaves at 56.67 px/s.Code
Simulating a hop steered back with Left, the landing update still changes Madeline's speed at the air rate, −10.83 px/s, and the next at the ground rate, −16.67 px/s.Code
A frame-by-frame model of Player.Update and NormalUpdate on flat ground matches a statement-by-statement float32 simulation of the released code on every frame of 300 random input scripts, for both delta-time steps.Code
When Madeline rises into a solid in the normal state, she is moved 1 px up and 1 to 4 px (UpwardCornerCorrection) sideways to the first spot where her hitbox fits, keeping her speed. She tries leftward first unless she is moving right, then rightward unless she is moving left.Code
When Madeline rises into a solid in the normal state and no corner correction fits, her vertical speed is zeroed. The variable-jump timer is zeroed too, unless it still reads at least VarJumpTime − CeilingVarJumpGrace, 0.2 − 0.05 s, which spares hits in the jump's first 0.05 s.Code
On stages with floating blocks, a frame-by-frame model of Madeline rising into solids, her ducking box, and CanUnDuck matches a statement-by-statement float32 simulation of the released code on every frame of random stages and input scripts.Code

References

  1. ^A jump starts only on the frame A goes down while Mario is grounded; InitJS zeroes the vertical subpixel and sets the jumping state.CodeXkeeper0/smb1
    How 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 frame
    
    src/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.

    In the claim ledger

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

    In the claim ledger

  3. ^ abcIn the standing, walking, running, and landing states, a fresh A press (zjoy1_pressed_bits) copies zjump_speed into Mega Man's vertical speed after the frame's move, so the press frame doesn't lift him.Codelsmmega/mm2
    How 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.

    In the claim ledger

  4. ^ abOn the ground, a fresh press of B (or X) starts Mario's jump and a fresh press of A a spin jump; CODE_00D5F2 takes the take-off speed from DATA_00D2BD at an index set by his horizontal speed.CodeSMWDisX
    How 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.

    In the claim ledger

  5. ^ abGrounded 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

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

    In the claim ledger

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

    In the claim ledger

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

    In the claim ledger

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

    In the claim ledger

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

    In the claim ledger

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

    In the claim ledger

  12. ^A fresh A press on the ground sets Mega Man's upward speed to $04.$DF, 4.87 px/frame.Codelsmmega/mm1
    How 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.

    In the claim ledger

  13. ^Mega Man 2 keeps Mega Man's jump and running numbers. Both take off at $04.$DF, subtract $40 of 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/mm2
    How 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.

    In the claim ledger

  14. ^ abcMega Man's jump speed is $04.$DF, 4.87 px/frame upward, out of water ($05.$80 in water).Codelsmmega/mm2
    How 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.

    In the claim ledger

  15. ^ 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-ca65
    How 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.

    In the claim ledger

  16. ^ abLanding on Rush Coil launches Mega Man at $06.$EE, 6.93 px/frame, once per bounce, and sets force_full_jump, so releasing A doesn't cut that rise.Codeplasticsmoke/megaman3-disassembly-ca65
    How 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.

    In the claim ledger

  17. ^ 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-ca65
    How 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.

    In the claim ledger

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

    In the claim ledger

  19. ^ abMega Man 5 keeps Mega Man 4's jump. Both write 5 px/frame ($05.$00) into the vertical speed at $03F0/$03D8 on a jump, and set it to 0 on any rising frame without A.Codeplasticsmoke/megaman5-disassembly-ca65 · plasticsmoke/megaman4-disassembly-ca65
    How 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.

    In the claim ledger

  20. ^ abSonic_Jump takes off at $680 subpixels per frame (6.5 px/frame), $800 as Super Sonic, and $380 underwater, the same take-off as Sonic 1.Codesonicretro/s2disasm · sonicretro/s1disasmrevised
    How 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.

    In the claim ledger

  21. ^ abSonic and Tails take off at $680 subpixels per frame (6.5 px/frame) and Knuckles at $600 (6 px/frame); underwater the speeds are $380 and $300.Codesonicretro/skdisasm
    How 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.

    In the claim ledger

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

    In the claim ledger

  23. ^ abcDATA_00D2BD gives 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.CodeSMWDisX
    How 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.

    In the claim ledger

  24. ^ 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.CodeSMWDisX
    How 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.

    In the claim ledger

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

    In the claim ledger

  26. ^PlayerStartJump first checks quicksand: sunk with QuicksandDepth 2 or more, the player takes off at JumpHeightQuicksand, $E0 for 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 $08 or more), a charged crouch (CrouchJumpTimer at $3C), and holding an item. A charged jump clears the running bit.CodeSMB2 Discombobulatedrevised
    How 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.

    In the claim ledger

  27. ^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 $04 and $07. With an item, see carry-stats.VerifiedSMB2 Discombobulatedrevised
    How 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.

    In the claim ledger

  28. ^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 $01 and $02. With an item, see carry-stats.VerifiedSMB2 Discombobulatedrevised
    How 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.

    In the claim ledger

  29. ^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 $04 and $07. With an item, see carry-stats.VerifiedSMB2 Discombobulatedrevised
    How 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.

    In the claim ledger

  30. ^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 $04 and $07. With an item, see carry-stats.VerifiedSMB2 Discombobulatedrevised
    How 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.

    In the claim ledger

  31. ^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, $18 empty-handed for all four, and carrying $18, $16, $1D, and $15 (carry-speed).CodeSMB2 Discombobulatedrevised
    How 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.

    In the claim ledger

  32. ^PlayerYSpdData starts 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.

    In the claim ledger

  33. ^The press frame already moves Mario, since PlayerPhysicsSub starts the jump before the state dispatch runs JumpSwimSub and MovePlayerVertically.CodeXkeeper0/smb1
    How 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 leave
    
    src/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.

    In the claim ledger

  34. ^ 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 claim ledger

  35. ^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_Jump drops its return address, skipping the rest of the grounded routine, SpeedToPos included.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.

    In the claim ledger

  36. ^A normal jump sets Madeline's vertical speed to JumpSpeed, −105 px/s.CodeNoelFB/Celeste
    How 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 the claim ledger

  37. ^In each update, Player.Update ticks both jump timers, the state machine runs NormalUpdate (gravity, hold, and new jump), and then MoveV applies Speed.Y * Engine.DeltaTime.CodeNoelFB/Celeste · JamesMcMahon/monocle-engine
    How 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.

    In the claim ledger

  38. ^InitJS picks 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 claim ledger

  39. ^In the running game, a jump pressed on a 45° ramp built from Green Hill's $E0 ramp block adds the jump speed along the ground normal (CalcSine of 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.

    In the claim ledger

  40. ^Both of the kid's jumps are fixed sequences in SEQTABLE.S, with no speed or gravity: each cycle ANIMCHAR reads the sequence up to the next frame number, adding each chx byte to CharX in the direction he faces and each chy byte to his height. The frames of both jumps add no horizontal offset of their own (Fdx 0 in FRAMEDEF.S).Codejmechner/Prince-of-Persia-Apple-IIrevised
    How 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, Fcheck
    
    01 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.

    In the claim ledger

  41. ^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_update resets 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 names ABILITY_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/sm64revised
    How 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.

    In the claim ledger

  42. ^Quake III's jump is in the shared movement code: PM_CheckJump, called from PM_WalkMove (so only on walkable ground), needs an up move of at least 10 and the jump-held flag clear, which PmoveSingle clears only on a step whose up move is under 10, so holding the key never jumps twice; it then sets the vertical velocity to JUMP_VELOCITY (270), where Quake's QuakeC adds 270 to it (quake/jump). Gravity is g_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", but PM_CheckJump never tests it.Codeid-Software/Quake-III-Arena · id-Software/Quake-Tools
    How we know
    29#define	JUMP_VELOCITY	270
    
    code/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.

    In the claim ledger

  43. ^Player_InitJump, which doesn't test the character, adds PLAYER_JUMP_HEIGHT, 4.875 px/frame (2.625 in water), to the speed along the ground's normal (rotation - 64). Sonic 1's Sonic_Jump adds son_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/s1disasm
    How 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 the claim ledger

  44. ^In Super Mario Sunshine, by the decompilers' Player code, which doesn't yet match, a press that starts a jump through changePlayerJumping first goes to a miss jump if isJumpMiss is true, then to a spin jump if considerRotateJumpStart reads the stick's recent turning as a spin, and otherwise to the status it asks for. For the single jump, MARIO_STATUS_JUMP, setStatusToJumping sets 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 as isThing2 and isThing3, the speed is replaced or added to and the jump becomes MARIO_STATUS_FORCE_JUMP; on Yoshi it is multiplied by the parameter mJumpYoshiMult, and while isSinking() is true both speeds are scaled by a factor from the mGraffitoParams set. When the new jumping status carries the bit the code calls MARIO_STATUS_FLAG_UNK2000000 (0x2000000), as the single jump, the double jump, and the wall kick do, setStatusToJumping sets bit 0x100 of unk78, 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, fallProcess multiplies 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 its MARIO_UNKNOWN_08 flag is set, the action is neither intangible nor invulnerable, and the action has ACT_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's ACT_JUMP is 0x03000880.Code notesdoldecomp/sms · n64decomp/sm64revised
    How 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.

    In the claim ledger

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

    In the claim ledger

  46. ^A jump sets Samus's upward yVelocity to 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/mzm
    How 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 192
    
    include/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.

    In the claim ledger

  47. ^A jump sets Samus's upward yVelocity to 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-disassemblyrevised
    How 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 192
    
    include/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.

    In the claim ledger

  48. ^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: SetSamusJump sets SamusGravity to $18, or $12 with the boots.Codenmikstas/metroid-disassembly
    How 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.

    In the claim ledger

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

    In the claim ledger

  50. ^Mario gets no grace window after leaving a ledge; ProcJumping refuses airborne jumps unless he is swimming.CodeXkeeper0/smb1
    How 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.

    In the claim ledger

  51. ^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 claim ledger

  52. ^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_MdNormal and Sonic_MdRoll, call Sonic_Jump.Verifiedsonicretro/s1disasmrevised
    How 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.

    In the claim ledger

Sources

Code

Secondary