Triple jump
A series of jumps, each pressed just after the last one lands, that climb higher with each step.
On this page
A triple jump rewards rhythm: each jump pressed right after the last landing goes higher. In Super Mario 64, a press during the 4-frame landing from a jump starts a double jump at 52 units/frame1, and one during the landing from that starts a triple jump at 69, if Mario’s forward speed is above 202.
In a decompilation that doesn’t yet match, Super Mario Sunshine starts a triple jump, at enough forward speed, from the landing of a double jump, a backflip, or a spin jump, where Super Mario 64 chains it from a double jump3,2. Its take-off is 70 + ¼ × forward speed by default3.
- Landing chainSuper Mario 64 (1996). A press during a landing chains 42, 52, then 69 units/frame, the third above 20 forward.1,2Super Mario Sunshine (2002). A press within 15 updates of landing from a double jump, a backflip, or a spin jump starts it at 20 forward or more, by default at 70 plus a quarter of the speed.3
Games
| Game | Year | How | Note |
|---|---|---|---|
| Super Mario 64 | 1996 | Landing chain | a press during a landing chains 42, 52, then 69 units/frame, the third above 20 forward |
| Super Mario Sunshine | 2002 | Landing chain | a press within 15 updates of landing from a double jump, a backflip, or a spin jump starts it at 20 forward or more, by default at 70 plus a quarter of the speed |
Every claim about this mechanic, by game (1)
References
- ^ abA 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
doubleJumpTimerto 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, becauseset_jump_from_landingchecks 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.Coden64decomp/sm64revisedHow we know
785 case ACT_DOUBLE_JUMP: 786 set_mario_y_vel_based_on_fspeed(m, 52.0f, 0.25f); 787 m->forwardVel *= 0.8f;
src/game/mario.c lines 785–788 at 9921382 · upstream ↗ 26struct LandingAction sJumpLandAction = { 27 4, 5, ACT_FREEFALL, ACT_JUMP_LAND_STOP, ACT_DOUBLE_JUMP, ACT_FREEFALL, ACT_BEGIN_SLIDING, ⋮ 30struct LandingAction sFreefallLandAction = { 31 4, 5, ACT_FREEFALL, ACT_FREEFALL_LAND_STOP, ACT_DOUBLE_JUMP, ACT_FREEFALL, ACT_BEGIN_SLIDING,
src/game/mario_actions_moving.c lines 26–32 at 9921382 · upstream ↗ 1767 m->doubleJumpTimer = landingAction->unk02; ⋮ 1774 return set_mario_action(m, landingAction->endAction, 0); ⋮ 1777 if (++m->actionTimer >= landingAction->numFrames) { 1778 return set_mario_action(m, landingAction->endAction, 0); ⋮ 1781 if (m->input & INPUT_A_PRESSED) { 1782 return setAPressAction(m, landingAction->aPressedAction, 0);
src/game/mario_actions_moving.c lines 1767–1783 at 9921382 · upstream ↗ 1411 if (m->doubleJumpTimer > 0) { 1412 m->doubleJumpTimer--;
src/game/mario.c lines 1411–1413 at 9921382 · upstream ↗ 848 if (m->input & INPUT_A_PRESSED) { 849 if (!action) { 850 return set_jump_from_landing(m);
src/game/mario_actions_stationary.c lines 848–850 at 9921382 · upstream ↗ 1030 if ((m->doubleJumpTimer == 0) || (m->squishTimer != 0)) { 1031 set_mario_action(m, ACT_JUMP, 0); 1032 } else { 1033 switch (m->prevAction) { 1034 case ACT_JUMP_LAND: 1035 set_mario_action(m, ACT_DOUBLE_JUMP, 0); ⋮ 1039 set_mario_action(m, ACT_DOUBLE_JUMP, 0); ⋮ 1043 set_mario_action(m, ACT_DOUBLE_JUMP, 0);
src/game/mario.c lines 1030–1043 at 9921382 · upstream ↗ 856 if (m->input & (INPUT_NONZERO_ANALOG | INPUT_A_PRESSED | INPUT_OFF_FLOOR | INPUT_ABOVE_SLIDE)) { 857 return check_common_action_exits(m);
src/game/mario_actions_stationary.c lines 856–857 at 9921382 · upstream ↗ 1124 if (m->input & INPUT_NONZERO_ANALOG) { 1125 return set_mario_action(m, ACT_WALKING, 0);
src/game/mario.c lines 1124–1125 at 9921382 · upstream ↗ 1006 m->prevAction = m->action; 1007 m->action = action;
src/game/mario.c lines 1006–1007 at 9921382 · upstream ↗ 791 if (m->input & INPUT_A_PRESSED) { 792 return set_jump_from_landing(m);
src/game/mario_actions_moving.c lines 791–792 at 9921382 · 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.
- ^ abcA 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.Coden64decomp/sm64revisedHow we know
1874s32 act_double_jump_land(struct MarioState *m) { 1875 if (common_landing_cancels(m, &sDoubleJumpLandAction, set_triple_jump_action)) {
src/game/mario_actions_moving.c lines 1874–1876 at 9921382 · upstream ↗ 147s32 set_triple_jump_action(struct MarioState *m, UNUSED u32 action, UNUSED u32 actionArg) { 148 if (m->flags & MARIO_WING_CAP) { 149 return set_mario_action(m, ACT_FLYING_TRIPLE_JUMP, 0); 150 } else if (m->forwardVel > 20.0f) { 151 return set_mario_action(m, ACT_TRIPLE_JUMP, 0); 152 } else { 153 return set_mario_action(m, ACT_JUMP, 0);
src/game/mario_actions_moving.c lines 147–153 at 9921382 · upstream ↗ 796 case ACT_TRIPLE_JUMP: 797 set_mario_y_vel_based_on_fspeed(m, 69.0f, 0.0f); 798 m->forwardVel *= 0.8f; ⋮ 801 case ACT_FLYING_TRIPLE_JUMP: 802 set_mario_y_vel_based_on_fspeed(m, 82.0f, 0.0f);
src/game/mario.c lines 796–802 at 9921382 · upstream ↗ 50struct LandingAction sDoubleJumpLandAction = { 51 4, 5, ACT_FREEFALL, ACT_DOUBLE_JUMP_LAND_STOP, ACT_JUMP, ACT_FREEFALL, ACT_BEGIN_SLIDING,
src/game/mario_actions_moving.c lines 50–52 at 9921382 · upstream ↗ 258#define ACT_TRIPLE_JUMP 0x01000882 // (0x082 | ACT_FLAG_AIR | ACT_FLAG_ALLOW_VERTICAL_WIND_ACTION)include/sm64.h line 258 at 9921382 · 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.
- ^ abcIn Super Mario Sunshine, by the decompilers' Player code, which doesn't yet match, the double jump, the backflip (
MARIO_STATUS_BACK_JUMP), the spin jump, and the jumps the code callstrampleandwireJumpingall land inMARIO_STATUS_SEC_JUMP_SLIP. ItsjumpSlipEventscounts updates and ends the landing on the 16th, before reading A, so a press on one of the first 15 (computed) goes tochangePlayerJumping, which can still turn it into a miss or spin jump (sms/jump): the triple jump,MARIO_STATUS_ULTRA_JUMP, if the forward speed is at least the parametermTriJumpEnableSp(default 20), and a single jump if not. The single jump and the wall kick land inMARIO_STATUS_JUMP_SLIPinstead, where a press makes a double jump only at a forward speed of at leastmSecJumpEnableSp(default 20). The triple jump takes off atmUltraJumpForceplusmUltraJumpSpeedMulttimes the forward speed (defaults 70 and 0.25) and multiplies the forward speed bymUltraJumpXZMult(default 0.8); its status lacks the bit that lets a release cut the rise. Super Mario 64's triple jump starts from the double jump's 4-frame landing at a forward speed above 20, takes off at 69 whatever the speed, and can't be cut either (sm64/triple-jump, sm64/jump-release).Code notesdoldecomp/sms · n64decomp/sm64revisedHow we know
947 Object(NonMatching, "Player/MarioJump.cpp"), ⋮ 949 PCHObject(NonMatching, "Player/MarioMove.cpp"), ⋮ 952 PCHObject(NonMatching, "Player/MarioRun.cpp"), ⋮ 964 PCHObject(NonMatching, "Player/MarioInit.cpp"),
configure.py lines 947–964 at d2cc8f5 · upstream ↗ 341BOOL TMario::secJumping() ⋮ 357 jumpingBasic(MARIO_STATUS_SEC_JUMP_SLIP, anim, 3);
src/Player/MarioJump.cpp lines 341–357 at d2cc8f5 · upstream ↗ 378BOOL TMario::backJumping() ⋮ 390 jumpingBasic(MARIO_STATUS_SEC_JUMP_SLIP, 0xF7, 0); 391 else 392 jumpingBasic(MARIO_STATUS_SEC_JUMP_SLIP, ANIM_LAND, 0);
src/Player/MarioJump.cpp lines 378–392 at d2cc8f5 · upstream ↗ 773BOOL TMario::trample() ⋮ 778 jumpingBasic(MARIO_STATUS_SEC_JUMP_SLIP, mAnimationId, 3);
src/Player/MarioJump.cpp lines 773–778 at d2cc8f5 · upstream ↗ 997BOOL TMario::rotateJumping() ⋮ 1007 jumpingBasic(MARIO_STATUS_SEC_JUMP_SLIP, mAnimationId, 0);
src/Player/MarioJump.cpp lines 997–1007 at d2cc8f5 · upstream ↗ 1021BOOL TMario::wireJumping() ⋮ 1035 jumpingBasic(MARIO_STATUS_SEC_JUMP_SLIP, mAnimationId, 3);
src/Player/MarioJump.cpp lines 1021–1035 at d2cc8f5 · upstream ↗ 335 jumpingBasic(MARIO_STATUS_JUMP_SLIP, ANIM_JUMP, 3);src/Player/MarioJump.cpp line 335 at d2cc8f5 · upstream ↗ 454 jumpingBasic(MARIO_STATUS_JUMP_SLIP, ANIM_WJMP, 3);src/Player/MarioJump.cpp line 454 at d2cc8f5 · upstream ↗ 1538BOOL TMario::jumpSlipEvents(JumpSlipRecord* rec) ⋮ 1541 return changePlayerStatus(rec->mEndStatus, 0, false); ⋮ 1543 mStatusTimer++; ⋮ 1545 if (mStatusTimer >= rec->mMaxTimer) 1546 return changePlayerStatus(rec->mEndStatus, 0, false); ⋮ 1548 if (mInput & 0x2) { 1549 if (rec->mJumpStatus == MARIO_STATUS_SECOND_JUMP) 1550 if (mForwardVel >= mJumpParams.mSecJumpEnableSp.get()) 1551 return changePlayerJumping(MARIO_STATUS_SECOND_JUMP, 0); ⋮ 1553 if (rec->mJumpStatus == MARIO_STATUS_ULTRA_JUMP) 1554 if (mForwardVel >= mJumpParams.mTriJumpEnableSp.get()) 1555 return changePlayerJumping(MARIO_STATUS_ULTRA_JUMP, 0); ⋮
src/Player/MarioRun.cpp lines 1538–1557 at d2cc8f5 · upstream ↗ 1599BOOL TMario::secJumpSlip() ⋮ 1601 static TMario::JumpSlipRecord param 1602 = { 0x10, MARIO_STATUS_SEC_JUMP_END, MARIO_STATUS_ULTRA_JUMP,
src/Player/MarioRun.cpp lines 1599–1602 at d2cc8f5 · upstream ↗ 471 case MARIO_STATUS_ULTRA_JUMP: 472 setPlayerJumpSpeed(mJumpParams.mUltraJumpSpeedMult.get(), 473 mJumpParams.mUltraJumpForce.get()); 474 mForwardVel *= mJumpParams.mUltraJumpXZMult.get();
src/Player/MarioMove.cpp lines 471–474 at d2cc8f5 · upstream ↗ 572 , PARAM_INIT(mSecJumpEnableSp, 20.0f) ⋮ 576 , PARAM_INIT(mTriJumpEnableSp, 20.0f) 577 , PARAM_INIT(mUltraJumpForce, 70.0f) 578 , PARAM_INIT(mUltraJumpSpeedMult, 0.25f) 579 , PARAM_INIT(mUltraJumpXZMult, 0.8f)
src/Player/MarioInit.cpp lines 572–579 at d2cc8f5 · upstream ↗ 124 MARIO_STATUS_ULTRA_JUMP 125 = MARIO_STATUS_FLAG_JUMPING | MARIO_STATUS_TYPE_JUMPING | 0x2, // 0x882
include/Player/MarioStatus.hpp lines 124–125 at d2cc8f5 · upstream ↗ 1874s32 act_double_jump_land(struct MarioState *m) { 1875 if (common_landing_cancels(m, &sDoubleJumpLandAction, set_triple_jump_action)) {
src/game/mario_actions_moving.c lines 1874–1875 at 9921382 · upstream ↗ 50struct LandingAction sDoubleJumpLandAction = { 51 4, 5, ACT_FREEFALL, ACT_DOUBLE_JUMP_LAND_STOP, ACT_JUMP, ACT_FREEFALL, ACT_BEGIN_SLIDING,
src/game/mario_actions_moving.c lines 50–51 at 9921382 · upstream ↗ 150 } else if (m->forwardVel > 20.0f) { 151 return set_mario_action(m, ACT_TRIPLE_JUMP, 0);
src/game/mario_actions_moving.c lines 150–151 at 9921382 · upstream ↗ 796 case ACT_TRIPLE_JUMP: 797 set_mario_y_vel_based_on_fspeed(m, 69.0f, 0.0f); 798 m->forwardVel *= 0.8f;
src/game/mario.c lines 796–798 at 9921382 · upstream ↗ 258#define ACT_TRIPLE_JUMP 0x01000882 // (0x082 | ACT_FLAG_AIR | ACT_FLAG_ALLOW_VERTICAL_WIND_ACTION)include/sm64.h line 258 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.
Sources
Code
- n64decomp. 2023. “sm64: a decompilation of Super Mario 64 (n64decomp/sm64).” Commit 9921382. n64decomp/sm64 @ 9921382 · licence, all uses
- doldecomp. 2026. “sms: a decompilation of Super Mario Sunshine (doldecomp/sms).” Commit d2cc8f5. doldecomp/sms @ d2cc8f5 · licence, all uses