If you appreciate the work done within the wiki, please consider supporting The Cutting Room Floor on Patreon. Thanks for all your support!
This article has a talk page!

Bugs:Super Mario 64 (Nintendo 64)

From The Cutting Room Floor
Jump to navigation Jump to search

This page details bugs of Super Mario 64 (Nintendo 64).

Cactus 2.0!
This article has just been started and needs the article basics added.
Help us out and add them.
Hmmm...
To do:
Add more bugs, many of which are documented here.

Despawning Big Goombas Without Killing Them

if (obj_handle_attacks(&sGoombaHitbox, GOOMBA_ACT_ATTACKED_MARIO,
                               sGoombaAttackHandlers[o->oGoombaSize & 1])) {
            mark_goomba_as_dead();
        }

Only works on the triplet Goomba spawner. This piece of code in the Goomba behavior file calls a function that returns a value if attacked by Mario. If done so (and it does happen with every attack), the Goomba is marked as dead, so that it will despawn competely when exiting it's spawn radius.

Unlike the small and normal-sized Goomba, however, the big Goomba won't be killed by a weak attack like a simple punch. Yet regardless it is marked as dead, and even though it still isn't actually killed, will despawn as soon as the spawn radius is exited and entered again (by getting far away enough, then returning). This can be tested best at the starting point in Tiny-Huge Island.

This bug only works with the triplet spawner, as it has its own update function with code for loading and unloading enemies (bhv_goomba_triplet_spawner_update) which explicitly checks if any Goomba is marked as dead, and if so, it doesn't spawn that enemy anymore.

Empty File Deletion Crash

Present in all releases of the N64 game, including the Shindou Edition and Super Mario 3D All-Stars, but save data should not be damaged as a result of the crash.

On the File Select screen, perform the following actions within quick succession of each other:

  1. Select "Copy"
  2. Select an empty file (preferably C or D because they are closer)
  3. Select "Check Score" from the Copy menu
  4. Select an empty file

If done correctly, "Select File" on the Score screen will shortly fade to "No Saved Data Exists". Once this happens, select "Erase" and wait for its screen to overlap. You will immediately be asked if you wish to delete the data in NULL. Selecting "Yes" at this prompt will cause an address error which will immediately crash the game. If done on the 3D All-Stars version, the software will crash back to the Switch's home menu. The Wii VC is unaffected by this bug. The delete animation gets stuck, but switching to any of the other options (ie. Check Score) fixes it. On WiiU VC, the game will continue normally, albeit with the message claiming that "Mario 9" was erased.

Smoke Error

The smoke looks corrupted because the sprite is in a different format than it was set for the smoke. You can learn more about this here .


(Source: Snooplax)

Backwards Long Jump

The Backwards Long Jump hyperspeed method, or BLJ for short, is the most famous hyperspeed method in Super Mario 64. Due to their versatility, BLJs are commonly used in all kinds of speedruns and challenges. When Mario initiates a long jump, his horizontal speed is multiplied by 3/2. A BLJ occurs when a backwards long jump is interrupted before the effects of drag can counteract the speed gain from the 3/2 multiplier. This does not occur with forwards long jumps because long jumps have a "hard cap" of +48 horizontal speed which Mario's speed cannot exceed. No such cap exists in the negative direction because normally the "soft cap" of -16 speed from drag is easily enough to stop any speed gain.

In which in the code the case ACT_LONG_JUMP in the switch action function explains itself, As it doesn't call if Mario's forward velocity is at a negative integer past the speed cap.

case ACT_LONG_JUMP:
            m->marioObj->header.gfx.animInfo.animID = -1;
            set_mario_y_vel_based_on_fspeed(m, 30.0f, 0.0f);
            m->marioObj->oMarioLongJumpIsSlow = m->forwardVel > 16.0f ? FALSE : TRUE;
            if ((m->forwardVel *= 1.5f) > 48.0f) {
                m->forwardVel = 48.0f;
            }
            break;

There are several different types of BLJs. The distinguishing feature of different types of BLJs is what they use to interrupt the long jump:

  • Slope BLJs use slopes by going up the slope.
  • Stair BLJs use stairs by going up the stairs.

Elevator BLJs use the upwards movement of an elevator or other object. Side BLJs use two floors at slightly different levels by oscillating between them. Ceiling BLJs use an exposed ceiling or low-hanging ceiling by making Mario hit his head and start travelling downwards faster. BLJs can also be pause buffered to increase the amount of long jumps that can be performed in a given amount of time or space.

The BLJ glitch was patched in the Shindou release, and therefore also the iQue version. This also means that any emulator releases of these game versions lack the BLJ glitch, namely the Japanese Wii VC release, the Japanese Wii U VC release, and all versions of Super Mario 3D All-Stars.

