76 lines
2.2 KiB
C
76 lines
2.2 KiB
C
// castle_floor_trap.c.inc
|
|
|
|
void bhv_floor_trap_in_castle_loop(void) {
|
|
if (gMarioObject->platform == o)
|
|
o->parentObj->oInteractStatus |= INT_STATUS_TRAP_TURN;
|
|
o->oFaceAngleRoll = o->parentObj->oFaceAngleRoll;
|
|
}
|
|
|
|
void bhv_castle_floor_trap_init(void) {
|
|
struct Object *sp2C;
|
|
sp2C = spawn_object_relative(0, -358, 0, 0, o, MODEL_CASTLE_BOWSER_TRAP, bhvFloorTrapInCastle);
|
|
sp2C = spawn_object_relative(0, 358, 0, 0, o, MODEL_CASTLE_BOWSER_TRAP, bhvFloorTrapInCastle);
|
|
sp2C->oMoveAngleYaw += 0x8000;
|
|
}
|
|
|
|
void bhv_castle_floor_trap_open_detect(void) {
|
|
if (gMarioStates->action == ACT_SPECIAL_EXIT_AIRBORNE
|
|
|| gMarioStates->action == ACT_SPECIAL_DEATH_EXIT)
|
|
o->oAction = 4; // rotates trapdoor so it looks always open
|
|
else {
|
|
o->oAngleVelRoll = 0x400;
|
|
if (o->oInteractStatus & INT_STATUS_TRAP_TURN)
|
|
o->oAction = 1; // detects interact then opens the trapdoor
|
|
}
|
|
}
|
|
|
|
void bhv_castle_floor_trap_open(void) {
|
|
if (o->oTimer == 0)
|
|
cur_obj_play_sound_2(SOUND_GENERAL_CASTLE_TRAP_OPEN);
|
|
o->oAngleVelRoll -= 0x100;
|
|
o->oFaceAngleRoll += o->oAngleVelRoll;
|
|
if (o->oFaceAngleRoll < -0x4000) {
|
|
o->oFaceAngleRoll = -0x4000;
|
|
o->oAction = 2; // after opening is done, enable close detection
|
|
}
|
|
}
|
|
|
|
void bhv_castle_floor_trap_close_detect(void) {
|
|
if (o->oDistanceToMario > 1000.0f)
|
|
o->oAction = 3; // close trapdoor
|
|
}
|
|
|
|
void bhv_castle_floor_trap_close(void) {
|
|
o->oFaceAngleRoll += 0x400;
|
|
if (o->oFaceAngleRoll > 0) {
|
|
o->oFaceAngleRoll = 0;
|
|
o->oAction = 0; // after closing, reloads open detection
|
|
o->oInteractStatus &= ~INT_STATUS_TRAP_TURN;
|
|
}
|
|
}
|
|
|
|
void bhv_castle_floor_trap_rotate(void) {
|
|
o->oFaceAngleRoll = -0x3C00;
|
|
}
|
|
|
|
void bhv_castle_floor_trap_loop(void) {
|
|
UNUSED s32 unused[3];
|
|
switch (o->oAction) {
|
|
case 0:
|
|
bhv_castle_floor_trap_open_detect();
|
|
break;
|
|
case 1:
|
|
bhv_castle_floor_trap_open();
|
|
break;
|
|
case 2:
|
|
bhv_castle_floor_trap_close_detect();
|
|
break;
|
|
case 3:
|
|
bhv_castle_floor_trap_close();
|
|
break;
|
|
case 4:
|
|
bhv_castle_floor_trap_rotate();
|
|
break;
|
|
}
|
|
}
|