sm64

A Super Mario 64 decompilation
Log | Files | Refs | README | LICENSE

spawn_star.inc.c (5704B)


      1 // spawn_star.inc.c
      2 
      3 static struct ObjectHitbox sCollectStarHitbox = {
      4     /* interactType:      */ INTERACT_STAR_OR_KEY,
      5     /* downOffset:        */ 0,
      6     /* damageOrCoinValue: */ 0,
      7     /* health:            */ 0,
      8     /* numLootCoins:      */ 0,
      9     /* radius:            */ 80,
     10     /* height:            */ 50,
     11     /* hurtboxRadius:     */ 0,
     12     /* hurtboxHeight:     */ 0,
     13 };
     14 
     15 void bhv_collect_star_init(void) {
     16     s8 starIndex = (o->oBhvParams >> 24) & 0xFF;
     17     u8 currentLevelStarFlags = save_file_get_star_flags(gCurrSaveFileNum - 1, COURSE_NUM_TO_INDEX(gCurrCourseNum));
     18 
     19     if (currentLevelStarFlags & (1 << starIndex)) {
     20         o->header.gfx.sharedChild = gLoadedGraphNodes[MODEL_TRANSPARENT_STAR];
     21     } else {
     22         o->header.gfx.sharedChild = gLoadedGraphNodes[MODEL_STAR];
     23     }
     24 
     25     obj_set_hitbox(o, &sCollectStarHitbox);
     26 }
     27 
     28 void bhv_collect_star_loop(void) {
     29     o->oFaceAngleYaw += 0x800;
     30 
     31     if (o->oInteractStatus & INT_STATUS_INTERACTED) {
     32         mark_obj_for_deletion(o);
     33         o->oInteractStatus = 0;
     34     }
     35 }
     36 
     37 void bhv_star_spawn_init(void) {
     38     o->oMoveAngleYaw = atan2s(o->oHomeZ - o->oPosZ, o->oHomeX - o->oPosX);
     39     o->oStarSpawnDisFromHome = sqrtf(sqr(o->oHomeX - o->oPosX) + sqr(o->oHomeZ - o->oPosZ));
     40     o->oVelY = (o->oHomeY - o->oPosY) / 30.0f;
     41     o->oForwardVel = o->oStarSpawnDisFromHome / 30.0f;
     42     o->oStarSpawnUnkFC = o->oPosY;
     43 
     44     if (o->oBhvParams2ndByte == 0 || gCurrCourseNum == COURSE_BBH) {
     45         cutscene_object(CUTSCENE_STAR_SPAWN, o);
     46     } else {
     47         cutscene_object(CUTSCENE_RED_COIN_STAR_SPAWN, o);
     48     }
     49 
     50     set_time_stop_flags(TIME_STOP_ENABLED | TIME_STOP_MARIO_AND_DOORS);
     51     o->activeFlags |= ACTIVE_FLAG_INITIATED_TIME_STOP;
     52     cur_obj_become_intangible();
     53 }
     54 
     55 void bhv_star_spawn_loop(void) {
     56     switch (o->oAction) {
     57         case 0:
     58             o->oFaceAngleYaw += 0x1000;
     59             if (o->oTimer > 20) {
     60                 o->oAction = 1;
     61             }
     62             break;
     63 
     64         case 1:
     65             obj_move_xyz_using_fvel_and_yaw(o);
     66             o->oStarSpawnUnkFC += o->oVelY;
     67             o->oPosY = o->oStarSpawnUnkFC + sins((o->oTimer * 0x8000) / 30) * 400.0f;
     68             o->oFaceAngleYaw += 0x1000;
     69             spawn_object(o, MODEL_NONE, bhvSparkleSpawn);
     70             cur_obj_play_sound_1(SOUND_ENV_STAR);
     71             if (o->oTimer == 30) {
     72                 o->oAction = 2;
     73                 o->oForwardVel = 0;
     74                 play_power_star_jingle(TRUE);
     75             }
     76             break;
     77 
     78         case 2:
     79             if (o->oTimer < 20) {
     80                 o->oVelY = 20 - o->oTimer;
     81             } else {
     82                 o->oVelY = -10.0f;
     83             }
     84 
     85             spawn_object(o, MODEL_NONE, bhvSparkleSpawn);
     86             obj_move_xyz_using_fvel_and_yaw(o);
     87             o->oFaceAngleYaw = o->oFaceAngleYaw - o->oTimer * 0x10 + 0x1000;
     88             cur_obj_play_sound_1(SOUND_ENV_STAR);
     89 
     90             if (o->oPosY < o->oHomeY) {
     91                 cur_obj_play_sound_2(SOUND_GENERAL_STAR_APPEARS);
     92                 cur_obj_become_tangible();
     93                 o->oPosY = o->oHomeY;
     94                 o->oAction = 3;
     95             }
     96             break;
     97 
     98         case 3:
     99             o->oFaceAngleYaw += 0x800;
    100             if (o->oTimer == 20) {
    101                 gObjCutsceneDone = TRUE;
    102                 clear_time_stop_flags(TIME_STOP_ENABLED | TIME_STOP_MARIO_AND_DOORS);
    103                 o->activeFlags &= ~ACTIVE_FLAG_INITIATED_TIME_STOP;
    104             }
    105 
    106             if (o->oInteractStatus & INT_STATUS_INTERACTED) {
    107                 mark_obj_for_deletion(o);
    108                 o->oInteractStatus = 0;
    109             }
    110             break;
    111     }
    112 }
    113 
    114 struct Object *spawn_star(struct Object *star, f32 homeX, f32 homeY, f32 homeZ) {
    115     star = spawn_object_abs_with_rot(o, 0, MODEL_STAR, bhvStarSpawnCoordinates,
    116                                      o->oPosX, o->oPosY, o->oPosZ, 0, 0, 0);
    117     star->oBhvParams = o->oBhvParams;
    118     star->oHomeX = homeX;
    119     star->oHomeY = homeY;
    120     star->oHomeZ = homeZ;
    121     star->oFaceAnglePitch = 0;
    122     star->oFaceAngleRoll = 0;
    123     return star;
    124 }
    125 
    126 void spawn_default_star(f32 homeX, f32 homeY, f32 homeZ) {
    127     struct Object *star = spawn_star(star, homeX, homeY, homeZ);
    128     star->oBhvParams2ndByte = 0;
    129 }
    130 
    131 void spawn_red_coin_cutscene_star(f32 homeX, f32 homeY, f32 homeZ) {
    132     struct Object *star = spawn_star(star, homeX, homeY, homeZ);
    133     star->oBhvParams2ndByte = 1;
    134 }
    135 
    136 void spawn_no_exit_star(f32 homeX, f32 homeY, f32 homeZ) {
    137     struct Object *star = spawn_star(star, homeX, homeY, homeZ);
    138     star->oBhvParams2ndByte = 1;
    139     star->oInteractionSubtype |= INT_SUBTYPE_NO_EXIT;
    140 }
    141 
    142 void bhv_hidden_red_coin_star_init(void) {
    143     s16 count;
    144 
    145     if (gCurrCourseNum != COURSE_JRB) {
    146         spawn_object(o, MODEL_TRANSPARENT_STAR, bhvRedCoinStarMarker);
    147     }
    148 
    149     count = count_objects_with_behavior(bhvRedCoin);
    150     if (count == 0) {
    151         struct Object *star = spawn_object_abs_with_rot(o, 0, MODEL_STAR, bhvStar,
    152                                                         o->oPosX, o->oPosY, o->oPosZ, 0, 0, 0);
    153         star->oBhvParams = o->oBhvParams;
    154         o->activeFlags = ACTIVE_FLAG_DEACTIVATED;
    155     }
    156 
    157     o->oHiddenStarTriggerCounter = 8 - count;
    158 }
    159 
    160 void bhv_hidden_red_coin_star_loop(void) {
    161     gRedCoinsCollected = o->oHiddenStarTriggerCounter;
    162 
    163     switch (o->oAction) {
    164         case 0:
    165             if (o->oHiddenStarTriggerCounter == 8) {
    166                 o->oAction = 1;
    167             }
    168             break;
    169 
    170         case 1:
    171             if (o->oTimer > 2) {
    172                 spawn_red_coin_cutscene_star(o->oPosX, o->oPosY, o->oPosZ);
    173                 spawn_mist_particles();
    174                 o->activeFlags = ACTIVE_FLAG_DEACTIVATED;
    175             }
    176             break;
    177     }
    178 }