sm64pc/src/game/behaviors/bubba.inc.c

173 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;
}
}