Claim set · data/claims/sm64.yaml

Super Mario 64 (the n64decomp decompilation, n64decomp/sm64)

Game: Super Mario 64.

Super Mario 64 keeps Mario's speeds as floats in world units per frame: perform_air_step moves him a quarter of his velocity in each of four quarter steps. A frame waits for two vertical blanks in display_and_vsync, so on an NTSC console the game runs at most 30 frames a second. sm64/units

About: Super Mario 64 Gravity

Value: 30 frames/s

Codesm64: a decompilation of Super Mario 64 (n64decomp/sm64) · src/game/mario_step.c#L618-L621for (i = 0; i < 4; i++) { intendedPos[0] = m->pos[0] + m->vel[0] / 4.0f; intendedPos[1] = m->pos[1] + m->vel[1] / 4.0f; intendedPos[2] = m->pos[2] + m->vel[2] / 4.0f;sm64: a decompilation of Super Mario 64 (n64decomp/sm64) · src/game/game_init.c#L372-L375osRecvMesg(&gGameVblankQueue, &gMainReceivedMesg, OS_MESG_BLOCK); osViSwapBuffer((void *) PHYSICAL_TO_VIRTUAL(gPhysicalFramebuffers[sRenderedFramebuffer])); … osRecvMesg(&gGameVblankQueue, &gMainReceivedMesg, OS_MESG_BLOCK);sm64: a decompilation of Super Mario 64 (n64decomp/sm64) · src/game/main.c#L428-L433#if defined(VERSION_US) || defined(VERSION_SH) || defined(VERSION_CN) if (sp24 == TV_TYPE_NTSC) { osViSetMode(&osViModeTable[OS_VI_NTSC_LAN1]);Checked by claude, 2026-10-21 — read perform_air_step (four quarter steps, then gravity) and display_and_vsync; the game vblank queue gets a message on every vblank (main.c handle_vblank), and the frame blocks on it twice

NTSC video runs at about 60 fields a second, which isn't in the code. A frame that takes longer than two vblanks lowers the rate, so 30 is a ceiling. The cited branch is the US build's, which picks NTSC or PAL by the console; the European build always sets PAL mode (50 Hz).

Cited by: Super Mario 64

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. sm64/jump-speed

About: Super Mario 64 Jump

Value: 42 units/frame

Codesm64: a decompilation of Super Mario 64 (n64decomp/sm64) · src/game/mario.c#L763-L766static void set_mario_y_vel_based_on_fspeed(struct MarioState *m, f32 initialVelY, f32 multiplier) { … m->vel[1] = initialVelY + get_additive_y_vel_for_jumps() + m->forwardVel * multiplier;sm64: a decompilation of Super Mario 64 (n64decomp/sm64) · src/game/mario.c#L821-L826case ACT_JUMP: case ACT_HOLD_JUMP: … set_mario_y_vel_based_on_fspeed(m, 42.0f, 0.25f); m->forwardVel *= 0.8f;Checked by claude, 2026-10-21 — read set_mario_y_vel_based_on_fspeed and the ACT_JUMP case of set_mario_action_airborne; the decompilers' comment says get_additive_y_vel_for_jumps is a stub that returns 0

At the walking cap of 32 the take-off is 50 units/frame. Squished or in quicksand, the result is halved (L768-L770).

Cited by: Banjo-Kazooie, Jump, Super Mario 64, Super Mario Sunshine

Mario's usual gravity subtracts 4 units/frame from his vertical speed each frame, down to a fastest fall of −75. The long jump and the slide kick use 2 instead, with the same cap. sm64/gravity

About: Super Mario 64 Gravity

Value: 4 units/frame²

