304 lines
8.7 KiB
C
304 lines
8.7 KiB
C
// flying_bookend_switch.inc.c
|
|
|
|
struct Struct80331B30 {
|
|
s16 unk00;
|
|
s16 unk02;
|
|
};
|
|
|
|
struct ObjectHitbox sFlyingBookendHitbox = {
|
|
/* interactType: */ INTERACT_HIT_FROM_BELOW,
|
|
/* downOffset: */ 0,
|
|
/* damageOrCoinValue: */ 2,
|
|
/* health: */ 0,
|
|
/* numLootCoins: */ -1,
|
|
/* radius: */ 60,
|
|
/* height: */ 30,
|
|
/* hurtboxRadius: */ 40,
|
|
/* hurtboxHeight: */ 30,
|
|
};
|
|
|
|
struct Struct80331B30 D_80331B30[] = {
|
|
{ 52, 150 },
|
|
{ 135, 3 },
|
|
{ -75, 78 },
|
|
};
|
|
|
|
struct ObjectHitbox sBookSwitchHitbox = {
|
|
/* interactType: */ INTERACT_BREAKABLE,
|
|
/* downOffset: */ 0,
|
|
/* damageOrCoinValue: */ 0,
|
|
/* health: */ 99,
|
|
/* numLootCoins: */ 0,
|
|
/* radius: */ 20,
|
|
/* height: */ 30,
|
|
/* hurtboxRadius: */ 20,
|
|
/* hurtboxHeight: */ 30,
|
|
};
|
|
|
|
void flying_bookend_act_0(void) {
|
|
if (obj_is_near_to_and_facing_mario(400.0f, 0x3000)) {
|
|
cur_obj_play_sound_2(SOUND_OBJ_DEFAULT_DEATH);
|
|
o->oAction = 1;
|
|
o->oBookendUnkF4 = o->oFaceAnglePitch + 0x7FFF;
|
|
o->oBookendUnkF8 = o->oFaceAngleRoll - 0x7FFF;
|
|
cur_obj_set_model(MODEL_BOOKEND_PART);
|
|
}
|
|
}
|
|
|
|
void flying_bookend_act_1(void) {
|
|
if (obj_forward_vel_approach(3.0f, 1.0f)) {
|
|
if (cur_obj_init_anim_and_check_if_end(2)) {
|
|
o->oAction = 2;
|
|
o->oForwardVel = 0.0f;
|
|
} else {
|
|
o->oForwardVel = 3.0f;
|
|
if (o->oTimer > 5) {
|
|
obj_face_pitch_approach(o->oBookendUnkF4, 2000);
|
|
if (o->oTimer >= 10) {
|
|
obj_face_roll_approach(o->oBookendUnkF8, 2000);
|
|
if (o->oTimer >= 20) {
|
|
approach_f32_ptr(&o->header.gfx.scale[0], 3.0f, 0.2f);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
cur_obj_move_using_fvel_and_gravity();
|
|
}
|
|
|
|
void flying_bookend_act_2(void) {
|
|
cur_obj_init_animation_with_sound(1);
|
|
cur_obj_update_floor_and_walls();
|
|
|
|
if (o->oForwardVel == 0.0f) {
|
|
obj_turn_pitch_toward_mario(120.0f, 1000);
|
|
o->oFaceAnglePitch = o->oMoveAnglePitch + 0x7FFF;
|
|
cur_obj_rotate_yaw_toward(o->oAngleToMario, 1000);
|
|
|
|
if (o->oTimer > 30) {
|
|
obj_compute_vel_from_move_pitch(50.0f);
|
|
}
|
|
}
|
|
|
|
cur_obj_move_standard(78);
|
|
}
|
|
|
|
void flying_bookend_act_3(void) {
|
|
o->oDamageOrCoinValue = 1;
|
|
o->oNumLootCoins = 0;
|
|
|
|
if (o->oTimer >= 4) {
|
|
o->oAction = 2;
|
|
o->oForwardVel = 50.0f;
|
|
}
|
|
|
|
obj_forward_vel_approach(50.0f, 2.0f);
|
|
cur_obj_move_using_fvel_and_gravity();
|
|
}
|
|
|
|
void bhv_flying_bookend_loop(void) {
|
|
if (!(o->activeFlags & 0x0008)) {
|
|
o->oDeathSound = SOUND_OBJ_POUNDING1;
|
|
cur_obj_scale(o->header.gfx.scale[0]);
|
|
|
|
switch (o->oAction) {
|
|
case 0:
|
|
flying_bookend_act_0();
|
|
break;
|
|
case 1:
|
|
flying_bookend_act_1();
|
|
break;
|
|
case 2:
|
|
flying_bookend_act_2();
|
|
break;
|
|
case 3:
|
|
flying_bookend_act_3();
|
|
break;
|
|
}
|
|
|
|
obj_check_attacks(&sFlyingBookendHitbox, -1);
|
|
if (o->oAction == -1 || (o->oMoveFlags & 0x00000203)) {
|
|
o->oNumLootCoins = 0;
|
|
obj_die_if_health_non_positive();
|
|
}
|
|
|
|
o->oGraphYOffset = 30.0f * o->header.gfx.scale[0];
|
|
}
|
|
}
|
|
|
|
void bhv_bookend_spawn_loop(void) {
|
|
struct Object *sp1C;
|
|
|
|
if (!(o->activeFlags & 0x0008)) {
|
|
if (o->oTimer > 40 && obj_is_near_to_and_facing_mario(600.0f, 0x2000)) {
|
|
sp1C = spawn_object(o, MODEL_BOOKEND, bhvFlyingBookend);
|
|
if (sp1C != NULL) {
|
|
sp1C->oAction = 3;
|
|
cur_obj_play_sound_2(SOUND_OBJ_DEFAULT_DEATH);
|
|
}
|
|
o->oTimer = 0;
|
|
}
|
|
}
|
|
}
|
|
|
|
void bookshelf_manager_act_0(void) {
|
|
s32 val04;
|
|
|
|
if (!(o->activeFlags & 0x0008)) {
|
|
for (val04 = 0; val04 < 3; val04++) {
|
|
spawn_object_relative(val04, D_80331B30[val04].unk00, D_80331B30[val04].unk02, 0, o,
|
|
MODEL_BOOKEND, bhvBookSwitch);
|
|
}
|
|
|
|
o->oAction = 1;
|
|
}
|
|
}
|
|
|
|
void bookshelf_manager_act_1(void) {
|
|
if (o->oBookSwitchManagerUnkF8 == 0) {
|
|
if (obj_is_near_to_and_facing_mario(500.0f, 0x3000)) {
|
|
o->oBookSwitchManagerUnkF8 = 1;
|
|
}
|
|
} else if (o->oTimer > 60) {
|
|
o->oAction = 2;
|
|
o->oBookSwitchManagerUnkF8 = 0;
|
|
}
|
|
}
|
|
|
|
void bookshelf_manager_act_2(void) {
|
|
if (!(o->activeFlags & 0x0008)) {
|
|
if (o->oBookSwitchManagerUnkF4 < 0) {
|
|
if (o->oTimer > 30) {
|
|
o->oBookSwitchManagerUnkF4 = o->oBookSwitchManagerUnkF8 = 0;
|
|
} else if (o->oTimer > 10) {
|
|
o->oBookSwitchManagerUnkF8 = 1;
|
|
}
|
|
} else {
|
|
if (o->oBookSwitchManagerUnkF4 >= 3) {
|
|
if (o->oTimer > 100) {
|
|
o->parentObj = cur_obj_nearest_object_with_behavior(bhvHauntedBookshelf);
|
|
o->parentObj->oAction = 1;
|
|
o->oPosX = o->parentObj->oPosX;
|
|
o->oAction = 3;
|
|
} else if (o->oTimer == 30) {
|
|
play_puzzle_jingle();
|
|
}
|
|
} else {
|
|
o->oTimer = 0;
|
|
}
|
|
}
|
|
} else {
|
|
o->oAction = 4;
|
|
}
|
|
}
|
|
|
|
void bookshelf_manager_act_3(void) {
|
|
if (o->oTimer > 85) {
|
|
o->oAction = 4;
|
|
} else {
|
|
o->oForwardVel = o->parentObj->oPosX - o->oPosX;
|
|
o->oPosX = o->parentObj->oPosX;
|
|
}
|
|
}
|
|
|
|
void bookshelf_manager_act_4(void) {
|
|
if (o->oBookSwitchManagerUnkF4 >= 3) {
|
|
obj_mark_for_deletion(o);
|
|
} else {
|
|
o->oAction = 0;
|
|
}
|
|
}
|
|
|
|
void bhv_haunted_bookshelf_manager_loop(void) {
|
|
switch (o->oAction) {
|
|
case 0:
|
|
bookshelf_manager_act_0();
|
|
break;
|
|
case 2:
|
|
bookshelf_manager_act_2();
|
|
break;
|
|
case 1:
|
|
bookshelf_manager_act_1();
|
|
break;
|
|
case 3:
|
|
bookshelf_manager_act_3();
|
|
break;
|
|
case 4:
|
|
bookshelf_manager_act_4();
|
|
break;
|
|
}
|
|
}
|
|
|
|
void bhv_book_switch_loop(void) {
|
|
s32 sp3C;
|
|
struct Object *sp38;
|
|
s16 sp36;
|
|
s16 sp34;
|
|
|
|
o->header.gfx.scale[0] = 2.0f;
|
|
o->header.gfx.scale[1] = 0.9f;
|
|
|
|
if (o->parentObj->oAction == 4) {
|
|
obj_mark_for_deletion(o);
|
|
} else {
|
|
sp3C = obj_check_attacks(&sBookSwitchHitbox, o->oAction);
|
|
if (o->parentObj->oBookSwitchManagerUnkF8 != 0 || o->oAction == 1) {
|
|
if (o->oDistanceToMario < 100.0f) {
|
|
cur_obj_become_tangible();
|
|
} else {
|
|
cur_obj_become_intangible();
|
|
}
|
|
|
|
o->oAction = 1;
|
|
if (o->oBookSwitchUnkF4 == 0.0f) {
|
|
cur_obj_play_sound_2(SOUND_OBJ_DEFAULT_DEATH);
|
|
}
|
|
|
|
if (approach_f32_ptr(&o->oBookSwitchUnkF4, 50.0f, 20.0f)) {
|
|
if (o->parentObj->oBookSwitchManagerUnkF4 >= 0 && o->oTimer > 60) {
|
|
if (sp3C == 1 || sp3C == 2 || sp3C == 6) {
|
|
o->oAction = 2;
|
|
}
|
|
}
|
|
} else {
|
|
o->oTimer = 0;
|
|
}
|
|
} else {
|
|
cur_obj_become_intangible();
|
|
if (approach_f32_ptr(&o->oBookSwitchUnkF4, 0.0f, 20.0f)) {
|
|
if (o->oAction != 0) {
|
|
if (o->parentObj->oBookSwitchManagerUnkF4 == o->oBehParams2ndByte) {
|
|
play_sound(SOUND_GENERAL2_RIGHT_ANSWER, gDefaultSoundArgs);
|
|
o->parentObj->oBookSwitchManagerUnkF4 += 1;
|
|
} else {
|
|
sp36 = random_u16() & 0x1;
|
|
sp34 = gMarioObject->oPosZ + 1.5f * gMarioStates[0].vel[2];
|
|
|
|
play_sound(SOUND_MENU_CAMERA_BUZZ, gDefaultSoundArgs);
|
|
if (sp34 > 0) {
|
|
sp34 = 0;
|
|
}
|
|
|
|
sp38 = spawn_object_abs_with_rot(o, 0, MODEL_BOOKEND, bhvFlyingBookend,
|
|
0x1FC * sp36 - 0x8CA, 890, sp34, 0,
|
|
0x8000 * sp36 + 0x4000, 0);
|
|
|
|
if (sp38 != NULL) {
|
|
sp38->oAction = 3;
|
|
}
|
|
|
|
o->parentObj->oBookSwitchManagerUnkF4 = -1;
|
|
}
|
|
|
|
o->oAction = 0;
|
|
}
|
|
}
|
|
}
|
|
|
|
o->oPosX += o->parentObj->oForwardVel;
|
|
o->oPosZ = o->oHomeZ - o->oBookSwitchUnkF4;
|
|
cur_obj_push_mario_away_from_cylinder(70.0f, 70.0f);
|
|
}
|
|
}
|