1
0
Fork 0
mirror of https://github.com/zeldaret/oot.git synced 2025-05-10 19:13:42 +00:00

Update Room Documentation (#2015)

* Update Room Documentation

* Write more complete documentation, implement suggestions.

* Function name changes; minor comment tweaks

* nit

* Resolve Dragorn fixes

* Resolve Fig suggestions, fix comment wording

* fix bss, fig suggestion

* bss
This commit is contained in:
mzxrules 2024-09-05 08:08:21 -04:00 committed by GitHub
parent dbb059c6a7
commit acb5c7f20c
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
27 changed files with 243 additions and 195 deletions

View file

@ -1044,12 +1044,12 @@ void func_80095974(GraphicsContext* gfxCtx);
void func_80095AA0(PlayState* play, Room* room, Input* input, s32 arg3); void func_80095AA0(PlayState* play, Room* room, Input* input, s32 arg3);
void Room_DrawBackground2D(Gfx** gfxP, void* tex, void* tlut, u16 width, u16 height, u8 fmt, u8 siz, u16 tlutMode, void Room_DrawBackground2D(Gfx** gfxP, void* tex, void* tlut, u16 width, u16 height, u8 fmt, u8 siz, u16 tlutMode,
u16 tlutCount, f32 offsetX, f32 offsetY); u16 tlutCount, f32 offsetX, f32 offsetY);
void func_80096FD4(PlayState* play, Room* room); void Room_Init(PlayState* play, Room* room);
u32 func_80096FE8(PlayState* play, RoomContext* roomCtx); u32 Room_SetupFirstRoom(PlayState* play, RoomContext* roomCtx);
s32 func_8009728C(PlayState* play, RoomContext* roomCtx, s32 roomNum); s32 Room_RequestNewRoom(PlayState* play, RoomContext* roomCtx, s32 roomNum);
s32 func_800973FC(PlayState* play, RoomContext* roomCtx); s32 Room_ProcessRoomRequest(PlayState* play, RoomContext* roomCtx);
void Room_Draw(PlayState* play, Room* room, u32 flags); void Room_Draw(PlayState* play, Room* room, u32 flags);
void func_80097534(PlayState* play, RoomContext* roomCtx); void Room_FinishRoomChange(PlayState* play, RoomContext* roomCtx);
void Sample_Destroy(GameState* thisx); void Sample_Destroy(GameState* thisx);
void Sample_Init(GameState* thisx); void Sample_Init(GameState* thisx);
void Inventory_ChangeEquipment(s16 equipment, u16 value); void Inventory_ChangeEquipment(s16 equipment, u16 value);
@ -1061,7 +1061,7 @@ s32 Object_GetSlot(ObjectContext* objectCtx, s16 objectId);
s32 Object_IsLoaded(ObjectContext* objectCtx, s32 slot); s32 Object_IsLoaded(ObjectContext* objectCtx, s32 slot);
void func_800981B8(ObjectContext* objectCtx); void func_800981B8(ObjectContext* objectCtx);
s32 Scene_ExecuteCommands(PlayState* play, SceneCmd* sceneCmd); s32 Scene_ExecuteCommands(PlayState* play, SceneCmd* sceneCmd);
void TransitionActor_InitContext(GameState* state, TransitionActorContext* transiActorCtx); void Scene_ResetTransitionActorList(GameState* state, TransitionActorList* transitionActors);
void Scene_SetTransitionForNextEntrance(PlayState* play); void Scene_SetTransitionForNextEntrance(PlayState* play);
void Scene_Draw(PlayState* play); void Scene_Draw(PlayState* play);

View file

@ -63,7 +63,7 @@ typedef struct PlayState {
/* 0x10B20 */ AnimTaskQueue animTaskQueue; /* 0x10B20 */ AnimTaskQueue animTaskQueue;
/* 0x117A4 */ ObjectContext objectCtx; /* 0x117A4 */ ObjectContext objectCtx;
/* 0x11CBC */ RoomContext roomCtx; /* 0x11CBC */ RoomContext roomCtx;
/* 0x11D34 */ TransitionActorContext transiActorCtx; /* 0x11D34 */ TransitionActorList transitionActors;
/* 0x11D3C */ void (*playerInit)(Player* player, struct PlayState* play, FlexSkeletonHeader* skelHeader); /* 0x11D3C */ void (*playerInit)(Player* player, struct PlayState* play, FlexSkeletonHeader* skelHeader);
/* 0x11D40 */ void (*playerUpdate)(Player* player, struct PlayState* play, Input* input); /* 0x11D40 */ void (*playerUpdate)(Player* player, struct PlayState* play, Input* input);
/* 0x11D44 */ int (*isPlayerDroppingFish)(struct PlayState* play); /* 0x11D44 */ int (*isPlayerDroppingFish)(struct PlayState* play);
@ -81,8 +81,7 @@ typedef struct PlayState {
/* 0x11DE9 */ u8 haltAllActors; /* 0x11DE9 */ u8 haltAllActors;
/* 0x11DEA */ u8 spawn; /* 0x11DEA */ u8 spawn;
/* 0x11DEB */ u8 numActorEntries; /* 0x11DEB */ u8 numActorEntries;
/* 0x11DEC */ u8 numRooms; /* 0x11DEC */ RoomList roomList;
/* 0x11DF0 */ RomFile* roomList;
/* 0x11DF4 */ ActorEntry* playerEntry; /* 0x11DF4 */ ActorEntry* playerEntry;
/* 0x11DF8 */ ActorEntry* actorEntryList; /* 0x11DF8 */ ActorEntry* actorEntryList;
/* 0x11DFC */ void* unk_11DFC; /* 0x11DFC */ void* unk_11DFC;

View file

@ -40,10 +40,10 @@ typedef struct TransitionActorEntry {
/* 0x0E */ s16 params; /* 0x0E */ s16 params;
} TransitionActorEntry; // size = 0x10 } TransitionActorEntry; // size = 0x10
typedef struct TransitionActorContext { typedef struct TransitionActorList {
/* 0x00 */ u8 numActors; /* 0x00 */ u8 count;
/* 0x04 */ TransitionActorEntry* list; /* 0x04 */ TransitionActorEntry* list;
} TransitionActorContext; // size = 0x8 } TransitionActorList; // size = 0x8
typedef struct Spawn { typedef struct Spawn {
/* 0x00 */ u8 playerEntryIndex; /* 0x00 */ u8 playerEntryIndex;
@ -171,7 +171,7 @@ typedef enum RoomBehaviorType2 {
} RoomBehaviorType2; } RoomBehaviorType2;
typedef struct Room { typedef struct Room {
/* 0x00 */ s8 num; /* 0x00 */ s8 num; // -1 is invalid room
/* 0x01 */ u8 unk_01; /* 0x01 */ u8 unk_01;
/* 0x02 */ u8 behaviorType2; /* 0x02 */ u8 behaviorType2;
/* 0x03 */ u8 behaviorType1; /* 0x03 */ u8 behaviorType1;
@ -185,16 +185,21 @@ typedef struct Room {
typedef struct RoomContext { typedef struct RoomContext {
/* 0x00 */ Room curRoom; /* 0x00 */ Room curRoom;
/* 0x14 */ Room prevRoom; /* 0x14 */ Room prevRoom;
/* 0x28 */ void* bufPtrs[2]; /* 0x28 */ void* bufPtrs[2]; // Start and end pointers for the room buffer. Can be split into two pages, where page 0 is allocated from the start pointer and page 1 is allocated from the end pointer.
/* 0x30 */ u8 unk_30; /* 0x30 */ u8 activeBufPage; // 0 - First page in memory, 1 - Last page in memory
/* 0x31 */ s8 status; /* 0x31 */ s8 status; // 0 - Free for new room request, 1 - DmaRequest for a new room is in progress
/* 0x34 */ void* unk_34; /* 0x34 */ void* roomRequestAddr; // Pointer to where the requested room segment will be stored
/* 0x38 */ DmaRequest dmaRequest; /* 0x38 */ DmaRequest dmaRequest;
/* 0x58 */ OSMesgQueue loadQueue; /* 0x58 */ OSMesgQueue loadQueue;
/* 0x70 */ OSMesg loadMsg; /* 0x70 */ OSMesg loadMsg;
/* 0x74 */ s16 unk_74[2]; // context-specific data used by the current scene draw config /* 0x74 */ s16 drawParams[2]; // context-specific data used by the current scene draw config
} RoomContext; // size = 0x78 } RoomContext; // size = 0x78
typedef struct RoomList {
/* 0x00 */ u8 count;
/* 0x04 */ RomFile* romFiles; // Array of rom addresses for each room in a scene
} RoomList;
#define ROOM_DRAW_OPA (1 << 0) #define ROOM_DRAW_OPA (1 << 0)
#define ROOM_DRAW_XLU (1 << 1) #define ROOM_DRAW_XLU (1 << 1)

View file

@ -42,8 +42,8 @@
*/ */
#if PLATFORM_GC #if PLATFORM_GC
#pragma increment_block_number "gc-eu:240 gc-eu-mq:240 gc-eu-mq-dbg:224 gc-jp:240 gc-jp-ce:240 gc-jp-mq:240 gc-us:240" \ #pragma increment_block_number "gc-eu:224 gc-eu-mq:224 gc-eu-mq-dbg:224 gc-jp:224 gc-jp-ce:224 gc-jp-mq:224 gc-us:224" \
"gc-us-mq:240" "gc-us-mq:224"
#include "global.h" #include "global.h"
#include "alloca.h" #include "alloca.h"

View file

@ -7,6 +7,7 @@
#include "global.h" #include "global.h"
#include "fault.h" #include "fault.h"
#include "terminal.h" #include "terminal.h"
#pragma increment_block_number "gc-jp:128 gc-jp-ce:128 gc-jp-mq:128 gc-us:128 gc-us-mq:128"
#if PLATFORM_GC #if PLATFORM_GC

View file

@ -14,7 +14,7 @@ s32 gScreenWidth = SCREEN_WIDTH;
s32 gScreenHeight = SCREEN_HEIGHT; s32 gScreenHeight = SCREEN_HEIGHT;
u32 gSystemHeapSize = 0; u32 gSystemHeapSize = 0;
#pragma increment_block_number "gc-eu:224 gc-eu-mq:224 gc-jp:224 gc-jp-ce:224 gc-jp-mq:224 gc-us:224 gc-us-mq:224" #pragma increment_block_number "gc-eu:208 gc-eu-mq:208 gc-jp:208 gc-jp-ce:208 gc-jp-mq:208 gc-us:208 gc-us-mq:208"
PreNmiBuff* gAppNmiBufferPtr; PreNmiBuff* gAppNmiBufferPtr;
Scheduler gScheduler; Scheduler gScheduler;

View file

@ -1972,7 +1972,7 @@ void func_8002F994(Actor* actor, s32 timer) {
// Tests if something hit Jabu Jabu surface, displaying hit splash and playing sfx if true // Tests if something hit Jabu Jabu surface, displaying hit splash and playing sfx if true
s32 func_8002F9EC(PlayState* play, Actor* actor, CollisionPoly* poly, s32 bgId, Vec3f* pos) { s32 func_8002F9EC(PlayState* play, Actor* actor, CollisionPoly* poly, s32 bgId, Vec3f* pos) {
if (SurfaceType_GetFloorType(&play->colCtx, poly, bgId) == FLOOR_TYPE_8) { if (SurfaceType_GetFloorType(&play->colCtx, poly, bgId) == FLOOR_TYPE_8) {
play->roomCtx.unk_74[0] = 1; play->roomCtx.drawParams[0] = 1;
CollisionCheck_BlueBlood(play, NULL, pos); CollisionCheck_BlueBlood(play, NULL, pos);
Actor_PlaySfx(actor, NA_SE_IT_WALL_HIT_BUYO); Actor_PlaySfx(actor, NA_SE_IT_WALL_HIT_BUYO);
return true; return true;
@ -3079,8 +3079,8 @@ void Actor_SpawnTransitionActors(PlayState* play, ActorContext* actorCtx) {
u8 numActors; u8 numActors;
s32 i; s32 i;
transitionActor = play->transiActorCtx.list; transitionActor = play->transitionActors.list;
numActors = play->transiActorCtx.numActors; numActors = play->transitionActors.count;
for (i = 0; i < numActors; i++) { for (i = 0; i < numActors; i++) {
if (transitionActor->id >= 0) { if (transitionActor->id >= 0) {
@ -3095,7 +3095,7 @@ void Actor_SpawnTransitionActors(PlayState* play, ActorContext* actorCtx) {
(i << TRANSITION_ACTOR_PARAMS_INDEX_SHIFT) + transitionActor->params); (i << TRANSITION_ACTOR_PARAMS_INDEX_SHIFT) + transitionActor->params);
transitionActor->id = -transitionActor->id; transitionActor->id = -transitionActor->id;
numActors = play->transiActorCtx.numActors; numActors = play->transitionActors.count;
} }
} }
transitionActor++; transitionActor++;

View file

@ -310,8 +310,8 @@ void CutsceneCmd_Misc(PlayState* play, CutsceneContext* csCtx, CsCmdMisc* cmd) {
break; break;
case CS_MISC_FADE_KOKIRI_GRASS_ENV_ALPHA: case CS_MISC_FADE_KOKIRI_GRASS_ENV_ALPHA:
if (play->roomCtx.unk_74[0] <= 127) { if (play->roomCtx.drawParams[0] <= 127) {
play->roomCtx.unk_74[0] += 4; play->roomCtx.drawParams[0] += 4;
} }
break; break;
@ -324,14 +324,14 @@ void CutsceneCmd_Misc(PlayState* play, CutsceneContext* csCtx, CsCmdMisc* cmd) {
break; break;
case CS_MISC_DEKU_TREE_DEATH: case CS_MISC_DEKU_TREE_DEATH:
if (play->roomCtx.unk_74[0] < 1650) { if (play->roomCtx.drawParams[0] < 1650) {
play->roomCtx.unk_74[0] += 20; play->roomCtx.drawParams[0] += 20;
} }
if (csCtx->curFrame == 783) { if (csCtx->curFrame == 783) {
Sfx_PlaySfxCentered(NA_SE_EV_DEKU_DEATH); Sfx_PlaySfxCentered(NA_SE_EV_DEKU_DEATH);
} else if (csCtx->curFrame == 717) { } else if (csCtx->curFrame == 717) {
play->roomCtx.unk_74[0] = 0; play->roomCtx.drawParams[0] = 0;
} }
break; break;
@ -344,12 +344,12 @@ void CutsceneCmd_Misc(PlayState* play, CutsceneContext* csCtx, CsCmdMisc* cmd) {
break; break;
case CS_MISC_TRIFORCE_FLASH: case CS_MISC_TRIFORCE_FLASH:
if (play->roomCtx.unk_74[1] == 0) { if (play->roomCtx.drawParams[1] == 0) {
Sfx_PlaySfxCentered(NA_SE_EV_TRIFORCE_FLASH); Sfx_PlaySfxCentered(NA_SE_EV_TRIFORCE_FLASH);
} }
if (play->roomCtx.unk_74[1] < 255) { if (play->roomCtx.drawParams[1] < 255) {
play->roomCtx.unk_74[1] += 5; play->roomCtx.drawParams[1] += 5;
} }
break; break;

View file

@ -441,8 +441,8 @@ void Environment_Init(PlayState* play2, EnvironmentContext* envCtx, s32 unused)
sLightningBolts[i].state = LIGHTNING_BOLT_INACTIVE; sLightningBolts[i].state = LIGHTNING_BOLT_INACTIVE;
} }
play->roomCtx.unk_74[0] = 0; play->roomCtx.drawParams[0] = 0;
play->roomCtx.unk_74[1] = 0; play->roomCtx.drawParams[1] = 0;
for (i = 0; i < ARRAY_COUNT(play->csCtx.actorCues); i++) { for (i = 0; i < ARRAY_COUNT(play->csCtx.actorCues); i++) {
play->csCtx.actorCues[i] = NULL; play->csCtx.actorCues[i] = NULL;

View file

@ -8,7 +8,7 @@
#include "n64dd.h" #include "n64dd.h"
#endif #endif
#pragma increment_block_number "gc-eu:128 gc-eu-mq:128 gc-jp:128 gc-jp-ce:128 gc-jp-mq:128 gc-us:128 gc-us-mq:128" #pragma increment_block_number "gc-eu:0 gc-eu-mq:0 gc-jp:128 gc-jp-ce:128 gc-jp-mq:128 gc-us:128 gc-us-mq:128"
#if PLATFORM_N64 #if PLATFORM_N64
#define OCARINA_BUTTON_A_PRIM_R 80 #define OCARINA_BUTTON_A_PRIM_R 80

View file

@ -468,7 +468,8 @@ void Play_Init(GameState* thisx) {
Actor_InitContext(this, &this->actorCtx, this->playerEntry); Actor_InitContext(this, &this->actorCtx, this->playerEntry);
while (!func_800973FC(this, &this->roomCtx)) { // Busyloop until the room loads
while (!Room_ProcessRoomRequest(this, &this->roomCtx)) {
; // Empty Loop ; // Empty Loop
} }
@ -950,7 +951,7 @@ void Play_Update(PlayState* this) {
} }
} else { } else {
PLAY_LOG(3606); PLAY_LOG(3606);
func_800973FC(this, &this->roomCtx); Room_ProcessRoomRequest(this, &this->roomCtx);
PLAY_LOG(3612); PLAY_LOG(3612);
CollisionCheck_AT(this, &this->colChkCtx); CollisionCheck_AT(this, &this->colChkCtx);
@ -1524,8 +1525,8 @@ void Play_InitScene(PlayState* this, s32 spawn) {
Object_InitContext(this, &this->objectCtx); Object_InitContext(this, &this->objectCtx);
LightContext_Init(this, &this->lightCtx); LightContext_Init(this, &this->lightCtx);
TransitionActor_InitContext(&this->state, &this->transiActorCtx); Scene_ResetTransitionActorList(&this->state, &this->transitionActors);
func_80096FD4(this, &this->roomCtx.curRoom); Room_Init(this, &this->roomCtx.curRoom);
R_SCENE_CAM_TYPE = SCENE_CAM_TYPE_DEFAULT; R_SCENE_CAM_TYPE = SCENE_CAM_TYPE_DEFAULT;
gSaveContext.worldMapArea = WORLD_MAP_AREA_HYRULE_FIELD; gSaveContext.worldMapArea = WORLD_MAP_AREA_HYRULE_FIELD;
Scene_ExecuteCommands(this, this->sceneSegment); Scene_ExecuteCommands(this, this->sceneSegment);
@ -1579,7 +1580,7 @@ void Play_SpawnScene(PlayState* this, s32 sceneId, s32 spawn) {
} }
#endif #endif
size = func_80096FE8(this, &this->roomCtx); size = Room_SetupFirstRoom(this, &this->roomCtx);
PRINTF("ROOM SIZE=%fK\n", size / 1024.0f); PRINTF("ROOM SIZE=%fK\n", size / 1024.0f);
} }
@ -1913,7 +1914,7 @@ s32 func_800C0D34(PlayState* this, Actor* actor, s16* yaw) {
return 0; return 0;
} }
transitionActor = &this->transiActorCtx.list[GET_TRANSITION_ACTOR_INDEX(actor)]; transitionActor = &this->transitionActors.list[GET_TRANSITION_ACTOR_INDEX(actor)];
frontRoom = transitionActor->sides[0].room; frontRoom = transitionActor->sides[0].room;
if (frontRoom == transitionActor->sides[1].room) { if (frontRoom == transitionActor->sides[1].room) {

View file

@ -536,13 +536,18 @@ void Room_DrawImage(PlayState* play, Room* room, u32 flags) {
} }
} }
void func_80096FD4(PlayState* play, Room* room) { void Room_Init(PlayState* play, Room* room) {
room->num = -1; room->num = -1;
room->segment = NULL; room->segment = NULL;
} }
u32 func_80096FE8(PlayState* play, RoomContext* roomCtx) { /**
u32 maxRoomSize = 0; * Allocates memory for rooms and fetches the first room that the player will spawn into.
*
* @return u32 size of the buffer reserved for room data
*/
u32 Room_SetupFirstRoom(PlayState* play, RoomContext* roomCtx) {
u32 roomBufferSize = 0;
u32 roomSize; u32 roomSize;
s32 i; s32 i;
s32 j; s32 j;
@ -553,25 +558,27 @@ u32 func_80096FE8(PlayState* play, RoomContext* roomCtx) {
u32 cumulRoomSize; u32 cumulRoomSize;
s32 pad; s32 pad;
// Set roomBufferSize to the largest room
{ {
RomFile* roomList = play->roomList; RomFile* roomList = play->roomList.romFiles;
for (i = 0; i < play->numRooms; i++) { for (i = 0; i < play->roomList.count; i++) {
roomSize = roomList[i].vromEnd - roomList[i].vromStart; roomSize = roomList[i].vromEnd - roomList[i].vromStart;
PRINTF("ROOM%d size=%d\n", i, roomSize); PRINTF("ROOM%d size=%d\n", i, roomSize);
if (maxRoomSize < roomSize) { if (roomBufferSize < roomSize) {
maxRoomSize = roomSize; roomBufferSize = roomSize;
} }
} }
} }
if ((u32)play->transiActorCtx.numActors != 0) { // If there any rooms are connected, find their combined size and update roomBufferSize if larger
RomFile* roomList = play->roomList; if ((u32)play->transitionActors.count != 0) {
TransitionActorEntry* transitionActor = &play->transiActorCtx.list[0]; RomFile* roomList = play->roomList.romFiles;
TransitionActorEntry* transitionActor = &play->transitionActors.list[0];
LOG_NUM("game_play->room_rom_address.num", play->numRooms, "../z_room.c", 912); LOG_NUM("game_play->room_rom_address.num", play->roomList.count, "../z_room.c", 912);
for (j = 0; j < play->transiActorCtx.numActors; j++) { for (j = 0; j < play->transitionActors.count; j++) {
frontRoom = transitionActor->sides[0].room; frontRoom = transitionActor->sides[0].room;
backRoom = transitionActor->sides[1].room; backRoom = transitionActor->sides[1].room;
frontRoomSize = (frontRoom < 0) ? 0 : roomList[frontRoom].vromEnd - roomList[frontRoom].vromStart; frontRoomSize = (frontRoom < 0) ? 0 : roomList[frontRoom].vromEnd - roomList[frontRoom].vromStart;
@ -580,32 +587,52 @@ u32 func_80096FE8(PlayState* play, RoomContext* roomCtx) {
PRINTF("DOOR%d=<%d> ROOM1=<%d, %d> ROOM2=<%d, %d>\n", j, cumulRoomSize, frontRoom, frontRoomSize, backRoom, PRINTF("DOOR%d=<%d> ROOM1=<%d, %d> ROOM2=<%d, %d>\n", j, cumulRoomSize, frontRoom, frontRoomSize, backRoom,
backRoomSize); backRoomSize);
if (maxRoomSize < cumulRoomSize) { if (roomBufferSize < cumulRoomSize) {
maxRoomSize = cumulRoomSize; roomBufferSize = cumulRoomSize;
} }
transitionActor++; transitionActor++;
} }
} }
PRINTF(VT_FGCOL(YELLOW)); PRINTF(VT_FGCOL(YELLOW));
PRINTF(T("部屋バッファサイズ=%08x(%5.1fK)\n", "Room buffer size=%08x(%5.1fK)\n"), maxRoomSize, PRINTF(T("部屋バッファサイズ=%08x(%5.1fK)\n", "Room buffer size=%08x(%5.1fK)\n"), roomBufferSize,
maxRoomSize / 1024.0f); roomBufferSize / 1024.0f);
roomCtx->bufPtrs[0] = GAME_STATE_ALLOC(&play->state, maxRoomSize, "../z_room.c", 946); roomCtx->bufPtrs[0] = GAME_STATE_ALLOC(&play->state, roomBufferSize, "../z_room.c", 946);
PRINTF(T("部屋バッファ開始ポインタ=%08x\n", "Room buffer initial pointer=%08x\n"), roomCtx->bufPtrs[0]); PRINTF(T("部屋バッファ開始ポインタ=%08x\n", "Room buffer initial pointer=%08x\n"), roomCtx->bufPtrs[0]);
roomCtx->bufPtrs[1] = (void*)((uintptr_t)roomCtx->bufPtrs[0] + maxRoomSize); roomCtx->bufPtrs[1] = (void*)((uintptr_t)roomCtx->bufPtrs[0] + roomBufferSize);
PRINTF(T("部屋バッファ終了ポインタ=%08x\n", "Room buffer end pointer=%08x\n"), roomCtx->bufPtrs[1]); PRINTF(T("部屋バッファ終了ポインタ=%08x\n", "Room buffer end pointer=%08x\n"), roomCtx->bufPtrs[1]);
PRINTF(VT_RST); PRINTF(VT_RST);
roomCtx->unk_30 = 0; roomCtx->activeBufPage = 0;
roomCtx->status = 0; roomCtx->status = 0;
frontRoom = gSaveContext.respawnFlag > 0 ? ((void)0, gSaveContext.respawn[gSaveContext.respawnFlag - 1].roomIndex) frontRoom = gSaveContext.respawnFlag > 0 ? ((void)0, gSaveContext.respawn[gSaveContext.respawnFlag - 1].roomIndex)
: play->spawnList[play->spawn].room; : play->spawnList[play->spawn].room;
func_8009728C(play, roomCtx, frontRoom);
return maxRoomSize; // Load into a room for the first time.
// Since curRoom was initialized to `room = -1` and `segment = NULL` in Play_InitScene, the previous room
// will also be initialized to the nulled state when this function completes.
Room_RequestNewRoom(play, roomCtx, frontRoom);
return roomBufferSize;
} }
s32 func_8009728C(PlayState* play, RoomContext* roomCtx, s32 roomNum) { /**
* Tries to create an asynchronous request to transfer room data into memory.
* If successful, the requested room will be loaded into memory and becomes the new current room; the room that was
* current before becomes the previous room.
*
* Room_RequestNewRoom will be blocked from loading new rooms until Room_ProcessRoomRequest completes room
* initialization.
*
* Calling Room_RequestNewRoom outside of Room_SetupFirstRoom will allow for two rooms being initialized simultaneously.
* This allows an actor like ACTOR_EN_HOLL to seamlessly swap the two rooms as the player moves between them. Calling
* Room_FinishRoomChange afterward will finalize the room swap.
*
* @param roomNum is the id of the room to load. roomNum must NOT be the same id as curRoom.num, since this will create
* duplicate actor instances that cannot be cleaned up by calling Room_FinishRoomChange
* @returns bool false if the request could not be created.
*/
s32 Room_RequestNewRoom(PlayState* play, RoomContext* roomCtx, s32 roomNum) {
if (roomCtx->status == 0) { if (roomCtx->status == 0) {
u32 size; u32 size;
@ -614,11 +641,11 @@ s32 func_8009728C(PlayState* play, RoomContext* roomCtx, s32 roomNum) {
roomCtx->curRoom.segment = NULL; roomCtx->curRoom.segment = NULL;
roomCtx->status = 1; roomCtx->status = 1;
ASSERT(roomNum < play->numRooms, "read_room_ID < game_play->room_rom_address.num", "../z_room.c", 1009); ASSERT(roomNum < play->roomList.count, "read_room_ID < game_play->room_rom_address.num", "../z_room.c", 1009);
size = play->roomList[roomNum].vromEnd - play->roomList[roomNum].vromStart; size = play->roomList.romFiles[roomNum].vromEnd - play->roomList.romFiles[roomNum].vromStart;
roomCtx->unk_34 = roomCtx->roomRequestAddr = (void*)ALIGN16((uintptr_t)roomCtx->bufPtrs[roomCtx->activeBufPage] -
(void*)ALIGN16((uintptr_t)roomCtx->bufPtrs[roomCtx->unk_30] - ((size + 8) * roomCtx->unk_30 + 7)); ((size + 8) * roomCtx->activeBufPage + 7));
osCreateMesgQueue(&roomCtx->loadQueue, &roomCtx->loadMsg, 1); osCreateMesgQueue(&roomCtx->loadQueue, &roomCtx->loadMsg, 1);
@ -626,37 +653,44 @@ s32 func_8009728C(PlayState* play, RoomContext* roomCtx, s32 roomNum) {
if ((B_80121220 != NULL) && (B_80121220->unk_08 != NULL)) { if ((B_80121220 != NULL) && (B_80121220->unk_08 != NULL)) {
B_80121220->unk_08(play, roomCtx, roomNum); B_80121220->unk_08(play, roomCtx, roomNum);
} else { } else {
DMA_REQUEST_ASYNC(&roomCtx->dmaRequest, roomCtx->unk_34, play->roomList[roomNum].vromStart, size, 0, DMA_REQUEST_ASYNC(&roomCtx->dmaRequest, roomCtx->roomRequestAddr,
&roomCtx->loadQueue, NULL, "../z_room.c", 1036); play->roomList.romFiles[roomNum].vromStart, size, 0, &roomCtx->loadQueue, NULL,
"../z_room.c", 1036);
} }
#else #else
DMA_REQUEST_ASYNC(&roomCtx->dmaRequest, roomCtx->unk_34, play->roomList[roomNum].vromStart, size, 0, DMA_REQUEST_ASYNC(&roomCtx->dmaRequest, roomCtx->roomRequestAddr, play->roomList.romFiles[roomNum].vromStart,
&roomCtx->loadQueue, NULL, "../z_room.c", 1036); size, 0, &roomCtx->loadQueue, NULL, "../z_room.c", 1036);
#endif #endif
roomCtx->unk_30 ^= 1; roomCtx->activeBufPage ^= 1;
return true; return true;
} }
return false; return false;
} }
s32 func_800973FC(PlayState* play, RoomContext* roomCtx) { /**
* Completes room initialization for the room requested by a call to Room_RequestNewRoom.
* This function does not block the thread if the room data is still being transferred.
*
* @returns bool false if a dma transfer is in progress.
*/
s32 Room_ProcessRoomRequest(PlayState* play, RoomContext* roomCtx) {
if (roomCtx->status == 1) { if (roomCtx->status == 1) {
if (osRecvMesg(&roomCtx->loadQueue, NULL, OS_MESG_NOBLOCK) == 0) { if (osRecvMesg(&roomCtx->loadQueue, NULL, OS_MESG_NOBLOCK) == 0) {
roomCtx->status = 0; roomCtx->status = 0;
roomCtx->curRoom.segment = roomCtx->unk_34; roomCtx->curRoom.segment = roomCtx->roomRequestAddr;
gSegments[3] = VIRTUAL_TO_PHYSICAL(roomCtx->unk_34); gSegments[3] = VIRTUAL_TO_PHYSICAL(roomCtx->curRoom.segment);
Scene_ExecuteCommands(play, roomCtx->curRoom.segment); Scene_ExecuteCommands(play, roomCtx->curRoom.segment);
Player_SetBootData(play, GET_PLAYER(play)); Player_SetBootData(play, GET_PLAYER(play));
Actor_SpawnTransitionActors(play, &play->actorCtx); Actor_SpawnTransitionActors(play, &play->actorCtx);
} else { } else {
return 0; return false;
} }
} }
return 1; return true;
} }
void Room_Draw(PlayState* play, Room* room, u32 flags) { void Room_Draw(PlayState* play, Room* room, u32 flags) {
@ -668,9 +702,17 @@ void Room_Draw(PlayState* play, Room* room, u32 flags) {
} }
} }
void func_80097534(PlayState* play, RoomContext* roomCtx) { /**
* Finalizes a swap between two rooms.
*
* When a new room is created with Room_RequestNewRoom, the previous room and its actors remain in memory. This allows
* an actor like ACTOR_EN_HOLL to seamlessly swap the two rooms as the player moves between them.
*/
void Room_FinishRoomChange(PlayState* play, RoomContext* roomCtx) {
// Delete the previous room
roomCtx->prevRoom.num = -1; roomCtx->prevRoom.num = -1;
roomCtx->prevRoom.segment = NULL; roomCtx->prevRoom.segment = NULL;
func_80031B14(play, &play->actorCtx); func_80031B14(play, &play->actorCtx);
Actor_SpawnTransitionActors(play, &play->actorCtx); Actor_SpawnTransitionActors(play, &play->actorCtx);
Map_InitRoomData(play, roomCtx->curRoom.num); Map_InitRoomData(play, roomCtx->curRoom.num);

View file

@ -230,8 +230,8 @@ BAD_RETURN(s32) Scene_CommandCollisionHeader(PlayState* play, SceneCmd* cmd) {
} }
BAD_RETURN(s32) Scene_CommandRoomList(PlayState* play, SceneCmd* cmd) { BAD_RETURN(s32) Scene_CommandRoomList(PlayState* play, SceneCmd* cmd) {
play->numRooms = cmd->roomList.length; play->roomList.count = cmd->roomList.length;
play->roomList = SEGMENTED_TO_VIRTUAL(cmd->roomList.data); play->roomList.romFiles = SEGMENTED_TO_VIRTUAL(cmd->roomList.data);
} }
BAD_RETURN(s32) Scene_CommandSpawnList(PlayState* play, SceneCmd* cmd) { BAD_RETURN(s32) Scene_CommandSpawnList(PlayState* play, SceneCmd* cmd) {
@ -327,12 +327,12 @@ BAD_RETURN(s32) Scene_CommandPathList(PlayState* play, SceneCmd* cmd) {
} }
BAD_RETURN(s32) Scene_CommandTransitionActorEntryList(PlayState* play, SceneCmd* cmd) { BAD_RETURN(s32) Scene_CommandTransitionActorEntryList(PlayState* play, SceneCmd* cmd) {
play->transiActorCtx.numActors = cmd->transiActorList.length; play->transitionActors.count = cmd->transiActorList.length;
play->transiActorCtx.list = SEGMENTED_TO_VIRTUAL(cmd->transiActorList.data); play->transitionActors.list = SEGMENTED_TO_VIRTUAL(cmd->transiActorList.data);
} }
void TransitionActor_InitContext(GameState* state, TransitionActorContext* transiActorCtx) { void Scene_ResetTransitionActorList(GameState* state, TransitionActorList* transitionActors) {
transiActorCtx->numActors = 0; transitionActors->count = 0;
} }
BAD_RETURN(s32) Scene_CommandLightSettingsList(PlayState* play, SceneCmd* cmd) { BAD_RETURN(s32) Scene_CommandLightSettingsList(PlayState* play, SceneCmd* cmd) {

View file

@ -289,12 +289,12 @@ void Scene_DrawConfigDodongosCavern(PlayState* play) {
gSPSegment(POLY_OPA_DISP++, 0x0B, displayListHead); gSPSegment(POLY_OPA_DISP++, 0x0B, displayListHead);
gDPPipeSync(displayListHead++); gDPPipeSync(displayListHead++);
gDPSetEnvColor(displayListHead++, 255, 255, 255, play->roomCtx.unk_74[BGDODOAGO_EYE_LEFT]); gDPSetEnvColor(displayListHead++, 255, 255, 255, play->roomCtx.drawParams[BGDODOAGO_EYE_LEFT]);
gSPEndDisplayList(displayListHead++); gSPEndDisplayList(displayListHead++);
gSPSegment(POLY_OPA_DISP++, 0x0C, displayListHead); gSPSegment(POLY_OPA_DISP++, 0x0C, displayListHead);
gDPPipeSync(displayListHead++); gDPPipeSync(displayListHead++);
gDPSetEnvColor(displayListHead++, 255, 255, 255, play->roomCtx.unk_74[BGDODOAGO_EYE_RIGHT]); gDPSetEnvColor(displayListHead++, 255, 255, 255, play->roomCtx.drawParams[BGDODOAGO_EYE_RIGHT]);
gSPEndDisplayList(displayListHead++); gSPEndDisplayList(displayListHead++);
CLOSE_DISPS(play->state.gfxCtx, "../z_scene_table.c", 4956); CLOSE_DISPS(play->state.gfxCtx, "../z_scene_table.c", 4956);
@ -306,7 +306,7 @@ void Scene_DrawConfigTempleOfTime(PlayState* play) {
OPEN_DISPS(play->state.gfxCtx, "../z_scene_table.c", 5069); OPEN_DISPS(play->state.gfxCtx, "../z_scene_table.c", 5069);
temp = play->roomCtx.unk_74[0] / 255.0f; temp = play->roomCtx.drawParams[0] / 255.0f;
gSPSegment(POLY_XLU_DISP++, 0x08, displayListHead); gSPSegment(POLY_XLU_DISP++, 0x08, displayListHead);
gSPSegment(POLY_OPA_DISP++, 0x08, displayListHead); gSPSegment(POLY_OPA_DISP++, 0x08, displayListHead);
@ -323,7 +323,7 @@ void Scene_DrawConfigTempleOfTime(PlayState* play) {
gSPSegment(POLY_OPA_DISP++, 0x0A, displayListHead); gSPSegment(POLY_OPA_DISP++, 0x0A, displayListHead);
gSPSegment(POLY_XLU_DISP++, 0x0A, displayListHead); gSPSegment(POLY_XLU_DISP++, 0x0A, displayListHead);
gDPPipeSync(displayListHead++); gDPPipeSync(displayListHead++);
gDPSetEnvColor(displayListHead++, 0, 0, 0, play->roomCtx.unk_74[0]); gDPSetEnvColor(displayListHead++, 0, 0, 0, play->roomCtx.drawParams[0]);
gSPEndDisplayList(displayListHead++); gSPEndDisplayList(displayListHead++);
gSPSegment(POLY_OPA_DISP++, 0x0B, displayListHead); gSPSegment(POLY_OPA_DISP++, 0x0B, displayListHead);
@ -331,7 +331,7 @@ void Scene_DrawConfigTempleOfTime(PlayState* play) {
gDPSetPrimColor(displayListHead++, 0, 0, 89 + (u8)(166.0f * temp), 89 + (u8)(166.0f * temp), gDPSetPrimColor(displayListHead++, 0, 0, 89 + (u8)(166.0f * temp), 89 + (u8)(166.0f * temp),
89 + (u8)(166.0f * temp), 255); 89 + (u8)(166.0f * temp), 255);
gDPPipeSync(displayListHead++); gDPPipeSync(displayListHead++);
gDPSetEnvColor(displayListHead++, 0, 0, 0, play->roomCtx.unk_74[0]); gDPSetEnvColor(displayListHead++, 0, 0, 0, play->roomCtx.drawParams[0]);
gSPEndDisplayList(displayListHead++); gSPEndDisplayList(displayListHead++);
gSPSegment(POLY_OPA_DISP++, 0x0C, displayListHead); gSPSegment(POLY_OPA_DISP++, 0x0C, displayListHead);
@ -339,13 +339,13 @@ void Scene_DrawConfigTempleOfTime(PlayState* play) {
gDPSetPrimColor(displayListHead++, 0, 0, 255 + (u8)(179.0f * temp), 255 + (u8)(179.0f * temp), gDPSetPrimColor(displayListHead++, 0, 0, 255 + (u8)(179.0f * temp), 255 + (u8)(179.0f * temp),
255 + (u8)(179.0f * temp), 255); 255 + (u8)(179.0f * temp), 255);
gDPPipeSync(displayListHead++); gDPPipeSync(displayListHead++);
gDPSetEnvColor(displayListHead++, 0, 0, 0, play->roomCtx.unk_74[0]); gDPSetEnvColor(displayListHead++, 0, 0, 0, play->roomCtx.drawParams[0]);
gSPEndDisplayList(displayListHead++); gSPEndDisplayList(displayListHead++);
gSPSegment(POLY_OPA_DISP++, 0x0D, displayListHead); gSPSegment(POLY_OPA_DISP++, 0x0D, displayListHead);
gSPSegment(POLY_XLU_DISP++, 0x0D, displayListHead); gSPSegment(POLY_XLU_DISP++, 0x0D, displayListHead);
gDPPipeSync(displayListHead++); gDPPipeSync(displayListHead++);
gDPSetEnvColor(displayListHead++, 0, 0, 0, play->roomCtx.unk_74[1]); gDPSetEnvColor(displayListHead++, 0, 0, 0, play->roomCtx.drawParams[1]);
gSPEndDisplayList(displayListHead); gSPEndDisplayList(displayListHead);
CLOSE_DISPS(play->state.gfxCtx, "../z_scene_table.c", 5145); CLOSE_DISPS(play->state.gfxCtx, "../z_scene_table.c", 5145);
@ -539,8 +539,8 @@ void Scene_DrawConfigWaterTemple(PlayState* play) {
OPEN_DISPS(play->state.gfxCtx, "../z_scene_table.c", 5535); OPEN_DISPS(play->state.gfxCtx, "../z_scene_table.c", 5535);
spB0 = (play->roomCtx.unk_74[1] >> 8) & 0xFF; spB0 = (play->roomCtx.drawParams[1] >> 8) & 0xFF;
spAC = play->roomCtx.unk_74[1] & 0xFF; spAC = play->roomCtx.drawParams[1] & 0xFF;
gameplayFrames = play->gameplayFrames; gameplayFrames = play->gameplayFrames;
#if !OOT_MQ #if !OOT_MQ
@ -613,7 +613,7 @@ void Scene_DrawConfigWaterTempleBoss(PlayState* play) {
Gfx_TwoTexScroll(play->state.gfxCtx, G_TX_RENDERTILE, gameplayFrames * 1, 0, 32, 32, 1, 0, 0, 32, 32)); Gfx_TwoTexScroll(play->state.gfxCtx, G_TX_RENDERTILE, gameplayFrames * 1, 0, 32, 32, 1, 0, 0, 32, 32));
gDPPipeSync(POLY_OPA_DISP++); gDPPipeSync(POLY_OPA_DISP++);
gDPSetEnvColor(POLY_OPA_DISP++, 128, 128, 128, play->roomCtx.unk_74[0]); gDPSetEnvColor(POLY_OPA_DISP++, 128, 128, 128, play->roomCtx.drawParams[0]);
gDPPipeSync(POLY_XLU_DISP++); gDPPipeSync(POLY_XLU_DISP++);
gDPSetEnvColor(POLY_XLU_DISP++, 128, 128, 128, 145); gDPSetEnvColor(POLY_XLU_DISP++, 128, 128, 128, 145);
@ -913,7 +913,7 @@ void Scene_DrawConfigFishingPond(PlayState* play) {
gSPSegment(POLY_XLU_DISP++, 0x08, gSPSegment(POLY_XLU_DISP++, 0x08,
Gfx_TwoTexScrollPrimColor(play->state.gfxCtx, 0, 127 - gameplayFrames % 128, (gameplayFrames * 1) % 128, Gfx_TwoTexScrollPrimColor(play->state.gfxCtx, 0, 127 - gameplayFrames % 128, (gameplayFrames * 1) % 128,
32, 32, 1, gameplayFrames % 128, (gameplayFrames * 1) % 128, 32, 32, 255, 255, 32, 32, 1, gameplayFrames % 128, (gameplayFrames * 1) % 128, 32, 32, 255, 255,
255, play->roomCtx.unk_74[0] + 127)); 255, play->roomCtx.drawParams[0] + 127));
gDPPipeSync(POLY_OPA_DISP++); gDPPipeSync(POLY_OPA_DISP++);
gDPSetEnvColor(POLY_OPA_DISP++, 128, 128, 128, 128); gDPSetEnvColor(POLY_OPA_DISP++, 128, 128, 128, 128);
@ -1093,16 +1093,16 @@ void Scene_DrawConfigHyruleField(PlayState* play) {
gSPEndDisplayList(displayListHead++); gSPEndDisplayList(displayListHead++);
} else { } else {
if (gSaveContext.save.dayTime > CLOCK_TIME(18, 30)) { if (gSaveContext.save.dayTime > CLOCK_TIME(18, 30)) {
if (play->roomCtx.unk_74[0] != 255) { if (play->roomCtx.drawParams[0] != 255) {
Math_StepToS(&play->roomCtx.unk_74[0], 255, 5); Math_StepToS(&play->roomCtx.drawParams[0], 255, 5);
} }
} else if (gSaveContext.save.dayTime >= CLOCK_TIME(6, 0)) { } else if (gSaveContext.save.dayTime >= CLOCK_TIME(6, 0)) {
if (play->roomCtx.unk_74[0] != 0) { if (play->roomCtx.drawParams[0] != 0) {
Math_StepToS(&play->roomCtx.unk_74[0], 0, 10); Math_StepToS(&play->roomCtx.drawParams[0], 0, 10);
} }
} }
gDPSetPrimColor(displayListHead++, 0, 0, 255, 255, 255, play->roomCtx.unk_74[0]); gDPSetPrimColor(displayListHead++, 0, 0, 255, 255, 255, play->roomCtx.drawParams[0]);
gSPDisplayList(displayListHead++, spot00_room_0DL_012B20); gSPDisplayList(displayListHead++, spot00_room_0DL_012B20);
gSPEndDisplayList(displayListHead++); gSPEndDisplayList(displayListHead++);
} }
@ -1187,9 +1187,9 @@ void Scene_DrawConfigKokiriForest(PlayState* play) {
gDPSetEnvColor(POLY_XLU_DISP++, 128, 128, 128, 128); gDPSetEnvColor(POLY_XLU_DISP++, 128, 128, 128, 128);
if (gSaveContext.sceneLayer == 4) { if (gSaveContext.sceneLayer == 4) {
spA3 = 255 - (u8)play->roomCtx.unk_74[0]; spA3 = 255 - (u8)play->roomCtx.drawParams[0];
} else if (gSaveContext.sceneLayer == 6) { } else if (gSaveContext.sceneLayer == 6) {
spA0 = play->roomCtx.unk_74[0] + 500; spA0 = play->roomCtx.drawParams[0] + 500;
} else if ((!IS_CUTSCENE_LAYER || LINK_IS_ADULT) && GET_EVENTCHKINF(EVENTCHKINF_07)) { } else if ((!IS_CUTSCENE_LAYER || LINK_IS_ADULT) && GET_EVENTCHKINF(EVENTCHKINF_07)) {
spA0 = 2150; spA0 = 2150;
} }
@ -1206,8 +1206,8 @@ void Scene_DrawConfigKokiriForest(PlayState* play) {
gSPEndDisplayList(displayListHead++); gSPEndDisplayList(displayListHead++);
gSPSegment(POLY_OPA_DISP++, 0x0C, gSPSegment(POLY_OPA_DISP++, 0x0C,
Gfx_TwoTexScroll(play->state.gfxCtx, G_TX_RENDERTILE, 0, (s16)(-play->roomCtx.unk_74[0] * 0.02f), 32, 16, Gfx_TwoTexScroll(play->state.gfxCtx, G_TX_RENDERTILE, 0, (s16)(-play->roomCtx.drawParams[0] * 0.02f), 32,
1, 0, (s16)(-play->roomCtx.unk_74[0] * 0.02f), 32, 16)); 16, 1, 0, (s16)(-play->roomCtx.drawParams[0] * 0.02f), 32, 16));
CLOSE_DISPS(play->state.gfxCtx, "../z_scene_table.c", 7044); CLOSE_DISPS(play->state.gfxCtx, "../z_scene_table.c", 7044);
} }
@ -1218,16 +1218,16 @@ void Scene_DrawConfigLakeHylia(PlayState* play) {
OPEN_DISPS(play->state.gfxCtx, "../z_scene_table.c", 7058); OPEN_DISPS(play->state.gfxCtx, "../z_scene_table.c", 7058);
if (IS_CUTSCENE_LAYER || (LINK_IS_ADULT && !GET_EVENTCHKINF(EVENTCHKINF_69))) { if (IS_CUTSCENE_LAYER || (LINK_IS_ADULT && !GET_EVENTCHKINF(EVENTCHKINF_69))) {
play->roomCtx.unk_74[0] = 87; play->roomCtx.drawParams[0] = 87;
} }
gameplayFrames = play->gameplayFrames; gameplayFrames = play->gameplayFrames;
gSPSegment(POLY_OPA_DISP++, 0x08, gSPSegment(POLY_OPA_DISP++, 0x08,
Gfx_TwoTexScrollEnvColor(play->state.gfxCtx, G_TX_RENDERTILE, gameplayFrames, gameplayFrames, 32, 32, 1, Gfx_TwoTexScrollEnvColor(play->state.gfxCtx, G_TX_RENDERTILE, gameplayFrames, gameplayFrames, 32, 32, 1,
0, 0, 32, 32, 0, 0, 0, play->roomCtx.unk_74[0] + 168)); 0, 0, 32, 32, 0, 0, 0, play->roomCtx.drawParams[0] + 168));
gSPSegment(POLY_OPA_DISP++, 0x09, gSPSegment(POLY_OPA_DISP++, 0x09,
Gfx_TwoTexScrollEnvColor(play->state.gfxCtx, G_TX_RENDERTILE, -gameplayFrames, -gameplayFrames, 32, 32, Gfx_TwoTexScrollEnvColor(play->state.gfxCtx, G_TX_RENDERTILE, -gameplayFrames, -gameplayFrames, 32, 32,
1, 0, 0, 16, 64, 0, 0, 0, play->roomCtx.unk_74[0] + 168)); 1, 0, 0, 16, 64, 0, 0, 0, play->roomCtx.drawParams[0] + 168));
gDPPipeSync(POLY_OPA_DISP++); gDPPipeSync(POLY_OPA_DISP++);
gDPSetEnvColor(POLY_OPA_DISP++, 255, 255, 255, 128); gDPSetEnvColor(POLY_OPA_DISP++, 255, 255, 255, 128);
@ -1341,12 +1341,12 @@ void Scene_DrawConfigLostWoods(PlayState* play) {
gDPPipeSync(POLY_OPA_DISP++); gDPPipeSync(POLY_OPA_DISP++);
gDPSetEnvColor(POLY_OPA_DISP++, 128, 128, 128, 128); gDPSetEnvColor(POLY_OPA_DISP++, 128, 128, 128, 128);
if ((play->roomCtx.unk_74[0] == 0) && (INV_CONTENT(ITEM_COJIRO) == ITEM_COJIRO)) { if ((play->roomCtx.drawParams[0] == 0) && (INV_CONTENT(ITEM_COJIRO) == ITEM_COJIRO)) {
if (play->roomCtx.unk_74[1] == 50) { if (play->roomCtx.drawParams[1] == 50) {
Player_PlaySfx(GET_PLAYER(play), NA_SE_EV_CHICKEN_CRY_M); Player_PlaySfx(GET_PLAYER(play), NA_SE_EV_CHICKEN_CRY_M);
play->roomCtx.unk_74[0] = 1; play->roomCtx.drawParams[0] = 1;
} }
play->roomCtx.unk_74[1]++; play->roomCtx.drawParams[1]++;
} }
CLOSE_DISPS(play->state.gfxCtx, "../z_scene_table.c", 7309); CLOSE_DISPS(play->state.gfxCtx, "../z_scene_table.c", 7309);
@ -1441,16 +1441,16 @@ void Scene_DrawConfigDeathMountainTrail(PlayState* play) {
gSPEndDisplayList(displayListHead++); gSPEndDisplayList(displayListHead++);
} else { } else {
if (gSaveContext.save.dayTime > CLOCK_TIME(18, 0)) { if (gSaveContext.save.dayTime > CLOCK_TIME(18, 0)) {
if (play->roomCtx.unk_74[0] != 255) { if (play->roomCtx.drawParams[0] != 255) {
Math_StepToS(&play->roomCtx.unk_74[0], 255, 5); Math_StepToS(&play->roomCtx.drawParams[0], 255, 5);
} }
} else if (gSaveContext.save.dayTime >= CLOCK_TIME(6, 0)) { } else if (gSaveContext.save.dayTime >= CLOCK_TIME(6, 0)) {
if (play->roomCtx.unk_74[0] != 0) { if (play->roomCtx.drawParams[0] != 0) {
Math_StepToS(&play->roomCtx.unk_74[0], 0, 10); Math_StepToS(&play->roomCtx.drawParams[0], 0, 10);
} }
} }
gDPSetPrimColor(displayListHead++, 0, 0, 255, 255, 255, play->roomCtx.unk_74[0]); gDPSetPrimColor(displayListHead++, 0, 0, 255, 255, 255, play->roomCtx.drawParams[0]);
gSPDisplayList(displayListHead++, spot16_room_0DL_00AA48); gSPDisplayList(displayListHead++, spot16_room_0DL_00AA48);
gSPEndDisplayList(displayListHead++); gSPEndDisplayList(displayListHead++);
} }
@ -1604,27 +1604,27 @@ void Scene_DrawConfigJabuJabu(PlayState* play) {
1.f + (1 * temp * Math_CosS(D_8012A39C))); 1.f + (1 * temp * Math_CosS(D_8012A39C)));
View_SetDistortionSpeed(&play->view, 0.95f); View_SetDistortionSpeed(&play->view, 0.95f);
switch (play->roomCtx.unk_74[0]) { switch (play->roomCtx.drawParams[0]) {
case 0: case 0:
break; break;
case 1: case 1:
if (play->roomCtx.unk_74[1] < 1200) { if (play->roomCtx.drawParams[1] < 1200) {
play->roomCtx.unk_74[1] += 200; play->roomCtx.drawParams[1] += 200;
} else { } else {
play->roomCtx.unk_74[0]++; play->roomCtx.drawParams[0]++;
} }
break; break;
case 2: case 2:
if (play->roomCtx.unk_74[1] > 0) { if (play->roomCtx.drawParams[1] > 0) {
play->roomCtx.unk_74[1] -= 30; play->roomCtx.drawParams[1] -= 30;
} else { } else {
play->roomCtx.unk_74[1] = 0; play->roomCtx.drawParams[1] = 0;
play->roomCtx.unk_74[0] = 0; play->roomCtx.drawParams[0] = 0;
} }
break; break;
} }
D_8012A398 += 0.15f + (play->roomCtx.unk_74[1] * 0.001f); D_8012A398 += 0.15f + (play->roomCtx.drawParams[1] * 0.001f);
} }
if (play->roomCtx.curRoom.num == 2) { if (play->roomCtx.curRoom.num == 2) {

View file

@ -121,7 +121,7 @@ void BgDodoago_Init(Actor* thisx, PlayState* play) {
if (Flags_GetSwitch(play, PARAMS_GET_U(this->dyna.actor.params, 0, 6))) { if (Flags_GetSwitch(play, PARAMS_GET_U(this->dyna.actor.params, 0, 6))) {
BgDodoago_SetupAction(this, BgDodoago_DoNothing); BgDodoago_SetupAction(this, BgDodoago_DoNothing);
this->dyna.actor.shape.rot.x = 0x1333; this->dyna.actor.shape.rot.x = 0x1333;
play->roomCtx.unk_74[BGDODOAGO_EYE_LEFT] = play->roomCtx.unk_74[BGDODOAGO_EYE_RIGHT] = 255; play->roomCtx.drawParams[BGDODOAGO_EYE_LEFT] = play->roomCtx.drawParams[BGDODOAGO_EYE_RIGHT] = 255;
return; return;
} }
@ -154,15 +154,15 @@ void BgDodoago_WaitExplosives(BgDodoago* this, PlayState* play) {
? BGDODOAGO_EYE_RIGHT ? BGDODOAGO_EYE_RIGHT
: BGDODOAGO_EYE_LEFT; : BGDODOAGO_EYE_LEFT;
if (((play->roomCtx.unk_74[BGDODOAGO_EYE_LEFT] == 255) && (this->state == BGDODOAGO_EYE_RIGHT)) || if (((play->roomCtx.drawParams[BGDODOAGO_EYE_LEFT] == 255) && (this->state == BGDODOAGO_EYE_RIGHT)) ||
((play->roomCtx.unk_74[BGDODOAGO_EYE_RIGHT] == 255) && (this->state == BGDODOAGO_EYE_LEFT))) { ((play->roomCtx.drawParams[BGDODOAGO_EYE_RIGHT] == 255) && (this->state == BGDODOAGO_EYE_LEFT))) {
Flags_SetSwitch(play, PARAMS_GET_U(this->dyna.actor.params, 0, 6)); Flags_SetSwitch(play, PARAMS_GET_U(this->dyna.actor.params, 0, 6));
this->state = 0; this->state = 0;
Audio_PlaySfxGeneral(NA_SE_SY_CORRECT_CHIME, &gSfxDefaultPos, 4, &gSfxDefaultFreqAndVolScale, Audio_PlaySfxGeneral(NA_SE_SY_CORRECT_CHIME, &gSfxDefaultPos, 4, &gSfxDefaultFreqAndVolScale,
&gSfxDefaultFreqAndVolScale, &gSfxDefaultReverb); &gSfxDefaultFreqAndVolScale, &gSfxDefaultReverb);
BgDodoago_SetupAction(this, BgDodoago_OpenJaw); BgDodoago_SetupAction(this, BgDodoago_OpenJaw);
OnePointCutscene_Init(play, 3380, 160, &this->dyna.actor, CAM_ID_MAIN); OnePointCutscene_Init(play, 3380, 160, &this->dyna.actor, CAM_ID_MAIN);
} else if (play->roomCtx.unk_74[this->state] == 0) { } else if (play->roomCtx.drawParams[this->state] == 0) {
OnePointCutscene_Init(play, 3065, 40, &this->dyna.actor, CAM_ID_MAIN); OnePointCutscene_Init(play, 3065, 40, &this->dyna.actor, CAM_ID_MAIN);
BgDodoago_SetupAction(this, BgDodoago_LightOneEye); BgDodoago_SetupAction(this, BgDodoago_LightOneEye);
Audio_PlaySfxGeneral(NA_SE_SY_CORRECT_CHIME, &gSfxDefaultPos, 4, &gSfxDefaultFreqAndVolScale, Audio_PlaySfxGeneral(NA_SE_SY_CORRECT_CHIME, &gSfxDefaultPos, 4, &gSfxDefaultFreqAndVolScale,
@ -212,14 +212,14 @@ void BgDodoago_OpenJaw(BgDodoago* this, PlayState* play) {
s32 i; s32 i;
// make both eyes red (one already is) // make both eyes red (one already is)
if (play->roomCtx.unk_74[BGDODOAGO_EYE_LEFT] < 255) { if (play->roomCtx.drawParams[BGDODOAGO_EYE_LEFT] < 255) {
play->roomCtx.unk_74[BGDODOAGO_EYE_LEFT] += 5; play->roomCtx.drawParams[BGDODOAGO_EYE_LEFT] += 5;
} }
if (play->roomCtx.unk_74[BGDODOAGO_EYE_RIGHT] < 255) { if (play->roomCtx.drawParams[BGDODOAGO_EYE_RIGHT] < 255) {
play->roomCtx.unk_74[BGDODOAGO_EYE_RIGHT] += 5; play->roomCtx.drawParams[BGDODOAGO_EYE_RIGHT] += 5;
} }
if (play->roomCtx.unk_74[BGDODOAGO_EYE_LEFT] != 255 || play->roomCtx.unk_74[BGDODOAGO_EYE_RIGHT] != 255) { if (play->roomCtx.drawParams[BGDODOAGO_EYE_LEFT] != 255 || play->roomCtx.drawParams[BGDODOAGO_EYE_RIGHT] != 255) {
sTimer--; sTimer--;
return; return;
} }
@ -260,9 +260,9 @@ void BgDodoago_DoNothing(BgDodoago* this, PlayState* play) {
} }
void BgDodoago_LightOneEye(BgDodoago* this, PlayState* play) { void BgDodoago_LightOneEye(BgDodoago* this, PlayState* play) {
play->roomCtx.unk_74[this->state] += 5; play->roomCtx.drawParams[this->state] += 5;
if (play->roomCtx.unk_74[this->state] == 255) { if (play->roomCtx.drawParams[this->state] == 255) {
BgDodoago_SetupAction(this, BgDodoago_WaitExplosives); BgDodoago_SetupAction(this, BgDodoago_WaitExplosives);
} }
} }

View file

@ -238,7 +238,7 @@ void BgMizuWater_ChangeWaterLevel(BgMizuWater* this, PlayState* play) {
} }
if (Math_StepToF(&this->actor.world.pos.y, this->targetY, 5.0f)) { if (Math_StepToF(&this->actor.world.pos.y, this->targetY, 5.0f)) {
play->roomCtx.unk_74[0] = 0; play->roomCtx.drawParams[0] = 0;
this->actionFunc = BgMizuWater_WaitForAction; this->actionFunc = BgMizuWater_WaitForAction;
Message_CloseTextbox(play); Message_CloseTextbox(play);
} }
@ -253,7 +253,7 @@ void BgMizuWater_ChangeWaterLevel(BgMizuWater* this, PlayState* play) {
this->targetY = this->baseY; this->targetY = this->baseY;
} }
if (Math_StepToF(&this->actor.world.pos.y, this->targetY, 1.0f)) { if (Math_StepToF(&this->actor.world.pos.y, this->targetY, 1.0f)) {
play->roomCtx.unk_74[0] = 0; play->roomCtx.drawParams[0] = 0;
this->actionFunc = BgMizuWater_WaitForAction; this->actionFunc = BgMizuWater_WaitForAction;
} }
waterBoxes[6].ySurface = this->actor.world.pos.y; waterBoxes[6].ySurface = this->actor.world.pos.y;
@ -265,7 +265,7 @@ void BgMizuWater_ChangeWaterLevel(BgMizuWater* this, PlayState* play) {
this->targetY = this->baseY; this->targetY = this->baseY;
} }
if (Math_StepToF(&this->actor.world.pos.y, this->targetY, 1.0f)) { if (Math_StepToF(&this->actor.world.pos.y, this->targetY, 1.0f)) {
play->roomCtx.unk_74[0] = 0; play->roomCtx.drawParams[0] = 0;
this->actionFunc = BgMizuWater_WaitForAction; this->actionFunc = BgMizuWater_WaitForAction;
} }
waterBoxes[8].ySurface = this->actor.world.pos.y; waterBoxes[8].ySurface = this->actor.world.pos.y;
@ -277,7 +277,7 @@ void BgMizuWater_ChangeWaterLevel(BgMizuWater* this, PlayState* play) {
this->targetY = this->baseY; this->targetY = this->baseY;
} }
if (Math_StepToF(&this->actor.world.pos.y, this->targetY, 1.0f)) { if (Math_StepToF(&this->actor.world.pos.y, this->targetY, 1.0f)) {
play->roomCtx.unk_74[0] = 0; play->roomCtx.drawParams[0] = 0;
this->actionFunc = BgMizuWater_WaitForAction; this->actionFunc = BgMizuWater_WaitForAction;
} }
waterBoxes[16].ySurface = this->actor.world.pos.y; waterBoxes[16].ySurface = this->actor.world.pos.y;
@ -323,7 +323,7 @@ void BgMizuWater_Update(Actor* thisx, PlayState* play) {
unk1 = 255 - (s32)((posY - WATER_TEMPLE_WATER_F2_Y) / (WATER_TEMPLE_WATER_F3_Y - WATER_TEMPLE_WATER_F2_Y) * unk1 = 255 - (s32)((posY - WATER_TEMPLE_WATER_F2_Y) / (WATER_TEMPLE_WATER_F3_Y - WATER_TEMPLE_WATER_F2_Y) *
(255 - 160)); (255 - 160));
} }
play->roomCtx.unk_74[1] = ((u8)unk0 << 8) | (unk1 & 0xFF); play->roomCtx.drawParams[1] = ((u8)unk0 << 8) | (unk1 & 0xFF);
} }
this->actionFunc(this, play); this->actionFunc(this, play);

View file

@ -105,7 +105,7 @@ void func_808BA018(Actor* thisx, PlayState* play) {
} }
void func_808BA204(BgTokiHikari* this, PlayState* play) { void func_808BA204(BgTokiHikari* this, PlayState* play) {
if (play->roomCtx.unk_74[1] != 0) { if (play->roomCtx.drawParams[1] != 0) {
this->actionFunc = func_808BA22C; this->actionFunc = func_808BA22C;
} }
} }

View file

@ -77,7 +77,7 @@ void BgTokiSwd_Init(Actor* thisx, PlayState* play) {
} }
if (gSaveContext.sceneLayer == 5) { if (gSaveContext.sceneLayer == 5) {
play->roomCtx.unk_74[0] = 0xFF; play->roomCtx.drawParams[0] = 0xFF;
} }
Collider_InitCylinder(play, &this->collider); Collider_InitCylinder(play, &this->collider);
@ -119,10 +119,10 @@ void func_808BAF40(BgTokiSwd* this, PlayState* play) {
} }
} }
if (gSaveContext.sceneLayer == 5) { if (gSaveContext.sceneLayer == 5) {
if (play->roomCtx.unk_74[0] > 0) { if (play->roomCtx.drawParams[0] > 0) {
play->roomCtx.unk_74[0]--; play->roomCtx.drawParams[0]--;
} else { } else {
play->roomCtx.unk_74[0] = 0; play->roomCtx.drawParams[0] = 0;
} }
} }
} }
@ -146,8 +146,8 @@ void func_808BB0AC(BgTokiSwd* this, PlayState* play) {
} }
void func_808BB128(BgTokiSwd* this, PlayState* play) { void func_808BB128(BgTokiSwd* this, PlayState* play) {
if (CutsceneFlags_Get(play, 1) && (play->roomCtx.unk_74[0] < 0xFF)) { if (CutsceneFlags_Get(play, 1) && (play->roomCtx.drawParams[0] < 0xFF)) {
play->roomCtx.unk_74[0] += 5; play->roomCtx.drawParams[0] += 5;
} }
} }

View file

@ -241,7 +241,7 @@ void BgTreemouth_Draw(Actor* thisx, PlayState* play) {
} }
if (gSaveContext.sceneLayer == 6) { if (gSaveContext.sceneLayer == 6) {
alpha = (play->roomCtx.unk_74[0] + 0x1F4); alpha = (play->roomCtx.drawParams[0] + 0x1F4);
} }
gDPSetEnvColor(POLY_OPA_DISP++, 128, 128, 128, alpha * 0.1f); gDPSetEnvColor(POLY_OPA_DISP++, 128, 128, 128, alpha * 0.1f);

View file

@ -337,7 +337,7 @@ void BossMo_Init(Actor* thisx, PlayState* play2) {
Flags_SetSwitch(play, 0x14); Flags_SetSwitch(play, 0x14);
sMorphaCore = this; sMorphaCore = this;
MO_WATER_LEVEL(play) = this->waterLevel = MO_WATER_LEVEL(play); MO_WATER_LEVEL(play) = this->waterLevel = MO_WATER_LEVEL(play);
play->roomCtx.unk_74[0] = 0xA0; play->roomCtx.drawParams[0] = 0xA0;
play->specialEffects = sEffects; play->specialEffects = sEffects;
for (i = 0; i < BOSS_MO_EFFECT_COUNT; i++) { for (i = 0; i < BOSS_MO_EFFECT_COUNT; i++) {
sEffects[i].type = MO_FX_NONE; sEffects[i].type = MO_FX_NONE;
@ -357,7 +357,7 @@ void BossMo_Init(Actor* thisx, PlayState* play2) {
Actor_SpawnAsChild(&play->actorCtx, &this->actor, play, ACTOR_DOOR_WARP1, 0.0f, -280.0f, 0.0f, 0, 0, 0, Actor_SpawnAsChild(&play->actorCtx, &this->actor, play, ACTOR_DOOR_WARP1, 0.0f, -280.0f, 0.0f, 0, 0, 0,
WARP_DUNGEON_ADULT); WARP_DUNGEON_ADULT);
Actor_Spawn(&play->actorCtx, play, ACTOR_ITEM_B_HEART, -200.0f, -280.0f, 0.0f, 0, 0, 0, 0); Actor_Spawn(&play->actorCtx, play, ACTOR_ITEM_B_HEART, -200.0f, -280.0f, 0.0f, 0, 0, 0, 0);
play->roomCtx.unk_74[0] = 0xFF; play->roomCtx.drawParams[0] = 0xFF;
MO_WATER_LEVEL(play) = -500; MO_WATER_LEVEL(play) = -500;
return; return;
} }
@ -1711,9 +1711,9 @@ void BossMo_DeathCs(BossMo* this, PlayState* play) {
} }
} }
if (sMorphaCore->waterLevel < -200.0f) { if (sMorphaCore->waterLevel < -200.0f) {
play->roomCtx.unk_74[0]++; play->roomCtx.drawParams[0]++;
if (play->roomCtx.unk_74[0] >= 0xFF) { if (play->roomCtx.drawParams[0] >= 0xFF) {
play->roomCtx.unk_74[0] = 0xFF; play->roomCtx.drawParams[0] = 0xFF;
} }
} }
if (sMorphaCore->waterLevel < -250.0f) { if (sMorphaCore->waterLevel < -250.0f) {

View file

@ -236,7 +236,7 @@ void DemoKankyo_Init(Actor* thisx, PlayState* play) {
Actor_SpawnAsChild(&play->actorCtx, &this->actor, play, ACTOR_DOOR_TOKI, this->actor.world.pos.x, Actor_SpawnAsChild(&play->actorCtx, &this->actor, play, ACTOR_DOOR_TOKI, this->actor.world.pos.x,
this->actor.world.pos.y, this->actor.world.pos.z, 0, 0, 0, 0x0000); this->actor.world.pos.y, this->actor.world.pos.z, 0, 0, 0, 0x0000);
} else { } else {
play->roomCtx.unk_74[1] = 0xFF; play->roomCtx.drawParams[1] = 0xFF;
Actor_Kill(&this->actor); Actor_Kill(&this->actor);
} }
break; break;

View file

@ -350,7 +350,7 @@ void DoorShutter_SetupAction(DoorShutter* this, DoorShutterActionFunc actionFunc
* @return true if the door is barred * @return true if the door is barred
*/ */
s32 DoorShutter_SetupDoor(DoorShutter* this, PlayState* play) { s32 DoorShutter_SetupDoor(DoorShutter* this, PlayState* play) {
TransitionActorEntry* transitionEntry = &play->transiActorCtx.list[GET_TRANSITION_ACTOR_INDEX(&this->dyna.actor)]; TransitionActorEntry* transitionEntry = &play->transitionActors.list[GET_TRANSITION_ACTOR_INDEX(&this->dyna.actor)];
s8 frontRoom = transitionEntry->sides[0].room; s8 frontRoom = transitionEntry->sides[0].room;
s32 doorType = this->doorType; s32 doorType = this->doorType;
DoorShutterStyleInfo* styleInfo = &sStyleInfo[this->styleType]; DoorShutterStyleInfo* styleInfo = &sStyleInfo[this->styleType];
@ -462,7 +462,7 @@ void DoorShutter_Destroy(Actor* thisx, PlayState* play) {
if (this->dyna.actor.room >= 0) { if (this->dyna.actor.room >= 0) {
s32 transitionActorId = GET_TRANSITION_ACTOR_INDEX(&this->dyna.actor); s32 transitionActorId = GET_TRANSITION_ACTOR_INDEX(&this->dyna.actor);
play->transiActorCtx.list[transitionActorId].id *= -1; play->transitionActors.list[transitionActorId].id *= -1;
} }
} }
@ -801,7 +801,7 @@ void DoorShutter_SetupClosed(DoorShutter* this, PlayState* play) {
Vec3f relPlayerPos; Vec3f relPlayerPos;
Actor_WorldToActorCoords(&this->dyna.actor, &relPlayerPos, &player->actor.world.pos); Actor_WorldToActorCoords(&this->dyna.actor, &relPlayerPos, &player->actor.world.pos);
this->dyna.actor.room = play->transiActorCtx.list[GET_TRANSITION_ACTOR_INDEX(&this->dyna.actor)] this->dyna.actor.room = play->transitionActors.list[GET_TRANSITION_ACTOR_INDEX(&this->dyna.actor)]
.sides[(relPlayerPos.z < 0.0f) ? 0 : 1] .sides[(relPlayerPos.z < 0.0f) ? 0 : 1]
.room; .room;
if (room != this->dyna.actor.room) { if (room != this->dyna.actor.room) {
@ -809,9 +809,9 @@ void DoorShutter_SetupClosed(DoorShutter* this, PlayState* play) {
play->roomCtx.curRoom = play->roomCtx.prevRoom; play->roomCtx.curRoom = play->roomCtx.prevRoom;
play->roomCtx.prevRoom = tempRoom; play->roomCtx.prevRoom = tempRoom;
play->roomCtx.unk_30 ^= 1; play->roomCtx.activeBufPage ^= 1;
} }
func_80097534(play, &play->roomCtx); Room_FinishRoomChange(play, &play->roomCtx);
Play_SetupRespawnPoint(play, RESPAWN_MODE_DOWN, 0x0EFF); Play_SetupRespawnPoint(play, RESPAWN_MODE_DOWN, 0x0EFF);
} }
this->isActive = false; this->isActive = false;
@ -1012,7 +1012,7 @@ void DoorShutter_Draw(Actor* thisx, PlayState* play) {
} else { } else {
if (gfxInfo->barsDL != NULL) { if (gfxInfo->barsDL != NULL) {
TransitionActorEntry* transitionEntry = TransitionActorEntry* transitionEntry =
&play->transiActorCtx.list[GET_TRANSITION_ACTOR_INDEX(&this->dyna.actor)]; &play->transitionActors.list[GET_TRANSITION_ACTOR_INDEX(&this->dyna.actor)];
if (play->roomCtx.prevRoom.num >= 0 || if (play->roomCtx.prevRoom.num >= 0 ||
transitionEntry->sides[0].room == transitionEntry->sides[1].room) { transitionEntry->sides[0].room == transitionEntry->sides[1].room) {

View file

@ -166,7 +166,7 @@ void EnDoor_Destroy(Actor* thisx, PlayState* play) {
TransitionActorEntry* transitionEntry; TransitionActorEntry* transitionEntry;
EnDoor* this = (EnDoor*)thisx; EnDoor* this = (EnDoor*)thisx;
transitionEntry = &play->transiActorCtx.list[GET_TRANSITION_ACTOR_INDEX(&this->actor)]; transitionEntry = &play->transitionActors.list[GET_TRANSITION_ACTOR_INDEX(&this->actor)];
if (transitionEntry->id < 0) { if (transitionEntry->id < 0) {
transitionEntry->id = -transitionEntry->id; transitionEntry->id = -transitionEntry->id;
} }
@ -334,7 +334,7 @@ s32 EnDoor_OverrideLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3f*
TransitionActorEntry* transitionEntry; TransitionActorEntry* transitionEntry;
Gfx** doorDLists = sDoorDLists[this->dListIndex]; Gfx** doorDLists = sDoorDLists[this->dListIndex];
transitionEntry = &play->transiActorCtx.list[GET_TRANSITION_ACTOR_INDEX(&this->actor)]; transitionEntry = &play->transitionActors.list[GET_TRANSITION_ACTOR_INDEX(&this->actor)];
rot->z += this->actor.world.rot.y; rot->z += this->actor.world.rot.y;
if ((play->roomCtx.prevRoom.num >= 0) || (transitionEntry->sides[0].room == transitionEntry->sides[1].room)) { if ((play->roomCtx.prevRoom.num >= 0) || (transitionEntry->sides[0].room == transitionEntry->sides[1].room)) {
// Draw the side of the door that is visible to the camera // Draw the side of the door that is visible to the camera

View file

@ -133,7 +133,7 @@ void EnHoll_Init(Actor* thisx, PlayState* play) {
void EnHoll_Destroy(Actor* thisx, PlayState* play) { void EnHoll_Destroy(Actor* thisx, PlayState* play) {
s32 transitionActorIndex = GET_TRANSITION_ACTOR_INDEX(thisx); s32 transitionActorIndex = GET_TRANSITION_ACTOR_INDEX(thisx);
TransitionActorEntry* transitionEntry = &play->transiActorCtx.list[transitionActorIndex]; TransitionActorEntry* transitionEntry = &play->transitionActors.list[transitionActorIndex];
transitionEntry->id = -transitionEntry->id; transitionEntry->id = -transitionEntry->id;
} }
@ -145,7 +145,7 @@ void EnHoll_SwapRooms(PlayState* play) {
tempRoom = roomCtx->curRoom; tempRoom = roomCtx->curRoom;
roomCtx->curRoom = roomCtx->prevRoom; roomCtx->curRoom = roomCtx->prevRoom;
roomCtx->prevRoom = tempRoom; roomCtx->prevRoom = tempRoom;
play->roomCtx.unk_30 ^= 1; play->roomCtx.activeBufPage ^= 1;
} }
/** /**
@ -196,14 +196,14 @@ void EnHoll_HorizontalVisibleNarrow(EnHoll* this, PlayState* play) {
transitionActorIndex = GET_TRANSITION_ACTOR_INDEX(&this->actor); transitionActorIndex = GET_TRANSITION_ACTOR_INDEX(&this->actor);
if (orthogonalDistToPlayer > sHorizontalVisibleNarrowTriggerDists[triggerDistsIndex][1]) { if (orthogonalDistToPlayer > sHorizontalVisibleNarrowTriggerDists[triggerDistsIndex][1]) {
if (play->roomCtx.prevRoom.num >= 0 && play->roomCtx.status == 0) { if (play->roomCtx.prevRoom.num >= 0 && play->roomCtx.status == 0) {
this->actor.room = play->transiActorCtx.list[transitionActorIndex].sides[this->side].room; this->actor.room = play->transitionActors.list[transitionActorIndex].sides[this->side].room;
EnHoll_SwapRooms(play); EnHoll_SwapRooms(play);
func_80097534(play, &play->roomCtx); Room_FinishRoomChange(play, &play->roomCtx);
} }
} else { } else {
this->actor.room = play->transiActorCtx.list[transitionActorIndex].sides[this->side ^ 1].room; this->actor.room = play->transitionActors.list[transitionActorIndex].sides[this->side ^ 1].room;
if (play->roomCtx.prevRoom.num < 0) { if (play->roomCtx.prevRoom.num < 0) {
func_8009728C(play, &play->roomCtx, this->actor.room); Room_RequestNewRoom(play, &play->roomCtx, this->actor.room);
} else { } else {
this->planeAlpha = this->planeAlpha =
(255.0f / (sHorizontalVisibleNarrowTriggerDists[triggerDistsIndex][2] - (255.0f / (sHorizontalVisibleNarrowTriggerDists[triggerDistsIndex][2] -
@ -239,14 +239,14 @@ void EnHoll_HorizontalInvisible(EnHoll* this, PlayState* play) {
orthogonalDistToSubject > ENHOLL_H_INVISIBLE_LOAD_DEPTH_MIN))) { orthogonalDistToSubject > ENHOLL_H_INVISIBLE_LOAD_DEPTH_MIN))) {
s32 transitionActorIndex = GET_TRANSITION_ACTOR_INDEX(&this->actor); s32 transitionActorIndex = GET_TRANSITION_ACTOR_INDEX(&this->actor);
s32 side = (relSubjectPos.z < 0.0f) ? 0 : 1; s32 side = (relSubjectPos.z < 0.0f) ? 0 : 1;
TransitionActorEntry* transitionEntry = &play->transiActorCtx.list[transitionActorIndex]; TransitionActorEntry* transitionEntry = &play->transitionActors.list[transitionActorIndex];
s32 room = transitionEntry->sides[side].room; s32 room = transitionEntry->sides[side].room;
this->actor.room = room; this->actor.room = room;
if (isKokiriLayer8) {} if (isKokiriLayer8) {}
if (this->actor.room != play->roomCtx.curRoom.num) { if (this->actor.room != play->roomCtx.curRoom.num) {
if (room) {} if (room) {}
if (func_8009728C(play, &play->roomCtx, this->actor.room)) { if (Room_RequestNewRoom(play, &play->roomCtx, this->actor.room)) {
EnHoll_SetupAction(this, EnHoll_WaitRoomLoaded); EnHoll_SetupAction(this, EnHoll_WaitRoomLoaded);
} }
} }
@ -273,11 +273,11 @@ void EnHoll_VerticalDownBgCoverLarge(EnHoll* this, PlayState* play) {
} }
if (absYDistToPlayer < ENHOLL_V_DOWN_LOAD_YDIST) { if (absYDistToPlayer < ENHOLL_V_DOWN_LOAD_YDIST) {
this->actor.room = play->transiActorCtx.list[transitionActorIndex].sides[1].room; this->actor.room = play->transitionActors.list[transitionActorIndex].sides[1].room;
Math_SmoothStepToF(&player->actor.world.pos.x, this->actor.world.pos.x, 1.0f, 50.0f, 10.0f); Math_SmoothStepToF(&player->actor.world.pos.x, this->actor.world.pos.x, 1.0f, 50.0f, 10.0f);
Math_SmoothStepToF(&player->actor.world.pos.z, this->actor.world.pos.z, 1.0f, 50.0f, 10.0f); Math_SmoothStepToF(&player->actor.world.pos.z, this->actor.world.pos.z, 1.0f, 50.0f, 10.0f);
if (this->actor.room != play->roomCtx.curRoom.num && if (this->actor.room != play->roomCtx.curRoom.num &&
func_8009728C(play, &play->roomCtx, this->actor.room)) { Room_RequestNewRoom(play, &play->roomCtx, this->actor.room)) {
EnHoll_SetupAction(this, EnHoll_WaitRoomLoaded); EnHoll_SetupAction(this, EnHoll_WaitRoomLoaded);
this->resetBgCoverAlpha = true; this->resetBgCoverAlpha = true;
player->actor.speed = 0.0f; player->actor.speed = 0.0f;
@ -308,9 +308,9 @@ void EnHoll_VerticalBgCover(EnHoll* this, PlayState* play) {
s32 transitionActorIndex = GET_TRANSITION_ACTOR_INDEX(&this->actor); s32 transitionActorIndex = GET_TRANSITION_ACTOR_INDEX(&this->actor);
s32 side = (this->actor.yDistToPlayer > 0.0f) ? 0 : 1; s32 side = (this->actor.yDistToPlayer > 0.0f) ? 0 : 1;
this->actor.room = play->transiActorCtx.list[transitionActorIndex].sides[side].room; this->actor.room = play->transitionActors.list[transitionActorIndex].sides[side].room;
if (this->actor.room != play->roomCtx.curRoom.num && if (this->actor.room != play->roomCtx.curRoom.num &&
func_8009728C(play, &play->roomCtx, this->actor.room)) { Room_RequestNewRoom(play, &play->roomCtx, this->actor.room)) {
EnHoll_SetupAction(this, EnHoll_WaitRoomLoaded); EnHoll_SetupAction(this, EnHoll_WaitRoomLoaded);
this->resetBgCoverAlpha = true; this->resetBgCoverAlpha = true;
} }
@ -334,9 +334,9 @@ void EnHoll_VerticalInvisible(EnHoll* this, PlayState* play) {
absYDistToPlayer > ENHOLL_V_INVISIBLE_LOAD_YDIST_MIN) { absYDistToPlayer > ENHOLL_V_INVISIBLE_LOAD_YDIST_MIN) {
transitionActorIndex = GET_TRANSITION_ACTOR_INDEX(&this->actor); transitionActorIndex = GET_TRANSITION_ACTOR_INDEX(&this->actor);
side = (this->actor.yDistToPlayer > 0.0f) ? 0 : 1; side = (this->actor.yDistToPlayer > 0.0f) ? 0 : 1;
this->actor.room = play->transiActorCtx.list[transitionActorIndex].sides[side].room; this->actor.room = play->transitionActors.list[transitionActorIndex].sides[side].room;
if (this->actor.room != play->roomCtx.curRoom.num && if (this->actor.room != play->roomCtx.curRoom.num &&
func_8009728C(play, &play->roomCtx, this->actor.room)) { Room_RequestNewRoom(play, &play->roomCtx, this->actor.room)) {
EnHoll_SetupAction(this, EnHoll_WaitRoomLoaded); EnHoll_SetupAction(this, EnHoll_WaitRoomLoaded);
} }
} }
@ -375,9 +375,9 @@ void EnHoll_HorizontalBgCoverSwitchFlag(EnHoll* this, PlayState* play) {
if (orthogonalDistToPlayer < ENHOLL_H_SWITCHFLAG_LOAD_DEPTH) { if (orthogonalDistToPlayer < ENHOLL_H_SWITCHFLAG_LOAD_DEPTH) {
s32 side = (relPlayerPos.z < 0.0f) ? 0 : 1; s32 side = (relPlayerPos.z < 0.0f) ? 0 : 1;
this->actor.room = play->transiActorCtx.list[transitionActorIndex].sides[side].room; this->actor.room = play->transitionActors.list[transitionActorIndex].sides[side].room;
if (this->actor.room != play->roomCtx.curRoom.num && if (this->actor.room != play->roomCtx.curRoom.num &&
func_8009728C(play, &play->roomCtx, this->actor.room)) { Room_RequestNewRoom(play, &play->roomCtx, this->actor.room)) {
EnHoll_SetupAction(this, EnHoll_WaitRoomLoaded); EnHoll_SetupAction(this, EnHoll_WaitRoomLoaded);
} }
} }
@ -392,7 +392,7 @@ void EnHoll_HorizontalBgCoverSwitchFlag(EnHoll* this, PlayState* play) {
void EnHoll_WaitRoomLoaded(EnHoll* this, PlayState* play) { void EnHoll_WaitRoomLoaded(EnHoll* this, PlayState* play) {
if (!EnHoll_IsKokiriLayer8() && play->roomCtx.status == 0) { if (!EnHoll_IsKokiriLayer8() && play->roomCtx.status == 0) {
func_80097534(play, &play->roomCtx); Room_FinishRoomChange(play, &play->roomCtx);
if (play->bgCoverAlpha == 0) { if (play->bgCoverAlpha == 0) {
this->resetBgCoverAlpha = false; this->resetBgCoverAlpha = false;
} }

View file

@ -14,7 +14,7 @@
#include "cic6105.h" #include "cic6105.h"
#endif #endif
#pragma increment_block_number "gc-eu:160 gc-eu-mq:160 gc-jp:162 gc-jp-ce:162 gc-jp-mq:162 gc-us:162 gc-us-mq:162" #pragma increment_block_number "gc-eu:157 gc-eu-mq:157 gc-jp:159 gc-jp-ce:159 gc-jp-mq:159 gc-us:159 gc-us-mq:159"
#define FLAGS ACTOR_FLAG_4 #define FLAGS ACTOR_FLAG_4
@ -920,10 +920,10 @@ void Fishing_Init(Actor* thisx, PlayState* play2) {
sFishGameNumber = (HIGH_SCORE(HS_FISHING) & (HS_FISH_PLAYED * 255)) >> 0x10; sFishGameNumber = (HIGH_SCORE(HS_FISHING) & (HS_FISH_PLAYED * 255)) >> 0x10;
if ((sFishGameNumber & 7) == 7) { if ((sFishGameNumber & 7) == 7) {
play->roomCtx.unk_74[0] = 90; play->roomCtx.drawParams[0] = 90;
sFishingFoggy = 1; sFishingFoggy = 1;
} else { } else {
play->roomCtx.unk_74[0] = 40; play->roomCtx.drawParams[0] = 40;
sFishingFoggy = 0; sFishingFoggy = 0;
} }

View file

@ -5008,7 +5008,7 @@ s32 Player_ActionChange_1(Player* this, PlayState* play) {
if (slidingDoor->dyna.actor.category == ACTORCAT_DOOR) { if (slidingDoor->dyna.actor.category == ACTORCAT_DOOR) {
this->cv.slidingDoorBgCamIndex = this->cv.slidingDoorBgCamIndex =
play->transiActorCtx.list[GET_TRANSITION_ACTOR_INDEX(&slidingDoor->dyna.actor)] play->transitionActors.list[GET_TRANSITION_ACTOR_INDEX(&slidingDoor->dyna.actor)]
.sides[(doorDirection > 0) ? 0 : 1] .sides[(doorDirection > 0) ? 0 : 1]
.bgCamIndex; .bgCamIndex;
@ -5091,7 +5091,7 @@ s32 Player_ActionChange_1(Player* this, PlayState* play) {
} }
} else { } else {
Camera_ChangeDoorCam(Play_GetCamera(play, CAM_ID_MAIN), doorActor, Camera_ChangeDoorCam(Play_GetCamera(play, CAM_ID_MAIN), doorActor,
play->transiActorCtx.list[GET_TRANSITION_ACTOR_INDEX(doorActor)] play->transitionActors.list[GET_TRANSITION_ACTOR_INDEX(doorActor)]
.sides[(doorDirection > 0) ? 0 : 1] .sides[(doorDirection > 0) ? 0 : 1]
.bgCamIndex, .bgCamIndex,
0, 38.0f * D_808535EC, 26.0f * D_808535EC, 10.0f * D_808535EC); 0, 38.0f * D_808535EC, 26.0f * D_808535EC, 10.0f * D_808535EC);
@ -5100,12 +5100,12 @@ s32 Player_ActionChange_1(Player* this, PlayState* play) {
} }
if ((this->doorType != PLAYER_DOORTYPE_FAKE) && (doorActor->category == ACTORCAT_DOOR)) { if ((this->doorType != PLAYER_DOORTYPE_FAKE) && (doorActor->category == ACTORCAT_DOOR)) {
frontRoom = play->transiActorCtx.list[GET_TRANSITION_ACTOR_INDEX(doorActor)] frontRoom = play->transitionActors.list[GET_TRANSITION_ACTOR_INDEX(doorActor)]
.sides[(doorDirection > 0) ? 0 : 1] .sides[(doorDirection > 0) ? 0 : 1]
.room; .room;
if ((frontRoom >= 0) && (frontRoom != play->roomCtx.curRoom.num)) { if ((frontRoom >= 0) && (frontRoom != play->roomCtx.curRoom.num)) {
func_8009728C(play, &play->roomCtx, frontRoom); Room_RequestNewRoom(play, &play->roomCtx, frontRoom);
} }
} }
@ -9703,7 +9703,7 @@ void Player_Action_80845EF8(Player* this, PlayState* play) {
} else { } else {
func_8083C0E8(this, play); func_8083C0E8(this, play);
if (play->roomCtx.prevRoom.num >= 0) { if (play->roomCtx.prevRoom.num >= 0) {
func_80097534(play, &play->roomCtx); Room_FinishRoomChange(play, &play->roomCtx);
} }
Camera_SetFinishedFlag(Play_GetCamera(play, CAM_ID_MAIN)); Camera_SetFinishedFlag(Play_GetCamera(play, CAM_ID_MAIN));
Play_SetupRespawnPoint(play, RESPAWN_MODE_DOWN, 0xDFF); Play_SetupRespawnPoint(play, RESPAWN_MODE_DOWN, 0xDFF);

View file

@ -1595,12 +1595,12 @@ Room_DrawImageSingle = 0x800805E0; // type:func
Room_GetImageMultiBgEntry = 0x80080990; // type:func Room_GetImageMultiBgEntry = 0x80080990; // type:func
Room_DrawImageMulti = 0x80080A7C; // type:func Room_DrawImageMulti = 0x80080A7C; // type:func
Room_DrawImage = 0x80080E48; // type:func Room_DrawImage = 0x80080E48; // type:func
func_80096FD4 = 0x80080EB0; // type:func Room_Init = 0x80080EB0; // type:func
func_80096FE8 = 0x80080EC8; // type:func Room_SetupFirstRoom = 0x80080EC8; // type:func
func_8009728C = 0x80081064; // type:func Room_RequestNewRoom = 0x80081064; // type:func
func_800973FC = 0x800811CC; // type:func Room_ProcessRoomRequest = 0x800811CC; // type:func
Room_Draw = 0x80081270; // type:func Room_Draw = 0x80081270; // type:func
func_80097534 = 0x800812C0; // type:func Room_FinishRoomChange = 0x800812C0; // type:func
Sample_HandleStateChange = 0x80081360; // type:func Sample_HandleStateChange = 0x80081360; // type:func
Sample_Draw = 0x80081394; // type:func Sample_Draw = 0x80081394; // type:func
Sample_Main = 0x80081580; // type:func Sample_Main = 0x80081580; // type:func
@ -1632,7 +1632,7 @@ Scene_CommandObjectList = 0x80082308; // type:func
Scene_CommandLightList = 0x800824BC; // type:func Scene_CommandLightList = 0x800824BC; // type:func
Scene_CommandPathList = 0x8008256C; // type:func Scene_CommandPathList = 0x8008256C; // type:func
Scene_CommandTransitionActorEntryList = 0x800825B4; // type:func Scene_CommandTransitionActorEntryList = 0x800825B4; // type:func
TransitionActor_InitContext = 0x8008260C; // type:func Scene_ResetTransitionActorList = 0x8008260C; // type:func
Scene_CommandLightSettingsList = 0x8008261C; // type:func Scene_CommandLightSettingsList = 0x8008261C; // type:func
Scene_CommandSkyboxSettings = 0x80082674; // type:func Scene_CommandSkyboxSettings = 0x80082674; // type:func
Scene_CommandSkyboxDisables = 0x800826B8; // type:func Scene_CommandSkyboxDisables = 0x800826B8; // type:func