Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
MorsGames
GitHub Repository: MorsGames/sm64plus
Path: blob/master/src/game/behaviors/castle_floor_trap.inc.c
7861 views
1
// castle_floor_trap.c.inc
2
#include "../settings.h"
3
4
void bhv_floor_trap_in_castle_loop(void) {
5
if (gMarioObject->platform == o)
6
o->parentObj->oInteractStatus |= INT_STATUS_TRAP_TURN;
7
o->oFaceAngleRoll = o->parentObj->oFaceAngleRoll;
8
}
9
10
void bhv_castle_floor_trap_init(void) {
11
struct Object *sp2C;
12
sp2C = spawn_object_relative(0, -358, 0, 0, o, MODEL_CASTLE_BOWSER_TRAP, bhvFloorTrapInCastle);
13
sp2C = spawn_object_relative(0, 358, 0, 0, o, MODEL_CASTLE_BOWSER_TRAP, bhvFloorTrapInCastle);
14
sp2C->oMoveAngleYaw += 0x8000;
15
}
16
17
void bhv_castle_floor_trap_open_detect(void) {
18
if (gMarioStates[0].action == ACT_SPECIAL_EXIT_AIRBORNE
19
|| gMarioStates[0].action == ACT_SPECIAL_DEATH_EXIT)
20
o->oAction = 4; // rotates trapdoor so it looks always open
21
else {
22
o->oAngleVelRoll = 0x400;
23
if (o->oInteractStatus & INT_STATUS_TRAP_TURN)
24
o->oAction = 1; // detects interact then opens the trapdoor
25
}
26
}
27
28
void bhv_castle_floor_trap_open(void) {
29
if (o->oTimer == 0) {
30
if (configRestoreUnusedSounds) {
31
play_sound(SOUND_GENERAL_CASTLE_TRAP_OPEN, gGlobalSoundSource);
32
}
33
else {
34
cur_obj_play_sound_2(SOUND_GENERAL_CASTLE_TRAP_OPEN);
35
}
36
}
37
o->oAngleVelRoll -= 0x100;
38
o->oFaceAngleRoll += o->oAngleVelRoll;
39
if (o->oFaceAngleRoll < -0x4000) {
40
o->oFaceAngleRoll = -0x4000;
41
o->oAction = 2; // after opening is done, enable close detection
42
}
43
}
44
45
void bhv_castle_floor_trap_close_detect(void) {
46
if (o->oDistanceToMario > 1000.0f)
47
o->oAction = 3; // close trapdoor
48
}
49
50
void bhv_castle_floor_trap_close(void) {
51
o->oFaceAngleRoll += 0x400;
52
if (o->oFaceAngleRoll > 0) {
53
o->oFaceAngleRoll = 0;
54
o->oAction = 0; // after closing, reloads open detection
55
o->oInteractStatus &= ~INT_STATUS_TRAP_TURN;
56
}
57
}
58
59
void bhv_castle_floor_trap_rotate(void) {
60
o->oFaceAngleRoll = -0x3C00;
61
}
62
63
void bhv_castle_floor_trap_loop(void) {
64
UNUSED s32 unused[3];
65
switch (o->oAction) {
66
case 0:
67
bhv_castle_floor_trap_open_detect();
68
break;
69
case 1:
70
bhv_castle_floor_trap_open();
71
break;
72
case 2:
73
bhv_castle_floor_trap_close_detect();
74
break;
75
case 3:
76
bhv_castle_floor_trap_close();
77
break;
78
case 4:
79
bhv_castle_floor_trap_rotate();
80
break;
81
}
82
}
83
84