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 }