bubba.inc.c (5456B)
1 // bubba.inc.c 2 3 static struct ObjectHitbox sBubbaHitbox = { 4 /* interactType: */ INTERACT_CLAM_OR_BUBBA, 5 /* downOffset: */ 0, 6 /* damageOrCoinValue: */ 1, 7 /* health: */ 99, 8 /* numLootCoins: */ 0, 9 /* radius: */ 300, 10 /* height: */ 200, 11 /* hurtboxRadius: */ 300, 12 /* hurtboxHeight: */ 200, 13 }; 14 15 void bubba_act_0(void) { 16 f32 sp24 = cur_obj_lateral_dist_to_home(); 17 18 treat_far_home_as_mario(2000.0f); 19 o->oAnimState = 0; 20 21 o->oBubbaUnk1AC = obj_get_pitch_to_home(sp24); 22 23 approach_f32_ptr(&o->oBubbaUnkF4, 5.0f, 0.5f); 24 25 if (o->oBubbaUnkFC != 0) { 26 if (abs_angle_diff(o->oMoveAngleYaw, o->oBubbaUnk1AE) < 800) { 27 o->oBubbaUnkFC = 0; 28 } 29 } else { 30 if (o->oDistanceToMario >= 25000.0f) { 31 o->oBubbaUnk1AE = o->oAngleToMario; 32 o->oBubbaUnkF8 = random_linear_offset(20, 30); 33 } 34 35 if ((o->oBubbaUnkFC = o->oMoveFlags & OBJ_MOVE_HIT_WALL)) { 36 o->oBubbaUnk1AE = cur_obj_reflect_move_angle_off_wall(); 37 } else if (o->oTimer > 30 && o->oDistanceToMario < 2000.0f) { 38 o->oAction = 1; 39 } else if (o->oBubbaUnkF8 != 0) { 40 o->oBubbaUnkF8--; 41 } else { 42 o->oBubbaUnk1AE = obj_random_fixed_turn(0x2000); 43 o->oBubbaUnkF8 = random_linear_offset(100, 100); 44 } 45 } 46 } 47 48 void bubba_act_1(void) { 49 treat_far_home_as_mario(2500.0f); 50 51 if (o->oDistanceToMario > 2500.0f) { 52 o->oAction = 0; 53 } else if (o->oBubbaUnk100 != 0) { 54 if (--o->oBubbaUnk100 == 0) { 55 cur_obj_play_sound_2(SOUND_OBJ_BUBBA_CHOMP); 56 o->oAction = 0; 57 } else if (o->oBubbaUnk100 < 15) { 58 o->oAnimState = 1; 59 } else if (o->oBubbaUnk100 == 20) { 60 s16 val06 = 10000 - (s16)(20.0f * (find_water_level(o->oPosX, o->oPosZ) - o->oPosY)); 61 o->oBubbaUnk1AC -= val06; 62 o->oMoveAnglePitch = o->oBubbaUnk1AC; 63 o->oBubbaUnkF4 = 40.0f; 64 obj_compute_vel_from_move_pitch(o->oBubbaUnkF4); 65 o->oAnimState = 0; 66 } else { 67 o->oBubbaUnk1AE = o->oAngleToMario; 68 o->oBubbaUnk1AC = o->oBubbaUnk104; 69 70 cur_obj_rotate_yaw_toward(o->oBubbaUnk1AE, 400); 71 obj_move_pitch_approach(o->oBubbaUnk1AC, 400); 72 } 73 } else { 74 if (abs_angle_diff(gMarioObject->oFaceAngleYaw, o->oAngleToMario) < 0x3000) { 75 s16 val04 = 0x4000 - atan2s(800.0f, o->oDistanceToMario - 800.0f); 76 if ((s16)(o->oMoveAngleYaw - o->oAngleToMario) < 0) { 77 val04 = -val04; 78 } 79 80 o->oBubbaUnk1AE = o->oAngleToMario + val04; 81 } else { 82 o->oBubbaUnk1AE = o->oAngleToMario; 83 } 84 85 o->oBubbaUnk1AC = o->oBubbaUnk104; 86 87 if (obj_is_near_to_and_facing_mario(500.0f, 3000) 88 && abs_angle_diff(o->oBubbaUnk1AC, o->oMoveAnglePitch) < 3000) { 89 o->oBubbaUnk100 = 30; 90 o->oBubbaUnkF4 = 0; 91 o->oAnimState = 1; 92 } else { 93 approach_f32_ptr(&o->oBubbaUnkF4, 20.0f, 0.5f); 94 } 95 } 96 } 97 98 void bhv_bubba_loop(void) { 99 UNUSED u8 filler[4]; 100 101 o->oInteractionSubtype &= ~INT_SUBTYPE_EATS_MARIO; 102 o->oBubbaUnk104 = obj_turn_pitch_toward_mario(120.0f, 0); 103 104 if (abs_angle_diff(o->oAngleToMario, o->oMoveAngleYaw) < 0x1000 105 && abs_angle_diff(o->oBubbaUnk104 + 0x800, o->oMoveAnglePitch) < 0x2000) { 106 if (o->oAnimState != 0 && o->oDistanceToMario < 250.0f) { 107 o->oInteractionSubtype |= INT_SUBTYPE_EATS_MARIO; 108 } 109 110 o->hurtboxRadius = 100.0f; 111 } else { 112 o->hurtboxRadius = 150.0f; 113 } 114 115 cur_obj_update_floor_and_walls(); 116 117 switch (o->oAction) { 118 case 0: 119 bubba_act_0(); 120 break; 121 case 1: 122 bubba_act_1(); 123 break; 124 } 125 126 if (o->oMoveFlags & OBJ_MOVE_MASK_IN_WATER) { 127 if (o->oMoveFlags & OBJ_MOVE_ENTERED_WATER) { 128 struct Object *sp38 = spawn_object(o, MODEL_WATER_SPLASH, bhvWaterSplash); 129 if (sp38 != NULL) { 130 obj_scale(sp38, 3.0f); 131 } 132 133 o->oBubbaUnk108 = o->oVelY; 134 o->oBubbaUnk10C = 0.0f; 135 } else { 136 approach_f32_ptr(&o->oBubbaUnk108, 0.0f, 4.0f); 137 if ((o->oBubbaUnk10C -= o->oBubbaUnk108) > 1.0f) { 138 s16 sp36 = random_u16(); 139 o->oBubbaUnk10C -= 1.0f; 140 spawn_object_relative(0, 150.0f * coss(sp36), 0x64, 150.0f * sins(sp36), o, 141 MODEL_WHITE_PARTICLE_SMALL, bhvSmallParticleSnow); 142 } 143 } 144 145 obj_smooth_turn(&o->oBubbaUnk1B0, &o->oMoveAnglePitch, o->oBubbaUnk1AC, 0.05f, 10, 50, 2000); 146 obj_smooth_turn(&o->oBubbaUnk1B2, &o->oMoveAngleYaw, o->oBubbaUnk1AE, 0.05f, 10, 50, 2000); 147 obj_compute_vel_from_move_pitch(o->oBubbaUnkF4); 148 } else { 149 o->oBubbaUnkF4 = sqrtf(o->oForwardVel * o->oForwardVel + o->oVelY * o->oVelY); 150 o->oMoveAnglePitch = obj_get_pitch_from_vel(); 151 obj_face_pitch_approach(o->oMoveAnglePitch, 400); 152 o->oBubbaUnk1B0 = 0; 153 } 154 155 obj_face_pitch_approach(o->oMoveAnglePitch, 400); 156 obj_check_attacks(&sBubbaHitbox, o->oAction); 157 158 cur_obj_move_standard(78); 159 160 o->oFloorHeight += 150.0f; 161 if (o->oPosY < o->oFloorHeight) { 162 o->oPosY = o->oFloorHeight; 163 } 164 }