Codesm64: a decompilation of Super Mario 64 (n64decomp/sm64) · src/game/mario_step.c#L575-L580} else { m->vel[1] -= 4.0f; if (m->vel[1] < -75.0f) { m->vel[1] = -75.0f;sm64: a decompilation of Super Mario 64 (n64decomp/sm64) · src/game/mario_step.c#L543-L548} else if (m->action == ACT_LONG_JUMP || m->action == ACT_SLIDE_KICK || m->action == ACT_BBH_ENTER_SPIN) { m->vel[1] -= 2.0f; if (m->vel[1] < -75.0f) {sm64: a decompilation of Super Mario 64 (n64decomp/sm64) · src/game/mario_step.c#L646-L648if (m->action != ACT_FLYING) { apply_gravity(m);Checked by claude, 2026-10-21 — read apply_gravity whole; the other branches are the twirl, the cannon, lava, wind, metal underwater, the wing cap's flutter, and the release cut (sm64/jump-release)

Cited by: Super Mario 64

Releasing A cuts a jump short: on a frame with A up and the rise above 20 units/frame, apply_gravity divides the vertical speed by 4 instead of subtracting gravity. Only actions flagged ACT_FLAG_CONTROL_JUMP_HEIGHT do this, among them the single and double jumps and the wall kick; the triple jump, backflip, and side flip lack the flag and keep their full height. The check also needs a flag that every airborne action sets and bouncing off an enemy clears. sm64/jump-release

About: Super Mario 64 Variable jump height

Value: 20 units/frame

Codesm64: a decompilation of Super Mario 64 (n64decomp/sm64) · src/game/mario_step.c#L519-L533u32 should_strengthen_gravity_for_jump_ascent(struct MarioState *m) { if (!(m->flags & MARIO_UNKNOWN_08)) { return FALSE; … if (!(m->input & INPUT_A_DOWN) && m->vel[1] > 20.0f) { return (m->action & ACT_FLAG_CONTROL_JUMP_HEIGHT) != 0;sm64: a decompilation of Super Mario 64 (n64decomp/sm64) · src/game/mario_step.c#L559-L560} else if (should_strengthen_gravity_for_jump_ascent(m)) { m->vel[1] /= 4.0f;sm64: a decompilation of Super Mario 64 (n64decomp/sm64) · include/sm64.h#L256-L263#define ACT_JUMP 0x03000880 // (0x080 | ACT_FLAG_AIR | ACT_FLAG_ALLOW_VERTICAL_WIND_ACTION | ACT_FLAG_CONTROL_JUMP_HEIGHT) #define ACT_DOUBLE_JUMP 0x03000881 // (0x081 | ACT_FLAG_AIR | ACT_FLAG_ALLOW_VERTICAL_WIND_ACTION | ACT_FLAG_CONTROL_JUMP_HEIGHT) #define ACT_TRIPLE_JUMP 0x01000882 // (0x082 | ACT_FLAG_AIR | ACT_FLAG_ALLOW_VERTICAL_WIND_ACTION) #define ACT_BACKFLIP 0x01000883 // (0x083 | ACT_FLAG_AIR | ACT_FLAG_ALLOW_VERTICAL_WIND_ACTION) … #define ACT_WALL_KICK_AIR 0x03000886 // (0x086 | ACT_FLAG_AIR | ACT_FLAG_ALLOW_VERTICAL_WIND_ACTION | ACT_FLAG_CONTROL_JUMP_HEIGHT) #define ACT_SIDE_FLIP 0x01000887 // (0x087 | ACT_FLAG_AIR | ACT_FLAG_ALLOW_VERTICAL_WIND_ACTION) #define ACT_LONG_JUMP 0x03000888 // (0x088 | ACT_FLAG_AIR | ACT_FLAG_ALLOW_VERTICAL_WIND_ACTION | ACT_FLAG_CONTROL_JUMP_HEIGHT)sm64: a decompilation of Super Mario 64 (n64decomp/sm64) · src/game/mario.c#L887-L888m->peakHeight = m->pos[1]; m->flags |= MARIO_UNKNOWN_08;sm64: a decompilation of Super Mario 64 (n64decomp/sm64) · src/game/interaction.c#L515-L519void bounce_off_object(struct MarioState *m, struct Object *o, f32 velY) { … m->flags &= ~MARIO_UNKNOWN_08;Checked by claude, 2026-10-21 — read should_strengthen_gravity_for_jump_ascent, its branch in apply_gravity (after the long jump's own branch at L543, so the long jump never reaches it despite its flag), the end of set_mario_action_airborne, bounce_off_object, and the action flags in sm64.h (bit 25 is 0x02000000)

