2019-09-01 19:50:50 +00:00
|
|
|
// haunted_chair.inc.c
|
|
|
|
|
|
|
|
struct ObjectHitbox sHauntedChairHitbox = {
|
|
|
|
/* interactType: */ INTERACT_MR_BLIZZARD,
|
|
|
|
/* downOffset: */ 0,
|
|
|
|
/* damageOrCoinValue: */ 2,
|
|
|
|
/* health: */ 0,
|
|
|
|
/* numLootCoins: */ 0,
|
|
|
|
/* radius: */ 50,
|
|
|
|
/* height: */ 50,
|
|
|
|
/* hurtboxRadius: */ 50,
|
|
|
|
/* hurtboxHeight: */ 50,
|
|
|
|
};
|
|
|
|
|
|
|
|
void bhv_haunted_chair_init(void) {
|
|
|
|
struct Object *val04;
|
|
|
|
f32 val00;
|
|
|
|
|
2020-03-02 03:42:52 +00:00
|
|
|
val04 = cur_obj_find_nearest_object_with_behavior(bhvMadPiano, &val00);
|
2019-09-01 19:50:50 +00:00
|
|
|
if (val04 != NULL && val00 < 300.0f) {
|
|
|
|
o->parentObj = val04;
|
|
|
|
} else {
|
|
|
|
o->oHauntedChairUnkF4 = 1;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
void haunted_chair_act_0(void) {
|
|
|
|
s16 val0E;
|
|
|
|
f32 val08;
|
|
|
|
|
|
|
|
if (o->parentObj != o) {
|
|
|
|
if (o->oHauntedChairUnk104 == 0) {
|
|
|
|
if (lateral_dist_between_objects(o, o->parentObj) < 250.0f) {
|
2020-03-02 03:42:52 +00:00
|
|
|
val0E = obj_angle_to_object(o, o->parentObj) - o->oFaceAngleYaw + 0x2000;
|
2019-09-01 19:50:50 +00:00
|
|
|
if (val0E & 0x4000) {
|
|
|
|
o->oHauntedChairUnk100 = &o->oFaceAngleRoll;
|
|
|
|
if (val0E > 0) {
|
|
|
|
o->oHauntedChairUnk104 = 0x4000;
|
|
|
|
} else {
|
|
|
|
o->oHauntedChairUnk104 = -0x4000;
|
|
|
|
}
|
|
|
|
} else {
|
|
|
|
o->oHauntedChairUnk100 = &o->oFaceAnglePitch;
|
|
|
|
if (val0E < 0) {
|
|
|
|
o->oHauntedChairUnk104 = 0x5000;
|
|
|
|
} else {
|
|
|
|
o->oHauntedChairUnk104 = -0x4000;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
if (o->oHauntedChairUnk104 < 0) {
|
|
|
|
o->oHauntedChairUnkF8 = -1500.0f;
|
|
|
|
} else {
|
|
|
|
o->oHauntedChairUnkF8 = 1500.0f;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
} else {
|
|
|
|
oscillate_toward(o->oHauntedChairUnk100, &o->oHauntedChairUnkF8, o->oHauntedChairUnk104,
|
|
|
|
4000.0f, 20.0f, 2.0f);
|
|
|
|
}
|
|
|
|
} else if (o->oHauntedChairUnkF4 != 0) {
|
|
|
|
if (o->oDistanceToMario < 500.0f) {
|
|
|
|
o->oHauntedChairUnkF4 -= 1;
|
|
|
|
}
|
|
|
|
o->oTimer = 0.0f;
|
|
|
|
} else {
|
|
|
|
if ((o->oTimer & 0x8) != 0) {
|
|
|
|
if (o->oFaceAnglePitch < 0) {
|
2020-03-02 03:42:52 +00:00
|
|
|
cur_obj_play_sound_2(SOUND_GENERAL_HAUNTED_CHAIR_MOVE);
|
2019-09-01 19:50:50 +00:00
|
|
|
val08 = 4.0f;
|
|
|
|
} else {
|
|
|
|
val08 = -4.0f;
|
|
|
|
}
|
|
|
|
|
|
|
|
o->oHomeX -= val08;
|
|
|
|
o->oHomeZ -= val08;
|
|
|
|
|
|
|
|
o->oFaceAnglePitch = o->oFaceAngleRoll = (s32)(50.0f * val08);
|
|
|
|
;
|
|
|
|
} else {
|
|
|
|
o->oFaceAnglePitch = o->oFaceAngleRoll = 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (o->oTimer > 30) {
|
|
|
|
o->oAction = 1;
|
|
|
|
o->oHauntedChairUnkF8 = 0.0f;
|
|
|
|
o->oHauntedChairUnkFC = 200.0f;
|
|
|
|
o->oHauntedChairUnkF4 = 40;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2020-03-02 03:42:52 +00:00
|
|
|
cur_obj_push_mario_away_from_cylinder(80.0f, 120.0f);
|
2019-09-01 19:50:50 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
void haunted_chair_act_1(void) {
|
2020-03-02 03:42:52 +00:00
|
|
|
cur_obj_update_floor_and_walls();
|
2019-09-01 19:50:50 +00:00
|
|
|
|
|
|
|
if (o->oTimer < 70) {
|
|
|
|
if (o->oTimer < 50) {
|
|
|
|
o->oVelY = 6.0f;
|
|
|
|
} else {
|
|
|
|
o->oVelY = 0.0f;
|
|
|
|
}
|
|
|
|
|
|
|
|
o->oGravity = 0.0f;
|
|
|
|
oscillate_toward(&o->oFaceAnglePitch, &o->oHauntedChairUnkF8, -4000, 200.0f, 20.0f, 2.0f);
|
|
|
|
oscillate_toward(&o->oFaceAngleRoll, &o->oHauntedChairUnkFC, 0, 0.0f, 20.0f, 1.0f);
|
|
|
|
} else {
|
|
|
|
if (o->oHauntedChairUnkF4 != 0) {
|
|
|
|
if (--o->oHauntedChairUnkF4 == 0) {
|
2020-03-02 03:42:52 +00:00
|
|
|
cur_obj_play_sound_2(SOUND_GENERAL_HAUNTED_CHAIR);
|
2019-09-01 19:50:50 +00:00
|
|
|
o->oMoveAnglePitch = obj_turn_pitch_toward_mario(120.0f, 0);
|
|
|
|
o->oMoveAngleYaw = o->oAngleToMario;
|
|
|
|
obj_compute_vel_from_move_pitch(50.0f);
|
|
|
|
} else if (o->oHauntedChairUnkF4 > 20) {
|
|
|
|
if (gGlobalTimer % 4 == 0) {
|
2020-03-02 03:42:52 +00:00
|
|
|
cur_obj_play_sound_2(SOUND_GENERAL_SWISH_AIR_2);
|
2019-09-01 19:50:50 +00:00
|
|
|
}
|
|
|
|
o->oFaceAngleYaw += 0x2710;
|
|
|
|
}
|
|
|
|
} else if (o->oMoveFlags & 0x00000203) {
|
|
|
|
obj_die_if_health_non_positive();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
obj_check_attacks(&sHauntedChairHitbox, o->oAction);
|
2020-03-02 03:42:52 +00:00
|
|
|
cur_obj_move_standard(78);
|
2019-09-01 19:50:50 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
void bhv_haunted_chair_loop(void) {
|
|
|
|
if (!(o->activeFlags & 0x0008)) {
|
|
|
|
switch (o->oAction) {
|
|
|
|
case 0:
|
|
|
|
haunted_chair_act_0();
|
|
|
|
break;
|
|
|
|
case 1:
|
|
|
|
haunted_chair_act_1();
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
func_802F8D78(30.0f, 30.0f);
|
|
|
|
}
|
|
|
|
}
|