the cutting room mirror

Objects

This article has a talk page!
view on tcrf.net

This is a sub-page of Development:Super Mario 64 (Nintendo 64).

To do:

  • data/pathdata.glb
  • data/p/pathtest.p
  • data/p/pathminiteresa.p
  • stage/tag.cnf

Objects#

Motos/Motosman#

An unused enemy internally referred to as "モトス" (Japanese name), "motos", and "motosman" in "sm64/shape/EnemyTest/old/motos.sou". The Behavior file was last updated on October 17th, 1995. Some behavior names and an object shape's name identify it as "motosman", which is the most likely internal name. The name "Motos" likely derives from the game Motos, where the player controls a bumper car that can bump enemies off, and in turn enemies can bump the car off. This is similar to how Motosman functions in-game, just with throwing instead of bumping. Orphaned code in "data/p/pathmotos.p" implies it would have been able to grab objects, run and aim towards the player, then throw.

The general structure and idea of this enemy may have evolved into and split off into Chuckya and Bully. It also shares a similar internal name to Chuckya: Chuckya (carryboy) and Motos (motosman). Various pieces of code associated with Lethal Lava Land and Bowser in the Fire Sea indicate that Motos was intended to appear as a common enemy or common mini-boss in both levels. The phrase motos regularly appears in textures associated with the level, Bullies are internally labeled "Otos" and use sound effects associated with Motos in the source code, and the "Bully the Bullies" Star in Lethal Lava Land is named bigmotos in the code.

Animations

Behavior Code

#define ANM_motos_basedata_A       0
#define ANM_motos_carry            1
#define ANM_motos_carry_run        2
#define ANM_motos_carry_start      3
#define ANM_motos_down_recover     4
#define ANM_motos_down_stop        5
#define ANM_motos_pitch            6
#define ANM_motos_safe_down        7
#define ANM_motos_wait             8
#define ANM_motos_walk             9

#define ANM_motos_end              ANM_motos_walk+1

e_motos:
   p_initialize(enemyA)
   p_setbit(flag,stf_moveON | stf_YangleSAME | stf_catchON | stf_playerdistON | stf_playerangleON )
   p_set_pointer(skelanime,motos_anime)
   p_setd(objname,OBJNAME_TAKE)
   p_sethitbox(100,100)
   p_setmovedata(30,-400,-50,1000,1000,200,0,0)
   p_makeobj_child(S_NULL,e_motos_hand)
   p_hitON
   p_while
       p_program(s_motos)
   p_loop

e_motos_hand:
   p_initialize(enemyA)
   p_setbit(flag,stf_moveON | stf_YangleSAME )
   p_softspritemodeON
   p_while
       p_program(s_motos_hand)
   p_loop

#define        motos_work  (execstp->s[stw_work0].d)

extern unsigned long MotosProc1(int code,MapNode *node, void *data)
{

   if (code == MAP_CBACK_EXEC) {

       AffineMtx    modelmtx;  
       StrategyRecord  *stp = (StrategyRecord *)hmsActiveShape;

       if ( stp->childobj != NULL ){
           s_calc_skeleton_glbmtx(&modelmtx,(AffineMtx *)data,hmsActiveCamera->matrix);
           s_calc_skeleton_glbpos(modelmtx,stp->childobj);
           s_copy_worldXYZmappos(stp->childobj);
       }

   }

   return(0);

}

extern void s_motos_hand(void)
{

   StrategyRecord *firep;

   execstp->s[stw_skeletonX].f = 100;
   execstp->s[stw_skeletonY].f = 0;
   execstp->s[stw_skeletonZ].f = 150;

   obj_angleY = execstp->motherobj->s[stw_angleY].d;

   switch (execstp->motherobj->s[stw_imm].d ){
       case    0:
           break;
       case    1:
           s_copy_mapwork(player1stp,execstp);
           break;
       case    2:
           player1stp->s[stw_mail].d |= PLAYERMAIL_CARRYMODE_OFF;
           playerWorks[0].velocity = 50;
           execstp->motherobj->s[stw_imm].d = 0;
           break;
   }


#if 0
   if (execstp->motherobj->s[stw_imm].d != 0){
       execstp->motherobj->s[stw_imm].d = 0;
       firep = s_makeobj_nowpos(execstp,S_green_kame,e_enemyfire);
       firep->s[stw_speedF].f = 40;
       firep->s[stw_speedY].f = 20;
       firep->s[stw_angleY].d = execstp->motherobj->s[stw_angleY].d;
   }
#endif

}

