172 lines
5.4 KiB
C
172 lines
5.4 KiB
C
// bubba.inc.c
|
|
|
|
static struct ObjectHitbox sBubbaHitbox = {
|
|
/* interactType: */ INTERACT_CLAM_OR_BUBBA,
|
|
/* downOffset: */ 0,
|
|
/* damageOrCoinValue: */ 1,
|
|
/* health: */ 99,
|
|
/* numLootCoins: */ 0,
|
|
/* radius: */ 300,
|
|
/* height: */ 200,
|
|
/* hurtboxRadius: */ 300,
|
|
/* hurtboxHeight: */ 200,
|
|
};
|
|
|
|
void bubba_act_0(void) {
|
|
f32 sp24;
|
|
|
|
sp24 = obj_lateral_dist_to_home();
|
|
treat_far_home_as_mario(2000.0f);
|
|
o->oAnimState = 0;
|
|
|
|
o->oBubbaUnk1AC = obj_get_pitch_to_home(sp24);
|
|
|
|
approach_f32_ptr(&o->oBubbaUnkF4, 5.0f, 0.5f);
|
|
|
|
if (o->oBubbaUnkFC != 0) {
|
|
if (abs_angle_diff(o->oMoveAngleYaw, o->oBubbaUnk1AE) < 800) {
|
|
o->oBubbaUnkFC = 0;
|
|
}
|
|
} else {
|
|
if (o->oDistanceToMario >= 25000.0f) {
|
|
o->oBubbaUnk1AE = o->oAngleToMario;
|
|
o->oBubbaUnkF8 = random_linear_offset(20, 30);
|
|
}
|
|
|
|
if ((o->oBubbaUnkFC = o->oMoveFlags & 0x00000200) != 0) {
|
|
o->oBubbaUnk1AE = obj_reflect_move_angle_off_wall();
|
|
} else if (o->oTimer > 30 && o->oDistanceToMario < 2000.0f) {
|
|
o->oAction = 1;
|
|
} else if (o->oBubbaUnkF8 != 0) {
|
|
o->oBubbaUnkF8 -= 1;
|
|
} else {
|
|
o->oBubbaUnk1AE = obj_random_fixed_turn(0x2000);
|
|
o->oBubbaUnkF8 = random_linear_offset(100, 100);
|
|
}
|
|
}
|
|
}
|
|
|
|
void bubba_act_1(void) {
|
|
s16 val06;
|
|
s16 val04;
|
|
|
|
treat_far_home_as_mario(2500.0f);
|
|
if (o->oDistanceToMario > 2500.0f) {
|
|
o->oAction = 0;
|
|
} else if (o->oBubbaUnk100 != 0) {
|
|
if (--o->oBubbaUnk100 == 0) {
|
|
PlaySound2(SOUND_OBJECT_CHOMPINGSOUND);
|
|
o->oAction = 0;
|
|
} else if (o->oBubbaUnk100 < 15) {
|
|
o->oAnimState = 1;
|
|
} else if (o->oBubbaUnk100 == 20) {
|
|
val06 = 10000 - (s16)(20.0f * (find_water_level(o->oPosX, o->oPosZ) - o->oPosY));
|
|
o->oBubbaUnk1AC -= val06;
|
|
o->oMoveAnglePitch = o->oBubbaUnk1AC;
|
|
o->oBubbaUnkF4 = 40.0f;
|
|
obj_compute_vel_from_move_pitch(o->oBubbaUnkF4);
|
|
o->oAnimState = 0;
|
|
;
|
|
} else {
|
|
o->oBubbaUnk1AE = o->oAngleToMario;
|
|
o->oBubbaUnk1AC = o->oBubbaUnk104;
|
|
|
|
obj_rotate_yaw_toward(o->oBubbaUnk1AE, 400);
|
|
obj_move_pitch_approach(o->oBubbaUnk1AC, 400);
|
|
}
|
|
} else {
|
|
if (abs_angle_diff(gMarioObject->oFaceAngleYaw, o->oAngleToMario) < 0x3000) {
|
|
val04 = 0x4000 - atan2s(800.0f, o->oDistanceToMario - 800.0f);
|
|
if ((s16)(o->oMoveAngleYaw - o->oAngleToMario) < 0) {
|
|
val04 = -val04;
|
|
}
|
|
|
|
o->oBubbaUnk1AE = o->oAngleToMario + val04;
|
|
;
|
|
} else {
|
|
o->oBubbaUnk1AE = o->oAngleToMario;
|
|
}
|
|
|
|
o->oBubbaUnk1AC = o->oBubbaUnk104;
|
|
|
|
if (obj_is_near_to_and_facing_mario(500.0f, 3000)
|
|
&& abs_angle_diff(o->oBubbaUnk1AC, o->oMoveAnglePitch) < 3000) {
|
|
o->oBubbaUnk100 = 30;
|
|
o->oBubbaUnkF4 = 0;
|
|
o->oAnimState = 1;
|
|
} else {
|
|
approach_f32_ptr(&o->oBubbaUnkF4, 20.0f, 0.5f);
|
|
}
|
|
}
|
|
}
|
|
|
|
void bhv_bubba_loop(void) {
|
|
UNUSED s32 unused;
|
|
struct Object *sp38;
|
|
s16 sp36;
|
|
|
|
o->oInteractionSubtype &= ~INT_SUBTYPE_EATS_MARIO;
|
|
o->oBubbaUnk104 = obj_turn_pitch_toward_mario(120.0f, 0);
|
|
|
|
if (abs_angle_diff(o->oAngleToMario, o->oMoveAngleYaw) < 0x1000
|
|
&& abs_angle_diff(o->oBubbaUnk104 + 0x800, o->oMoveAnglePitch) < 0x2000) {
|
|
if (o->oAnimState != 0 && o->oDistanceToMario < 250.0f) {
|
|
o->oInteractionSubtype |= INT_SUBTYPE_EATS_MARIO;
|
|
}
|
|
|
|
o->hurtboxRadius = 100.0f;
|
|
} else {
|
|
o->hurtboxRadius = 150.0f;
|
|
}
|
|
|
|
obj_update_floor_and_walls();
|
|
|
|
switch (o->oAction) {
|
|
case 0:
|
|
bubba_act_0();
|
|
break;
|
|
case 1:
|
|
bubba_act_1();
|
|
break;
|
|
}
|
|
|
|
if (o->oMoveFlags & 0x00000078) {
|
|
if (o->oMoveFlags & 0x00000008) {
|
|
sp38 = spawn_object(o, MODEL_WATER_SPLASH, bhvWaterSplash);
|
|
if (sp38 != NULL) {
|
|
scale_object(sp38, 3.0f);
|
|
}
|
|
|
|
o->oBubbaUnk108 = o->oVelY;
|
|
o->oBubbaUnk10C = 0.0f;
|
|
;
|
|
} else {
|
|
approach_f32_ptr(&o->oBubbaUnk108, 0.0f, 4.0f);
|
|
if ((o->oBubbaUnk10C -= o->oBubbaUnk108) > 1.0f) {
|
|
sp36 = RandomU16();
|
|
o->oBubbaUnk10C -= 1.0f;
|
|
spawn_object_relative(0, 150.0f * coss(sp36), 0x64, 150.0f * sins(sp36), o,
|
|
MODEL_WHITE_PARTICLE_SMALL, bhvSmallParticleSnow);
|
|
}
|
|
}
|
|
|
|
obj_smooth_turn(&o->oBubbaUnk1B0, &o->oMoveAnglePitch, o->oBubbaUnk1AC, 0.05f, 10, 50, 2000);
|
|
obj_smooth_turn(&o->oBubbaUnk1B2, &o->oMoveAngleYaw, o->oBubbaUnk1AE, 0.05f, 10, 50, 2000);
|
|
obj_compute_vel_from_move_pitch(o->oBubbaUnkF4);
|
|
} else {
|
|
o->oBubbaUnkF4 = sqrtf(o->oForwardVel * o->oForwardVel + o->oVelY * o->oVelY);
|
|
o->oMoveAnglePitch = obj_get_pitch_from_vel();
|
|
obj_face_pitch_approach(o->oMoveAnglePitch, 400);
|
|
o->oBubbaUnk1B0 = 0;
|
|
}
|
|
|
|
obj_face_pitch_approach(o->oMoveAnglePitch, 400);
|
|
obj_check_attacks(&sBubbaHitbox, o->oAction);
|
|
|
|
obj_move_standard(78);
|
|
|
|
o->oFloorHeight += 150.0f;
|
|
if (o->oPosY < o->oFloorHeight) {
|
|
o->oPosY = o->oFloorHeight;
|
|
}
|
|
}
|