The flag MARIO_UNKNOWN_08 has no name in the decompilation. The cut also skips the action's intangible and invulnerable states (L524). From any take-off up to 80 units/frame, one release frame brings the rise under 20, so the cut works once. A release after the rise has dropped below 20 changes nothing.

Cited by: Banjo-Kazooie, Super Mario 64, Variable jump height

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. sm64/double-jump

About: Super Mario 64 Jump

Value: 52 units/frame

Codesm64: a decompilation of Super Mario 64 (n64decomp/sm64) · src/game/mario.c#L785-L788case ACT_DOUBLE_JUMP: set_mario_y_vel_based_on_fspeed(m, 52.0f, 0.25f); m->forwardVel *= 0.8f;sm64: a decompilation of Super Mario 64 (n64decomp/sm64) · src/game/mario_actions_moving.c#L26-L32struct LandingAction sJumpLandAction = { 4, 5, ACT_FREEFALL, ACT_JUMP_LAND_STOP, ACT_DOUBLE_JUMP, ACT_FREEFALL, ACT_BEGIN_SLIDING, … struct LandingAction sFreefallLandAction = { 4, 5, ACT_FREEFALL, ACT_FREEFALL_LAND_STOP, ACT_DOUBLE_JUMP, ACT_FREEFALL, ACT_BEGIN_SLIDING,sm64: a decompilation of Super Mario 64 (n64decomp/sm64) · src/game/mario_actions_moving.c#L1767-L1783m->doubleJumpTimer = landingAction->unk02; … if (++m->actionTimer >= landingAction->numFrames) { return set_mario_action(m, landingAction->endAction, 0); } … if (m->input & INPUT_A_PRESSED) { return setAPressAction(m, landingAction->aPressedAction, 0);sm64: a decompilation of Super Mario 64 (n64decomp/sm64) · src/game/mario.c#L1411-L1413if (m->doubleJumpTimer > 0) { m->doubleJumpTimer--;sm64: a decompilation of Super Mario 64 (n64decomp/sm64) · src/game/mario_actions_stationary.c#L848-L850if (m->input & INPUT_A_PRESSED) { if (!action) { return set_jump_from_landing(m);sm64: a decompilation of Super Mario 64 (n64decomp/sm64) · src/game/mario.c#L1030-L1043if ((m->doubleJumpTimer == 0) || (m->squishTimer != 0)) { set_mario_action(m, ACT_JUMP, 0); } else { switch (m->prevAction) { case ACT_JUMP_LAND: set_mario_action(m, ACT_DOUBLE_JUMP, 0);sm64: a decompilation of Super Mario 64 (n64decomp/sm64) · src/game/mario_actions_stationary.c#L856-L857if (m->input & (INPUT_NONZERO_ANALOG | INPUT_A_PRESSED | INPUT_OFF_FLOOR | INPUT_ABOVE_SLIDE)) { return check_common_action_exits(m);sm64: a decompilation of Super Mario 64 (n64decomp/sm64) · src/game/mario.c#L1124-L1125if (m->input & INPUT_NONZERO_ANALOG) { return set_mario_action(m, ACT_WALKING, 0);sm64: a decompilation of Super Mario 64 (n64decomp/sm64) · src/game/mario.c#L1006-L1007m->prevAction = m->action; m->action = action;sm64: a decompilation of Super Mario 64 (n64decomp/sm64) · src/game/mario_actions_moving.c#L791-L792if (m->input & INPUT_A_PRESSED) { return set_jump_from_landing(m);Checked by claude, 2026-10-21 — read common_landing_cancels, act_jump_land_stop (check_common_landing_cancels with action 0), set_jump_from_landing, and the timer countdown in update_mario_inputs

