sm64pc/src/game/behaviors/door.inc.c

140 lines
3.9 KiB
C
Raw Permalink Normal View History

2019-08-25 04:46:40 +00:00
// door.c.inc
2020-02-03 05:51:26 +00:00
struct DoorAction
{
u32 flag;
s32 action;
};
struct DoorAction D_8032F300[] = { { 0x40000, 3 }, { 0x80000, 4 }, { 0x10000, 1 }, { 0x20000, 2 }, { -1, 0 }, };
2019-08-25 04:46:40 +00:00
2019-10-05 19:08:05 +00:00
s32 D_8032F328[] = { SOUND_GENERAL_OPEN_WOOD_DOOR, SOUND_GENERAL_OPEN_IRON_DOOR };
2019-08-25 04:46:40 +00:00
2019-10-05 19:08:05 +00:00
s32 D_8032F330[] = { SOUND_GENERAL_CLOSE_WOOD_DOOR, SOUND_GENERAL_CLOSE_IRON_DOOR };
2019-08-25 04:46:40 +00:00
2020-03-02 03:42:52 +00:00
void door_animation_and_reset(s32 sp18) {
cur_obj_init_animation_with_sound(sp18);
if (cur_obj_check_if_near_animation_end())
2019-08-25 04:46:40 +00:00
o->oAction = 0;
}
2020-03-02 03:42:52 +00:00
void set_door_camera_event(void) {
2019-08-25 04:46:40 +00:00
if (segmented_to_virtual(bhvDoor) == o->behavior)
2020-01-03 15:38:57 +00:00
gPlayerCameraState->cameraEvent = CAM_EVENT_DOOR;
2019-08-25 04:46:40 +00:00
else
2020-01-03 15:38:57 +00:00
gPlayerCameraState->cameraEvent = CAM_EVENT_DOOR_WARP;
gPlayerCameraState->usedObj = o;
2019-08-25 04:46:40 +00:00
}
2020-03-02 03:42:52 +00:00
void play_door_open_noise(void) {
s32 sp1C = cur_obj_has_model(MODEL_HMC_METAL_DOOR);
2019-08-25 04:46:40 +00:00
if (o->oTimer == 0) {
2020-03-02 03:42:52 +00:00
cur_obj_play_sound_2(D_8032F328[sp1C]);
2019-08-25 04:46:40 +00:00
gTimeStopState |= TIME_STOP_MARIO_OPENED_DOOR;
}
if (o->oTimer == 70) {
2020-03-02 03:42:52 +00:00
cur_obj_play_sound_2(D_8032F330[sp1C]);
2019-08-25 04:46:40 +00:00
}
}
2020-03-02 03:42:52 +00:00
void play_warp_door_open_noise(void) {
s32 sp1C = cur_obj_has_model(MODEL_HMC_METAL_DOOR);
2019-08-25 04:46:40 +00:00
if (o->oTimer == 30)
2020-03-02 03:42:52 +00:00
cur_obj_play_sound_2(D_8032F330[sp1C]);
2019-08-25 04:46:40 +00:00
}
void bhv_door_loop(void) {
s32 sp1C = 0;
2020-02-03 05:51:26 +00:00
while (D_8032F300[sp1C].flag != (u32)~0) {
2020-03-02 03:42:52 +00:00
if (cur_obj_clear_interact_status_flag(D_8032F300[sp1C].flag)) {
set_door_camera_event();
cur_obj_change_action(D_8032F300[sp1C].action);
2019-08-25 04:46:40 +00:00
}
sp1C++;
}
2020-02-03 05:51:26 +00:00
2019-08-25 04:46:40 +00:00
switch (o->oAction) {
case 0:
2020-03-02 03:42:52 +00:00
cur_obj_init_animation_with_sound(0);
2019-08-25 04:46:40 +00:00
break;
case 1:
2020-03-02 03:42:52 +00:00
door_animation_and_reset(1);
play_door_open_noise();
2019-08-25 04:46:40 +00:00
break;
case 2:
2020-03-02 03:42:52 +00:00
door_animation_and_reset(2);
play_door_open_noise();
2019-08-25 04:46:40 +00:00
break;
case 3:
2020-03-02 03:42:52 +00:00
door_animation_and_reset(3);
play_warp_door_open_noise();
2019-08-25 04:46:40 +00:00
break;
case 4:
2020-03-02 03:42:52 +00:00
door_animation_and_reset(4);
play_warp_door_open_noise();
2019-08-25 04:46:40 +00:00
break;
}
if (o->oAction == 0)
load_object_collision_model();
bhv_star_door_loop_2();
}
void bhv_door_init(void) {
f32 x = o->oPosX;
f32 z = o->oPosZ;
struct Surface *floor;
find_floor(x, o->oPosY, z, &floor);
if (floor != NULL) {
2019-10-05 19:08:05 +00:00
o->oDoorUnkF8 = floor->room;
2019-08-25 04:46:40 +00:00
}
x = o->oPosX + sins(o->oMoveAngleYaw) * 200.0f;
z = o->oPosZ + coss(o->oMoveAngleYaw) * 200.0f;
find_floor(x, o->oPosY, z, &floor);
if (floor != NULL) {
2019-10-05 19:08:05 +00:00
o->oDoorUnkFC = floor->room;
2019-08-25 04:46:40 +00:00
}
x = o->oPosX + sins(o->oMoveAngleYaw) * -200.0f;
z = o->oPosZ + coss(o->oMoveAngleYaw) * -200.0f;
find_floor(x, o->oPosY, z, &floor);
if (floor != NULL) {
2019-10-05 19:08:05 +00:00
o->oDoorUnk100 = floor->room;
2019-08-25 04:46:40 +00:00
}
2019-10-05 19:08:05 +00:00
if (o->oDoorUnkF8 > 0 && o->oDoorUnkF8 < 60) {
gDoorAdjacentRooms[o->oDoorUnkF8][0] = o->oDoorUnkFC;
gDoorAdjacentRooms[o->oDoorUnkF8][1] = o->oDoorUnk100;
2019-08-25 04:46:40 +00:00
}
}
void bhv_star_door_loop_2(void) {
s32 sp4 = 0;
if (gMarioCurrentRoom != 0) {
2019-10-05 19:08:05 +00:00
if (o->oDoorUnkF8 == gMarioCurrentRoom)
2019-08-25 04:46:40 +00:00
sp4 = 1;
2019-10-05 19:08:05 +00:00
else if (gMarioCurrentRoom == o->oDoorUnkFC)
2019-08-25 04:46:40 +00:00
sp4 = 1;
2019-10-05 19:08:05 +00:00
else if (gMarioCurrentRoom == o->oDoorUnk100)
2019-08-25 04:46:40 +00:00
sp4 = 1;
2019-10-05 19:08:05 +00:00
else if (gDoorAdjacentRooms[gMarioCurrentRoom][0] == o->oDoorUnkFC)
2019-08-25 04:46:40 +00:00
sp4 = 1;
2019-10-05 19:08:05 +00:00
else if (gDoorAdjacentRooms[gMarioCurrentRoom][0] == o->oDoorUnk100)
2019-08-25 04:46:40 +00:00
sp4 = 1;
2019-10-05 19:08:05 +00:00
else if (gDoorAdjacentRooms[gMarioCurrentRoom][1] == o->oDoorUnkFC)
2019-08-25 04:46:40 +00:00
sp4 = 1;
2019-10-05 19:08:05 +00:00
else if (gDoorAdjacentRooms[gMarioCurrentRoom][1] == o->oDoorUnk100)
2019-08-25 04:46:40 +00:00
sp4 = 1;
} else
sp4 = 1;
if (sp4 == 1) {
2020-04-03 18:57:26 +00:00
o->header.gfx.node.flags |= GRAPH_RENDER_ACTIVE;
2019-08-25 04:46:40 +00:00
D_8035FEE4++;
}
if (sp4 == 0) {
2020-04-03 18:57:26 +00:00
o->header.gfx.node.flags &= ~GRAPH_RENDER_ACTIVE;
2019-08-25 04:46:40 +00:00
}
2019-10-05 19:08:05 +00:00
o->oDoorUnk88 = sp4;
2019-08-25 04:46:40 +00:00
}