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

553 lines
18 KiB
C

struct ObjectHitbox sEyerokHitbox = {
/* interactType: */ INTERACT_BOUNCE_TOP,
/* downOffset: */ 0,
/* damageOrCoinValue: */ 0,
/* health: */ 4,
/* numLootCoins: */ 0,
/* radius: */ 150,
/* height: */ 100,
/* hurtboxRadius: */ 1,
/* hurtboxHeight: */ 1,
};
s8 D_80331BA4[] = { 0, 1, 3, 2, 1, 0 };
static s32 func_8030D284(s32 arg0) {
if (gMarioObject->oPosZ - o->oHomeZ < arg0) {
return TRUE;
} else {
return FALSE;
}
}
static void eyerok_spawn_hand(s16 side, s32 model, void *behavior) {
struct Object *hand;
hand = spawn_object_relative_with_scale(side, -500 * side, 0, 300, 1.5f, o, model, behavior);
if (hand != NULL) {
hand->oFaceAngleYaw -= 0x4000 * side;
}
}
static void eyerok_boss_act_sleep(void) {
if (o->oTimer == 0) {
eyerok_spawn_hand(-1, MODEL_EYEROK_LEFT_HAND, bhvEyerokHand);
eyerok_spawn_hand(1, MODEL_EYEROK_RIGHT_HAND, bhvEyerokHand);
} else if (o->oDistanceToMario < 500.0f) {
PlaySound2(SOUND_OBJECT_EYEROKEXPLODE);
o->oAction = EYEROK_BOSS_ACT_WAKE_UP;
}
}
static void eyerok_boss_act_wake_up(void) {
if (o->oEyerokBossNumHands == 2) {
if (o->oTimer > 5) {
if (o->oSubAction == 0) {
func_8031FFB4(0, 60, 40);
o->oSubAction += 1;
}
if (o->oEyerokBossUnk110 == 0.0f && mario_ready_to_speak() != 0) {
o->oAction = EYEROK_BOSS_ACT_SHOW_INTRO_TEXT;
} else if (o->oTimer > 150) {
if (approach_f32_ptr(&o->oEyerokBossUnk110, 0.0f, 10.0f)) {
o->oTimer = 0;
}
} else if (o->oTimer > 90) {
approach_f32_ptr(&o->oEyerokBossUnk110, 300.f, 10.0f);
}
}
} else {
o->oTimer = 0;
}
}
static void eyerok_boss_act_show_intro_text(void) {
if (obj_update_dialog_unk2(2, 0, 0xA2, 0x75)) {
o->oAction = EYEROK_BOSS_ACT_FIGHT;
}
}
static void eyerok_boss_act_fight(void) {
if (o->oEyerokBossNumHands == 0) {
o->oAction = EYEROK_BOSS_ACT_DIE;
} else if (o->oEyerokBossUnk1AC == 0 && o->oEyerokBossActiveHand == 0) {
if (o->oEyerokBossUnk104 != 0) {
if (approach_f32_ptr(&o->oEyerokBossUnk110, 1.0f, 0.02f)) {
if (o->oEyerokBossUnk104 < 0) {
if (func_8030D284(400) == 0 && ++o->oEyerokBossUnk104 == 0) {
o->oEyerokBossUnk104 = 1;
}
} else {
o->oEyerokBossUnk104 -= 1;
}
if (o->oEyerokBossUnk104 != 0 && o->oEyerokBossUnk104 != 1) {
o->oEyerokBossUnkFC += 1;
if ((o->oEyerokBossActiveHand = o->oEyerokBossUnkFC & 0x1) == 0) {
o->oEyerokBossActiveHand = -1;
}
}
}
} else {
o->oEyerokBossUnkFC += 1;
if (func_8030D284(400)) {
o->oEyerokBossUnk104 = -8;
o->oEyerokBossUnk110 = 1.0f;
o->oEyerokBossUnk108 = 0.0f;
} else if (o->oEyerokBossNumHands == 2 && o->oEyerokBossUnkFC % 6 == 0) {
o->oEyerokBossUnk104 = 8;
o->oEyerokBossUnk110 = 0.0f;
if ((o->oEyerokBossUnkFC = RandomU16() & 0x1) != 0) {
o->oEyerokBossUnk108 = -1.0f;
} else {
o->oEyerokBossUnk108 = 1.0f;
}
o->oEyerokBossUnk10C = gMarioObject->oPosZ;
clamp_f32(&o->oEyerokBossUnk10C, o->oPosZ + 400.0f, o->oPosZ + 1600.0f);
} else if ((o->oEyerokBossActiveHand = o->oEyerokBossUnkFC & 0x1) == 0) {
o->oEyerokBossActiveHand = -1;
}
}
}
}
static void eyerok_boss_act_die(void) {
if (o->oTimer == 60) {
if (obj_update_dialog_unk2(2, 0, 0xA2, 0x76)) {
create_star(0.0f, -900.0f, -3700.0f);
} else {
o->oTimer -= 1;
}
} else if (o->oTimer > 120) {
stop_background_music(SEQUENCE_ARGS(4, SEQ_EVENT_BOSS));
mark_object_for_deletion(o);
}
}
void bhv_eyerok_boss_loop(void) {
switch (o->oAction) {
case EYEROK_BOSS_ACT_SLEEP:
eyerok_boss_act_sleep();
break;
case EYEROK_BOSS_ACT_WAKE_UP:
eyerok_boss_act_wake_up();
break;
case EYEROK_BOSS_ACT_SHOW_INTRO_TEXT:
eyerok_boss_act_show_intro_text();
break;
case EYEROK_BOSS_ACT_FIGHT:
eyerok_boss_act_fight();
break;
case EYEROK_BOSS_ACT_DIE:
eyerok_boss_act_die();
break;
}
}
static s32 eyerok_hand_check_attacked(void) {
if (o->oEyerokReceivedAttack != 0 && abs_angle_diff(o->oAngleToMario, o->oFaceAngleYaw) < 0x3000) {
PlaySound2(SOUND_CH9_UNK5A_LOWPRIO);
if (--o->oHealth >= 2) {
o->oAction = EYEROK_HAND_ACT_ATTACKED;
o->oVelY = 30.0f;
} else {
o->parentObj->oEyerokBossNumHands -= 1;
o->oAction = EYEROK_HAND_ACT_DIE;
o->oVelY = 50.0f;
}
o->oForwardVel *= 0.2f;
o->oMoveAngleYaw = o->oFaceAngleYaw + 0x8000;
o->oMoveFlags = 0;
o->oGravity = -4.0f;
o->oAnimState = 3;
return TRUE;
} else {
return FALSE;
}
}
static void func_8030DBA8(void) {
PlaySound2(SOUND_OBJECT_POUNDINGLOUD);
func_8027F440(1, o->oPosX, o->oPosY, o->oPosZ);
func_802ADA94();
}
static void eyerok_hand_act_sleep(void) {
if (o->parentObj->oAction != EYEROK_BOSS_ACT_SLEEP
&& ++o->oEyerokHandWakeUpTimer > -3 * o->oBehParams2ndByte) {
if (func_8029F788()) {
o->parentObj->oEyerokBossNumHands += 1;
o->oAction = EYEROK_HAND_ACT_IDLE;
o->collisionData = segmented_to_virtual(&ssl_seg7_collision_07028274);
} else {
approach_f32_ptr(&o->oPosX, o->oHomeX, 15.0f);
o->oPosY = o->oHomeY
+ (200 * o->oBehParams2ndByte + 400)
* sins((s16)(absf(o->oPosX - o->oHomeX) / 724.0f * 0x8000));
obj_face_yaw_approach(o->oMoveAngleYaw, 400);
}
} else {
if (o->oBehParams2ndByte < 0) {
o->collisionData = segmented_to_virtual(&ssl_seg7_collision_070284B0);
} else {
o->collisionData = segmented_to_virtual(&ssl_seg7_collision_07028370);
}
func_8029F6F0();
o->oPosX = o->oHomeX + 724.0f * o->oBehParams2ndByte;
}
}
static void eyerok_hand_act_idle(void) {
set_obj_animation_and_sound_state(2);
if (o->parentObj->oAction == EYEROK_BOSS_ACT_FIGHT) {
if (o->parentObj->oEyerokBossUnk104 != 0) {
if (o->parentObj->oEyerokBossUnk104 != 1) {
o->oAction = EYEROK_HAND_ACT_BEGIN_DOUBLE_POUND;
o->oGravity = 0.0f;
}
} else if (o->parentObj->oEyerokBossUnk1AC == 0 && o->parentObj->oEyerokBossActiveHand != 0) {
if (o->parentObj->oEyerokBossActiveHand == o->oBehParams2ndByte) {
if (func_8030D284(400) != 0 || RandomU16() % 2 != 0) {
o->oAction = EYEROK_HAND_ACT_TARGET_MARIO;
o->oMoveAngleYaw = o->oAngleToMario;
o->oGravity = 0.0f;
} else {
o->oAction = EYEROK_HAND_ACT_FIST_PUSH;
if (o->parentObj->oPosX - gMarioObject->oPosX < 0.0f) {
o->oMoveAngleYaw = -0x800;
} else {
o->oMoveAngleYaw = 0x800;
}
o->oMoveAngleYaw += o->oAngleToMario;
o->oGravity = -4.0f;
}
} else {
o->oAction = EYEROK_HAND_ACT_OPEN;
}
}
} else {
o->oPosY = o->oHomeY + o->parentObj->oEyerokBossUnk110;
}
}
static void eyerok_hand_act_open(void) {
s16 sp1E;
o->parentObj->oEyerokBossUnk1AC = o->oBehParams2ndByte;
if (func_802F92B0(4)) {
o->oAction = EYEROK_HAND_ACT_SHOW_EYE;
o->oEyerokHandUnkFC = 2;
o->oEyerokHandUnk100 = 60;
o->collisionData = segmented_to_virtual(ssl_seg7_collision_070282F8);
if (o->parentObj->oEyerokBossNumHands != 2) {
sp1E = o->oAngleToMario;
clamp_s16(&sp1E, -0x3000, 0x3000);
o->oMoveAngleYaw = sp1E;
o->oForwardVel = 50.0f;
;
} else {
o->oMoveAngleYaw = 0;
}
}
}
static void eyerok_hand_act_show_eye(void) {
UNUSED s16 val06;
set_obj_animation_and_sound_state(5);
func_802F9378(0, 0, SOUND_OBJECT_BRIDGEEXPLODE);
if (!eyerok_hand_check_attacked()) {
if (o->parentObj->oEyerokBossActiveHand == 0) {
if (o->oAnimState < 3) {
o->oAnimState += 1;
} else if (func_8029F788()) {
val06 = (s16)(o->oAngleToMario - o->oFaceAngleYaw) * o->oBehParams2ndByte;
o->oAction = EYEROK_HAND_ACT_CLOSE;
}
} else {
if (o->oEyerokHandUnk100--) {
if (o->oEyerokHandUnkFC != 0) {
o->oEyerokHandUnkFC -= 1;
}
o->oAnimState = D_80331BA4[o->oEyerokHandUnkFC];
} else {
o->oEyerokHandUnkFC = 5;
o->oEyerokHandUnk100 = random_linear_offset(20, 50);
}
if (o->parentObj->oEyerokBossNumHands != 2) {
obj_face_yaw_approach(o->oMoveAngleYaw, 0x800);
if (o->oTimer > 10
&& (o->oPosZ - gMarioObject->oPosZ > 0.0f || (o->oMoveFlags & 0x00000400))) {
o->parentObj->oEyerokBossActiveHand = 0;
o->oForwardVel = 0.0f;
}
}
}
}
}
static void eyerok_hand_act_close(void) {
if (func_802F92EC(7, 1)) {
o->collisionData = segmented_to_virtual(ssl_seg7_collision_07028274);
if (o->parentObj->oEyerokBossNumHands != 2) {
o->oAction = EYEROK_HAND_ACT_RETREAT;
o->parentObj->oEyerokBossActiveHand = o->oBehParams2ndByte;
} else if (o->parentObj->oEyerokBossActiveHand == 0) {
o->oAction = EYEROK_HAND_ACT_IDLE;
o->parentObj->oEyerokBossUnk1AC = 0;
}
}
}
static void eyerok_hand_act_attacked(void) {
if (func_802F92B0(3)) {
o->oAction = EYEROK_HAND_ACT_RECOVER;
o->collisionData = segmented_to_virtual(ssl_seg7_collision_07028274);
}
if (o->oMoveFlags & 0x00000003) {
o->oForwardVel = 0.0f;
}
}
static void eyerok_hand_act_recover(void) {
if (func_802F92B0(0)) {
o->oAction = EYEROK_HAND_ACT_BECOME_ACTIVE;
}
}
static void eyerok_hand_act_become_active(void) {
if (o->parentObj->oEyerokBossActiveHand == 0 || o->parentObj->oEyerokBossNumHands != 2) {
o->oAction = EYEROK_HAND_ACT_RETREAT;
o->parentObj->oEyerokBossActiveHand = o->oBehParams2ndByte;
}
}
static void eyerok_hand_act_die(void) {
if (func_802F92B0(1)) {
o->parentObj->oEyerokBossUnk1AC = 0;
func_802A3C98(150.0f, 1);
create_sound_spawner(SOUND_CH9_UNK5B);
}
if (o->oMoveFlags & 0x00000003) {
PlaySound2(SOUND_OBJECT_POUNDINGLOUD);
o->oForwardVel = 0.0f;
}
}
static void eyerok_hand_act_retreat(void) {
f32 distToHome = obj_lateral_dist_to_home();
s16 angleToHome = obj_angle_to_home();
if ((distToHome -= 40.0f) < 0.0f) {
distToHome = 0.0f;
}
o->oPosX = o->oHomeX - distToHome * sins(angleToHome);
o->oPosZ = o->oHomeZ - distToHome * coss(angleToHome);
obj_face_yaw_approach(0, 400);
if (approach_f32_ptr(&o->oPosY, o->oHomeY, 20.0f) && distToHome == 0.0f && o->oFaceAngleYaw == 0) {
o->oAction = EYEROK_HAND_ACT_IDLE;
o->parentObj->oEyerokBossActiveHand -= o->oBehParams2ndByte;
if (o->parentObj->oEyerokBossUnk1AC == o->oBehParams2ndByte) {
o->parentObj->oEyerokBossUnk1AC = 0;
}
}
}
static void eyerok_hand_act_target_mario(void) {
if (func_8030D284(400) != 0 || o->oPosZ - gMarioObject->oPosZ > 0.0f
|| o->oPosZ - o->parentObj->oPosZ > 1700.0f || absf(o->oPosX - o->parentObj->oPosX) > 900.0f
|| (o->oMoveFlags & 0x00000200)) {
o->oForwardVel = 0.0f;
if (approach_f32_ptr(&o->oPosY, o->oHomeY + 300.0f, 20.0f)) {
o->oAction = EYEROK_HAND_ACT_SMASH;
}
} else {
obj_forward_vel_approach(50.0f, 5.0f);
approach_f32_ptr(&o->oPosY, o->oHomeY + 300.0f, 20.0f);
obj_rotate_yaw_toward(o->oAngleToMario, 4000);
}
}
static void eyerok_hand_act_smash(void) {
s16 sp1E;
if (o->oTimer > 20) {
if (o->oMoveFlags & 0x00000003) {
if (o->oGravity < -4.0f) {
func_8030DBA8();
o->oGravity = -4.0f;
} else {
sp1E = abs_angle_diff(o->oFaceAngleYaw, o->oAngleToMario);
if (o->oDistanceToMario < 300.0f && sp1E > 0x2000 && sp1E < 0x6000) {
o->oAction = EYEROK_HAND_ACT_FIST_SWEEP;
if ((s16)(o->oFaceAngleYaw - o->oAngleToMario) < 0) {
o->oMoveAngleYaw = 0x4000;
} else {
o->oMoveAngleYaw = -0x4000;
}
} else {
o->oAction = EYEROK_HAND_ACT_RETREAT;
}
}
} else {
o->oGravity = -20.0f;
}
}
}
static void eyerok_hand_act_fist_push(void) {
if (o->oTimer > 5 && (o->oPosZ - gMarioObject->oPosZ > 0.0f || (o->oMoveFlags & 0x00000400))) {
o->oAction = EYEROK_HAND_ACT_FIST_SWEEP;
o->oForwardVel = 0.0f;
if (o->oPosX - gMarioObject->oPosX < 0.0f) {
o->oMoveAngleYaw = 0x4000;
} else {
o->oMoveAngleYaw = -0x4000;
}
} else {
o->oForwardVel = 50.0f;
}
}
static void eyerok_hand_act_fist_sweep(void) {
if (o->oPosZ - o->parentObj->oPosZ < 1000.0f || (o->oMoveFlags & 0x400)) {
o->oAction = EYEROK_HAND_ACT_RETREAT;
o->oForwardVel = 0.0f;
} else {
obj_forward_vel_approach(5.0f, 0.02f);
o->oForwardVel *= 1.08f;
o->oTimer = 0;
}
}
static void eyerok_hand_act_begin_double_pound(void) {
f32 sp4;
if (o->parentObj->oEyerokBossUnk104 < 0
|| o->parentObj->oEyerokBossActiveHand == o->oBehParams2ndByte) {
o->oAction = EYEROK_HAND_ACT_DOUBLE_POUND;
o->oMoveAngleYaw = (s32)(o->oFaceAngleYaw - 0x4000 * o->parentObj->oEyerokBossUnk108);
} else {
sp4 = o->parentObj->oPosX + 400.0f * o->parentObj->oEyerokBossUnk108
- 180.0f * o->oBehParams2ndByte;
o->oPosX = o->oHomeX + (sp4 - o->oHomeX) * o->parentObj->oEyerokBossUnk110;
o->oPosY = o->oHomeY + 300.0f * o->parentObj->oEyerokBossUnk110;
o->oPosZ =
o->oHomeZ + (o->parentObj->oEyerokBossUnk10C - o->oHomeZ) * o->parentObj->oEyerokBossUnk110;
}
}
static void eyerok_hand_act_double_pound(void) {
if (o->parentObj->oEyerokBossNumHands != 2) {
o->parentObj->oEyerokBossActiveHand = o->oBehParams2ndByte;
}
if (o->parentObj->oEyerokBossUnk104 == 1) {
o->oAction = EYEROK_HAND_ACT_RETREAT;
o->parentObj->oEyerokBossUnk1AC = o->oBehParams2ndByte;
} else if (o->parentObj->oEyerokBossActiveHand == o->oBehParams2ndByte) {
if (o->oMoveFlags & 0x00000003) {
if (o->oGravity < -15.0f) {
o->parentObj->oEyerokBossActiveHand = 0;
func_8030DBA8();
o->oForwardVel = 0.0f;
o->oGravity = -15.0f;
} else {
o->oForwardVel = 30.0f * absf(o->parentObj->oEyerokBossUnk108);
o->oVelY = 100.0f;
o->oMoveFlags = 0;
}
} else if (o->oVelY <= 0.0f) {
o->oGravity = -20.0f;
}
}
}
void bhv_eyerok_hand_loop(void) {
o->header.gfx.scale[0] = 1.5f;
if (o->oAction == EYEROK_HAND_ACT_SLEEP) {
eyerok_hand_act_sleep();
} else {
obj_update_floor_and_walls();
switch (o->oAction) {
case EYEROK_HAND_ACT_IDLE:
eyerok_hand_act_idle();
break;
case EYEROK_HAND_ACT_OPEN:
eyerok_hand_act_open();
break;
case EYEROK_HAND_ACT_SHOW_EYE:
eyerok_hand_act_show_eye();
break;
case EYEROK_HAND_ACT_CLOSE:
eyerok_hand_act_close();
break;
case EYEROK_HAND_ACT_RETREAT:
eyerok_hand_act_retreat();
break;
case EYEROK_HAND_ACT_TARGET_MARIO:
eyerok_hand_act_target_mario();
break;
case EYEROK_HAND_ACT_SMASH:
eyerok_hand_act_smash();
break;
case EYEROK_HAND_ACT_FIST_PUSH:
eyerok_hand_act_fist_push();
break;
case EYEROK_HAND_ACT_FIST_SWEEP:
eyerok_hand_act_fist_sweep();
break;
case EYEROK_HAND_ACT_BEGIN_DOUBLE_POUND:
eyerok_hand_act_begin_double_pound();
break;
case EYEROK_HAND_ACT_DOUBLE_POUND:
eyerok_hand_act_double_pound();
break;
case EYEROK_HAND_ACT_ATTACKED:
eyerok_hand_act_attacked();
break;
case EYEROK_HAND_ACT_RECOVER:
eyerok_hand_act_recover();
break;
case EYEROK_HAND_ACT_BECOME_ACTIVE:
eyerok_hand_act_become_active();
break;
case EYEROK_HAND_ACT_DIE:
eyerok_hand_act_die();
break;
}
o->oEyerokReceivedAttack = obj_check_attacks(&sEyerokHitbox, o->oAction);
obj_move_standard(-78);
}
load_object_collision_model();
o->header.gfx.scale[0] = 1.5f * o->oBehParams2ndByte;
}