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

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

GameYearHowNote
Super Mario 641996Landing chaina press during a landing chains 42, 52, then 69 units/frame, the third above 20 forward
Super Mario Sunshine2002Landing chaina 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

  1. ^ 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 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.Coden64decomp/sm64revised
    How 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.

    In the claim ledger

  2. ^ 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/sm64revised
    How 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.

    In the claim ledger

  3. ^ 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 calls trample and wireJumping all land in MARIO_STATUS_SEC_JUMP_SLIP. Its jumpSlipEvents counts updates and ends the landing on the 16th, before reading A, so a press on one of the first 15 (computed) goes to changePlayerJumping, 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 parameter mTriJumpEnableSp (default 20), and a single jump if not. The single jump and the wall kick land in MARIO_STATUS_JUMP_SLIP instead, where a press makes a double jump only at a forward speed of at least mSecJumpEnableSp (default 20). The triple jump takes off at mUltraJumpForce plus mUltraJumpSpeedMult times the forward speed (defaults 70 and 0.25) and multiplies the forward speed by mUltraJumpXZMult (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/sm64revised
    How 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.

    In the claim ledger

Sources

Code