From 640dc6e8ee7634ce50be6265260f482a1538fee6 Mon Sep 17 00:00:00 2001 From: MysterD Date: Thu, 24 Sep 2020 23:45:28 -0700 Subject: [PATCH] Render both sides of open doors --- src/game/object_helpers.c | 32 ++++++++++++++++++++++++++++---- src/game/object_list_processor.c | 1 + src/game/object_list_processor.h | 1 + 3 files changed, 30 insertions(+), 4 deletions(-) diff --git a/src/game/object_helpers.c b/src/game/object_helpers.c index 2467e59b..47fd7490 100644 --- a/src/game/object_helpers.c +++ b/src/game/object_helpers.c @@ -188,7 +188,6 @@ Gfx *geo_switch_area(s32 callContext, struct GraphNode *node) { gFindFloorIncludeSurfaceIntangible = TRUE; find_floor(gMarioObject->oPosX, gMarioObject->oPosY, gMarioObject->oPosZ, &sp20); - if (sp20) { gMarioCurrentRoom = sp20->room; gMarioStates[0].currentRoom = gMarioCurrentRoom; @@ -199,6 +198,29 @@ Gfx *geo_switch_area(s32 callContext, struct GraphNode *node) { switchCase->selectedCase = sp26; } } + + // display both sides of door + gDoorCurrentRoom = 0; + for (int i = 0; i < MAX_PLAYERS; i++) { + struct MarioState* m = &gMarioStates[i]; + if (!is_player_active(m)) { continue; } + + struct Object* door = m->interactObj; + if (door == NULL) { continue; } + if (door->oInteractType != INTERACT_DOOR) { continue; } + if (door->oAction == 0) { continue; } + if (gDoorAdjacentRooms[door->oDoorUnkF8][0] != gMarioCurrentRoom && gDoorAdjacentRooms[door->oDoorUnkF8][1] != gMarioCurrentRoom) { continue; } + + find_floor(door->oHomeX, door->oHomeY, door->oHomeZ, &sp20); + if (!sp20) { continue; } + + sp26 = sp20->room - 1; + if (sp26 == 0) { continue; } + + gDoorCurrentRoom = sp20->room; + switchCase->selectedCase = sp26; + break; + } } } else { switchCase->selectedCase = 0; @@ -2541,12 +2563,14 @@ void cur_obj_enable_rendering_if_mario_in_room(void) { } } - if (marioInRoom) { + u8 inViewOfOpenDoor = (gDoorCurrentRoom != 0) + && (gDoorAdjacentRooms[gDoorCurrentRoom][0] == o->oRoom || gDoorAdjacentRooms[gDoorCurrentRoom][1] == o->oRoom); + + if (marioInRoom || inViewOfOpenDoor) { cur_obj_enable_rendering(); o->activeFlags &= ~ACTIVE_FLAG_IN_DIFFERENT_ROOM; gNumRoomedObjectsInMarioRoom++; - } - else { + } else { cur_obj_disable_rendering(); o->activeFlags |= ACTIVE_FLAG_IN_DIFFERENT_ROOM; gNumRoomedObjectsNotInMarioRoom++; diff --git a/src/game/object_list_processor.c b/src/game/object_list_processor.c index db97c586..4f69ca00 100644 --- a/src/game/object_list_processor.c +++ b/src/game/object_list_processor.c @@ -151,6 +151,7 @@ s16 *gEnvironmentRegions; s32 gEnvironmentLevels[20]; s8 gDoorAdjacentRooms[60][2]; s16 gMarioCurrentRoom; +s16 gDoorCurrentRoom; s16 D_8035FEE2; s16 D_8035FEE4; s16 gTHIWaterDrained; diff --git a/src/game/object_list_processor.h b/src/game/object_list_processor.h index ccb28343..b23bd8ad 100644 --- a/src/game/object_list_processor.h +++ b/src/game/object_list_processor.h @@ -109,6 +109,7 @@ extern s16 *gEnvironmentRegions; extern s32 gEnvironmentLevels[20]; extern s8 gDoorAdjacentRooms[60][2]; extern s16 gMarioCurrentRoom; +extern s16 gDoorCurrentRoom; extern s16 D_8035FEE2; extern s16 D_8035FEE4; extern s16 gTHIWaterDrained;