// king_bobomb.c.inc void bhv_bobomb_anchor_mario_loop(void) { func_802A8D18(50.0f, 50.0f, 64); } void ActionKingBobomb0(void) { #ifndef VERSION_JP o->oForwardVel = 0; o->oVelY = 0; #endif if (o->oSubAction == 0) { obj_become_intangible(); gSecondCameraFocus = o; set_obj_animation_and_sound_state(5); obj_set_pos_to_home(); o->oHealth = 3; if (obj_is_mario_in_range_and_ready_to_speak(500.0f, 100.0f)) { o->oSubAction++; func_8031FFB4(0, 60, 40); } } else if (obj_update_dialog_unk2(2, 1, 162, 17)) { o->oAction = 2; o->oFlags |= OBJ_FLAG_HOLDABLE; } } int func_802A6AF8(f32 arg0) { if (arg0 < o->oPosY - gMarioObject->oPosY) return 1; else return 0; } void ActionKingBobomb2(void) { obj_become_tangible(); if (o->oPosY - o->oHomeY < -100.0f) // Thrown off hill { o->oAction = 5; obj_become_intangible(); } if (o->OBJECT_FIELD_S32(0x1E) == 0) { if (obj_check_anim_frame(15)) ShakeScreen(1); if (func_802A4AB0(4)) o->OBJECT_FIELD_S32(0x1E)++; } else { if (o->OBJECT_FIELD_S32(0x1E) == 1) { func_802A4A70(11, 7); o->OBJECT_FIELD_S32(0x1E) = 2; } else set_obj_animation_and_sound_state(11); if (o->OBJECT_FIELD_S32(0x20) == 0) { o->oForwardVel = 3.0f; obj_rotate_yaw_toward(o->oAngleToMario, 0x100); } else { o->oForwardVel = 0.0f; o->OBJECT_FIELD_S32(0x20)--; } } if (obj_check_grabbed_mario()) o->oAction = 3; if (func_802A6AF8(1200.0f)) { o->oAction = 0; stop_background_music(SEQUENCE_ARGS(4, SEQ_EVENT_BOSS)); } } void ActionKingBobomb3(void) { if (o->oSubAction == 0) { o->oForwardVel = 0; o->OBJECT_FIELD_S32(0x1F) = 0; o->OBJECT_FIELD_S32(0x1D) = 0; if (o->oTimer == 0) PlaySound2(SOUND_OBJECT_UNKNOWN3); if (func_802A4AB0(0)) { o->oSubAction++; func_802A4A70(1, 0); } } else { if (o->oSubAction == 1) { set_obj_animation_and_sound_state(1); o->OBJECT_FIELD_S32(0x1D) += player_performed_grab_escape_action(); print_debug_bottom_up("%d", o->OBJECT_FIELD_S32(0x1D)); if (o->OBJECT_FIELD_S32(0x1D) > 10) { o->oUnknownUnk88 = 3; o->oAction = 2; o->OBJECT_FIELD_S32(0x20) = 35; o->oInteractStatus &= ~(INT_STATUS_GRABBED_MARIO); } else { o->oForwardVel = 3.0f; if (o->OBJECT_FIELD_S32(0x1F) > 20 && obj_rotate_yaw_toward(0, 0x400)) { o->oSubAction++; func_802A4A70(9, 22); } } o->OBJECT_FIELD_S32(0x1F)++; } else { set_obj_animation_and_sound_state(9); if (obj_check_anim_frame(31)) { o->oUnknownUnk88 = 2; PlaySound2(SOUND_OBJECT_UNKNOWN4); } else if (func_8029F788()) { o->oAction = 1; o->oInteractStatus &= ~(INT_STATUS_GRABBED_MARIO); } } } } void ActionKingBobomb1(void) { o->oForwardVel = 0; o->oVelY = 0; set_obj_animation_and_sound_state(11); o->oMoveAngleYaw = approach_s16_symmetric(o->oMoveAngleYaw, o->oAngleToMario, 512); if (o->oDistanceToMario < 2500.0f) o->oAction = 2; if (func_802A6AF8(1200.0f)) { o->oAction = 0; stop_background_music(SEQUENCE_ARGS(4, SEQ_EVENT_BOSS)); } } void ActionKingBobomb6(void) { if (o->oSubAction == 0) { if (o->oTimer == 0) { o->OBJECT_FIELD_S32(0x1F) = 0; PlaySound2(SOUND_OBJECT_BULLYTHWOMP); PlaySound2(SOUND_CH9_UNK42); ShakeScreen(1); func_802AA618(0, 0, 100.0f); o->oInteractType = 8; obj_become_tangible(); } if (func_802A4AB0(2)) o->OBJECT_FIELD_S32(0x1F)++; if (o->OBJECT_FIELD_S32(0x1F) > 3) { o->oSubAction++; ; // Needed to match } } else { if (o->oSubAction == 1) { if (func_802A4AB0(10)) { o->oSubAction++; o->oInteractType = 2; obj_become_intangible(); } } else { set_obj_animation_and_sound_state(11); if (obj_rotate_yaw_toward(o->oAngleToMario, 0x800) == 1) o->oAction = 2; } } } void ActionKingBobomb7(void) { set_obj_animation_and_sound_state(2); if (obj_update_dialog_unk2(2, 2, 162, 116)) { create_sound_spawner(SOUND_OBJECT_KINGWHOMPDEATH); obj_hide(); obj_become_intangible(); func_802AA618(0, 0, 200.0f); spawn_triangle_break_particles(20, 138, 3.0f, 4); ShakeScreen(1); #ifndef VERSION_JP obj_spawn_star_at_y_offset(2000.0f, 4500.0f, -4500.0f, 200.0f); #else o->oPosY += 100.0f; create_star(2000.0f, 4500.0f, -4500.0f); #endif o->oAction = 8; } } void ActionKingBobomb8(void) { if (o->oTimer == 60) stop_background_music(SEQUENCE_ARGS(4, SEQ_EVENT_BOSS)); } void ActionKingBobomb4() // bobomb been thrown { if (o->oPosY - o->oHomeY > -100.0f) // not thrown off hill { if (o->oMoveFlags & 1) { o->oHealth--; o->oForwardVel = 0; o->oVelY = 0; PlaySound2(SOUND_OBJECT_BULLYTHWOMP); if (o->oHealth) o->oAction = 6; else o->oAction = 7; } } else { if (o->oSubAction == 0) { if (o->oMoveFlags & 2) { o->oForwardVel = 0; o->oVelY = 0; o->oSubAction++; } else if (o->oMoveFlags & 1) PlaySound2(SOUND_OBJECT_BULLYTHWOMP); } else { if (func_802A4AB0(10)) o->oAction = 5; // Go back to top of hill o->oSubAction++; } } } void ActionKingBobomb5() // bobomb returns home { switch (o->oSubAction) { case 0: if (o->oTimer == 0) PlaySound2(SOUND_OBJECT_KINGBOBOMBJUMP); o->OBJECT_FIELD_S32(0x1C) = 1; func_802A4AEC(8); o->oMoveAngleYaw = obj_angle_to_home(); if (o->oPosY < o->oHomeY) o->oVelY = 100.0f; else { func_802B2894(&o->oHomeX, &o->oPosX, 100.0f, -4.0f); // the Vec3fs oHome and oPos are being passed by reference o->oSubAction++; } break; case 1: func_802A4AEC(8); if (o->oVelY < 0 && o->oPosY < o->oHomeY) { o->oPosY = o->oHomeY; o->oVelY = 0; o->oForwardVel = 0; o->oGravity = -4.0f; o->OBJECT_FIELD_S32(0x1C) = 0; set_obj_animation_and_sound_state(7); PlaySound2(SOUND_OBJECT_BULLYTHWOMP); ShakeScreen(1); o->oSubAction++; } break; case 2: if (func_802A4AB0(7)) o->oSubAction++; break; case 3: if (func_802A6AF8(1200.0f)) { o->oAction = 0; stop_background_music(SEQUENCE_ARGS(4, SEQ_EVENT_BOSS)); } if (obj_is_mario_in_range_and_ready_to_speak(500.0f, 100.0f)) o->oSubAction++; break; case 4: if (obj_update_dialog_unk2(2, 1, 162, 128)) o->oAction = 2; break; } } void (*sKingBobombActions[])(void) = { ActionKingBobomb0, ActionKingBobomb1, ActionKingBobomb2, ActionKingBobomb3, ActionKingBobomb4, ActionKingBobomb5, ActionKingBobomb6, ActionKingBobomb7, ActionKingBobomb8 }; struct SoundState sKingBobombSoundStates[] = { { 0, 0, 0, NO_SOUND }, { 1, 1, 20, SOUND_OBJECT_POUNDING1_HIGHPRIO }, { 0, 0, 0, NO_SOUND }, { 0, 0, 0, NO_SOUND }, { 1, 15, -1, SOUND_OBJECT_POUNDING1_HIGHPRIO }, { 0, 0, 0, NO_SOUND }, { 0, 0, 0, NO_SOUND }, { 0, 0, 0, NO_SOUND }, { 0, 0, 0, NO_SOUND }, { 1, 33, -1, SOUND_OBJECT_POUNDING1_HIGHPRIO }, { 0, 0, 0, NO_SOUND }, { 1, 1, 15, SOUND_OBJECT_POUNDING1_HIGHPRIO } }; void func_802A7748(void) { obj_update_floor_and_walls(); if (o->OBJECT_FIELD_S32(0x1C) == 0) obj_move_standard(-78); else obj_move_using_fvel_and_gravity(); obj_call_action_function(sKingBobombActions); exec_anim_sound_state(sKingBobombSoundStates); if (o->oDistanceToMario < 5000.0f) obj_enable_rendering(); else obj_disable_rendering(); } void bhv_king_bobomb_loop(void) { f32 sp34 = 20.0f; f32 sp30 = 50.0f; UNUSED u8 pad[8]; o->oInteractionSubtype |= INT_SUBTYPE_GRABS_MARIO; switch (o->oHeldState) { case HELD_FREE: func_802A7748(); break; case HELD_HELD: func_8029FA5C(6, 1); break; case HELD_THROWN: case HELD_DROPPED: obj_get_thrown_or_placed(sp34, sp30, 4); obj_become_intangible(); o->oPosY += 20.0f; break; } o->oInteractStatus = 0; }