static int s_ai_pitch(short angle,float dist)
{

   if ( (s_chase_angleY(obj_targetangle,angle)) && (obj_playerdist < dist) ) return(1);
   else                                                                      
return(0);

}

static void motos_wait(void)
{ 
   obj_speedF = 0;
   obj_speedY = 0;
   s_set_skelanimeNo(ANM_motos_wait);

   if ( obj_playerdist < 500 ) obj_mode = mode_motos_player_search;

}

static void motos_player_search(void)
{

   s_set_skelanimeNo(ANM_motos_walk);

   obj_speedF = 2;
   s_chase_angleY(obj_targetangle,300);

   if ( execstp->s[stw_mail].d & EMAIL_CARRYMODE_ON ){
       obj_mode = mode_motos_player_carry;
       execstp->s[stw_imm].d = 1;
   }

}

static void motos_player_carry(void)
{

   s_set_skelanimeNo(ANM_motos_carry_start);
   if ( s_check_animeend() )   obj_mode = mode_motos_player_pitch;

}

static void motos_player_pitch(void)
{

   obj_speedF = 0;
   s_set_skelanimeNo(ANM_motos_pitch);
   if ( s_check_animenumber(14) ){
       execstp->s[stw_imm].d = 2;      /* nageru shyn kan  */
       execstp->hit_counter = 10;      /* hit time wait!!  */
   }
   if ( s_check_animeend() ){
       obj_mode = mode_motos_wait;
       Mbitclr(execstp->s[stw_mail].d,EMAIL_CARRYMODE_ON);
   }

}

static void motos_carry_start(void)
{ 
   s_set_skelanimeNo(ANM_motos_carry_start);
   if ( s_check_animeend() ){
       if ( s_ai_pitch(0x200,500) ) obj_mode = mode_motos_pitch;
       else                         obj_mode = mode_motos_carry_run;
   }       

}

static void motos_carry_run(void)
{

   obj_speedF = 5;

   s_set_skelanimeNo(ANM_motos_carry_run);
   if ( s_ai_pitch(0x200,500) ) obj_mode = mode_motos_pitch;
   else                         obj_mode = mode_motos_carry_run;

}

static void motos_pitch(void)
{ 
   obj_speedF = 0;
   s_set_skelanimeNo(ANM_motos_pitch);

   if ( s_check_animenumber(14) ){
       execstp->s[stw_imm].d = 0;
   }
   if ( s_check_animeend() )   obj_mode = mode_motos_wait;

}

static void motos_fly(void)
{

   s_set_skelanimeNo(ANM_motos_walk);

   if ( obj_movestatus & MOVESTAT_BGTOUCH ) obj_mode = mode_motos_wait;

}

static void motos_main(void)
{

   s_enemybgcheck();                       /*  monky bgcheck   */

   switch (obj_mode){
       case        mode_motos_wait:        motos_wait();       break;
       case        mode_motos_player_search:       motos_player_search();      break;
       case        mode_motos_player_carry:        motos_player_carry();       break;
       case        mode_motos_player_pitch:        motos_player_pitch();       break;
       case        mode_motos_carry_start:     motos_carry_start();        break;
       case        mode_motos_carry_run:       motos_carry_run();      break;
       case        mode_motos_pitch:       motos_pitch();      break;
       case        mode_motos_fly:     motos_fly();        break;
   default: rmonpf(("Error objmode motos\n")); }

   s_enemymove(-78);                           /*  monky moving    */

}

extern void s_motos(void)
{
   float   f,y;
   f = 5;
   y = 0;

   s_set_scale(2.0);

   Mbitset(execstp->s[stw_enemyinfo].d,ENEMYINFO_CARRY);

   switch(execstp->s[stw_actionmode].d){
       case    CHILEDMODE_NO_CATCH:    motos_main();                                   break;
       case    CHILEDMODE_CATCH:       s_mode_catch(ANM_motos_walk,mode_motos_wait);   break;
       case    CHILEDMODE_THROW:       s_mode_throw(f,y,mode_motos_fly);               break;
    // case    CHILEDMODE_DROP:        s_mode_drop();                                  break;
       case    CHILEDMODE_DROP:        s_mode_throw(f,y,mode_motos_fly);               break;
   }
   s_erase_shape(obj_playerdist,2000);

}

Behavior Code

e_motos:
e_motosman:
   p_initialize(option)
   p_killshape