The double jump has no speed requirement. Pressing on the landing's 4th frame works too: the landing hands over to its stop action in the same frame, whose A check reaches set_jump_from_landing with the timer at 5. From walking, set_jump_from_landing's switch falls to its default, a single jump.

Cited by: Banjo-Kazooie, Super Mario 64, Triple jump

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. sm64/triple-jump

About: Super Mario 64 Jump

Value: 69 units/frame

Codesm64: a decompilation of Super Mario 64 (n64decomp/sm64) · src/game/mario_actions_moving.c#L1874-L1876s32 act_double_jump_land(struct MarioState *m) { if (common_landing_cancels(m, &sDoubleJumpLandAction, set_triple_jump_action)) {sm64: a decompilation of Super Mario 64 (n64decomp/sm64) · src/game/mario_actions_moving.c#L147-L153s32 set_triple_jump_action(struct MarioState *m, UNUSED u32 action, UNUSED u32 actionArg) { if (m->flags & MARIO_WING_CAP) { return set_mario_action(m, ACT_FLYING_TRIPLE_JUMP, 0); } else if (m->forwardVel > 20.0f) { return set_mario_action(m, ACT_TRIPLE_JUMP, 0); } else { return set_mario_action(m, ACT_JUMP, 0);sm64: a decompilation of Super Mario 64 (n64decomp/sm64) · src/game/mario.c#L796-L802case ACT_TRIPLE_JUMP: set_mario_y_vel_based_on_fspeed(m, 69.0f, 0.0f); m->forwardVel *= 0.8f; … case ACT_FLYING_TRIPLE_JUMP: set_mario_y_vel_based_on_fspeed(m, 82.0f, 0.0f);sm64: a decompilation of Super Mario 64 (n64decomp/sm64) · src/game/mario_actions_moving.c#L50-L52struct LandingAction sDoubleJumpLandAction = { 4, 5, ACT_FREEFALL, ACT_DOUBLE_JUMP_LAND_STOP, ACT_JUMP, ACT_FREEFALL, ACT_BEGIN_SLIDING,sm64: a decompilation of Super Mario 64 (n64decomp/sm64) · include/sm64.h#L258#define ACT_TRIPLE_JUMP 0x01000882 // (0x082 | ACT_FLAG_AIR | ACT_FLAG_ALLOW_VERTICAL_WIND_ACTION)Checked by claude, 2026-10-21 — read act_double_jump_land, set_triple_jump_action, the ACT_TRIPLE_JUMP case, and the ACT_DOUBLE_JUMP_LAND case of set_jump_from_landing (L1046-L1055), which applies the same test after the landing

The double-jump landing has the same 4 frames and 5-frame timer as sm64/double-jump. A triple jump landing sets the timer to 0 (sTripleJumpLandAction), so the chain stops at three.

Cited by: Super Mario 64, Triple jump

Z while running starts a crouch slide, and A in its first 30 frames at a forward speed above 10 units/frame starts a long jump. It takes off at 30 units/frame up and multiplies the forward speed by 1.5, capped at 48; in the air it falls with a gravity of 2 instead of 4. sm64/long-jump

About: Super Mario 64 Long jump

Value: 1.5 × forward speed

