sm64pc/src/game/behaviors/castle_floor_trap.inc.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;
}
}