Hopper#

Unused lighting

Transparent in-game model

Hopping animation

Directory: "sm64/shape/EnemyTest/old/hopper.sou"

hopper.sou seems to be a grasshopper enemy. Not much is known about this "hopper", but it does have one animation and an empty path file associated with it. Additionally e_batta (translates to grasshopper) might be a version of it.

Katsugikun#

An enemy with a semi-interesting tale. The word katsugi translates to carry, and the model ID associated with it still exists, but no model is present in the files. Katsugikun's behavior code only contains the header as well as a suspiciously edited version of King Bob-omb's initialization code. It's referenced in the Lethal Lava Land's object shape bank, and a code remnant found in Chuckya's behavior code indicates Katsugikun evolved from Motos and was either an early version of or possibly a boss variant of Chuckya. Of note is that the sounds Chuckya uses are labeled with the prefix KATSUGINAGE, sharing the same name "Katsugi" but only with different honorifics.

Behavior Code & Remnants

#define NA_SE3_KATSUGI_WALK        0x50158081
#define NA_SE3_KATSUGINAGE_DOWN    0x516E0081        /** katsugi nage down **/
#define NA_LSE3_KATSUGINAGE_MOVE    0x600A4001        /* katugi nage */
#define                S_katugikun         S_B1_bankenemy_01

/********************************************************************************
        C Program (katsugi)
 ********************************************************************************/
extern void s_motoshand_main(float f,float v,long mail)
{
    switch (execstp->motherobj->s[stw_imm].d ){
         case    0:
            break;
        case    1:
            s_copy_mapwork(player1stp,execstp);
            break;
        case    2:
            player1stp->s[stw_mail].d |= ( PLAYERMAIL_CARRYMODE_OFF + mail );
            playerWorks[0].velocity = f; 
            playerWorks[0].speed[1] = v; 
            execstp->motherobj->s[stw_imm].d = 0;
            break;
        case    3:
            player1stp->s[stw_mail].d |= ( PLAYERMAIL_CARRYMODE_OFF + PLAYERMAIL_CARRYTHROW_SMALL );
            playerWorks[0].velocity = 10; 
            playerWorks[0].speed[1] = 10; 
            execstp->motherobj->s[stw_imm].d = 0;
            break;
    }
    obj_angleY = execstp->motherobj->s[stw_angleY].d;
    if ( execstp->motherobj->status == 0 )    s_remove_obj(execstp);
}

e_katsugi:
    p_initialize(enemyA)
    p_setbit(flag,stf_moveON | stf_YangleSAME | stf_playerdistON | stf_playerangleON | stf_alldispON )
    p_set_pointer(skelanime,bomking_anime)
    p_setd(objname,OBJNAME_TAKE)
    p_sethitbox(100,100)
    p_setmovedata(30,-400,-50,1000,1000,200,0,0)
    p_makeobj_child(S_NULL,e_bomking_hand)
    p_hitON
    p_save_nowpos
    p_while
        p_program(s_bomking)
    p_loop

e_katsugi_hand:
    p_initialize(enemyA)
    p_setbit(flag,stf_moveON | stf_YangleSAME )
    p_softspritemodeON
    p_while
        p_program(s_bomking_hand)
    p_loop

Test Lift#

Directory: "sm64/shape/keep/OLD/etc/testlift.sou"

Path (Behavior code): "sm64/data/p/pathtestlift.p"

A yellow test platform that was created to test out how elevators would work, and has an unused path file associated with it. A smaller .shape version of this model is left over in the final game, unused.

Behavior Code

/********************************************************************************

#define    road_root(p)        (p->s[stw_work2].pointer)
#define    road_pointer(p)     (p->s[stw_work3].pointer)
#define    road_flag(p)        (p->s[stw_work4].d)
#define    road_angleX(p)      (p->s[stw_work5].d)
#define    road_angleY(p)      (p->s[stw_work6].d)
#define    road_groundY(p)     (p->s[stw_work7].f)

 ********************************************************************************/

e_testlift:
   p_initialize(moveBG)
   p_setbit(flag,stf_moveON )
   p_movebginfo(testlift_info)
   p_while
       p_program(s_testlift)
   p_loop

/********************************************************************************
       C Program (testlift)
 ********************************************************************************/