Codesm64: a decompilation of Super Mario 64 (n64decomp/sm64) · src/game/mario_actions_moving.c#L807-L808if (m->input & INPUT_Z_PRESSED) { return set_mario_action(m, ACT_CROUCH_SLIDE, 0);sm64: a decompilation of Super Mario 64 (n64decomp/sm64) · src/game/mario_actions_moving.c#L1459-L1463if (m->actionTimer < 30) { m->actionTimer++; if (m->input & INPUT_A_PRESSED) { if (m->forwardVel > 10.0f) { return set_jumping_action(m, ACT_LONG_JUMP, 0);sm64: a decompilation of Super Mario 64 (n64decomp/sm64) · src/game/mario.c#L863-L873case ACT_LONG_JUMP: … set_mario_y_vel_based_on_fspeed(m, 30.0f, 0.0f); … if ((m->forwardVel *= 1.5f) > 48.0f) { m->forwardVel = 48.0f;sm64: a decompilation of Super Mario 64 (n64decomp/sm64) · src/game/mario_step.c#L543-L545} else if (m->action == ACT_LONG_JUMP || m->action == ACT_SLIDE_KICK || m->action == ACT_BBH_ENTER_SPIN) { m->vel[1] -= 2.0f;Checked by claude, 2026-10-21 — read act_walking's Z check, act_crouch_slide, the ACT_LONG_JUMP case of set_mario_action_airborne, and apply_gravity

In the air the long jump also keeps forward speed up to 48 before drag starts, against 32 for other jumps (update_air_without_turn, mario_actions_airborne.c L223). A press during a long jump's 6-frame landing, with Z held, starts another long jump (sLongJumpLandAction, act_long_jump_land).

Cited by: Long jump, Super Mario 64