Frame Walking

Frame walking is a fairly simple glitch you can do yourself with a bit of practice and timing. Run up to a steep slope (e.g. next to the crater that spawns bowling balls in Bob-omb Battlefield, or one of the tall spikes in Jolly Roger Bay) and use the joystick to move each frame when doing each step.

The reason why the glitch occurs is because when Mario does a quarter step, the game checks how steep the slope is. If it's steep, Mario does a quarter step and then slides off it. But when moving on a steep slope, Mario's speed decreases over time and eventually makes Mario slide off, but not when doing a quarter step each frame before Mario's state changes to sliding off.

The steeper the slope is, the harder the timing gets, eventually becoming frame-perfect each time.

Demonstration

Shell Hyperspeed

The Shell Hyperspeed glitch is a pretty easy glitch where if Mario's on a very steep slope while riding the shell, Mario's speed increases at a negative integer to where you can build up negative speed, going off the slope can make Mario go backwards at a fast speed, eventually then decreasing overtime when you're not on the steep slope.

This is because in the code there's no negative speed cap in the update_shell_speed(struct MarioState *m) function.

if (m->forwardVel > 64.0f) {
    m->forwardVel = 64.0f;
}

C^ Hyperspeed

Hmmm...
To do:
Add the code on how it works from the source code.

C^ Hyperspeed is a pretty hard glitch to where going on a step slope, (For example: On the white slope past the Chain Chomp in Bob-omb Battlefield), moving and going in first person, Mario begins skidding indefinitely to where you can build up speed, in which if you fall off the slope, exit first person and land in a object that's claimable and exit the course before Mario's speed resets, Mario's current speed is kept inside the castle, causing the 10k glitch.

Koopa The Quick Glitches

Bowling Ball Deceleration

Using a bowling ball clone while in a race, You can make Koopa the Quick's animation index out of the animation's bounds, making Koopa the Quick having broken animations, eventually having its animation index being normal and glitched again repeatedly.

static void koopa_the_quick_animate_footsteps(void) {
    cur_obj_init_animation_with_accel_and_sound(9, o->oForwardVel * 0.09f);
    koopa_play_footstep_sound(2, 17);
}
(Source: pannenkoek2012)

Koopa The Quick PU Speed Build Up

Using the same technique as in the Bowling Ball Deceleration Glitch, Moving Koopa the Quick enough to where he's at the corner to where he will indefinitely build up PU speed, Eventually going into a PU.

In the code for the koopa_the_quick_detect_bowling_ball function, The reason why Koopa the Quick can build up PU speed is because there isn't a negative speed cap in the code of the game, Just like Mario when he starts building up speed doing a BLJ.

if (distToBall < 400.0f) {
                if (ballSpeedInKoopaRunDir < o->oForwardVel * 0.7f) {
                    return 1;
                } else {
                    o->oForwardVel -= 2.0f;
                }
            }
(Source: pannenkoek2012)

Text Redirection

When going to a sign or a star door that you dont have the required stars for, Mario stops in place. But his speed isn't reset, It's still kept. So when building up speed and going to a sign, You can redirect Mario at a different direction, Being useful for TAS and or speedruns.

Invisible Bowser

In the second bowser fight, if you grab Bowser as he's about to teleport, you can hold and throw him while he's invisible. The reason why is because the function for Bowser to teleport is cancelled out. This can be fixed by purposely making Bowser fall, making him become visible again.

Misalignment

A misalignment is a 1x1-unit area a floor hitbox extends to but wall hitboxes do not. On convex corners, they allow Mario to snap up to the floor from up to 78 units below it, as opposed to just 30 units when there is a wall hitbox present.

It is the same truncation responsible for PUs that causes misalignment; because floor and ceiling detection is done with integers, all decimal places are removed. If Mario has the right position off the floor, his position will be rounded to a spot on the floor, making the floor appear to extend to his actual position. Walls do not do this, since they use floating-point numbers, which causes the floor to not properly align with its adjacent walls.

SM64 MisalignmentDemonstration.png


(Source: pannenkoek2012)

Tick Tock Clock Pendulum Box

The box holding the pivot of the first pendulum in Tick Tock Clock is an extremely glitchy object. With a precise jump, it is possible to grab onto the top of the pendulum, which is not visually suggested to be possible as it is inside the box.

Pulling himself up will put Mario inside the box, which will cause Mario's model to undergo erratic animation irregularities and rapid displacements when he performs various actions, as seen in the footage.

SM64 Pendulum Buginess Demonstration.gif


(Source: Supper Mario Broth / toyuru2)