static short test_liftdata[] = {

   0,0,    0,1000, /* (X),(Y),(Z) */
   1,1000, 100,1000,   /* (X),(Y),(Z) */
   2,1000, 200,   0,   /* (X),(Y),(Z) */
   3,   0, 100,   0,   /* (X),(Y),(Z) */
   -1,
};

extern void s_testlift(void)
{

   int flag;

   road_root(execstp) = test_liftdata;     /* data read    */

   flag = s_road_move(0);

   obj_speedF = 10;                        /* set speed     */
   obj_angleX = road_angleX(execstp);      /* speed X Angle */
   obj_angleY = road_angleY(execstp);      /* speed Y Angle */

   s_3Dmove();
   stMainMoveBG();

   rmonpf(("%d,%d\n",flag,road_flag(execstp) ));

}

Item Test#

Directory: sm64/data/iwa_path/oneupkinoko.s

A test object that spawns Mario's Cap being blown by wind.

Behavior Code

 e_item_test:
   p_initialize(item)
   p_setbit(flag,stf_moveON)

   p_while
       p_program(s_item_test)
   p_loop

/***************************************************************************************************
                           Test
***************************************************************************************************/
extern void s_item_test(void)
{
   StrategyRecord *stratp;

   if (contOr->trigger & CONT_L) {

       stratp = s_makeobj_nowpos(execstp,  S_itemhat_hat ,e_itemhat_blow);
       stratp->s[stw_worldX].f = player_posX;
       stratp->s[stw_worldY].f = player_posY+160;
       stratp->s[stw_worldZ].f = player_posZ;

       stratp->s[stw_angleY].d = player_angleY;

       stratp->s[stw_speedY].f = 10;
       stratp->s[stw_speedF].f = 20;
   }

}

Dice#

Directory: sm64/data/iwa_path/dice.s

A dice block with rudimentary physics that is meant to use a 50×50×50 cube. In its current state the object is a bit broken, as the angle resets when it lands and only the X angle rotates; fixing them results in the object working as intended.

Notably, this object lines up with a quote said by (Assisant Director) Yoshiaki Koizumi in an interview:
"I wanted to have more tools, toys, and things for Mario to play around with: balls, cars, etc. I really think we could have worked a lot more of those in."

Behavior Code

e_dice:
   p_initialize(enemyA)
   p_setbit(flag,stf_moveON |stf_YangleSAME | stf_catchON)
   p_setd(objname,OBJNAME_TAKE)
   p_BGcheckYset
   p_sethitbox(40,40)
   p_program(s_dice_init)

dice_main:
   p_while
       p_hitON
       p_program(s_diceMove)
   p_loop

extern void s_dice_init(void)
{

   execstp->s[stw_gravity].f   = 2.5;
   execstp->s[stw_friction].f  = 0.98;
   execstp->s[stw_specificG].f = 1.3;

}

static void DiceRotateEvent(void)
{
   short angleY = (short)execstp->s[stw_angleY].d ;

   execstp->s[stw_animeangleX].d += (short)(execstp->s[stw_speedF].f*500);


}

extern void DiceMoveEvent(void)
{
   short bg_flag = 0;
   float offsety;

   bg_flag = ObjMoveEvent();

   DiceRotateEvent();

   if ((bg_flag & 0x0001)!= 0x00) {
       offsety = sin(execstp->s[stw_animeangleX].d*2)*10;
       if (offsety < 0) offsety *= -1;
       execstp->s[stw_animepositionY].f = (offsety+25);


       if (execstp->s[stw_speedF].f < 5.0 && ( (int)offsety==10 || (int)offsety==0)) {
           execstp->s[stw_speedF].f = 0.0;
       }



   }

}

static void DiceCatch(void)
{

   MapHideShape(&execstp->map);


}

static void DiceDrop(void)
{

   s_drop_object();    

   execstp->s[stw_actionmode].d = CHILEDMODE_NO_CATCH;

}

static void DiceThrow(void)
{

   s_throw_object();   
   execstp->s[stw_actionmode].d = CHILEDMODE_NO_CATCH;
// execstp->s[stw_flag].d &= (stf_YangleSAME^0xffffffff); 

   execstp->s[stw_speedF].f = 25.;
   execstp->s[stw_speedY].f = 20.;
   execstp->s[state_flag].d = 2;
}

extern void s_diceMove(void)
{

   switch(execstp->s[stw_actionmode].d) {
       case CHILEDMODE_NO_CATCH:   DiceMoveEvent();        break;
       case CHILEDMODE_CATCH:      DiceCatch();            break;
       case CHILEDMODE_THROW:      DiceThrow();            break;
       case CHILEDMODE_DROP:       DiceDrop();             break;
   }


}