The long jump's cap clips only a forward speed above 48. A backward (negative) speed is multiplied by 1.5 with no limit, which the decompilers' comment names as the cause of backwards long jumps (BLJs). A long jump's landing chains into another long jump on A with Z held. In the air, each frame moves the speed 0.35 toward 0, adds the stick's push (up to 1.5 along Mario's facing), and adds 2 more while it is below −16. This is the US build; the Shindou and iQue builds set a negative speed to 0 when a long jump lands. sm64/long-jump-backward

About: Super Mario 64 Long jump

Codesm64: a decompilation of Super Mario 64 (n64decomp/sm64) · src/game/mario.c#L868-L871//! (BLJ's) This properly handles long jumps from getting forward speed with // too much velocity, but misses backwards longs allowing high negative speeds. if ((m->forwardVel *= 1.5f) > 48.0f) { m->forwardVel = 48.0f;sm64: a decompilation of Super Mario 64 (n64decomp/sm64) · src/game/mario_actions_moving.c#L46-L48struct LandingAction sLongJumpLandAction = { 6, 5, ACT_FREEFALL, ACT_LONG_JUMP_LAND_STOP, ACT_LONG_JUMP, ACT_FREEFALL, ACT_BEGIN_SLIDING,sm64: a decompilation of Super Mario 64 (n64decomp/sm64) · src/game/mario_actions_moving.c#L1847-L1859s32 act_long_jump_land(struct MarioState *m) { #if defined(VERSION_SH) || defined(VERSION_CN) // BLJ (Backwards Long Jump) speed build up fix, crushing SimpleFlips's dreams since July 1997 if (m->forwardVel < 0.0f) { m->forwardVel = 0.0f; } #endif if (!(m->input & INPUT_Z_DOWN)) { m->input &= ~INPUT_A_PRESSED; } if (common_landing_cancels(m, &sLongJumpLandAction, set_jumping_action)) {sm64: a decompilation of Super Mario 64 (n64decomp/sm64) · src/game/mario_actions_airborne.c#L223-L240dragThreshold = m->action == ACT_LONG_JUMP ? 48.0f : 32.0f; m->forwardVel = approach_f32(m->forwardVel, 0.0f, 0.35f, 0.35f); if (m->input & INPUT_NONZERO_ANALOG) { … intendedMag = m->intendedMag / 32.0f; m->forwardVel += intendedMag * coss(intendedDYaw) * 1.5f; … if (m->forwardVel > dragThreshold) { m->forwardVel -= 1.0f; } if (m->forwardVel < -16.0f) { m->forwardVel += 2.0f;Checked by claude, 2026-10-21 — read the ACT_LONG_JUMP case and its comment, sLongJumpLandAction, act_long_jump_land (its fix compiles only under VERSION_SH or VERSION_CN), approach_f32 in engine/math_util.c, and update_air_without_turn, which common_air_action_step calls for the long jump

The lines show the missing floor, not how a player first gets a backward speed or how the chain outpaces the air recovery; speedrunners' accounts (BLJs on stairs and slopes) are leads for a probe.

Cited by: Long jump, Super Mario 64

A jump that hits a wall at a forward speed above 16 turns Mario around and holds him in ACT_AIR_HIT_WALL. A press on its first 2 frames kicks off the wall. On the 3rd he bonks away, wallKickTimer is set to 5 and counts down once a frame, and A still kicks while it is nonzero: 7 frames in all. The kick takes off at 62 units/frame up and at least 24 forward. sm64/wall-kick

About: Super Mario 64 Wall jump

Value: 7 frames

Codesm64: a decompilation of Super Mario 64 (n64decomp/sm64) · src/game/mario_actions_airborne.c#L388-L399case AIR_STEP_HIT_WALL: … if (m->forwardVel > 16.0f) { … m->faceAngle[1] += 0x8000; … set_mario_action(m, ACT_AIR_HIT_WALL, 0);sm64: a decompilation of Super Mario 64 (n64decomp/sm64) · src/game/mario_actions_airborne.c#L1314-L1337if (++(m->actionTimer) <= 2) { if (m->input & INPUT_A_PRESSED) { … return set_mario_action(m, ACT_WALL_KICK_AIR, 0); } } else if (m->forwardVel >= 38.0f) { m->wallKickTimer = 5; … return set_mario_action(m, ACT_BACKWARD_AIR_KB, 0); } else { m->wallKickTimer = 5; … …sm64: a decompilation of Super Mario 64 (n64decomp/sm64) · src/game/mario_actions_airborne.c#L1156-L1158s32 act_backward_air_kb(struct MarioState *m) { if (check_wall_kick(m)) { return TRUE;sm64: a decompilation of Super Mario 64 (n64decomp/sm64) · src/game/mario_actions_airborne.c#L1247-L1249s32 act_soft_bonk(struct MarioState *m) { if (check_wall_kick(m)) { return TRUE;sm64: a decompilation of Super Mario 64 (n64decomp/sm64) · src/game/mario_actions_airborne.c#L1147-L1151s32 check_wall_kick(struct MarioState *m) { if ((m->input & INPUT_A_PRESSED) && m->wallKickTimer != 0 && m->prevAction == ACT_AIR_HIT_WALL) { m->faceAngle[1] += 0x8000; return set_mario_action(m, ACT_WALL_KICK_AIR, 0);sm64: a decompilation of Super Mario 64 (n64decomp/sm64) · src/game/mario.c#L1407-L1409if (m->wallKickTimer > 0) { m->wallKickTimer--;sm64: a decompilation of Super Mario 64 (n64decomp/sm64) · src/game/mario.c#L1705-L1717update_mario_inputs(gMarioState); … // The function can loop through many action shifts in one frame, … while (inLoop) {sm64: a decompilation of Super Mario 64 (n64decomp/sm64) · src/game/mario.c#L828-L834case ACT_WALL_KICK_AIR: case ACT_TOP_OF_POLE_JUMP: set_mario_y_vel_based_on_fspeed(m, 62.0f, 0.0f); if (m->forwardVel < 24.0f) { m->forwardVel = 24.0f;Checked by claude, 2026-10-21 — traced the frames. The wall-hit action first runs the frame after contact (actionTimer 1); frames 1 and 2 take A directly. On frame 3 both bonk branches (L1320-L1336) set the timer to 5 and return into the action loop, so act_soft_bonk or act_backward_air_kb runs that same frame and calls check_wall_kick. update_mario_inputs then counts the timer down at the start of frames 4 to 7 (4, 3, 2, 1), and on frame 8 it's 0.

The window closes early if Mario lands during the bonk. The kick's own vel[1] = 52 (L1316) is overwritten by the 62 set in set_mario_action_airborne. The wall kick keeps the release cut (sm64/jump-release).

Cited by: Super Mario 64, Super Mario Sunshine, Wall jump

Z in the air starts a ground pound. Mario stops dead and, on each of the first 10 frames (t counting from 0), rises 20 − 2t units, 110 in all, each rise skipped unless his new height plus 160 stays below the ceiling. He holds there until his spin animation ends plus 4 frames; then he falls from −50 units/frame under the usual gravity. sm64/ground-pound

About: Super Mario 64 Ground pound

Value: -50 units/frame

Codesm64: a decompilation of Super Mario 64 (n64decomp/sm64) · src/game/mario_actions_airborne.c#L451-L453if (m->input & INPUT_Z_PRESSED) { return set_mario_action(m, ACT_GROUND_POUND, 0);sm64: a decompilation of Super Mario 64 (n64decomp/sm64) · src/game/mario_actions_airborne.c#L924-L947if (m->actionState == 0) { if (m->actionTimer < 10) { yOffset = 20 - 2 * m->actionTimer; if (m->pos[1] + yOffset + 160.0f < m->ceilHeight) { m->pos[1] += yOffset; … m->vel[1] = -50.0f; mario_set_forward_vel(m, 0.0f); … m->actionTimer++; if (m->actionTimer >= m->marioObj->header.gfx.animInfo.curAnim->loopEnd + 4) { … …sm64: a decompilation of Super Mario 64 (n64decomp/sm64) · src/game/mario_actions_airborne.c#L948-L951} else { set_mario_animation(m, MARIO_ANIM_GROUND_POUND); … stepResult = perform_air_step(m, 0);Checked by claude, 2026-10-21 — read act_jump's Z check and act_ground_pound; phase 0 never calls perform_air_step, so gravity and the −50 apply only once phase 1 starts

Read in the US build; the cited lines have no version conditionals, and only the landing's voice clip differs in the Japanese one (L957-L961). The hold's length comes from the animation data, which the atlas doesn't fetch. A ground pound from a high fall onto snow or sand sticks Mario in the ground (should_get_stuck_in_ground).

Cited by: Banjo-Kazooie, Ground pound, Super Mario 64

On the ground the stick's tilt sets a target speed: intendedMag is 32 times the square of the tilt's fraction of full. Below the target Mario gains 1.1 − speed/43 units/frame each frame (1.1 from a standstill); above it, on level ground, he loses 1. The target is at most 32, or 24 on slow floors, and the speed is capped at 48. sm64/walking-speed

About: Super Mario 64 Running

Value: 32 units/frame

Codesm64: a decompilation of Super Mario 64 (n64decomp/sm64) · src/game/mario.c#L1295-L1298f32 mag = ((controller->stickMag / 64.0f) * (controller->stickMag / 64.0f)) * 64.0f; … m->intendedMag = mag / 2.0f;sm64: a decompilation of Super Mario 64 (n64decomp/sm64) · src/game/game_init.c#L455-L458if (controller->stickMag > 64) { … controller->stickMag = 64;sm64: a decompilation of Super Mario 64 (n64decomp/sm64) · src/game/mario_actions_moving.c#L438-L460if (m->floor != NULL && m->floor->type == SURFACE_SLOW) { maxTargetSpeed = 24.0f; } else { maxTargetSpeed = 32.0f; } targetSpeed = m->intendedMag < maxTargetSpeed ? m->intendedMag : maxTargetSpeed; … if (m->forwardVel <= 0.0f) { m->forwardVel += 1.1f; } else if (m->forwardVel <= targetSpeed) { m->forwardVel += 1.1f - m->forwardVel / 43.0f; } else if (m->floor->normal.y >= 0.95f) { …Checked by claude, 2026-10-21 — read update_mario_joystick_inputs, the stick clamp in adjust_analog_stick, and update_walking_speed; slopes then add apply_slope_accel (L464)

At full tilt the speed climbs to 32 and, since the last step below it overshoots, then sits just around it. Squished, intendedMag is an eighth of mag instead of a half (L1300).

Cited by: Banjo-Kazooie, Running