flying_bookend_switch.inc.c (8893B)
1 // flying_bookend_switch.inc.c 2 3 struct Struct80331B30 { 4 s16 unk00; 5 s16 unk02; 6 }; 7 8 struct ObjectHitbox sFlyingBookendHitbox = { 9 /* interactType: */ INTERACT_HIT_FROM_BELOW, 10 /* downOffset: */ 0, 11 /* damageOrCoinValue: */ 2, 12 /* health: */ 0, 13 /* numLootCoins: */ -1, 14 /* radius: */ 60, 15 /* height: */ 30, 16 /* hurtboxRadius: */ 40, 17 /* hurtboxHeight: */ 30, 18 }; 19 20 struct Struct80331B30 D_80331B30[] = { 21 { 52, 150 }, 22 { 135, 3 }, 23 { -75, 78 }, 24 }; 25 26 struct ObjectHitbox sBookSwitchHitbox = { 27 /* interactType: */ INTERACT_BREAKABLE, 28 /* downOffset: */ 0, 29 /* damageOrCoinValue: */ 0, 30 /* health: */ 99, 31 /* numLootCoins: */ 0, 32 /* radius: */ 20, 33 /* height: */ 30, 34 /* hurtboxRadius: */ 20, 35 /* hurtboxHeight: */ 30, 36 }; 37 38 void flying_bookend_act_0(void) { 39 if (obj_is_near_to_and_facing_mario(400.0f, 0x3000)) { 40 cur_obj_play_sound_2(SOUND_OBJ_DEFAULT_DEATH); 41 42 o->oAction = 1; 43 44 o->oBookendUnkF4 = o->oFaceAnglePitch + 0x7FFF; 45 o->oBookendUnkF8 = o->oFaceAngleRoll - 0x7FFF; 46 47 cur_obj_set_model(MODEL_BOOKEND_PART); 48 } 49 } 50 51 void flying_bookend_act_1(void) { 52 if (obj_forward_vel_approach(3.0f, 1.0f)) { 53 if (cur_obj_init_anim_and_check_if_end(2)) { 54 o->oAction = 2; 55 o->oForwardVel = 0.0f; 56 } else { 57 o->oForwardVel = 3.0f; 58 59 if (o->oTimer > 5) { 60 obj_face_pitch_approach(o->oBookendUnkF4, 2000); 61 if (o->oTimer >= 10) { 62 obj_face_roll_approach(o->oBookendUnkF8, 2000); 63 if (o->oTimer >= 20) { 64 approach_f32_ptr(&o->header.gfx.scale[0], 3.0f, 0.2f); 65 } 66 } 67 } 68 } 69 } 70 71 cur_obj_move_using_fvel_and_gravity(); 72 } 73 74 void flying_bookend_act_2(void) { 75 cur_obj_init_animation_with_sound(1); 76 cur_obj_update_floor_and_walls(); 77 78 if (o->oForwardVel == 0.0f) { 79 obj_turn_pitch_toward_mario(120.0f, 1000); 80 o->oFaceAnglePitch = o->oMoveAnglePitch + 0x7FFF; 81 cur_obj_rotate_yaw_toward(o->oAngleToMario, 1000); 82 83 if (o->oTimer > 30) { 84 obj_compute_vel_from_move_pitch(50.0f); 85 } 86 } 87 88 cur_obj_move_standard(78); 89 } 90 91 void flying_bookend_act_3(void) { 92 o->oDamageOrCoinValue = 1; 93 o->oNumLootCoins = 0; 94 95 if (o->oTimer > 3) { 96 o->oAction = 2; 97 o->oForwardVel = 50.0f; 98 } 99 100 obj_forward_vel_approach(50.0f, 2.0f); 101 cur_obj_move_using_fvel_and_gravity(); 102 } 103 104 void bhv_flying_bookend_loop(void) { 105 if (!(o->activeFlags & ACTIVE_FLAG_IN_DIFFERENT_ROOM)) { 106 o->oDeathSound = SOUND_OBJ_POUNDING1; 107 cur_obj_scale(o->header.gfx.scale[0]); 108 109 switch (o->oAction) { 110 case 0: 111 flying_bookend_act_0(); 112 break; 113 case 1: 114 flying_bookend_act_1(); 115 break; 116 case 2: 117 flying_bookend_act_2(); 118 break; 119 case 3: 120 flying_bookend_act_3(); 121 break; 122 } 123 124 obj_check_attacks(&sFlyingBookendHitbox, -1); 125 126 if (o->oAction == -1 || (o->oMoveFlags & (OBJ_MOVE_MASK_ON_GROUND | OBJ_MOVE_HIT_WALL))) { 127 o->oNumLootCoins = 0; 128 obj_die_if_health_non_positive(); 129 } 130 131 o->oGraphYOffset = 30.0f * o->header.gfx.scale[0]; 132 } 133 } 134 135 void bhv_bookend_spawn_loop(void) { 136 if (!(o->activeFlags & ACTIVE_FLAG_IN_DIFFERENT_ROOM)) { 137 if (o->oTimer > 40 && obj_is_near_to_and_facing_mario(600.0f, 0x2000)) { 138 struct Object *sp1C = spawn_object(o, MODEL_BOOKEND, bhvFlyingBookend); 139 140 if (sp1C != NULL) { 141 sp1C->oAction = 3; 142 cur_obj_play_sound_2(SOUND_OBJ_DEFAULT_DEATH); 143 } 144 145 o->oTimer = 0; 146 } 147 } 148 } 149 150 void bookshelf_manager_act_0(void) { 151 s32 i; 152 153 if (!(o->activeFlags & ACTIVE_FLAG_IN_DIFFERENT_ROOM)) { 154 for (i = 0; i < 3; i++) { 155 spawn_object_relative(i, D_80331B30[i].unk00, D_80331B30[i].unk02, 0, o, 156 MODEL_BOOKEND, bhvBookSwitch); 157 } 158 159 o->oAction = 1; 160 } 161 } 162 163 void bookshelf_manager_act_1(void) { 164 if (o->oBookSwitchManagerUnkF8 == 0) { 165 if (obj_is_near_to_and_facing_mario(500.0f, 0x3000)) { 166 o->oBookSwitchManagerUnkF8 = 1; 167 } 168 } else if (o->oTimer > 60) { 169 o->oAction = 2; 170 o->oBookSwitchManagerUnkF8 = 0; 171 } 172 } 173 174 void bookshelf_manager_act_2(void) { 175 if (!(o->activeFlags & ACTIVE_FLAG_IN_DIFFERENT_ROOM)) { 176 if (o->oBookSwitchManagerUnkF4 < 0) { 177 if (o->oTimer > 30) { 178 o->oBookSwitchManagerUnkF4 = o->oBookSwitchManagerUnkF8 = 0; 179 } else if (o->oTimer > 10) { 180 o->oBookSwitchManagerUnkF8 = 1; 181 } 182 } else { 183 if (o->oBookSwitchManagerUnkF4 >= 3) { 184 if (o->oTimer > 100) { 185 o->parentObj = cur_obj_nearest_object_with_behavior(bhvHauntedBookshelf); 186 o->parentObj->oAction = 1; 187 o->oPosX = o->parentObj->oPosX; 188 o->oAction = 3; 189 } else if (o->oTimer == 30) { 190 play_puzzle_jingle(); 191 } 192 } else { 193 o->oTimer = 0; 194 } 195 } 196 } else { 197 o->oAction = 4; 198 } 199 } 200 201 void bookshelf_manager_act_3(void) { 202 if (o->oTimer > 85) { 203 o->oAction = 4; 204 } else { 205 o->oForwardVel = o->parentObj->oPosX - o->oPosX; 206 o->oPosX = o->parentObj->oPosX; 207 } 208 } 209 210 void bookshelf_manager_act_4(void) { 211 if (o->oBookSwitchManagerUnkF4 >= 3) { 212 obj_mark_for_deletion(o); 213 } else { 214 o->oAction = 0; 215 } 216 } 217 218 void bhv_haunted_bookshelf_manager_loop(void) { 219 switch (o->oAction) { 220 case 0: 221 bookshelf_manager_act_0(); 222 break; 223 case 2: 224 bookshelf_manager_act_2(); 225 break; 226 case 1: 227 bookshelf_manager_act_1(); 228 break; 229 case 3: 230 bookshelf_manager_act_3(); 231 break; 232 case 4: 233 bookshelf_manager_act_4(); 234 break; 235 } 236 } 237 238 void bhv_book_switch_loop(void) { 239 o->header.gfx.scale[0] = 2.0f; 240 o->header.gfx.scale[1] = 0.9f; 241 242 if (o->parentObj->oAction == 4) { 243 obj_mark_for_deletion(o); 244 } else { 245 s32 attackType = obj_check_attacks(&sBookSwitchHitbox, o->oAction); 246 247 if (o->parentObj->oBookSwitchManagerUnkF8 != 0 || o->oAction == 1) { 248 if (o->oDistanceToMario < 100.0f) { 249 cur_obj_become_tangible(); 250 } else { 251 cur_obj_become_intangible(); 252 } 253 254 o->oAction = 1; 255 256 if (o->oBookSwitchUnkF4 == 0.0f) { 257 cur_obj_play_sound_2(SOUND_OBJ_DEFAULT_DEATH); 258 } 259 260 if (approach_f32_ptr(&o->oBookSwitchUnkF4, 50.0f, 20.0f)) { 261 if (o->parentObj->oBookSwitchManagerUnkF4 >= 0 && o->oTimer > 60 262 && (attackType == ATTACK_PUNCH || attackType == ATTACK_KICK_OR_TRIP 263 || attackType == ATTACK_FROM_BELOW)) { 264 o->oAction = 2; 265 } 266 } else { 267 o->oTimer = 0; 268 } 269 } else { 270 cur_obj_become_intangible(); 271 272 if (approach_f32_ptr(&o->oBookSwitchUnkF4, 0.0f, 20.0f) && o->oAction != 0) { 273 if (o->parentObj->oBookSwitchManagerUnkF4 == o->oBhvParams2ndByte) { 274 play_sound(SOUND_GENERAL2_RIGHT_ANSWER, gGlobalSoundSource); 275 o->parentObj->oBookSwitchManagerUnkF4++; 276 } else { 277 struct Object *sp38; 278 s16 sp36 = random_u16() & 0x1; 279 s16 sp34 = gMarioObject->oPosZ + 1.5f * gMarioStates[0].vel[2]; 280 281 play_sound(SOUND_MENU_CAMERA_BUZZ, gGlobalSoundSource); 282 283 if (sp34 > 0) { 284 sp34 = 0; 285 } 286 287 sp38 = spawn_object_abs_with_rot(o, 0, MODEL_BOOKEND, bhvFlyingBookend, 288 0x1FC * sp36 - 0x8CA, 890, sp34, 0, 289 0x8000 * sp36 + 0x4000, 0); 290 291 if (sp38 != NULL) { 292 sp38->oAction = 3; 293 } 294 295 o->parentObj->oBookSwitchManagerUnkF4 = -1; 296 } 297 298 o->oAction = 0; 299 } 300 } 301 302 o->oPosX += o->parentObj->oForwardVel; 303 o->oPosZ = o->oHomeZ - o->oBookSwitchUnkF4; 304 cur_obj_push_mario_away_from_cylinder(70.0f, 70.0f); 305 } 306 }