Commented Out Behavior#

Boo#

Commented Out Code

Final

Directory: sm64/data/p/pathteresa.p

There's commented out code in the "oba_animation_scale" function ("boo_oscillate" in the decomp), that makes the Boo's oscillation more static and jittery.

static void oba_animation_scale(int flag)
{
   execstp->s[stw_animeangleX].d = sin(oba_sinmoveY)*0x400;

   if ( obj_alpha == 255 || flag == 1 ){
       execstp->map.scale[0] = ( sin(oba_sinmoveY) * 0.08 + oba_scale); 
       execstp->map.scale[1] = (-sin(oba_sinmoveY) * 0.08 + oba_scale);
       execstp->map.scale[2] = execstp->map.scale[0];
       obj_gravity = sin(oba_sinmoveY) * oba_scale;
'''/*-----------------------------------------------------------------------------------------
       '''if ( ( obj_worldY - obj_animepositionY - obj_groundY ) < (50*oba_scale) ){
          '''if ( obj_gravity < 0 ) obj_gravity = -obj_gravity;
       '''}
'''-----------------------------------------------------------------------------------------*/
       oba_sinmoveY    += 0x400;
   }

}

Bowser#

Directory: sm64/data/p/pathkopa.p

There's two notable instances of commented out code.

The first is in "s_kopa_swingstart" ("bowser_act_thrown" in the decomp). It causes Bowser's speed to quickly cap if he's thrown off the arena. This code was likely intended to make it easier to throw him into the bombs.

//  if ( s_abs_f(obj_groundY-obj_attY) > 100  ) s_chase_speed(&obj_speedF,0,-4);

Commented Out Data

Final

The second is what appears to be an earlier version of "kopabg_timedata". (data used by the tilting platform in Bowser in the Fire Sea, known in the decomp as "sBowsertiltPlatformData")

#if 0
static KopaBGRotRecord kopabg_timedata[] = {
   {     1,  10,   34                          },
   {     0,   0,   34+34                       },
   {    -1, -10,   34+34+34                    },
   {     1, -20,   34+34+34+17                 },
   {    -1,  20,   34+34+34+17+17              },
   {     1,  40,   34+34+34+17+17+8            },
   {    -1, -40,   34+34+34+17+17+8+8          },
   {     1, -80,   34+34+34+17+17+8+8+4        },
   {    -1,  80,   34+34+34+17+17+8+8+4+4      },
   {     1, 160,   34+34+34+17+17+8+8+4+4+2    },
   {    -1,-160,   34+34+34+17+17+8+8+4+4+2    },
   {     1,   0,   0                           },
};
#endif

Cannon#

Directory: sm64/data/p/pathcannon.p

In the file containing the cannon behavior, there's commented out code in "cannon_fireentry" ("opened_cannon_act_3" in the decompilation) that, when reimplemented, makes the cannon spawn burn smoke particles when Mario is shot out of it. The model (S_gas_b) and behavior data (e_gas_b) of the cannon burn smoke weren't removed from the final game, and so can be found in the decomp under the names "MODEL_BURN_SMOKE_UNUSED" and "bhvCannonBaseUnused" respectively. This behavior can be seen in prerelease footage.

Behavior Code

e_gas_b:
   p_initialize(option)
   p_setbit(flag,stf_moveON | stf_YangleSAME | stf_FspeedON )
   p_softspritemodeON
   p_animereset
   p_do(8)
       p_program(s_gas_b)
       p_animeinc
   p_next
   p_killshape

extern void s_gas_b(void)
{
   obj_worldY += obj_speedY;
}

static void cannon_fireentry(void)
{

   StrategyRecord *stratp;
   float scale;

'''/*--------------------------------------
   '''if ( obj_timer < 30 ){
       '''stratp = s_makeobj_nowpos(execstp,S_gas_b,e_gas_b);
       '''stratp->s[stw_angleY].d = Randomd();
       '''stratp->s[stw_speedF].f = Randomf()*20+20;
       '''stratp->s[stw_speedY].f = cos(player1stp->s[stw_angleX].d)*40;
       '''scale                    = Randomf()*3.0+3.0;
       '''stratp->map.scale[0]     = scale;
       '''stratp->map.scale[1]     = scale;
   '''}
'''--------------------------------------*/

   if ( obj_timer > 3 ) obj_mode = mode_cannon_wait;

}

Mist Particles#

S_blackeffect

S_hiteffect (Final)

Directory: sm64/data/p/pathchiri.p

The general mist particles effect used throughout the game (when grabbing a Star, hitting a Blue Coin switch, when Mr. I and Boos die, etc.) has one line of code commented out. This line makes the particles use the model S_blackeffect (MODEL_WHITE_PUFF in the decomp) instead of S_hiteffect (MODEL_MIST in the decomp). Readding this model makes the particles black. The mist particles' behavior is called "s_burneffect", and has a comment above it saying "bomb effect", which combined with the black model indicates these particles were likely used as some sort of explosion or burning smoke effect before being repurposed as something more generic.

Behavior Code

/********************************************************************************

       bomb effect

 ********************************************************************************/

static EffectRecord burneffect = {
   EFFECT_BURN,
   20,             /* effect count     */
   S_hiteffect,    /* effect character */
'''//  S_blackeffect,  /* effect character */
   0,              /* ================ */          
   40,5,           /* speed F          */
   30,20,          /* speed Y          */
   -4,             /* gravity          */
   30,             /* air fric         */      
   330.0f,         /* ================ */
   10.0f           /* ================ */
};

extern void s_burneffect(int flag,int offsetY,float scale)
{

   burneffect.scale_min        = scale;
   burneffect.scale_random     = scale / 20.0;
   burneffect.offsetY          = offsetY;
   if ( flag == 0 )        burneffect.total  =  20;
   else if (flag > 20 )    burneffect.total  =  flag;
   else                    burneffect.total  =  4; 
   s_makeeffect_chiri(&burneffect);

}

Mr. I#

SM64-CommentedOutMrICode.mp4

Directory: sm64/data/p/pathballoon.p

Commented out code at the very bottom of "balloon_eyedamage" ("mr_i_act_3" in the decomp) that makes Mr. I go back to the idle action if Mario gets 2000 units away from it while it's dying.

/*--------------------------------------------------
       if ( obj_playerdist > 2000 ){
           obj_mode = mode_balloon_roll;
           obj_angleY = 0;
           obj_angleX = 0;
           s_set_scale(1.0);
       } 
--------------------------------------------------*/

Prototype Fish Easter Egg#

SM64-PrototypeFishEasterEggBehavior.mp4

Directory: sm64/data/p/pathfunsui.p

The behavior of the unused fish easter egg object, which was stubbed out from the final game, can be found in it's entirety. When Mario gets near the object, it starts to continuously spawn water splashes and occasionally spawns jumping fish, while playing a moving water sound.

extern void s_funsui_main(void)
{

   int     i;
   float sc;
   StrategyRecord *stratp;
   float   waterY = mcWaterCheck(obj_worldX,obj_worldZ);

'''#if 0
   '''switch(obj_mode){
       '''case 0:
           '''if ( obj_playerdist < 200 )  obj_mode++;
           '''break;
       '''case 1:
           '''if ( waterY > -10000 ){
               '''if ( beforeframe_objcount < ( NUM_STRATEGY - 28 )){

                   '''if ( frameCounter % 32 == 0 )    objsound(NA_SE2_FISH);

                   '''for(i=0;i<2;i++){

                       '''if ( ( Randomd() & 0x1f ) == 0 ){
                           '''stratp   = s_makeobj_nowpos(execstp,S_fish,e_smallwaterdrop);
                           '''s_set_skeletonobj(stratp,(void *)RCP_fishAnime,0);
                       '''} else {
                           '''stratp   = s_makeobj_nowpos(execstp,S_waterdrop,e_smallwaterdrop);
                           '''sc                       = Randomf()*1+0.5;
                           '''stSetScale(stratp,sc,sc,sc);
                           '''s_softspritemodeON(stratp);
                       '''}

                       '''stratp->s[stw_angleY].d = Randomd();
                       '''stratp->s[stw_worldY].f = waterY;
                       '''stratp->s[stw_speedF].f = Randomf()*3+2;
                       '''stratp->s[stw_speedY].f = Randomf()*20+20;
                   '''}
               '''}
           '''}

           '''if ( obj_playerdist > 300 )  obj_mode = 0;
           '''break;
   '''}

'''#endif

} 

Rainbow Ride Rotating Bridge Platform#

SM64_CommentedOutRRBridgePlatformBhv.mp4

Directory: sm64/data/p/pathfirebar.p

The rotating bridge platform in Rainbow Ride has commented out code in "s_fireskybar_mother" ("bhv_rr_rotating_bridge_platform_loop" in the decomp) that causes it to slowly move up and down in a sine wave motion.

extern void s_fireskybar_mother(void)
{

   obj_angleY += -0x80;
   obj_anglespeedY = -0x80;
'''//  obj_worldY = obj_attY + (sin(obj_work1)+1.0) * 500;
'''//  obj_work1  += 0x40;

   s_firebigbar_mother();

}

Wind#

SM64-CommentedOutWindLeaves.mp4

Directory: sm64/data/p/patheffectwind.p

There's commented out code in the wind particles' behavior, "s_effectwind" ("bhv_wind_loop" in the decomp), that causes them to turn into leaves 70% of the time.

/*------------------------------------------

       if ( Randomf() < 0.3 ){
           s_set_scale(0.5);
           s_softspritemodeON(execstp);
       } else {
           s_change_shape(S_grass);
           s_set_scale(1.5);
       }

------------------------------------------*/

Whomp#

Directory: sm64/data/p/pathwallman.p

There's 2 lines of code commented out in "wallman_down" ("whomp_jump" in the decomp) that causes Whomps to shake while jumping.

static void wallman_down(void)
{

   if ( obj_timer == 0 )   obj_speedY =  40;

   if ( obj_timer < 8  ){
'''//      if ( obj_timer % 2 )    obj_animeangleX = 0x200;
'''//      else                    obj_animeangleX = 0;
   } else  {
       obj_anglespeedX += 0x100;
       obj_animeangleX += obj_anglespeedX;
       if ( obj_animeangleX > 0x4000 ){
           obj_anglespeedX = 0;
           obj_animeangleX = 0x4000;
           obj_mode = mode_wallman_down_end;
       }
   }

}

Name-Only Objects#

The only remaining data for these objects is their names, found either in include/funlike.h, map/tag.cnf, or include/tagdecode.h. The former appears to come from mid-to-late 1995, while the latter has remnants from late '95.

Snow Objects#

e_koori, e_yukigoro, e_bigsnowman, e_icemotos, e_slidepeng, e_peng, e_bigpeng

e_koori is an unknown object that could be related to the unused breakable ice object, as "koori" translates to "ice".

e_yukigoro is the original object that the rolling snowball used.

e_bigsnowman is a bigger variant of Mr. Blizzard. Interestingly, the final behavior appears to have a remnant from this version, as the size is still set with a value in the behavior header.

e_icemotos, as the name implies, was a variant of Motos; it was the original boss in Snowman's Land instead of the Big Chilly Bully. It likely functioned similarly to Motos.

e_slidepeng is an early version of the racing penguin.

e_peng is an early version of the baby penguin.

e_bigpeng is an early version of the mother penguin.

Desert Objects#

e_sun, e_gourem, e_tatsumaki

e_sun might have been the Angry Sun from Super Mario Bros. 3. This name later appeared in Super Mario Maker, once again as a name only object.

e_tatsumaki is an earlier version of the tornados.

e_gourem is a bit more interesting: its name suggests that it was possibly the original boss in Shifting Sand Land instead of Eyerock.

Water Objects#

e_gesso, e_ufo, e_same, e_takarabako, e_pukupuku

e_gesso was presumably a Blooper, easily identified thanks to it using its Japanese name.

e_ufo is more mysterious, however. It had a Star labeled ufo catcher, so it might have been related to a "UFO Catcher" (Claw Game)-style minigame.

e_same is an early version of Sushi.

e_takarabako is an early version of the treasure chests.

e_pukupuku is an early version of Cheep-Cheep.

Battlefield Objects#

e_bigbomb, e_minipakun, e_groundmine, e_bombhei, e_hanatyann

e_bigbomb was a later version of Katsugi, just before it was changed to King Bob-omb. It appears to be a late change, as the Star name still references the old name, Big Bob-omb.

e_minipakun could be either the Nippers from Super Mario Bros. 3 or a smaller version of the regular Piranha Plant.

e_groundmine was a landmine object, possibly meant for Bob-omb Battlefield, considering it was designed with a "battlefield" theme in mind. May have been scrapped due to being a bit too difficult of an obstacle for the first level in the game. Notably, a landmine object can be found unused in Super Mario Galaxy as well. Maybe Nintendo doesn't like landmines?

e_bombhei was an earlier version of the Bob-omb.

e_hanatyann was the cut generic enemy version of Wiggler, which still has a model in the leaked source code.

Fortress Objects#

e_batta, e_rabit, e_tyoropu

e_batta is a bit more interesting: the name translates to "grasshopper", so it may have been a later revision/implementation of Hopper, who still has a model in the leaked source code. It was originally assigned to the battlefield/grass object table, according to "tag.cnf".

e_rabit is likely an earlier version of MIPS, perhaps the same actor mentioned in an interview.

e_tyoropu is an early version of the Monty Mole.

Underground Objects#

e_spaider, e_namazu

e_spaider is an early version of the scuttle bug.

e_namazu was one of the more intriguing enemies, as the name suggests that a giant catfish was planned for Hazy Maze Cave's underground. This object might have inspired how Mario needs to ground pound Dorrie to get on its head.

Misc. Objects#

e_coin_5, e_1up_tree, e_camerajugem, e_bigkuribo, e_furiko

e_coin_5, as the name implies, was an early version of Blue Coins, possibly a stationary version of them.

e_1up_tree was replaced later in development by a more finished 1-Up tree.

e_camerajugem is likely an earlier version of the Camera Lakitu/Lakitu Bro.

e_bigkuribo is an early version of the Big Goomba.

e_furiko was possibly a cut pendulum object.

Funlike Objects#

Objects that are in include/funlike.h, funlike is name of the format that Polygonal Collision uses, while the objects that are assigned to these ids have been updated, the names have not.

OBJSETCODE_PLAYER

What appears to be an early way to set the starting position for a player, called for in most stages flk files, now empty.

OBJSETCODE_STAR

Supposed to be a 2D Star, now empty.

OBJSETCODE_ELEVATOR

Likely an elevator object, calls for a now removed model, and static object.

OBJSETCODE_MAINROOM_TRAP

The floor trap that leads to BITDW, interestingly calls for a removed model.

OBJSETCODE_MOTOS_OBJ02

Removed LLL Object, a comment in the LLL Stage Object file labels it as "moving field", the Rolling Snowball in CCM is assigned instead.

OBJSETCODE_MOTOS_OBJ04

Another Removed LLL Stage Object, labeled as "bridge" in it's path file, now empty.

OBJSETCODE_MOTOS

Either Chuckya or an earlier version of Motos, overwritten by the Small Bully which is e_otos.

OBJSETCODE_BIGMOTOS

Likely the boss variant of Motos, overwritten by the Big Bully which is e_big_otos.

OBJSETCODE_BLOCK

Removed generic block, possibly a breakable brick block from previous games, now an empty definition.

OBJSETCODE_FIREMOTOS

What is possibly a fire throwing variant of motos, interestingly commented out code in pathmotos.p has it throwing a shell using e_enemyfire.

OBJSETCODE_FIREBAR

Likely a firebar as seen in previous games, another firebar object was created as a rotating stone, empty definition.

OBJSETCODE_LAVA

It appears lava was originally an object instead of a collision type, empty definition.

OBJSETCODE_FIRE

Likely a podobo from previous games, uses an empty definition.

OBJSETCODE_BIRD

What is likely Hoot, based on the name, empty definition.

OBJSETCODE_FLOWER

Either a Piranha Plant, Fire Flower, or a generic flower, empty definition.

OBJSETCODE_TREE4

Unused Tree Definition, refers to tree_04 from tree.sou.

Test Objects#

e_testobject

A generic test object, how helpful...

e_dummy

A dummy actor, even more helpful...

e_testcube

A test cube, now we are getting somewhere... Might be sm64/shape/keep/OLD/unused/cube.sou

e_testball

A test ball, finally something interesting. Probably used to test to prototype the physics of the "Iron Balls", it might be one of the 3 balls reference in sm64/include/shapedef.h

e_itest, e_itest2

Title screen test objects, something truly important.

e_test_coin

A test version of a coin.

e_demo_test, e_demo_director

Test objects related to the titlescreen demos.

e_WINDEMO_stardust, e_WINDEMO_star0, e_WINDEMO_tailstar, e_WINDEMO_star_start, e_WINDEMO_gueststar, e_WINDEMO_camcarrier, e_WINDEMO_camlooker, e_WINDEMO_director

A bunch of test objects made for the star collection cutscene.

e_KUPPA_crow, e_KUPPA_director

Bowser cutscene test objects, odd as Bowser doesn't have any cutscenes besides his death cutscene.