diff options
| author | Zelllll <56516451+Zelllll@users.noreply.github.com> | 2021-05-09 21:12:42 -0500 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2021-05-09 22:12:42 -0400 |
| commit | 874a75f456b8943d09e5e682811397c578ae6671 (patch) | |
| tree | 95756da6012c3177510e9d7b52f37fa5ce34a0a5 /src/code | |
| parent | e39141fb3df04cfd7c0df63e4570340db5df9e1a (diff) | |
Scene Changes (#114)
* match function
* major cleanups
* rename switch functions
* use graph_alloc to fix fake matches
* more documentation
* more matches, lots of changes
* lots more work
* format
* Update z_scene_proc.c
* very hard lagrange interpolation function OK!
* remove any remaining
* documentation done, only two functions left
* a few more things
* one function left!
* document another oot leftover
* last function decompiled, not matched yet
* scene_proc complete
* start work on z_scene
* done with z_scene
* remove unessecary typedefs
* fix some things to remove warnings
* Add z_scene_table and decomp data
* Delete ctx.c
* add draw cfg enum
* cleanup
* most scene table functions done
* done for now
* all scene files done
* Update include/z64scene.h
Co-authored-by: Anghelo Carvajal <anghelo.carvajal.14@sansano.usm.cl>
* add missing macros
* fix some renames
* scene texture file rename
* added temporary structs so it still builds
* more structs
* even more old structs
* fix boyo
* should fix compile error
* lets hope nothing broke
* ub comment back
Co-authored-by: Anghelo Carvajal <anghelo.carvajal.14@sansano.usm.cl>
Diffstat (limited to 'src/code')
| -rw-r--r-- | src/code/z_actor.c | 6 | ||||
| -rw-r--r-- | src/code/z_effect_soft_sprite_old_init.c | 2 | ||||
| -rw-r--r-- | src/code/z_en_item00.c | 20 | ||||
| -rw-r--r-- | src/code/z_scene.c | 652 | ||||
| -rw-r--r-- | src/code/z_scene_proc.c | 1079 | ||||
| -rw-r--r-- | src/code/z_scene_table.c | 2818 |
6 files changed, 3865 insertions, 712 deletions
diff --git a/src/code/z_actor.c b/src/code/z_actor.c index e941198f6..c09fc7d6b 100644 --- a/src/code/z_actor.c +++ b/src/code/z_actor.c @@ -171,7 +171,7 @@ void Actor_TargetContextInit(TargetContext* targetCtxt, Actor* actor, GlobalCont #pragma GLOBAL_ASM("./asm/non_matchings/code/z_actor//func_800B5814.asm") -u32 Actor_GetSwitchFlag(GlobalContext* ctxt, s32 flag) { +u32 Flags_GetSwitch(GlobalContext* ctxt, s32 flag) { if (flag >= 0 && flag < 0x80) { return ctxt->actorCtx.switchFlags[(flag & -0x20) >> 5] & (1 << (flag & 0x1F)); } @@ -327,7 +327,7 @@ void Actor_SetScale(Actor* actor, f32 scale) { void Actor_SetObjectSegment(GlobalContext* ctxt, Actor* actor) { // TODO: Segment number enum - gSegments[6] = PHYSICAL_TO_VIRTUAL(ctxt->sceneContext.objects[actor->objBankIndex].segment); + gSegments[6] = PHYSICAL_TO_VIRTUAL(ctxt->objectCtx.status[actor->objBankIndex].segment); } #if 0 @@ -351,7 +351,7 @@ void Actor_InitToDefaultValues(Actor* actor, GlobalContext* ctxt) { actor->naviMsgId = 255; Actor_Setshape(&actor->shape, 0, 0, 0); - if (Scene_IsObjectLoaded(&ctxt->sceneContext, actor->objBankIndex) != 0) { + if (Object_IsLoaded(&ctxt->objectCtx, actor->objBankIndex) != 0) { Actor_SetObjectSegment(ctxt, actor); actor->init(actor, ctxt); actor->init = NULL; diff --git a/src/code/z_effect_soft_sprite_old_init.c b/src/code/z_effect_soft_sprite_old_init.c index 79a9c50c3..e300b914c 100644 --- a/src/code/z_effect_soft_sprite_old_init.c +++ b/src/code/z_effect_soft_sprite_old_init.c @@ -10,7 +10,7 @@ void EffectSs_DrawGEffect(GlobalContext* globalCtx, EffectSs* this, void* textur MtxF mfTrans11DA0; s32 pad1; Mtx* mtx; - void* object = globalCtx->sceneContext.objects[this->rgObjBankIdx].segment; + void* object = globalCtx->objectCtx.status[this->rgObjBankIdx].segment; OPEN_DISPS(gfxCtx); diff --git a/src/code/z_en_item00.c b/src/code/z_en_item00.c index b4917b637..053d86ade 100644 --- a/src/code/z_en_item00.c +++ b/src/code/z_en_item00.c @@ -149,15 +149,15 @@ void EnItem00_Init(Actor* thisx, GlobalContext* globalCtx) { this->unk154 = 0.01f; break; case ITEM00_SHIELD_HERO: - this->actor.objBankIndex = Scene_FindSceneObjectIndex(&globalCtx->sceneContext, OBJECT_GI_SHIELD_2); + this->actor.objBankIndex = Object_GetIndex(&globalCtx->objectCtx, OBJECT_GI_SHIELD_2); EnItem00_SetObject(this, globalCtx, &shadowOffset, &shadowScale); break; case ITEM00_MAP: - this->actor.objBankIndex = Scene_FindSceneObjectIndex(&globalCtx->sceneContext, OBJECT_GI_MAP); + this->actor.objBankIndex = Object_GetIndex(&globalCtx->objectCtx, OBJECT_GI_MAP); EnItem00_SetObject(this, globalCtx, &shadowOffset, &shadowScale); break; case ITEM00_COMPASS: - this->actor.objBankIndex = Scene_FindSceneObjectIndex(&globalCtx->sceneContext, OBJECT_GI_COMPASS); + this->actor.objBankIndex = Object_GetIndex(&globalCtx->objectCtx, OBJECT_GI_COMPASS); EnItem00_SetObject(this, globalCtx, &shadowOffset, &shadowScale); break; default: @@ -263,8 +263,8 @@ void EnItem00_Destroy(Actor* thisx, GlobalContext* globalCtx) { void EnItem00_WaitForHeartObject(EnItem00* this, GlobalContext* globalCtx) { s32 sp1C; - sp1C = Scene_FindSceneObjectIndex(&globalCtx->sceneContext, OBJECT_GI_HEARTS); - if (Scene_IsObjectLoaded(&globalCtx->sceneContext, sp1C)) { + sp1C = Object_GetIndex(&globalCtx->objectCtx, OBJECT_GI_HEARTS); + if (Object_IsLoaded(&globalCtx->objectCtx, sp1C)) { this->actor.objBankIndex = sp1C; this->actionFunc = func_800A640C; } @@ -323,7 +323,7 @@ void func_800A6650(EnItem00* this, GlobalContext* globalCtx) { if (this->actor.params <= ITEM00_RUPEE_RED) { this->actor.shape.rot.y = this->actor.shape.rot.y + 960; } - if ((globalCtx->unk18840 & 1) != 0) { + if ((globalCtx->gameplayFrames & 1) != 0) { pos.x = this->actor.world.pos.x + randPlusMinusPoint5Scaled(10.0f); pos.y = this->actor.world.pos.y + randPlusMinusPoint5Scaled(10.0f); pos.z = this->actor.world.pos.z + randPlusMinusPoint5Scaled(10.0f); @@ -377,7 +377,7 @@ void func_800A6780(EnItem00* this, GlobalContext* globalCtx) { } } - if ((globalCtx->unk18840 & 1) == 0) { + if ((globalCtx->gameplayFrames & 1) == 0) { pos.x = this->actor.world.pos.x + ((Rand_ZeroOne() - 0.5f) * 10.0f); pos.y = this->actor.world.pos.y + ((Rand_ZeroOne() - 0.5f) * 10.0f); pos.z = this->actor.world.pos.z + ((Rand_ZeroOne() - 0.5f) * 10.0f); @@ -639,8 +639,8 @@ void EnItem00_Draw(Actor* thisx, GlobalContext* globalCtx) { case ITEM00_HEART: if (this->unk152 < 0) { if (this->unk152 == -1) { - s8 bankIndex = Scene_FindSceneObjectIndex(&globalCtx->sceneContext, OBJECT_GI_HEART); - if (Scene_IsObjectLoaded(&globalCtx->sceneContext, bankIndex)) { + s8 bankIndex = Object_GetIndex(&globalCtx->objectCtx, OBJECT_GI_HEART); + if (Object_IsLoaded(&globalCtx->objectCtx, bankIndex)) { this->actor.objBankIndex = bankIndex; Actor_SetObjectSegment(globalCtx, &this->actor); this->unk152 = -2; @@ -767,7 +767,7 @@ void EnItem00_DrawHeartContainer(EnItem00* actor, GlobalContext* globalCtx) { s32 pad; s32 pad2; - if (Scene_FindSceneObjectIndex(&globalCtx->sceneContext, OBJECT_GI_HEARTS) == actor->actor.objBankIndex) { + if (Object_GetIndex(&globalCtx->objectCtx, OBJECT_GI_HEARTS) == actor->actor.objBankIndex) { OPEN_DISPS(globalCtx->state.gfxCtx); func_8012C2DC(globalCtx->state.gfxCtx); diff --git a/src/code/z_scene.c b/src/code/z_scene.c index fa8137f3d..0841d72ae 100644 --- a/src/code/z_scene.c +++ b/src/code/z_scene.c @@ -1,83 +1,72 @@ #include <ultra64.h> #include <global.h> -/* -TODO: -There are a few issues left with this file, but many rely on larger structural project changes. -I am avoiding these in the mean time in order to not break the Ghidra project structures. -We need a header file for just z_scene. Including relevant structs, scene, and object enums. -Needs definition for OBJECT_EXCHANGE_BANK_MAX -The .data, .bss, and .rodata sections are not migrated to this file yet. -*/ - -s32 Scene_LoadObject(SceneContext* sceneCtxt, s16 id) { +s32 Object_Spawn(ObjectContext* objectCtx, s16 id) { u32 size; - sceneCtxt->objects[sceneCtxt->objectCount].id = id; + objectCtx->status[objectCtx->num].id = id; size = objectFileTable[id].vromEnd - objectFileTable[id].vromStart; - if (sceneCtxt) {} + if (1) {} - if (size) { - DmaMgr_SendRequest0(sceneCtxt->objects[sceneCtxt->objectCount].segment, objectFileTable[id].vromStart, size); + if (size != 0) { + DmaMgr_SendRequest0(objectCtx->status[objectCtx->num].segment, objectFileTable[id].vromStart, size); } - // TODO: This 0x22 is OBJECT_EXCHANGE_BANK_MAX - 1 in OOT - if (sceneCtxt->objectCount < 0x22) { - sceneCtxt->objects[sceneCtxt->objectCount + 1].segment = - // UB to cast pointer to u32 - (void*)ALIGN16((u32)sceneCtxt->objects[sceneCtxt->objectCount].segment + size); + if (objectCtx->num < OBJECT_EXCHANGE_BANK_MAX - 1) { + objectCtx->status[objectCtx->num + 1].segment = + (void*)ALIGN16((u32)objectCtx->status[objectCtx->num].segment + size); } - sceneCtxt->objectCount++; - sceneCtxt->spawnedObjectCount = sceneCtxt->objectCount; + objectCtx->num++; + objectCtx->spawnedObjectCount = objectCtx->num; - return sceneCtxt->objectCount - 1; + return objectCtx->num - 1; } -void Scene_Init(GlobalContext* ctxt, SceneContext* sceneCtxt) { - GlobalContext* global = ctxt; // Needs to be a new variable to match (possibly a sub struct?) - u32 unused; +void Object_InitBank(GameState* state, ObjectContext* objectCtx) { + GlobalContext* globalCtx = (GlobalContext*)state; + s32 pad; u32 spaceSize; s32 i; - if (global->sceneNum == SCENE_CLOCKTOWER || global->sceneNum == SCENE_TOWN || global->sceneNum == SCENE_BACKTOWN || global->sceneNum == SCENE_ICHIBA) { - spaceSize = 1566720; - } else if (global->sceneNum == SCENE_MILK_BAR) { - spaceSize = 1617920; - } else if (global->sceneNum == SCENE_00KEIKOKU) { - spaceSize = 1505280; + if (globalCtx->sceneNum == SCENE_CLOCKTOWER || globalCtx->sceneNum == SCENE_TOWN || + globalCtx->sceneNum == SCENE_BACKTOWN || globalCtx->sceneNum == SCENE_ICHIBA) { + spaceSize = OBJECT_SPACE_SIZE_CLOCK_TOWN; + } else if (globalCtx->sceneNum == SCENE_MILK_BAR) { + spaceSize = OBJECT_SPACE_SIZE_MILK_BAR; + } else if (globalCtx->sceneNum == SCENE_00KEIKOKU) { + spaceSize = OBJECT_SPACE_SIZE_TERMINA_FIELD; } else { - spaceSize = 1413120; + spaceSize = OBJECT_SPACE_SIZE_DEFAULT; } - sceneCtxt->objectCount = 0; - sceneCtxt->spawnedObjectCount = 0; - sceneCtxt->mainKeepIndex = 0; - sceneCtxt->keepObjectId = 0; + objectCtx->num = 0; + objectCtx->spawnedObjectCount = 0; + objectCtx->mainKeepIndex = 0; + objectCtx->subKeepIndex = 0; - // TODO: 0x23 is OBJECT_EXCHANGE_BANK_MAX in OOT - for (i = 0; i < 0x23; i++) sceneCtxt->objects[i].id = 0; + // clang-format off + for (i = 0; i < OBJECT_EXCHANGE_BANK_MAX; i++) { objectCtx->status[i].id = 0; } + // clang-format on - sceneCtxt->objectVramStart = sceneCtxt->objects[0].segment = THA_AllocEndAlign16(&ctxt->state.heap, spaceSize); - // UB to cast sceneCtxt->objectVramStart to s32 - sceneCtxt->objectVramEnd = (void*)((u32)sceneCtxt->objectVramStart + spaceSize); - // TODO: Second argument here is an object enum - sceneCtxt->mainKeepIndex = Scene_LoadObject(sceneCtxt, 1); - // TODO: Segment number enum? - gSegments[4] = PHYSICAL_TO_VIRTUAL(sceneCtxt->objects[sceneCtxt->mainKeepIndex].segment); + objectCtx->spaceStart = objectCtx->status[0].segment = THA_AllocEndAlign16(&state->heap, spaceSize); + objectCtx->spaceEnd = (void*)((u32)objectCtx->spaceStart + spaceSize); + objectCtx->mainKeepIndex = Object_Spawn(objectCtx, GAMEPLAY_KEEP); + + gSegments[4] = PHYSICAL_TO_VIRTUAL(objectCtx->status[objectCtx->mainKeepIndex].segment); } -void Scene_ReloadUnloadedObjects(SceneContext* sceneCtxt) { +void Object_UpdateBank(ObjectContext* objectCtx) { s32 i; - ObjectStatus* status; - ObjectFileTableEntry* objectFile; + ObjectStatus* status = &objectCtx->status[0]; + RomFile* objectFile; u32 size; - status = &sceneCtxt->objects[0]; - for (i = 0; i < sceneCtxt->objectCount; i++) { + for (i = 0; i < objectCtx->num; i++) { if (status->id < 0) { s32 id = -status->id; + if (status->dmaReq.vromAddr == 0) { objectFile = &objectFileTable[id]; size = objectFile->vromEnd - objectFile->vromStart; @@ -86,175 +75,185 @@ void Scene_ReloadUnloadedObjects(SceneContext* sceneCtxt) { status->id = 0; } else { osCreateMesgQueue(&status->loadQueue, &status->loadMsg, 1); - DmaMgr_SendRequestImpl(&status->dmaReq, status->segment, objectFile->vromStart, - size, 0, &status->loadQueue, NULL); + DmaMgr_SendRequestImpl(&status->dmaReq, status->segment, objectFile->vromStart, size, 0, + &status->loadQueue, NULL); } } else if (!osRecvMesg(&status->loadQueue, NULL, OS_MESG_NOBLOCK)) { status->id = id; } } + status++; } } -s32 Scene_FindSceneObjectIndex(SceneContext* sceneCtxt, s16 objectId) { +s32 Object_GetIndex(ObjectContext* objectCtx, s16 objectId) { s32 i; - for(i = 0; i < sceneCtxt->objectCount; i++) { - if((sceneCtxt->objects[i].id < 0 ? -sceneCtxt->objects[i].id : sceneCtxt->objects[i].id) == objectId) { + + for (i = 0; i < objectCtx->num; i++) { + if ((objectCtx->status[i].id < 0 ? -objectCtx->status[i].id : objectCtx->status[i].id) == objectId) { return i; } } + return -1; } -s32 Scene_IsObjectLoaded(SceneContext* actorShape, s32 index) { - if (actorShape->objects[index].id > 0) { - return 1; +s32 Object_IsLoaded(ObjectContext* objectCtx, s32 index) { + if (objectCtx->status[index].id > 0) { + return true; } else { - return 0; + return false; } } -void Scene_DmaAllObjects(SceneContext* sceneCtxt) { +void Object_LoadAll(ObjectContext* objectCtx) { s32 i; s32 id; u32 vromSize; - for (i = 0; i < sceneCtxt->objectCount; i++) { - id = sceneCtxt->objects[i].id; + for (i = 0; i < objectCtx->num; i++) { + id = objectCtx->status[i].id; vromSize = objectFileTable[id].vromEnd - objectFileTable[id].vromStart; if (vromSize == 0) { continue; } - DmaMgr_SendRequest0(sceneCtxt->objects[i].segment, objectFileTable[id].vromStart, vromSize); + DmaMgr_SendRequest0(objectCtx->status[i].segment, objectFileTable[id].vromStart, vromSize); } } -void* func_8012F73C(SceneContext* sceneCtxt, s32 iParm2, s16 id) { +void* func_8012F73C(ObjectContext* objectCtx, s32 iParm2, s16 id) { u32 addr; u32 vromSize; - ObjectFileTableEntry* fileTableEntry; + RomFile* fileTableEntry; - sceneCtxt->objects[iParm2].id = -id; - sceneCtxt->objects[iParm2].dmaReq.vromAddr = 0; + objectCtx->status[iParm2].id = -id; + objectCtx->status[iParm2].dmaReq.vromAddr = 0; fileTableEntry = &objectFileTable[id]; vromSize = fileTableEntry->vromEnd - fileTableEntry->vromStart; + // TODO: UB to cast void to u32 - addr = ((u32)sceneCtxt->objects[iParm2].segment) + vromSize; + addr = ((u32)objectCtx->status[iParm2].segment) + vromSize; addr = ALIGN16(addr); - // UB to cast u32 to pointer + return (void*)addr; } -// Scene Command 0x00: Link Spawn List -void Scene_HeaderCommand00(GlobalContext* ctxt, SceneCmd* entry) { - GlobalContext* global = ctxt; // Needs to be a new variable to match (possibly a sub struct?) +// Scene Header Command 0x00: Spawn List +void Scene_HeaderCmdSpawnList(GlobalContext* globalCtx, SceneCmd* cmd) { + GlobalContext* globalCtx2 = globalCtx; s32 loadedCount; - void* objectVramAddr; - s16 temp16; + void* nextObject; + s16 playerObjectId; u8 unk20; - ctxt->linkActorEntry = (ActorEntry*)Lib_SegmentedToVirtual(entry->spawnList.segment) + - ctxt->setupEntranceList[ctxt->curSpawn].spawn; - if ( (ctxt->linkActorEntry->params & 0x0F00) >> 8 == 0x0C || - (gSaveContext.extra.unk10 == 0x02 && gSaveContext.extra.unk42 == 0x0CFF) - ) { - Scene_LoadObject(&ctxt->sceneContext, OBJECT_STK); + globalCtx->linkActorEntry = (ActorEntry*)Lib_SegmentedToVirtual(cmd->spawnList.segment) + + globalCtx->setupEntranceList[globalCtx->curSpawn].spawn; + if ((globalCtx->linkActorEntry->params & 0x0F00) >> 8 == 0x0C || + (gSaveContext.extra.unk10 == 0x02 && gSaveContext.extra.unk42 == 0x0CFF)) { + // Skull Kid Object + Object_Spawn(&globalCtx->objectCtx, OBJECT_STK); return; } - loadedCount = Scene_LoadObject(&ctxt->sceneContext, OBJECT_LINK_CHILD); - objectVramAddr = global->sceneContext.objects[global->sceneContext.objectCount].segment; - ctxt->sceneContext.objectCount = loadedCount; - ctxt->sceneContext.spawnedObjectCount = loadedCount; + loadedCount = Object_Spawn(&globalCtx->objectCtx, OBJECT_LINK_CHILD); + nextObject = globalCtx2->objectCtx.status[globalCtx2->objectCtx.num].segment; + globalCtx->objectCtx.num = loadedCount; + globalCtx->objectCtx.spawnedObjectCount = loadedCount; unk20 = gSaveContext.perm.unk20; - temp16 = D_801C2730[unk20]; - gActorOverlayTable[0].initInfo->objectId = temp16; - Scene_LoadObject(&ctxt->sceneContext, temp16); + playerObjectId = gLinkFormObjectIndexes[unk20]; + gActorOverlayTable[0].initInfo->objectId = playerObjectId; + Object_Spawn(&globalCtx->objectCtx, playerObjectId); - ctxt->sceneContext.objects[ctxt->sceneContext.objectCount].segment = objectVramAddr; + globalCtx->objectCtx.status[globalCtx->objectCtx.num].segment = nextObject; } -// Scene Command 0x01: Actor List -void Scene_HeaderCommand01(GlobalContext* ctxt, SceneCmd* entry) { - ctxt->sceneNumActorsToLoad = (u16)entry->actorList.num; - ctxt->setupActorList = (ActorEntry*)Lib_SegmentedToVirtual(entry->actorList.segment); - ctxt->actorCtx.unkC = (u16)0; +// Scene Header Command 0x01: Actor List +void Scene_HeaderCmdActorList(GlobalContext* globalCtx, SceneCmd* cmd) { + globalCtx->sceneNumActorsToLoad = (u16)cmd->actorList.num; + globalCtx->setupActorList = (ActorEntry*)Lib_SegmentedToVirtual(cmd->actorList.segment); + globalCtx->actorCtx.unkC = (u16)0; } -// Scene Command 0x02: Cutscene Camera List -void Scene_HeaderCommand02(GlobalContext* ctxt, SceneCmd* entry) { - ctxt->unk18858 = (UNK_PTR)Lib_SegmentedToVirtual(entry->csCameraList.segment); +// Scene Header Command 0x02: List of cameras for actor cutscenes +void Scene_HeaderCmdActorCutsceneCamList(GlobalContext* globalCtx, SceneCmd* cmd) { + globalCtx->unk18858 = (UNK_PTR)Lib_SegmentedToVirtual(cmd->csCameraList.segment); } -// Scene Command 0x03: Collision Header -void Scene_HeaderCommand03(GlobalContext* ctxt, SceneCmd* entry) { - CollisionHeader* temp_ret; - CollisionHeader* temp_s0; +// Scene Header Command 0x03: Collision Header +void Scene_HeaderCmdColHeader(GlobalContext* globalCtx, SceneCmd* cmd) { + CollisionHeader* colHeaderTemp; + CollisionHeader* colHeader; - temp_ret = (CollisionHeader*)Lib_SegmentedToVirtual(entry->colHeader.segment); - temp_s0 = temp_ret; - temp_s0->vtxList = (Vec3s*)Lib_SegmentedToVirtual(temp_ret->vtxList); - temp_s0->polyList = (CollisionPoly*)Lib_SegmentedToVirtual(temp_s0->polyList); - if (temp_s0->surfaceTypeList != 0) { - temp_s0->surfaceTypeList = (SurfaceType*)Lib_SegmentedToVirtual(temp_s0->surfaceTypeList); + colHeaderTemp = (CollisionHeader*)Lib_SegmentedToVirtual(cmd->colHeader.segment); + colHeader = colHeaderTemp; + colHeader->vtxList = (Vec3s*)Lib_SegmentedToVirtual(colHeaderTemp->vtxList); + colHeader->polyList = (CollisionPoly*)Lib_SegmentedToVirtual(colHeader->polyList); + + if (colHeader->surfaceTypeList != NULL) { + colHeader->surfaceTypeList = (SurfaceType*)Lib_SegmentedToVirtual(colHeader->surfaceTypeList); } - if (temp_s0->cameraDataList != 0) { - temp_s0->cameraDataList = (void*)Lib_SegmentedToVirtual(temp_s0->cameraDataList); + + if (colHeader->cameraDataList != NULL) { + colHeader->cameraDataList = (void*)Lib_SegmentedToVirtual(colHeader->cameraDataList); } - if (temp_s0->waterBoxes != 0) { - temp_s0->waterBoxes = (WaterBox*)Lib_SegmentedToVirtual(temp_s0->waterBoxes); + + if (colHeader->waterBoxes != NULL) { + colHeader->waterBoxes = (WaterBox*)Lib_SegmentedToVirtual(colHeader->waterBoxes); } - BgCheck_Init(&ctxt->colCtx, ctxt, temp_s0); + BgCheck_Init(&globalCtx->colCtx, globalCtx, colHeader); } -// Scene Command 0x04: Room List -void Scene_HeaderCommand04(GlobalContext* ctxt, SceneCmd* entry) { - ctxt->numRooms = entry->roomList.num; - ctxt->roomList = (RomFile*)Lib_SegmentedToVirtual(entry->roomList.segment); +// Scene Header Command 0x04: Room List +void Scene_HeaderCmdRoomList(GlobalContext* globalCtx, SceneCmd* cmd) { + globalCtx->numRooms = cmd->roomList.num; + globalCtx->roomList = (RomFile*)Lib_SegmentedToVirtual(cmd->roomList.segment); } -// Scene Command 0x06: Entrance List -void Scene_HeaderCommand06(GlobalContext* ctxt, SceneCmd* entry) { - ctxt->setupEntranceList = (EntranceEntry*)Lib_SegmentedToVirtual(entry->entranceList.segment); +// Scene Header Command 0x06: Entrance List +void Scene_HeaderCmdEntranceList(GlobalContext* globalCtx, SceneCmd* cmd) { + globalCtx->setupEntranceList = (EntranceEntry*)Lib_SegmentedToVirtual(cmd->entranceList.segment); } -// Scene Command 0x07: Special Files -void Scene_HeaderCommand07(GlobalContext* ctxt, SceneCmd* entry) { - if (entry->specialFiles.keepObjectId != 0) { - ctxt->sceneContext.keepObjectId = Scene_LoadObject(&ctxt->sceneContext, - entry->specialFiles.keepObjectId); +// Scene Header Command 0x07: Special Files +void Scene_HeaderCmdSpecialFiles(GlobalContext* globalCtx, SceneCmd* cmd) { + static RomFile tatlMessageFiles[2] = { + { (u32)_elf_message_fieldSegmentRomStart, (u32)_elf_message_fieldSegmentRomEnd }, + { (u32)_elf_message_ydanSegmentRomStart, (u32)_elf_message_ydanSegmentRomEnd }, + }; + + if (cmd->specialFiles.subKeepIndex != 0) { + globalCtx->objectCtx.subKeepIndex = Object_Spawn(&globalCtx->objectCtx, cmd->specialFiles.subKeepIndex); // TODO: Segment number enum? - gSegments[5] = - PHYSICAL_TO_VIRTUAL(ctxt->sceneContext.objects[ctxt->sceneContext.keepObjectId].segment); + gSegments[5] = PHYSICAL_TO_VIRTUAL(globalCtx->objectCtx.status[globalCtx->objectCtx.subKeepIndex].segment); } - if (entry->specialFiles.cUpElfMsgNum != 0) { - ctxt->unk18868 = Play_LoadScene(ctxt, &D_801C2650[entry->specialFiles.cUpElfMsgNum - 1]); + if (cmd->specialFiles.cUpElfMsgNum != 0) { + globalCtx->unk18868 = Play_LoadScene(globalCtx, &tatlMessageFiles[cmd->specialFiles.cUpElfMsgNum - 1]); } } -// Scene Command 0x08: Room Behavior -void Scene_HeaderCommand08(GlobalContext* ctxt, SceneCmd* entry) { - ctxt->roomContext.currRoom.unk3 = entry->roomBehavior.gpFlag1; - ctxt->roomContext.currRoom.unk2 = entry->roomBehavior.gpFlag2 & 0xFF; - ctxt->roomContext.currRoom.unk5 = (entry->roomBehavior.gpFlag2 >> 8) & 1; - ctxt->msgCtx.unk12044 = (entry->roomBehavior.gpFlag2 >> 0xa) & 1; - ctxt->roomContext.currRoom.enablePosLights = (entry->roomBehavior.gpFlag2 >> 0xb) & 1; - ctxt->kankyoContext.unkE2 = (entry->roomBehavior.gpFlag2 >> 0xc) & 1; +// Scene Header Command 0x08: Room Behavior +void Scene_HeaderCmdRoomBehavior(GlobalContext* globalCtx, SceneCmd* cmd) { + globalCtx->roomContext.currRoom.unk3 = cmd->roomBehavior.gpFlag1; + globalCtx->roomContext.currRoom.unk2 = cmd->roomBehavior.gpFlag2 & 0xFF; + globalCtx->roomContext.currRoom.unk5 = (cmd->roomBehavior.gpFlag2 >> 8) & 1; + globalCtx->msgCtx.unk12044 = (cmd->roomBehavior.gpFlag2 >> 0xa) & 1; + globalCtx->roomContext.currRoom.enablePosLights = (cmd->roomBehavior.gpFlag2 >> 0xb) & 1; + globalCtx->kankyoContext.unkE2 = (cmd->roomBehavior.gpFlag2 >> 0xc) & 1; } -// Scene Command 0x0A: Mesh Header -void Scene_HeaderCommand0A(GlobalContext* ctxt, SceneCmd* entry) { - ctxt->roomContext.currRoom.mesh = (RoomMesh*)Lib_SegmentedToVirtual(entry->mesh.segment); +// Scene Header Command 0x0A: Mesh Header +void Scene_HeaderCmdMesh(GlobalContext* globalCtx, SceneCmd* cmd) { + globalCtx->roomContext.currRoom.mesh = (RoomMesh*)Lib_SegmentedToVirtual(cmd->mesh.segment); } -// Scene Command 0x0B: Object List -void Scene_HeaderCommand0B(GlobalContext *ctxt, SceneCmd *entry) { +// Scene Header Command 0x0B: Object List +void Scene_HeaderCmdObjectList(GlobalContext* globalCtx, SceneCmd* cmd) { s32 i, j, k; ObjectStatus* firstObject; ObjectStatus* status; @@ -262,21 +261,23 @@ void Scene_HeaderCommand0B(GlobalContext *ctxt, SceneCmd *entry) { s16* objectEntry; void* nextPtr; - objectEntry = (s16*)Lib_SegmentedToVirtual(entry->objectList.segment); + objectEntry = (s16*)Lib_SegmentedToVirtual(cmd->objectList.segment); k = 0; - i = ctxt->sceneContext.spawnedObjectCount; - status = &ctxt->sceneContext.objects[i]; - firstObject = ctxt->sceneContext.objects; + i = globalCtx->objectCtx.spawnedObjectCount; + status = &globalCtx->objectCtx.status[i]; + firstObject = globalCtx->objectCtx.status; - while (i < ctxt->sceneContext.objectCount) { + while (i < globalCtx->objectCtx.num) { if (status->id != *objectEntry) { - status2 = &ctxt->sceneContext.objects[i]; - for (j = i; j < ctxt->sceneContext.objectCount; j++) { + status2 = &globalCtx->objectCtx.status[i]; + + for (j = i; j < globalCtx->objectCtx.num; j++) { status2->id = 0; status2++; } - ctxt->sceneContext.objectCount = i; - func_800BA6FC(ctxt, &ctxt->actorCtx); + + globalCtx->objectCtx.num = i; + func_800BA6FC(globalCtx, &globalCtx->actorCtx); continue; } @@ -287,116 +288,128 @@ void Scene_HeaderCommand0B(GlobalContext *ctxt, SceneCmd *entry) { status++; } - while (k < entry->objectList.num) { - nextPtr = func_8012F73C(&ctxt->sceneContext, i, *objectEntry); + while (k < cmd->objectList.num) { + nextPtr = func_8012F73C(&globalCtx->objectCtx, i, *objectEntry); - // TODO: This 0x22 is OBJECT_EXCHANGE_BANK_MAX - 1 in OOT - if (i < 0x22) { + if (i < OBJECT_EXCHANGE_BANK_MAX - 1) { firstObject[i + 1].segment = nextPtr; } + i++; k++; objectEntry++; } - ctxt->sceneContext.objectCount = i; + globalCtx->objectCtx.num = i; } -// Scene Command 0x0C: Light List -void Scene_HeaderCommand0C(GlobalContext* ctxt, SceneCmd* entry) { +// Scene Header Command 0x0C: Light List +void Scene_HeaderCmdLightList(GlobalContext* globalCtx, SceneCmd* cmd) { s32 i; - LightInfo* lightInfo; + LightInfo* lightInfo = (LightInfo*)Lib_SegmentedToVirtual(cmd->lightList.segment); - lightInfo = (LightInfo*)Lib_SegmentedToVirtual(entry->lightList.segment); - for (i = 0; i < entry->lightList.num; i++) - { - LightContext_InsertLight(ctxt, &ctxt->lightCtx, lightInfo); + for (i = 0; i < cmd->lightList.num; i++) { + LightContext_InsertLight(globalCtx, &globalCtx->lightCtx, lightInfo); lightInfo++; } } -// Scene Command 0x0D: Path List -void Scene_HeaderCommand0D(GlobalContext* ctxt, SceneCmd* entry) { - ctxt->setupPathList = (void*)Lib_SegmentedToVirtual(entry->pathList.segment); -} - -// Scene Command 0x0E: Transition Actor List -void Scene_HeaderCommand0E(GlobalContext* ctxt, SceneCmd* entry) { - ctxt->transitionActorCount = entry->transiActorList.num; - ctxt->transitionActorList = (TransitionActorEntry*)Lib_SegmentedToVirtual((void*)entry->transiActorList.segment); - func_80105818(ctxt, ctxt->transitionActorCount, ctxt->transitionActorList); -} - -void func_8012FEBC(GlobalContext* ctxt, u8* nbTransitionActors) { - *nbTransitionActors = 0; -} - -// Scene Command 0x0F: Light Setting List -void Scene_HeaderCommand0F(GlobalContext* ctxt, SceneCmd* entry) { - ctxt->kankyoContext.environmentSettingsCount = entry->lightSettingList.num; - ctxt->kankyoContext.environmentSettingsList = (void*)Lib_SegmentedToVirtual(entry->lightSettingList.segment); -} - -s32 func_8012FF10(GlobalContext* ctxt, s32 fileIndex) { - u32 vromStart = D_801C2660[fileIndex].vromStart; - u32 fileSize = D_801C2660[fileIndex].vromEnd - vromStart; - - if (fileSize) { - ctxt->roomContext.unk74 = THA_AllocEndAlign16(&ctxt->state.heap, fileSize); - return DmaMgr_SendRequest0(ctxt->roomContext.unk74, vromStart, fileSize); +// Scene Header Command 0x0D: Path List +void Scene_HeaderCmdPathList(GlobalContext* globalCtx, SceneCmd* cmd) { + globalCtx->setupPathList = (void*)Lib_SegmentedToVirtual(cmd->pathList.segment); +} + +// Scene Header Command 0x0E: Transition Actor List +void Scene_HeaderCmdTransiActorList(GlobalContext* globalCtx, SceneCmd* cmd) { + globalCtx->transitionCtx.nbTransitionActors = cmd->transiActorList.num; + globalCtx->transitionCtx.transitionActorList = + (TransitionActorEntry*)Lib_SegmentedToVirtual((void*)cmd->transiActorList.segment); + func_80105818(globalCtx, globalCtx->transitionCtx.nbTransitionActors, globalCtx->transitionCtx.transitionActorList); +} + +// Init function for the transition system. +void Transition_Init(GameState* state, TransitionContext* transitionCtx) { + transitionCtx->nbTransitionActors = 0; +} + +// Scene Header Command 0x0F: Environment Light Settings List +void Scene_HeaderCmdEnvLightSettings(GlobalContext* globalCtx, SceneCmd* cmd) { + globalCtx->kankyoContext.environmentSettingsCount = cmd->lightSettingList.num; + globalCtx->kankyoContext.environmentSettingsList = (void*)Lib_SegmentedToVirtual(cmd->lightSettingList.segment); +} + +/** + * Loads different texture files for each region of the world. + * These later are stored in segment 0x06, and used in maps. + */ +s32 Scene_LoadAreaTextures(GlobalContext* globalCtx, s32 fileIndex) { + static RomFile sceneTextureFiles[9] = { + { 0, 0 }, // Default + { (u32)_scene_texture_01SegmentRomStart, (u32)_scene_texture_01SegmentRomEnd }, + { (u32)_scene_texture_02SegmentRomStart, (u32)_scene_texture_02SegmentRomEnd }, + { (u32)_scene_texture_03SegmentRomStart, (u32)_scene_texture_03SegmentRomEnd }, + { (u32)_scene_texture_04SegmentRomStart, (u32)_scene_texture_04SegmentRomEnd }, + { (u32)_scene_texture_05SegmentRomStart, (u32)_scene_texture_05SegmentRomEnd }, + { (u32)_scene_texture_06SegmentRomStart, (u32)_scene_texture_06SegmentRomEnd }, + { (u32)_scene_texture_07SegmentRomStart, (u32)_scene_texture_07SegmentRomEnd }, + { (u32)_scene_texture_08SegmentRomStart, (u32)_scene_texture_08SegmentRomEnd }, + }; + u32 vromStart = sceneTextureFiles[fileIndex].vromStart; + u32 size = sceneTextureFiles[fileIndex].vromEnd - vromStart; + + if (size != 0) { + globalCtx->roomContext.unk74 = THA_AllocEndAlign16(&globalCtx->state.heap, size); + return DmaMgr_SendRequest0(globalCtx->roomContext.unk74, vromStart, size); } // UB: Undefined behaviour to not have a return statement here, but it breaks matching to add one. } -// Scene Command 0x11: Skybox Settings -void Scene_HeaderCommand11(GlobalContext* ctxt, SceneCmd* entry) { - ctxt->unk18874 = entry->skyboxSettings.skyboxId & 3; - ctxt->kankyoContext.unk17 = ctxt->kankyoContext.unk18 = entry->skyboxSettings.unk5; - ctxt->kankyoContext.unk1E = entry->skyboxSettings.unk6; - func_8012FF10(ctxt, entry->skyboxSettings.data1); +// Scene Header Command 0x11: Skybox Settings +void Scene_HeaderCmdSkyboxSettings(GlobalContext* globalCtx, SceneCmd* cmd) { + globalCtx->unk18874 = cmd->skyboxSettings.skyboxId & 3; + globalCtx->kankyoContext.unk17 = globalCtx->kankyoContext.unk18 = cmd->skyboxSettings.unk5; + globalCtx->kankyoContext.unk1E = cmd->skyboxSettings.unk6; + Scene_LoadAreaTextures(globalCtx, cmd->skyboxSettings.data1); } -// Scene Command 0x12: Skybox Disables -void Scene_HeaderCommand12(GlobalContext* ctxt, SceneCmd* entry) { - ctxt->kankyoContext.unk15 = entry->skyboxDisables.unk4; - ctxt->kankyoContext.unk16 = entry->skyboxDisables.unk5; +// Scene Header Command 0x12: Skybox Disables +void Scene_HeaderCmdSkyboxDisables(GlobalContext* globalCtx, SceneCmd* cmd) { + globalCtx->kankyoContext.unk15 = cmd->skyboxDisables.unk4; + globalCtx->kankyoContext.unk16 = cmd->skyboxDisables.unk5; } -// Scene Command 0x10: Time Settings -void Scene_HeaderCommand10(GlobalContext *ctxt, SceneCmd *entry) { +// Scene Header Command 0x10: Time Settings +void Scene_HeaderCmdTimeSettings(GlobalContext* globalCtx, SceneCmd* cmd) { u32 dayTime; - if (entry->timeSettings.hour != 0xFF && entry->timeSettings.min != 0xFF) { + if (cmd->timeSettings.hour != 0xFF && cmd->timeSettings.min != 0xFF) { gSaveContext.extra.environmentTime = gSaveContext.perm.time = - (u16)(((entry->timeSettings.hour + (entry->timeSettings.min / 60.0f)) * 60.0f) / 0.021972656f); + (u16)(((cmd->timeSettings.hour + (cmd->timeSettings.min / 60.0f)) * 60.0f) / 0.021972656f); } - if (entry->timeSettings.unk6 != 0xFF) { - ctxt->kankyoContext.unk2 = entry->timeSettings.unk6; + if (cmd->timeSettings.unk6 != 0xFF) { + globalCtx->kankyoContext.unk2 = cmd->timeSettings.unk6; } else { - ctxt->kankyoContext.unk2 = 0; + globalCtx->kankyoContext.unk2 = 0; } - if (gSaveContext.perm.inv.items[0] == 0xFF) { - if (ctxt->kankyoContext.unk2 != 0) { - ctxt->kankyoContext.unk2 = 5; - } + if ((gSaveContext.perm.inv.items[0] == 0xFF) && (globalCtx->kankyoContext.unk2 != 0)) { + globalCtx->kankyoContext.unk2 = 5; } if (gSaveContext.extra.unk2b8 == 0) { - // TODO: Needs REG macro - gGameInfo->data[0x0F] = ctxt->kankyoContext.unk2; + REG(15) = globalCtx->kankyoContext.unk2; } dayTime = gSaveContext.perm.time; - ctxt->kankyoContext.unk4 = -(Math_SinS(dayTime - 0x8000) * 120.0f) * 25.0f; + globalCtx->kankyoContext.unk4 = -(Math_SinS(dayTime - 0x8000) * 120.0f) * 25.0f; dayTime = gSaveContext.perm.time; - ctxt->kankyoContext.unk8 = (Math_CosS(dayTime - 0x8000) * 120.0f) * 25.0f; + globalCtx->kankyoContext.unk8 = (Math_CosS(dayTime - 0x8000) * 120.0f) * 25.0f; dayTime = gSaveContext.perm.time; - ctxt->kankyoContext.unkC = (Math_CosS(dayTime - 0x8000) * 20.0f) * 25.0f; + globalCtx->kankyoContext.unkC = (Math_CosS(dayTime - 0x8000) * 20.0f) * 25.0f; - if (ctxt->kankyoContext.unk2 == 0 && gSaveContext.perm.cutscene < 0xFFF0) { + if (globalCtx->kankyoContext.unk2 == 0 && gSaveContext.perm.cutscene < 0xFFF0) { gSaveContext.extra.environmentTime = gSaveContext.perm.time; if (gSaveContext.extra.environmentTime >= 0x2AAA && gSaveContext.extra.environmentTime < 0x4555) { @@ -411,135 +424,172 @@ void Scene_HeaderCommand10(GlobalContext *ctxt, SceneCmd *entry) { } } -// Scene Command 0x05: Wind Settings -void Scene_HeaderCommand05(GlobalContext* ctxt, SceneCmd* entry) { - s8 temp1 = entry->windSettings.west; - s8 temp2 = entry->windSettings.vertical; - s8 temp3 = entry->windSettings.south; - ctxt->kankyoContext.windWest = temp1; - ctxt->kankyoContext.windVertical = temp2; - ctxt->kankyoContext.windSouth = temp3; - ctxt->kankyoContext.windClothIntensity = entry->windSettings.clothIntensity; -} +// Scene Header Command 0x05: Wind Settings +void Scene_HeaderCmdWindSettings(GlobalContext* globalCtx, SceneCmd* cmd) { + s8 temp1 = cmd->windSettings.west; + s8 temp2 = cmd->windSettings.vertical; + s8 temp3 = cmd->windSettings.south; -void Scene_HeaderCommand13(GlobalContext* ctxt, SceneCmd* entry) { - ctxt->setupExitList = (void*)Lib_SegmentedToVirtual(entry->exitList.segment); + globalCtx->kankyoContext.windWest = temp1; + globalCtx->kankyoContext.windVertical = temp2; + globalCtx->kankyoContext.windSouth = temp3; + globalCtx->kankyoContext.windClothIntensity = cmd->windSettings.clothIntensity; } -// Scene Command 0x09: Undefined -void Scene_HeaderCommand09(GlobalContext* ctxt, SceneCmd* entry) { +// Scene Header Command 0x13: Exit List +void Scene_HeaderCmdExitList(GlobalContext* globalCtx, SceneCmd* cmd) { + globalCtx->setupExitList = (u16*)Lib_SegmentedToVirtual(cmd->exitList.segment); +} +// Scene Header Command 0x09: Undefined +void Scene_HeaderCmd09(GlobalContext* globalCtx, SceneCmd* cmd) { } -// Scene Command 0x15: Sound Settings -void Scene_HeaderCommand15(GlobalContext* ctxt, SceneCmd* entry) { - ctxt->unk814 = entry->soundSettings.musicSeq; - ctxt->unk815 = entry->soundSettings.nighttimeSFX; +// Scene Header Command 0x15: Sound Settings= +void Scene_HeaderCmdSoundSettings(GlobalContext* globalCtx, SceneCmd* cmd) { + globalCtx->unk814 = cmd->soundSettings.musicSeq; + globalCtx->unk815 = cmd->soundSettings.nighttimeSFX; + if (gSaveContext.extra.unk276 == 0xFF || func_801A8A50(0) == 0x57) { - audio_setBGM(entry->soundSettings.bgmId); + audio_setBGM(cmd->soundSettings.bgmId); } } -// Scene Command 0x16: Echo Setting -void Scene_HeaderCommand16(GlobalContext* ctxt, SceneCmd* entry) { - ctxt->roomContext.currRoom.echo = entry->echoSettings.echo; +// Scene Header Command 0x16: Echo Setting +void Scene_HeaderCmdEchoSetting(GlobalContext* globalCtx, SceneCmd* cmd) { + globalCtx->roomContext.currRoom.echo = cmd->echoSettings.echo; } -// Scene Command 0x18: Alternate Headers -void Scene_HeaderCommand18(GlobalContext* ctxt, SceneCmd* entry) { +// Scene Header Command 0x18: Alternate Header List= +void Scene_HeaderCmdAltHeaderList(GlobalContext* globalCtx, SceneCmd* cmd) { SceneCmd** altHeaderList; SceneCmd* altHeader; + if (gSaveContext.extra.sceneSetupIndex) { - altHeaderList = (SceneCmd**)Lib_SegmentedToVirtual(entry->altHeaders.segment); + altHeaderList = (SceneCmd**)Lib_SegmentedToVirtual(cmd->altHeaders.segment); altHeader = altHeaderList[gSaveContext.extra.sceneSetupIndex - 1]; + if (altHeader != NULL) { - Scene_ProcessHeader(ctxt, (SceneCmd*)Lib_SegmentedToVirtual(altHeader)); - (entry + 1)->base.code = 0x14; + Scene_ProcessHeader(globalCtx, (SceneCmd*)Lib_SegmentedToVirtual(altHeader)); + (cmd + 1)->base.code = 0x14; } } } -// Scene Command 0x17: Cutscene Data -void Scene_HeaderCommand17(GlobalContext* ctxt, SceneCmd* entry) { - ctxt->csCtx.cutsceneCount = (u8)entry->base.data1; - ctxt->cutsceneList = (CutsceneEntry*)Lib_SegmentedToVirtual((void*)entry->base.data2); +// Scene Header Command 0x17: Cutscene List +void Scene_HeaderCmdCutsceneList(GlobalContext* globalCtx, SceneCmd* cmd) { + globalCtx->csCtx.cutsceneCount = (u8)cmd->base.data1; + globalCtx->cutsceneList = (CutsceneEntry*)Lib_SegmentedToVirtual((void*)cmd->base.data2); } -// Scene Command 0x1B: Cutscene Actor List -void Scene_HeaderCommand1B(GlobalContext* ctxt, SceneCmd* entry) { - ActorCutscene_Init(ctxt, (ActorCutscene*)Lib_SegmentedToVirtual(entry->cutsceneActorList.segment), - entry->cutsceneActorList.num); +// Scene Header Command 0x1B: Actor Cutscene List +void Scene_HeaderCmdActorCutsceneList(GlobalContext* globalCtx, SceneCmd* cmd) { + ActorCutscene_Init(globalCtx, (ActorCutscene*)Lib_SegmentedToVirtual(cmd->cutsceneActorList.segment), + cmd->cutsceneActorList.num); } -// Scene Command 0x1C: Mini Maps -void Scene_HeaderCommand1C(GlobalContext* ctxt, SceneCmd* entry) { - func_80104CF4(ctxt); - func_8010549C(ctxt, entry->minimapSettings.segment); +// Scene Header Command 0x1C: Mini Maps +void Scene_HeaderCmdMiniMap(GlobalContext* globalCtx, SceneCmd* cmd) { + func_80104CF4(globalCtx); + func_8010549C(globalCtx, cmd->minimapSettings.segment); } -// Scene Command 0x1D: Undefined -void Scene_HeaderCommand1D(GlobalContext* ctxt, SceneCmd* entry) { - +// Scene Header Command 0x1D: Undefined +void Scene_HeaderCmd1D(GlobalContext* globalCtx, SceneCmd* cmd) { } -// Scene Command 0x1E: Minimap Chests -void Scene_HeaderCommand1E(GlobalContext* ctxt, SceneCmd* entry) { - func_8010565C(ctxt, entry->minimapChests.num, entry->minimapChests.segment); +// Scene Header Command 0x1E: Minimap Compass Icon Info +void Scene_HeaderCmdMiniMapCompassInfo(GlobalContext* globalCtx, SceneCmd* cmd) { + func_8010565C(globalCtx, cmd->minimapChests.num, cmd->minimapChests.segment); } -// Scene Command 0x19: Misc. Settings (Camera & World Map Area) -void Scene_HeaderCommand19(GlobalContext *ctxt, SceneCmd *entry) { - s16 j; - s16 i; +// Scene Header Command 0x1A: Sets Area Visited Flag +void Scene_HeaderCmdSetAreaVisitedFlag(GlobalContext* globalCtx, SceneCmd* cmd) { + s16 j = 0; + s16 i = 0; - j = 0; - i = 0; - while (1) { + while (true) { if (scenesPerMapArea[i].scenes[j] == 0xFFFF) { i++; - j=0; + j = 0; - // 0x0B is sizeof(scenesPerMapArea) / sizeof(SceneIdList) ... but does not match calculated - if (i == 0x0B) { + if (i == (s32)(sizeof(scenesPerMapArea) / sizeof(SceneIdList))) { break; } } - if (ctxt->sceneNum == scenesPerMapArea[i].scenes[j]) { + if (globalCtx->sceneNum == scenesPerMapArea[i].scenes[j]) { break; } j++; } - // 0x0B is sizeof(scenesPerMapArea) / sizeof(SceneIdList) ... but does not match calculated - if (i < 0x0B) { - // This bitwise OR could be a macro, but all sane looking versions break matching. + if (i < (s32)(sizeof(scenesPerMapArea) / sizeof(SceneIdList))) { gSaveContext.perm.mapsVisited = (gBitFlags[i] | gSaveContext.perm.mapsVisited) | gSaveContext.perm.mapsVisited; } } -// Scene Command 0x1A: Texture Animations -void Scene_HeaderCommand1A(GlobalContext* ctxt, SceneCmd* entry) { - ctxt->sceneTextureAnimations = (AnimatedTexture*)Lib_SegmentedToVirtual(entry->textureAnimations.segment); -} - -void func_801306A4(GlobalContext *ctxt) { - ctxt->unk1887F = func_801323A0(ctxt->nextEntranceIndex) & 0x7F; -} - -s32 Scene_ProcessHeader(GlobalContext* ctxt, SceneCmd* header) { - u32 cmdCode; - - while (1) { - cmdCode = header->base.code; - - if (cmdCode == 0x14) { +// Scene Header Command 0x1A: Material Animations +void Scene_HeaderCmdAnimatedMaterials(GlobalContext* globalCtx, SceneCmd* cmd) { + globalCtx->sceneMaterialAnims = (AnimatedMaterial*)Lib_SegmentedToVirtual(cmd->textureAnimations.segment); +} + +/** + * Sets the exit fade from the next entrance index. + */ +void Scene_SetExitFade(GlobalContext* globalCtx) { + globalCtx->unk1887F = Entrance_GetTransitionFlags(globalCtx->nextEntranceIndex) & 0x7F; +} + +/** + * Executes all of the commands in a scene or room header. + */ +s32 Scene_ProcessHeader(GlobalContext* globalCtx, SceneCmd* header) { + static void (*sceneCmdHandlers[])(GlobalContext*, SceneCmd*) = { + Scene_HeaderCmdSpawnList, + Scene_HeaderCmdActorList, + Scene_HeaderCmdActorCutsceneCamList, + Scene_HeaderCmdColHeader, + Scene_HeaderCmdRoomList, + Scene_HeaderCmdWindSettings, + Scene_HeaderCmdEntranceList, + Scene_HeaderCmdSpecialFiles, + Scene_HeaderCmdRoomBehavior, + Scene_HeaderCmd09, + Scene_HeaderCmdMesh, + Scene_HeaderCmdObjectList, + Scene_HeaderCmdLightList, + Scene_HeaderCmdPathList, + Scene_HeaderCmdTransiActorList, + Scene_HeaderCmdEnvLightSettings, + Scene_HeaderCmdTimeSettings, + Scene_HeaderCmdSkyboxSettings, + Scene_HeaderCmdSkyboxDisables, + Scene_HeaderCmdExitList, + NULL, + Scene_HeaderCmdSoundSettings, + Scene_HeaderCmdEchoSetting, + Scene_HeaderCmdCutsceneList, + Scene_HeaderCmdAltHeaderList, + Scene_HeaderCmdSetAreaVisitedFlag, + Scene_HeaderCmdAnimatedMaterials, + Scene_HeaderCmdActorCutsceneList, + Scene_HeaderCmdMiniMap, + Scene_HeaderCmd1D, + Scene_HeaderCmdMiniMapCompassInfo, + }; + u32 cmdId; + + while (true) { + cmdId = header->base.code; + + if (cmdId == SCENE_CMD_ID_END) { break; } - if (cmdCode < 0x1F) { - sceneHeaderFuncTable[cmdCode](ctxt, header); + if (cmdId < SCENE_CMD_MAX) { + sceneCmdHandlers[cmdId](globalCtx, header); } header++; @@ -548,10 +598,16 @@ s32 Scene_ProcessHeader(GlobalContext* ctxt, SceneCmd* header) { return 0; } -u32 Scene_CreateEntrance(u32 sceneIndex, u32 spawnIndex, u32 offset) { - return (((sceneIndex << 9) | (spawnIndex << 4)) | offset) & 0xFFFF; +/** + * Creates an entrance index from the scene index, spawn index, and scene setup. + */ +u16 Entrance_CreateIndex(s32 sceneIndex, s32 spawnIndex, s32 sceneSetup) { + return (((sceneIndex << 9) | (spawnIndex << 4)) | sceneSetup) & 0xFFFF; } -void func_80130784(u32 spawnIndex) { - Scene_CreateEntrance(gSaveContext.perm.entranceIndex >> 9, spawnIndex, 0); +/** + * Creates an entrance index from the current entrance index with the given spawn index. + */ +u16 Entrance_CreateIndexFromSpawn(s32 spawnIndex) { + return Entrance_CreateIndex(gSaveContext.perm.entranceIndex >> 9, spawnIndex, 0); } diff --git a/src/code/z_scene_proc.c b/src/code/z_scene_proc.c index 6d235616c..d16a561ae 100644 --- a/src/code/z_scene_proc.c +++ b/src/code/z_scene_proc.c @@ -1,521 +1,800 @@ #include <ultra64.h> #include <global.h> -void SceneProc_DrawCurrentSceneAnimatedTextures(GlobalContext* ctxt) { - gSceneProcSceneDrawFuncs[ctxt->sceneConfig](ctxt); -} +//! @TODO: Once BSS is supported, remove these from `variables.h` (because they are static), and uncomment these here. +// static s32 sMatAnimStep; +// static u32 sMatAnimFlags; +// static f32 sMatAnimAlphaRatio; + +// Default displaylist that sets a valid displaylist into all of the segments. +static Gfx sSceneDrawDefaultDL[] = { + gsSPSegment(0x08, gEmptyDL), + gsSPSegment(0x09, gEmptyDL), + gsSPSegment(0x0A, gEmptyDL), + gsSPSegment(0x0B, gEmptyDL), + gsSPSegment(0x0C, gEmptyDL), + gsSPSegment(0x0D, gEmptyDL), + gsSPSegment(0x06, gEmptyDL), + gsDPPipeSync(), + gsDPSetPrimColor(0, 0, 128, 128, 128, 128), + gsDPSetEnvColor(128, 128, 128, 128), + gsSPEndDisplayList(), +}; + +/** + * Executes the current scene draw config handler. + */ +void Scene_ExecuteDrawConfig(GlobalContext* globalCtx) { + static void (*sceneDrawConfigHandlers[])(GlobalContext*) = { + Scene_DrawConfigDefault, + Scene_DrawConfigMatAnim, + Scene_DrawConfigDoNothing, + Scene_DrawConfig3, // unused, leftover from OoT + Scene_DrawConfig4, // unused, leftover from OoT + Scene_DrawConfig5, // unused + Scene_DrawConfigGreatBayTemple, + Scene_DrawConfigMatAnimManualStep, + }; + + sceneDrawConfigHandlers[globalCtx->sceneConfig](globalCtx); +} + +/** + * Scene Draw Config 0: + * Default scene draw config function. This just executes `sSceneDrawDefaultDL`. + */ +void Scene_DrawConfigDefault(GlobalContext* globalCtx) { + OPEN_DISPS(globalCtx->state.gfxCtx); + + gSPDisplayList(POLY_OPA_DISP++, sSceneDrawDefaultDL); + gSPDisplayList(POLY_XLU_DISP++, sSceneDrawDefaultDL); + + CLOSE_DISPS(globalCtx->state.gfxCtx); +} + +/** + * Returns a pointer to a single layer texture scroll displaylist. + */ +Gfx* AnimatedMat_TexScroll(GlobalContext* globalCtx, AnimatedMatTexScrollParams* params) { + return Gfx_TexScroll(globalCtx->state.gfxCtx, params->xStep * sMatAnimStep, -(params->yStep * sMatAnimStep), + params->width, params->height); +} + +/** + * Animated Material Type 0: + * Scrolls a single layer texture using the provided `AnimatedMatTexScrollParams`. + */ +void AnimatedMat_DrawTexScroll(GlobalContext* globalCtx, s32 segment, void* params) { + AnimatedMatTexScrollParams* texScrollParams = (AnimatedMatTexScrollParams*)params; + Gfx* texScrollDList = AnimatedMat_TexScroll(globalCtx, texScrollParams); + + OPEN_DISPS(globalCtx->state.gfxCtx); + + if (sMatAnimFlags & 1) { + gSPSegment(POLY_OPA_DISP++, segment, texScrollDList); + } -void SceneProc_DrawSceneConfig0(GlobalContext* ctxt) { - GraphicsContext* gfxCtx = ctxt->state.gfxCtx; + if (sMatAnimFlags & 2) { + gSPSegment(POLY_XLU_DISP++, segment, texScrollDList); + } - gSPDisplayList(gfxCtx->polyOpa.p++, gSceneProcDefaultDl); - gSPDisplayList(gfxCtx->polyXlu.p++, gSceneProcDefaultDl); + CLOSE_DISPS(globalCtx->state.gfxCtx); } -Gfx* SceneProc_SetTile1Layer(GlobalContext* ctxt, ScrollingTextureParams* params) { - return Gfx_TexScroll((ctxt->state).gfxCtx, - params->xStep * gSceneProcStep, - -(params->yStep * gSceneProcStep), - params->width, - params->height); +/** + * Returns a pointer to a two layer texture scroll displaylist. + */ +Gfx* AnimatedMat_TwoLayerTexScroll(GlobalContext* globalCtx, AnimatedMatTexScrollParams* params) { + return Gfx_TwoTexScroll(globalCtx->state.gfxCtx, 0, params[0].xStep * sMatAnimStep, + -(params[0].yStep * sMatAnimStep), params[0].width, params[0].height, 1, + params[1].xStep * sMatAnimStep, -(params[1].yStep * sMatAnimStep), params[1].width, + params[1].height); } -void SceneProc_DrawType0Texture(GlobalContext* ctxt, u32 segment, ScrollingTextureParams* params) { - Gfx* dl = SceneProc_SetTile1Layer(ctxt, params); +/** + * Animated Material Type 1: + * Scrolls a two layer texture using the provided `AnimatedMatTexScrollParams`. + */ +void AnimatedMat_DrawTwoTexScroll(GlobalContext* globalCtx, s32 segment, void* params) { + AnimatedMatTexScrollParams* texScrollParams = (AnimatedMatTexScrollParams*)params; + Gfx* texScrollDList = AnimatedMat_TwoLayerTexScroll(globalCtx, texScrollParams); - { - GraphicsContext* gfxCtx = ctxt->state.gfxCtx; - if (gSceneProcFlags & 1) { - gSPSegment(gfxCtx->polyOpa.p++, segment, dl); - } + OPEN_DISPS(globalCtx->state.gfxCtx); - if (gSceneProcFlags & 2) { - gSPSegment(gfxCtx->polyXlu.p++, segment, dl); - } + if (sMatAnimFlags & 1) { + gSPSegment(POLY_OPA_DISP++, segment, texScrollDList); } -} -Gfx* SceneProc_SetTile2Layers(GlobalContext* ctxt, ScrollingTextureParams* params) { - return Gfx_TwoTexScroll((ctxt->state).gfxCtx, - 0, - params[0].xStep * gSceneProcStep, - -(params[0].yStep * gSceneProcStep), - params[0].width, - params[0].height, - 1, - params[1].xStep * gSceneProcStep, - -(params[1].yStep * gSceneProcStep), - params[1].width, - params[1].height); + if (sMatAnimFlags & 2) { + gSPSegment(POLY_XLU_DISP++, segment, texScrollDList); + } + + CLOSE_DISPS(globalCtx->state.gfxCtx); } -void SceneProc_DrawType1Texture(GlobalContext* ctxt, u32 segment, ScrollingTextureParams* params) { - Gfx* dl = SceneProc_SetTile2Layers(ctxt, params); +/** + * Generates a displaylist that sets the prim and env color, and stores it in the provided segment ID. + */ +void AnimatedMat_SetColor(GlobalContext* globalCtx, s32 segment, F3DPrimColor* primColorResult, F3DEnvColor* envColor) { + Gfx* colorDList = (Gfx*)GRAPH_ALLOC(globalCtx->state.gfxCtx, sizeof(Gfx) * 4); - { - GraphicsContext* gfxCtx = ctxt->state.gfxCtx; - if (gSceneProcFlags & 1) { - gSPSegment(gfxCtx->polyOpa.p++, segment, dl); - } + OPEN_DISPS(globalCtx->state.gfxCtx); - if (gSceneProcFlags & 2) { - gSPSegment(gfxCtx->polyXlu.p++, segment, dl); - } - } -} + // clang-format off + if (sMatAnimFlags & 1) { gSPSegment(POLY_OPA_DISP++, segment, colorDList); } + if (sMatAnimFlags & 2) { gSPSegment(POLY_XLU_DISP++, segment, colorDList); } + // clang-format on -#ifdef NON_MATCHING -// Slight ordering differences at the beginning -void SceneProc_DrawFlashingTexture(GlobalContext* ctxt, u32 segment, FlashingTexturePrimColor* primColor, Color_RGBA8* envColor) { - GraphicsContext* gfxCtx; - Gfx* dl; + gDPSetPrimColor(colorDList++, 0, primColorResult->lodFrac, primColorResult->r, primColorResult->g, + primColorResult->b, (u8)(primColorResult->a * sMatAnimAlphaRatio)); - { - Gfx* _g = (Gfx*)ctxt->state.gfxCtx->polyOpa.d - 4; - dl = _g; - ctxt->state.gfxCtx->polyOpa.d = _g; + if (envColor != NULL) { + gDPSetEnvColor(colorDList++, envColor->r, envColor->g, envColor->b, envColor->a); } - gfxCtx = ctxt->state.gfxCtx; - if (gSceneProcFlags & 1) { - gSPSegment(gfxCtx->polyOpa.p++, segment, dl); + gSPEndDisplayList(colorDList++); + + CLOSE_DISPS(globalCtx->state.gfxCtx); +} + +/** + * Animated Material Type 2: + * Color key frame animation without linear interpolation. + */ +void AnimatedMat_DrawColor(GlobalContext* globalCtx, s32 segment, void* params) { + AnimatedMatColorParams* colorAnimParams = (AnimatedMatColorParams*)params; + F3DPrimColor* primColor; + F3DEnvColor* envColor; + s32 curFrame; + + primColor = (F3DPrimColor*)Lib_SegmentedToVirtual(colorAnimParams->primColors); + + curFrame = sMatAnimStep % colorAnimParams->keyFrameLength; + primColor += curFrame; + envColor = (colorAnimParams->envColors != NULL) + ? (F3DEnvColor*)Lib_SegmentedToVirtual(colorAnimParams->envColors) + curFrame + : NULL; + + AnimatedMat_SetColor(globalCtx, segment, primColor, envColor); +} + +/** + * Linear Interpolation + */ +s32 AnimatedMat_Lerp(s32 min, s32 max, f32 norm) { + return (s32)((max - min) * norm) + min; +} + +/** + * Animated Material Type 3: + * Color key frame animation with linear interpolation. + */ +void AnimatedMat_DrawColorLerp(GlobalContext* globalCtx, s32 segment, void* params) { + AnimatedMatColorParams* colorAnimParams = (AnimatedMatColorParams*)params; + F3DPrimColor* primColorMax; + F3DEnvColor* envColorMax; + u16* keyFrames; + s32 curFrame; + s32 endFrame; + s32 relativeFrame; // relative to the start frame + s32 startFrame; + f32 norm; + F3DPrimColor* primColorMin; + F3DPrimColor primColorResult; + F3DEnvColor* envColorMin; + F3DEnvColor envColorResult; + s32 i; + + primColorMax = (F3DPrimColor*)Lib_SegmentedToVirtual(colorAnimParams->primColors); + keyFrames = (u16*)Lib_SegmentedToVirtual(colorAnimParams->keyFrames); + curFrame = sMatAnimStep % colorAnimParams->keyFrameLength; + keyFrames++; + i = 1; + + while (colorAnimParams->keyFrameCount > i) { + if (curFrame < *keyFrames) { + break; + } + i++; + keyFrames++; } - if (gSceneProcFlags & 2) { - gSPSegment(gfxCtx->polyXlu.p++, segment, dl); + startFrame = keyFrames[-1]; + endFrame = keyFrames[0] - startFrame; + relativeFrame = curFrame - startFrame; + norm = (f32)relativeFrame / (f32)endFrame; + + primColorMax += i; + primColorMin = primColorMax - 1; + primColorResult.r = AnimatedMat_Lerp(primColorMin->r, primColorMax->r, norm); + primColorResult.g = AnimatedMat_Lerp(primColorMin->g, primColorMax->g, norm); + primColorResult.b = AnimatedMat_Lerp(primColorMin->b, primColorMax->b, norm); + primColorResult.a = AnimatedMat_Lerp(primColorMin->a, primColorMax->a, norm); + primColorResult.lodFrac = AnimatedMat_Lerp(primColorMin->lodFrac, primColorMax->lodFrac, norm); + + if (colorAnimParams->envColors) { + envColorMax = (F3DEnvColor*)Lib_SegmentedToVirtual(colorAnimParams->envColors); + envColorMax += i; + envColorMin = envColorMax - 1; + envColorResult.r = AnimatedMat_Lerp(envColorMin->r, envColorMax->r, norm); + envColorResult.g = AnimatedMat_Lerp(envColorMin->g, envColorMax->g, norm); + envColorResult.b = AnimatedMat_Lerp(envColorMin->b, envColorMax->b, norm); + envColorResult.a = AnimatedMat_Lerp(envColorMin->a, envColorMax->a, norm); + } else { + envColorMax = NULL; } - gDPSetPrimColor(dl++, - 0, - primColor->lodFrac, - primColor->red, - primColor->green, - primColor->blue, - (u8)(primColor->alpha * gSceneProcFlashingAlpha)); + AnimatedMat_SetColor(globalCtx, segment, &primColorResult, (envColorMax != NULL) ? &envColorResult : NULL); +} + +/** + * Lagrange interpolation + */ +f32 Scene_LagrangeInterp(s32 n, f32 x[], f32 fx[], f32 xp) { + f32 weights[50]; + f32 xVal; + f32 m; + f32 intp; + f32* xPtr1; + f32* fxPtr; + f32* weightsPtr; + f32* xPtr2; + s32 i; + s32 j; + + for (i = 0, weightsPtr = weights, xPtr1 = x, fxPtr = fx, weightsPtr = weightsPtr; i < n; i++) { + for (xVal = *xPtr1, m = 1.0f, j = 0, xPtr2 = x; j < n; j++) { + if (j != i) { + m *= xVal - (*xPtr2); + } + xPtr2++; + } - if (envColor != NULL) { - gDPSetEnvColor(dl++, - envColor->red, - envColor->green, - envColor->blue, - envColor->alpha); + xPtr1++; + *weightsPtr = (*fxPtr) / m; + fxPtr++; + weightsPtr++; } - gSPEndDisplayList(dl++); -} -#else -#pragma GLOBAL_ASM("./asm/non_matchings/code/z_scene_proc/SceneProc_DrawFlashingTexture.asm") -#endif + for (intp = 0.0f, i = 0, weightsPtr = weights; i < n; i++) { + for (m = 1.0f, j = 0, xPtr2 = x; j < n; j++) { + if (j != i) { + m *= xp - (*xPtr2); + } + xPtr2++; + } -void SceneProc_DrawType2Texture(GlobalContext* ctxt, u32 segment, FlashingTextureParams* params) { - Color_RGBA8* envColor; - FlashingTexturePrimColor* primColor = (FlashingTexturePrimColor *)Lib_SegmentedToVirtual(params->primColors); - u32 pad; - u32 index = gSceneProcStep % params->cycleLength; + intp += (*weightsPtr) * m; + weightsPtr++; + } - primColor += index; + return intp; +} + +/** + * Lagrange interpolation specifically for colors + */ +u8 Scene_LagrangeInterpColor(s32 n, f32 x[], f32 fx[], f32 xp) { + s32 intp = Scene_LagrangeInterp(n, x, fx, xp); + + // Clamp between 0 and 255 to ensure the color value does not overflow in either direction + return CLAMP(intp, 0, 255); +} + +/** + * Animated Material Type 4: + * Color key frame animation with non-linear interpolation. + */ +void AnimatedMat_DrawColorNonLinearInterp(GlobalContext* globalCtx, s32 segment, void* params) { + AnimatedMatColorParams* colorAnimParams = (AnimatedMatColorParams*)params; + F3DPrimColor* primColorCur = Lib_SegmentedToVirtual(colorAnimParams->primColors); + F3DEnvColor* envColorCur = Lib_SegmentedToVirtual(colorAnimParams->envColors); + u16* keyFrames = Lib_SegmentedToVirtual(colorAnimParams->keyFrames); + f32 curFrame = sMatAnimStep % colorAnimParams->keyFrameLength; + F3DPrimColor primColorResult; + F3DEnvColor envColorResult; + f32 x[50]; + f32 fxPrimR[50]; + f32 fxPrimG[50]; + f32 fxPrimB[50]; + f32 fxPrimA[50]; + f32 fxPrimLodFrac[50]; + f32 fxEnvR[50]; + f32 fxEnvG[50]; + f32 fxEnvB[50]; + f32 fxEnvA[50]; + f32* xPtr = x; + f32* fxPrimRPtr = fxPrimR; + f32* fxPrimGPtr = fxPrimG; + f32* fxPrimBPtr = fxPrimB; + f32* fxPrimAPtr = fxPrimA; + f32* fxPrimLodFracPtr = fxPrimLodFrac; + f32* fxEnvRPtr = fxEnvR; + f32* fxEnvGPtr = fxEnvG; + f32* fxEnvBPtr = fxEnvB; + f32* fxEnvAPtr = fxEnvA; + s32 i; - if (params->envColors) { - envColor = (Color_RGBA8*)Lib_SegmentedToVirtual(params->envColors) + index; - } else { - envColor = NULL; - } + for (i = 0; i < colorAnimParams->keyFrameCount; i++) { + *xPtr = *keyFrames; + *fxPrimRPtr = primColorCur->r; + *fxPrimGPtr = primColorCur->g; + *fxPrimBPtr = primColorCur->b; + *fxPrimAPtr = primColorCur->a; + *fxPrimLodFracPtr = primColorCur->lodFrac; + + primColorCur++; + fxPrimRPtr++; + fxPrimGPtr++; + fxPrimBPtr++; + fxPrimAPtr++; + fxPrimLodFracPtr++; + + if (envColorCur != NULL) { + *fxEnvRPtr = envColorCur->r; + *fxEnvGPtr = envColorCur->g; + *fxEnvBPtr = envColorCur->b; + *fxEnvAPtr = envColorCur->a; + + envColorCur++; + fxEnvRPtr++; + fxEnvGPtr++; + fxEnvBPtr++; + fxEnvAPtr++; + } - SceneProc_DrawFlashingTexture(ctxt, segment, primColor, envColor); -} - -s32 SceneProc_Lerp(s32 a, s32 b, f32 t) { - return (s32)((b - a) * t) + a; -} - -#ifdef NON_MATCHING -// Slight ordering and regalloc differences around t = ... -void SceneProc_DrawType3Texture(GlobalContext* ctxt, u32 segment, FlashingTextureParams* params) { - FlashingTextureParams* params2 = params; - Color_RGBA8* envColorTo; - FlashingTexturePrimColor* primColorTo = (FlashingTexturePrimColor *)Lib_SegmentedToVirtual(params2->primColors); - u16* keyFrames = (u16*)Lib_SegmentedToVirtual(params2->keyFrames); - s32 index = gSceneProcStep % params2->cycleLength; - s32 pad1; - s32 keyFrameIndex; - Color_RGBA8* envColorPtrIn; - f32 t; - s32 pad2; - FlashingTexturePrimColor primColorIn; - Color_RGBA8* envColorFrom; - Color_RGBA8 envColorIn; - s32 pad3; - FlashingTexturePrimColor* primColorFrom; - - keyFrameIndex = 1; - keyFrames += 1; - while (params2->numKeyFrames > keyFrameIndex) { - if (index < *keyFrames) break; - keyFrameIndex++; keyFrames++; + xPtr++; } - primColorTo += keyFrameIndex; - pad1 = keyFrames[0] - keyFrames[-1]; - pad2 = index - keyFrames[-1]; - - t = (f32)pad2 / (f32)pad1; - - primColorFrom = primColorTo - 1; - primColorIn.red = SceneProc_Lerp(primColorFrom->red, primColorTo->red, t); - primColorIn.green = SceneProc_Lerp(primColorFrom->green, primColorTo->green, t); - primColorIn.blue = SceneProc_Lerp(primColorFrom->blue, primColorTo->blue, t); - primColorIn.alpha = SceneProc_Lerp(primColorFrom->alpha, primColorTo->alpha, t); - primColorIn.lodFrac = SceneProc_Lerp(primColorFrom->lodFrac, primColorTo->lodFrac, t); - - if (params2->envColors) { - envColorTo = (Color_RGBA8*)Lib_SegmentedToVirtual(params2->envColors) + keyFrameIndex; - envColorFrom = envColorTo - 1; - envColorIn.red = SceneProc_Lerp(envColorFrom->red, envColorTo->red, t); - envColorIn.green = SceneProc_Lerp(envColorFrom->green, envColorTo->green, t); - envColorIn.blue = SceneProc_Lerp(envColorFrom->blue, envColorTo->blue, t); - envColorIn.alpha = SceneProc_Lerp(envColorFrom->alpha, envColorTo->alpha, t); + primColorResult.r = Scene_LagrangeInterpColor(colorAnimParams->keyFrameCount, x, fxPrimR, curFrame); + primColorResult.g = Scene_LagrangeInterpColor(colorAnimParams->keyFrameCount, x, fxPrimG, curFrame); + primColorResult.b = Scene_LagrangeInterpColor(colorAnimParams->keyFrameCount, x, fxPrimB, curFrame); + primColorResult.a = Scene_LagrangeInterpColor(colorAnimParams->keyFrameCount, x, fxPrimA, curFrame); + primColorResult.lodFrac = Scene_LagrangeInterpColor(colorAnimParams->keyFrameCount, x, fxPrimLodFrac, curFrame); + + if (colorAnimParams->envColors != NULL) { + envColorCur = Lib_SegmentedToVirtual(colorAnimParams->envColors); + envColorResult.r = Scene_LagrangeInterpColor(colorAnimParams->keyFrameCount, x, fxEnvR, curFrame); + envColorResult.g = Scene_LagrangeInterpColor(colorAnimParams->keyFrameCount, x, fxEnvG, curFrame); + envColorResult.b = Scene_LagrangeInterpColor(colorAnimParams->keyFrameCount, x, fxEnvB, curFrame); + envColorResult.a = Scene_LagrangeInterpColor(colorAnimParams->keyFrameCount, x, fxEnvA, curFrame); } else { - envColorTo = NULL; + envColorCur = NULL; } - if (envColorTo) { - envColorPtrIn = &envColorIn; - } else { - envColorPtrIn = NULL; - } - - SceneProc_DrawFlashingTexture(ctxt, segment, &primColorIn, envColorPtrIn); + AnimatedMat_SetColor(globalCtx, segment, &primColorResult, (envColorCur != NULL) ? &envColorResult : NULL); } -#else -#pragma GLOBAL_ASM("./asm/non_matchings/code/z_scene_proc/SceneProc_DrawType3Texture.asm") -#endif -#pragma GLOBAL_ASM("./asm/non_matchings/code/z_scene_proc/SceneProc_Interpolate.asm") - -u8 SceneProc_InterpolateClamped(u32 numKeyFrames, f32* keyFrames, f32* values, f32 frame) { - s32 ret = SceneProc_Interpolate(numKeyFrames, keyFrames, values, frame); - - return (ret < 0) ? 0 : - (ret > 0xFF)? 0xFF : - ret; -} +/** + * Animated Material Type 5: + * Cycles between a list of textures (imagine like a GIF) + */ +void AnimatedMat_DrawTexCycle(GlobalContext* globalCtx, s32 segment, void* params) { + AnimatedMatTexCycleParams* texAnimParams = params; + void** texList = (void**)Lib_SegmentedToVirtual(texAnimParams->textureList); + u8* texId = (u8*)Lib_SegmentedToVirtual(texAnimParams->textureIndexList); + s32 curFrame = sMatAnimStep % texAnimParams->keyFrameLength; + void* tex = Lib_SegmentedToVirtual(texList[texId[curFrame]]); -#pragma GLOBAL_ASM("./asm/non_matchings/code/z_scene_proc/SceneProc_DrawType4Texture.asm") + OPEN_DISPS(globalCtx->state.gfxCtx); -void SceneProc_DrawType5Texture(GlobalContext* ctxt, u32 segment, CyclingTextureParams* params) { - u8* offsets; - Gfx** dls; - Gfx* dl; - GraphicsContext* gfxCtx; - s32 step; - - dls = (Gfx**)Lib_SegmentedToVirtual(params->textureDls); - offsets = (u8*)Lib_SegmentedToVirtual(params->textureDlOffsets); - step = gSceneProcStep % params->cycleLength; - dl = (Gfx*)Lib_SegmentedToVirtual(dls[offsets[step]]); - - gfxCtx = ctxt->state.gfxCtx; - if (gSceneProcFlags & 1) { - gSPSegment(gfxCtx->polyOpa.p++, segment, dl); + if (sMatAnimFlags & 1) { + gSPSegment(POLY_OPA_DISP++, segment, tex); } - if (gSceneProcFlags & 2) { - gSPSegment(gfxCtx->polyXlu.p++, segment, dl); + if (sMatAnimFlags & 2) { + gSPSegment(POLY_XLU_DISP++, segment, tex); } -} + CLOSE_DISPS(globalCtx->state.gfxCtx); +} -void SceneProc_DrawAnimatedTextures(GlobalContext* ctxt, AnimatedTexture* textures, f32 flashingAlpha, u32 step, u32 flags) { +/** + * This is the main function that handles the animated material system. + * There are six different animated material types, which should be set in the provided `AnimatedMaterial`. + */ +void AnimatedMat_DrawMain(GlobalContext* globalCtx, AnimatedMaterial* matAnim, f32 alphaRatio, u32 step, u32 flags) { + static void (*matAnimDrawHandlers[])(GlobalContext*, s32 segment, void* params) = { + AnimatedMat_DrawTexScroll, AnimatedMat_DrawTwoTexScroll, AnimatedMat_DrawColor, + AnimatedMat_DrawColorLerp, AnimatedMat_DrawColorNonLinearInterp, AnimatedMat_DrawTexCycle, + }; s32 segmentAbs; s32 segment; - gSceneProcFlashingAlpha = flashingAlpha; - gSceneProcStep = step; - gSceneProcFlags = flags; + sMatAnimAlphaRatio = alphaRatio; + sMatAnimStep = step; + sMatAnimFlags = flags; - if ((textures != NULL) && (textures->segment != 0)) { + if ((matAnim != NULL) && (matAnim->segment != 0)) { do { - segment = textures->segment; - segmentAbs = ((segment < 0)? -segment : segment) + 7; - - gSceneProcDrawFuncs[textures->type](ctxt, segmentAbs, (void*)Lib_SegmentedToVirtual(textures->params)); - - textures++; + segment = matAnim->segment; + segmentAbs = ((segment < 0) ? -segment : segment) + 7; + matAnimDrawHandlers[matAnim->type](globalCtx, segmentAbs, (void*)Lib_SegmentedToVirtual(matAnim->params)); + matAnim++; } while (segment > -1); } } -void SceneProc_DrawAllSceneAnimatedTextures(GlobalContext* ctxt, AnimatedTexture* textures) { - SceneProc_DrawAnimatedTextures(ctxt, textures, 1, ctxt->unk18840, 3); +/** + * Draws an animated material to both OPA and XLU buffers. + */ +void AnimatedMat_Draw(GlobalContext* globalCtx, AnimatedMaterial* matAnim) { + AnimatedMat_DrawMain(globalCtx, matAnim, 1, globalCtx->gameplayFrames, 3); } -void SceneProc_DrawOpaqueSceneAnimatedTextures(GlobalContext* ctxt, AnimatedTexture* textures) { - SceneProc_DrawAnimatedTextures(ctxt, textures, 1, ctxt->unk18840, 1); +/** + * Draws an animated material to only the OPA buffer. + */ +void AnimatedMat_DrawOpa(GlobalContext* globalCtx, AnimatedMaterial* matAnim) { + AnimatedMat_DrawMain(globalCtx, matAnim, 1, globalCtx->gameplayFrames, 1); } -void SceneProc_DrawTranslucentSceneAnimatedTextures(GlobalContext* ctxt, AnimatedTexture* textures) { - SceneProc_DrawAnimatedTextures(ctxt, textures, 1, ctxt->unk18840, 2); +/** + * Draws an animated material to only the XLU buffer. + */ +void AnimatedMat_DrawXlu(GlobalContext* globalCtx, AnimatedMaterial* matAnim) { + AnimatedMat_DrawMain(globalCtx, matAnim, 1, globalCtx->gameplayFrames, 2); } -void SceneProc_DrawAllSceneAnimatedTexturesWithAlpha(GlobalContext* ctxt, AnimatedTexture* textures, f32 alpha) { - SceneProc_DrawAnimatedTextures(ctxt, textures, alpha, ctxt->unk18840, 3); +/** + * Draws an animated material with an alpha ratio (0.0 - 1.0) both OPA and XLU buffers. + */ +void AnimatedMat_DrawAlpha(GlobalContext* globalCtx, AnimatedMaterial* matAnim, f32 alphaRatio) { + AnimatedMat_DrawMain(globalCtx, matAnim, alphaRatio, globalCtx->gameplayFrames, 3); } -void SceneProc_DrawOpaqueSceneAnimatedTexturesWithAlpha(GlobalContext* ctxt, AnimatedTexture* textures, f32 alpha) { - SceneProc_DrawAnimatedTextures(ctxt, textures, alpha, ctxt->unk18840, 1); +/** + * Draws an animated material with an alpha ratio (0.0 - 1.0) to only the OPA buffer. + */ +void AnimatedMat_DrawAlphaOpa(GlobalContext* globalCtx, AnimatedMaterial* matAnim, f32 alphaRatio) { + AnimatedMat_DrawMain(globalCtx, matAnim, alphaRatio, globalCtx->gameplayFrames, 1); } -void SceneProc_DrawTranslucentSceneAnimatedTexturesWithAlpha(GlobalContext* ctxt, AnimatedTexture* textures, f32 alpha) { - SceneProc_DrawAnimatedTextures(ctxt, textures, alpha, ctxt->unk18840, 2); +/** + * Draws an animated material with an alpha ratio (0.0 - 1.0) to only the XLU buffer. + */ +void AnimatedMat_DrawAlphaXlu(GlobalContext* globalCtx, AnimatedMaterial* matAnim, f32 alphaRatio) { + AnimatedMat_DrawMain(globalCtx, matAnim, alphaRatio, globalCtx->gameplayFrames, 2); } -void SceneProc_DrawAllAnimatedTextures(GlobalContext* ctxt, AnimatedTexture* textures, u32 step) { - SceneProc_DrawAnimatedTextures(ctxt, textures, 1, step, 3); +/** + * Draws an animated material with a step to both the OPA and XLU buffers. + */ +void AnimatedMat_DrawStep(GlobalContext* globalCtx, AnimatedMaterial* matAnim, u32 step) { + AnimatedMat_DrawMain(globalCtx, matAnim, 1, step, 3); } -void SceneProc_DrawOpaqueAnimatedTextures(GlobalContext* ctxt, AnimatedTexture* textures, u32 step) { - SceneProc_DrawAnimatedTextures(ctxt, textures, 1, step, 1); +/** + * Draws an animated material with a step to only the OPA buffer. + */ +void AnimatedMat_DrawStepOpa(GlobalContext* globalCtx, AnimatedMaterial* textures, u32 step) { + AnimatedMat_DrawMain(globalCtx, textures, 1, step, 1); } -void SceneProc_DrawTranslucentAnimatedTextures(GlobalContext* ctxt, AnimatedTexture* textures, u32 step) { - SceneProc_DrawAnimatedTextures(ctxt, textures, 1, step, 2); +/** + * Draws an animated material with a step to only the XLU buffer. + */ +void AnimatedMat_DrawStepXlu(GlobalContext* globalCtx, AnimatedMaterial* matAnim, u32 step) { + AnimatedMat_DrawMain(globalCtx, matAnim, 1, step, 2); } -void SceneProc_DrawAllAnimatedTexturesWithAlpha(GlobalContext* ctxt, AnimatedTexture* textures, f32 alpha, u32 step) { - SceneProc_DrawAnimatedTextures(ctxt, textures, alpha, step, 3); +/** + * Draws an animated material with an alpha ratio (0.0 - 1.0) and a step to both the OPA and XLU buffers. + */ +void AnimatedMat_DrawAlphaStep(GlobalContext* globalCtx, AnimatedMaterial* matAnim, f32 alphaRatio, u32 step) { + AnimatedMat_DrawMain(globalCtx, matAnim, alphaRatio, step, 3); } -void SceneProc_DrawOpaqueAnimatedTexturesWithAlpha(GlobalContext* ctxt, AnimatedTexture* textures, f32 alpha, u32 step) { - SceneProc_DrawAnimatedTextures(ctxt, textures, alpha, step, 1); + +/** + * Draws an animated material with an alpha ratio (0.0 - 1.0) and a step to only the OPA buffer. + */ +void AnimatedMat_DrawAlphaStepOpa(GlobalContext* globalCtx, AnimatedMaterial* matAnim, f32 alphaRatio, u32 step) { + AnimatedMat_DrawMain(globalCtx, matAnim, alphaRatio, step, 1); } -void SceneProc_DrawTranslucentAnimatedTexturesWithAlpha(GlobalContext* ctxt, AnimatedTexture* textures, f32 alpha, u32 step) { - SceneProc_DrawAnimatedTextures(ctxt, textures, alpha, step, 2); + +/** + * Draws an animated material with an alpha ratio (0.0 - 1.0) and a step to only the XLU buffer. + */ +void AnimatedMat_DrawAlphaStepXlu(GlobalContext* globalCtx, AnimatedMaterial* matAnim, f32 alphaRatio, u32 step) { + AnimatedMat_DrawMain(globalCtx, matAnim, alphaRatio, step, 2); } -void SceneProc_DrawSceneConfig1(GlobalContext* ctxt) { - SceneProc_DrawAllSceneAnimatedTextures(ctxt, ctxt->sceneTextureAnimations); +/** + * Scene Draw Config 1: + * Allows the usage of the animated material system in scenes. + */ +void Scene_DrawConfigMatAnim(GlobalContext* globalCtx) { + AnimatedMat_Draw(globalCtx, globalCtx->sceneMaterialAnims); } -#ifdef NON_MATCHING -// This function still needs a lot of work -void SceneProc_DrawSceneConfig3(GlobalContext* ctxt) { - GraphicsContext* gfxCtx = ctxt->state.gfxCtx; - u32 frames = ctxt->unk18840; +/** + * Scene Draw Config 3: + * This config is unused, although it is identical to the grotto scene config from Ocarina of Time. + */ +void Scene_DrawConfig3(GlobalContext* globalCtx) { + u32 frames; - if (0); + OPEN_DISPS(globalCtx->state.gfxCtx); - gSPSegment(gfxCtx->polyXlu.p++, 8, - Rcp_GenerateSetTileSizeDl(ctxt->state.gfxCtx, 0, frames & 0x3f, 0x100, 0x10)); - gSPSegment(gfxCtx->polyXlu.p++, 9, - Gfx_TwoTexScroll(ctxt->state.gfxCtx, - 0, 0x7F - (frames & 0x7F), frames & 0x7F, 0x20, 0x20, - 1, frames & 0x7F, frames & 0x7F, 0x20, 0x20)); - gSPSegment(gfxCtx->polyOpa.p++, 10, - Gfx_TwoTexScroll(ctxt->state.gfxCtx, - 0, 0, 0, 0x20, 0x20, - 1, 0, 0x7F - (frames & 0x7F), 0x20, 0x20)); - gSPSegment(gfxCtx->polyOpa.p++, 11, - Rcp_GenerateSetTileSizeDl(ctxt->state.gfxCtx, 0, frames & 0x7F, 0x20, 0x20)); - gSPSegment(gfxCtx->polyXlu.p++, 12, - Gfx_TwoTexScroll(ctxt->state.gfxCtx, - 0, 0, frames * 0x32 & 0x7Ff, 8, 0x200, - 1, 0, frames * 0x3c & 0x7Ff, 8, 0x200)); - gSPSegment(gfxCtx->polyOpa.p++, 13, - Gfx_TwoTexScroll(ctxt->state.gfxCtx, - 0, 0, 0, 0x20, 0x40, - 1, 0, frames & 0x7F, 0x20, 0x20)); + frames = globalCtx->gameplayFrames; - gDPPipeSync(gfxCtx->polyXlu.p++); - gDPSetEnvColor(gfxCtx->polyXlu.p++, 0x80, 0x80, 0x80, 0x80); + gSPSegment(POLY_XLU_DISP++, 0x08, Gfx_TexScroll(globalCtx->state.gfxCtx, 0, (frames * 1) % 64, 256, 16)); - gDPPipeSync(gfxCtx->polyOpa.p++); - gDPSetEnvColor(gfxCtx->polyOpa.p++, 0x80, 0x80, 0x80, 0x80); -} -#else -#pragma GLOBAL_ASM("./asm/non_matchings/code/z_scene_proc/SceneProc_DrawSceneConfig3.asm") -#endif + gSPSegment(POLY_XLU_DISP++, 0x09, + Gfx_TwoTexScroll(globalCtx->state.gfxCtx, 0, 127 - (frames % 128), (frames * 1) % 128, 32, 32, 1, + frames % 128, (frames * 1) % 128, 32, 32)); -void SceneProc_DrawSceneConfig4(GlobalContext* ctxt) { - u32 frames; - GraphicsContext* gfxCtx = ctxt->state.gfxCtx; - u32 frames2; + gSPSegment(POLY_OPA_DISP++, 0x0A, + Gfx_TwoTexScroll(globalCtx->state.gfxCtx, 0, 0, 0, 32, 32, 1, 0, 127 - (frames * 1) % 128, 32, 32)); - frames = ctxt->unk18840; - frames2 = frames * 1; + gSPSegment(POLY_OPA_DISP++, 0x0B, Gfx_TexScroll(globalCtx->state.gfxCtx, 0, (frames * 1) % 128, 32, 32)); - gSPSegment(gfxCtx->polyXlu.p++, 8, - Gfx_TwoTexScroll(ctxt->state.gfxCtx, - 0, 0x7F - (frames & 0x7F), frames2 & 0x7F, 0x20, 0x20, - 1, (frames & 0x7F), frames2 & 0x7F, 0x20, 0x20)); + gSPSegment(POLY_XLU_DISP++, 0x0C, + Gfx_TwoTexScroll(globalCtx->state.gfxCtx, 0, 0, (frames * 50) % 2048, 8, 512, 1, 0, (frames * 60) % 2048, + 8, 512)); - gDPPipeSync(gfxCtx->polyOpa.p++); - gDPSetEnvColor(gfxCtx->polyOpa.p++, 0x80, 0x80, 0x80, 0x80); + gSPSegment(POLY_OPA_DISP++, 0x0D, + Gfx_TwoTexScroll(globalCtx->state.gfxCtx, 0, 0, 0, 32, 64, 1, 0, (frames * 1) % 128, 32, 32)); - gDPPipeSync(gfxCtx->polyXlu.p++); - gDPSetEnvColor(gfxCtx->polyXlu.p++, 0x80, 0x80, 0x80, 0x80); -} + gDPPipeSync(POLY_XLU_DISP++); + gDPSetEnvColor(POLY_XLU_DISP++, 128, 128, 128, 128); -void SceneProc_DrawSceneConfig2(GlobalContext* ctxt){} + gDPPipeSync(POLY_OPA_DISP++); + gDPSetEnvColor(POLY_OPA_DISP++, 128, 128, 128, 128); -void func_80131DF0(GlobalContext* ctxt, u32 param_2, u32 flags) { - Gfx* dl = D_801C3C50[param_2]; + CLOSE_DISPS(globalCtx->state.gfxCtx); +} - { - GraphicsContext* gfxCtx = ctxt->state.gfxCtx; - if (flags & 1) { - gSPSegment(gfxCtx->polyOpa.p++, 12, dl); - } +/** + * Scene Draw Config 4: + * This config is unused and just has a single TwoTexScroll intended for two 32x32 textures (likely two water textures). + * It is identical to the Castle Courtyard and Sacred Forest Meadow scene config from Ocarina of Time. + */ +void Scene_DrawConfig4(GlobalContext* globalCtx) { + u32 frames; - if (flags & 2) { - gSPSegment(gfxCtx->polyXlu.p++, 12, dl); - } + OPEN_DISPS(globalCtx->state.gfxCtx); + + frames = globalCtx->gameplayFrames; + + gSPSegment(POLY_XLU_DISP++, 0x08, + Gfx_TwoTexScroll(globalCtx->state.gfxCtx, 0, 127 - frames % 128, (frames * 1) % 128, 32, 32, 1, + frames % 128, (frames * 1) % 128, 32, 32)); + + gDPPipeSync(POLY_OPA_DISP++); + gDPSetEnvColor(POLY_OPA_DISP++, 128, 128, 128, 128); + + gDPPipeSync(POLY_XLU_DISP++); + gDPSetEnvColor(POLY_XLU_DISP++, 128, 128, 128, 128); + + CLOSE_DISPS(globalCtx->state.gfxCtx); +} + +/** + * Scene Draw Config 2: + * Has no effect, and is only used in SPOT00 (cutscene scene). + */ +void Scene_DrawConfigDoNothing(GlobalContext* globalCtx) { +} + +/** + * Stores a displaylist in the provided segment ID that sets a render mode from the index provided. + */ +void Scene_SetRenderModeXlu(GlobalContext* globalCtx, s32 index, u32 flags) { + static Gfx renderModeSetNoneDL[] = { + gsSPEndDisplayList(), + // These instructions will never get executed + gsSPEndDisplayList(), + gsSPEndDisplayList(), + gsSPEndDisplayList(), + }; + static Gfx renderModeSetXluSingleCycleDL[] = { + gsDPSetRenderMode(AA_EN | Z_CMP | IM_RD | CLR_ON_CVG | CVG_DST_WRAP | ZMODE_XLU | FORCE_BL | + GBL_c1(G_BL_CLR_IN, G_BL_0, G_BL_CLR_IN, G_BL_1), + G_RM_AA_ZB_XLU_SURF2), + gsSPEndDisplayList(), + // These instructions will never get executed + gsDPSetRenderMode(AA_EN | Z_CMP | IM_RD | CLR_ON_CVG | CVG_DST_WRAP | ZMODE_XLU | FORCE_BL | + GBL_c1(G_BL_CLR_FOG, G_BL_A_SHADE, G_BL_CLR_IN, G_BL_1MA), + G_RM_AA_ZB_XLU_SURF2), + gsSPEndDisplayList(), + }; + static Gfx renderModeSetXluTwoCycleDL[] = { + gsDPSetRenderMode(AA_EN | Z_CMP | Z_UPD | IM_RD | CLR_ON_CVG | CVG_DST_WRAP | ZMODE_XLU | FORCE_BL | + GBL_c1(G_BL_CLR_IN, G_BL_0, G_BL_CLR_IN, G_BL_1), + AA_EN | Z_CMP | Z_UPD | IM_RD | CLR_ON_CVG | CVG_DST_WRAP | ZMODE_XLU | FORCE_BL | + GBL_c2(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_1MA)), + gsSPEndDisplayList(), + // These instructions will never get executed + gsDPSetRenderMode(AA_EN | Z_CMP | Z_UPD | IM_RD | CLR_ON_CVG | CVG_DST_WRAP | ZMODE_XLU | FORCE_BL | + GBL_c1(G_BL_CLR_FOG, G_BL_A_SHADE, G_BL_CLR_IN, G_BL_1MA), + AA_EN | Z_CMP | Z_UPD | IM_RD | CLR_ON_CVG | CVG_DST_WRAP | ZMODE_XLU | FORCE_BL | + GBL_c2(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_1MA)), + gsSPEndDisplayList(), + }; + static Gfx* dLists[] = { + renderModeSetNoneDL, + renderModeSetXluSingleCycleDL, + renderModeSetXluTwoCycleDL, + }; + Gfx* dList = dLists[index]; + + OPEN_DISPS(globalCtx->state.gfxCtx); + + if (flags & 1) { + gSPSegment(POLY_OPA_DISP++, 0x0C, dList); } -} -void func_80131E58(GlobalContext* ctxt, u32 param_2, u32 flags) { - Gfx* dl = D_801C3C80[param_2]; + if (flags & 2) { + gSPSegment(POLY_XLU_DISP++, 0x0C, dList); + } - { - GraphicsContext* gfxCtx = ctxt->state.gfxCtx; - if (flags & 1) { - gSPSegment(gfxCtx->polyOpa.p++, 12, dl); - } + CLOSE_DISPS(globalCtx->state.gfxCtx); +} + +/** + * Although this function is unused, it will store a displaylist in the provided segment ID that sets the culling mode + * from the index provided. + */ +void Scene_SetCullFlag(GlobalContext* globalCtx, s32 index, u32 flags) { + static Gfx setBackCullDL[] = { + gsSPSetGeometryMode(G_CULL_BACK), + gsSPEndDisplayList(), + }; + static Gfx setFrontCullDL[] = { + gsSPSetGeometryMode(G_CULL_FRONT), + gsSPEndDisplayList(), + }; + static Gfx* dLists[] = { + setBackCullDL, + setFrontCullDL, + }; + Gfx* dList = dLists[index]; + + OPEN_DISPS(globalCtx->state.gfxCtx); + + if (flags & 1) { + gSPSegment(POLY_OPA_DISP++, 0x0C, dList); + } - if (flags & 2) { - gSPSegment(gfxCtx->polyXlu.p++, 12, dl); - } + if (flags & 2) { + gSPSegment(POLY_XLU_DISP++, 0x0C, dList); } + + CLOSE_DISPS(globalCtx->state.gfxCtx); } -void SceneProc_DrawSceneConfig5(GlobalContext* ctxt) { - u32 dlIndex; +/** + * Scene Draw Config 5: + * This config is unused, and its purpose is unknown. + */ +void Scene_DrawConfig5(GlobalContext* globalCtx) { + u32 dListIndex; u32 alpha; - GraphicsContext* gfxCtx; - if (ctxt->roomContext.unk7A[0] != 0) { - dlIndex = 1; - alpha = ctxt->roomContext.unk7A[1]; + if (globalCtx->roomContext.unk7A[0] != 0) { + dListIndex = 1; + alpha = globalCtx->roomContext.unk7A[1]; } else { - dlIndex = 0; - alpha = 0xff; + dListIndex = 0; + alpha = 255; } if (alpha == 0) { - ctxt->roomContext.unk78 = 0; + globalCtx->roomContext.unk78 = 0; } else { - gfxCtx = ctxt->state.gfxCtx; - - ctxt->roomContext.unk78 = 1; + OPEN_DISPS(globalCtx->state.gfxCtx); - SceneProc_DrawAllSceneAnimatedTextures(ctxt, ctxt->sceneTextureAnimations); + globalCtx->roomContext.unk78 = 1; + AnimatedMat_Draw(globalCtx, globalCtx->sceneMaterialAnims); + Scene_SetRenderModeXlu(globalCtx, dListIndex, 3); + gDPSetEnvColor(POLY_OPA_DISP++, 255, 255, 255, alpha); + gDPSetEnvColor(POLY_XLU_DISP++, 255, 255, 255, alpha); - func_80131DF0(ctxt, dlIndex, 3); - - gDPSetEnvColor(gfxCtx->polyOpa.p++, 0xFF, 0xFF, 0xFF, alpha); - gDPSetEnvColor(gfxCtx->polyXlu.p++, 0xFF, 0xFF, 0xFF, alpha); + CLOSE_DISPS(globalCtx->state.gfxCtx); } } -void SceneProc_DrawSceneConfig7(GlobalContext* ctxt) { - SceneProc_DrawAllAnimatedTextures(ctxt, ctxt->sceneTextureAnimations, ctxt->roomContext.unk7A[0]); -} - -void SceneProc_DrawSceneConfig6(GlobalContext* ctxt) { +/** + * Scene Draw Config 7: + * This is a special draw config for Sakon's Hideout, as well as the Music Box House. Its step value is set manually + * rather than always animating like `Scene_DrawConfigMatAnim`. + */ +void Scene_DrawConfigMatAnimManualStep(GlobalContext* globalCtx) { + AnimatedMat_DrawStep(globalCtx, globalCtx->sceneMaterialAnims, globalCtx->roomContext.unk7A[0]); +} + +/** + * Scene Draw Config 6: + * This is a special draw config for Great Bay Temple, which handles both material animations as well as setting the lod + * fraction to a certain value when certain flags are set, which are likely used for the pipes whenever they are + * activated. + */ +void Scene_DrawConfigGreatBayTemple(GlobalContext* globalCtx) { + static Gfx greatBayTempleColorSetDL[] = { + gsDPSetPrimColor(0, 255, 255, 255, 255, 255), + gsSPEndDisplayList(), + }; + s32 lodFrac; s32 i; - Gfx* dlHead; - u32 pad1; - u32 pad2; - GraphicsContext* gfxCtx; - u32 pad3; - u32 pad4; - u32 pad5; - u32 pad6; - Gfx* dl; - - if (Actor_GetSwitchFlag(ctxt,0x33) && - Actor_GetSwitchFlag(ctxt,0x34) && - Actor_GetSwitchFlag(ctxt,0x35) && - Actor_GetSwitchFlag(ctxt,0x36)) { - func_800C3C00(&ctxt->colCtx, 1); - } else { - func_800C3C14(&ctxt->colCtx, 1); - } + Gfx* dListHead; + Gfx* dList; - { - dl = (Gfx*)ctxt->state.gfxCtx->polyOpa.d - 18; - //dl = _g; - ctxt->state.gfxCtx->polyOpa.d = dl; + if (Flags_GetSwitch(globalCtx, 0x33) && Flags_GetSwitch(globalCtx, 0x34) && Flags_GetSwitch(globalCtx, 0x35) && + Flags_GetSwitch(globalCtx, 0x36)) { + func_800C3C00(&globalCtx->colCtx, 1); + } else { + func_800C3C14(&globalCtx->colCtx, 1); } - SceneProc_DrawAllSceneAnimatedTextures(ctxt, ctxt->sceneTextureAnimations); - - gfxCtx = ctxt->state.gfxCtx; - dlHead = dl; - for (i = 0; i < 9; i++, dlHead += 2) { - u32 lodFrac = 0; - - bcopy(D_801C3C88, dlHead, sizeof(Gfx[2])); - - switch(i) { - case 0: - if (Actor_GetSwitchFlag(ctxt,0x33) && - Actor_GetSwitchFlag(ctxt,0x34) && - Actor_GetSwitchFlag(ctxt,0x35) && - Actor_GetSwitchFlag(ctxt,0x36)) { - lodFrac = 0xFF; - } - break; - case 1: - if (Actor_GetSwitchFlag(ctxt,0x37)) { - lodFrac = 0x44; - } - break; - case 2: - if (Actor_GetSwitchFlag(ctxt,0x37) && - Actor_GetSwitchFlag(ctxt,0x38)) { - lodFrac = 0x44; - } - break; - case 3: - if (Actor_GetSwitchFlag(ctxt,0x37) && - Actor_GetSwitchFlag(ctxt,0x38) && - Actor_GetSwitchFlag(ctxt,0x39)) { - lodFrac = 0x44; - } - break; - case 4: - if (!Actor_GetSwitchFlag(ctxt,0x33)) { - lodFrac = 0x44; - } - break; - case 5: - if (Actor_GetSwitchFlag(ctxt,0x34)) { - lodFrac = 0x44; - } - break; - case 6: - if (Actor_GetSwitchFlag(ctxt,0x34) && - Actor_GetSwitchFlag(ctxt,0x35)) { - lodFrac = 0x44; - } - break; - case 7: - if (Actor_GetSwitchFlag(ctxt,0x34) && - Actor_GetSwitchFlag(ctxt,0x35) && - Actor_GetSwitchFlag(ctxt,0x36)) { - lodFrac = 0x44; - } - break; - case 8: - if (Actor_GetSwitchFlag(ctxt,0x3A)) { - lodFrac = 0x44; - } - break; + dList = (Gfx*)GRAPH_ALLOC(globalCtx->state.gfxCtx, sizeof(Gfx) * 18); + + AnimatedMat_Draw(globalCtx, globalCtx->sceneMaterialAnims); + + OPEN_DISPS(globalCtx->state.gfxCtx); + + for (dListHead = dList, i = 0; i < 9; i++, dListHead += 2) { + lodFrac = 0; + + bcopy(greatBayTempleColorSetDL, dListHead, sizeof(greatBayTempleColorSetDL)); + + switch (i) { + case 0: + if (Flags_GetSwitch(globalCtx, 0x33) && Flags_GetSwitch(globalCtx, 0x34) && + Flags_GetSwitch(globalCtx, 0x35) && Flags_GetSwitch(globalCtx, 0x36)) { + lodFrac = 255; + } + break; + case 1: + if (Flags_GetSwitch(globalCtx, 0x37)) { + lodFrac = 68; + } + break; + case 2: + if (Flags_GetSwitch(globalCtx, 0x37) && Flags_GetSwitch(globalCtx, 0x38)) { + lodFrac = 68; + } + break; + case 3: + if (Flags_GetSwitch(globalCtx, 0x37) && Flags_GetSwitch(globalCtx, 0x38) && + Flags_GetSwitch(globalCtx, 0x39)) { + lodFrac = 68; + } + break; + case 4: + if (!(Flags_GetSwitch(globalCtx, 0x33))) { + lodFrac = 68; + } + break; + case 5: + if (Flags_GetSwitch(globalCtx, 0x34)) { + lodFrac = 68; + } + break; + case 6: + if (Flags_GetSwitch(globalCtx, 0x34) && Flags_GetSwitch(globalCtx, 0x35)) { + lodFrac = 68; + } + break; + case 7: + if (Flags_GetSwitch(globalCtx, 0x34) && Flags_GetSwitch(globalCtx, 0x35) && + Flags_GetSwitch(globalCtx, 0x36)) { + lodFrac = 68; + } + break; + case 8: + if (Flags_GetSwitch(globalCtx, 0x3A)) { + lodFrac = 68; + } + break; } - gDPSetPrimColor(dlHead, 0, lodFrac, 0xFF, 0xFF, 0xFF, 0xFF); + gDPSetPrimColor(dListHead, 0, lodFrac, 255, 255, 255, 255); } - gSPSegment(gfxCtx->polyOpa.p++, 6, dl); - gSPSegment(gfxCtx->polyXlu.p++, 6, dl); + gSPSegment(POLY_OPA_DISP++, 0x06, dList); + gSPSegment(POLY_XLU_DISP++, 0x06, dList); + + CLOSE_DISPS(globalCtx->state.gfxCtx); } diff --git a/src/code/z_scene_table.c b/src/code/z_scene_table.c new file mode 100644 index 000000000..ef6bdaafd --- /dev/null +++ b/src/code/z_scene_table.c @@ -0,0 +1,2818 @@ +#include <ultra64.h> +#include <global.h> + +#define SCENE_ENTRY(name, textId, config) \ + { (u32) _##name##SegmentRomStart, (u32)_##name##SegmentRomEnd, textId, 0, config } + +#define SCENE_ENTRY_NONE() \ + { 0, 0, 0, 0, 0 } + +SceneTableEntry gSceneTable[] = { + SCENE_ENTRY(Z2_20SICHITAI2, 0x0116, SCENE_DRAW_CFG_MAT_ANIM), + SCENE_ENTRY_NONE(), + SCENE_ENTRY_NONE(), + SCENE_ENTRY_NONE(), + SCENE_ENTRY_NONE(), + SCENE_ENTRY_NONE(), + SCENE_ENTRY_NONE(), + SCENE_ENTRY(KAKUSIANA, 0x0000, SCENE_DRAW_CFG_MAT_ANIM), + SCENE_ENTRY(SPOT00, 0x0000, SCENE_DRAW_CFG_NOTHING), + SCENE_ENTRY_NONE(), + SCENE_ENTRY(Z2_WITCH_SHOP, 0x011A, SCENE_DRAW_CFG_MAT_ANIM), + SCENE_ENTRY(Z2_LAST_BS, 0x0000, SCENE_DRAW_CFG_MAT_ANIM), + SCENE_ENTRY(Z2_HAKASHITA, 0x0113, SCENE_DRAW_CFG_MAT_ANIM), + SCENE_ENTRY(Z2_AYASHIISHOP, 0x010E, SCENE_DRAW_CFG_MAT_ANIM), + SCENE_ENTRY_NONE(), + SCENE_ENTRY_NONE(), + SCENE_ENTRY(Z2_OMOYA, 0x0132, SCENE_DRAW_CFG_DEFAULT), + SCENE_ENTRY(Z2_BOWLING, 0x0108, SCENE_DRAW_CFG_MAT_ANIM), + SCENE_ENTRY(Z2_SONCHONOIE, 0x010B, SCENE_DRAW_CFG_DEFAULT), + SCENE_ENTRY(Z2_IKANA, 0x0141, SCENE_DRAW_CFG_MAT_ANIM), + SCENE_ENTRY(Z2_KAIZOKU, 0x0000, SCENE_DRAW_CFG_MAT_ANIM), + SCENE_ENTRY(Z2_MILK_BAR, 0x010C, SCENE_DRAW_CFG_MAT_ANIM), + SCENE_ENTRY(Z2_INISIE_N, 0x0144, SCENE_DRAW_CFG_MAT_ANIM), + SCENE_ENTRY(Z2_TAKARAYA, 0x0109, SCENE_DRAW_CFG_DEFAULT), + SCENE_ENTRY(Z2_INISIE_R, 0x0144, SCENE_DRAW_CFG_MAT_ANIM), + SCENE_ENTRY(Z2_OKUJOU, 0x0000, SCENE_DRAW_CFG_DEFAULT), + SCENE_ENTRY(Z2_OPENINGDAN, 0x0000, SCENE_DRAW_CFG_MAT_ANIM), + SCENE_ENTRY(Z2_MITURIN, 0x011F, SCENE_DRAW_CFG_MAT_ANIM), + SCENE_ENTRY(Z2_13HUBUKINOMITI, 0x0000, SCENE_DRAW_CFG_DEFAULT), + SCENE_ENTRY(Z2_CASTLE, 0x0142, SCENE_DRAW_CFG_MAT_ANIM), + SCENE_ENTRY(Z2_DEKUTES, 0x0000, SCENE_DRAW_CFG_MAT_ANIM), + SCENE_ENTRY(Z2_MITURIN_BS, 0x0000, SCENE_DRAW_CFG_DEFAULT), + SCENE_ENTRY(Z2_SYATEKI_MIZU, 0x0107, SCENE_DRAW_CFG_MAT_ANIM), + SCENE_ENTRY(Z2_HAKUGIN, 0x012B, SCENE_DRAW_CFG_MAT_ANIM), + SCENE_ENTRY(Z2_ROMANYMAE, 0x0149, SCENE_DRAW_CFG_DEFAULT), + SCENE_ENTRY(Z2_PIRATE, 0x0000, SCENE_DRAW_CFG_MAT_ANIM), + SCENE_ENTRY(Z2_SYATEKI_MORI, 0x011B, SCENE_DRAW_CFG_DEFAULT), + SCENE_ENTRY(Z2_SINKAI, 0x0135, SCENE_DRAW_CFG_MAT_ANIM), + SCENE_ENTRY(Z2_YOUSEI_IZUMI, 0x013E, SCENE_DRAW_CFG_MAT_ANIM), + SCENE_ENTRY(Z2_KINSTA1, 0x011E, SCENE_DRAW_CFG_MAT_ANIM), + SCENE_ENTRY(Z2_KINDAN2, 0x013F, SCENE_DRAW_CFG_MAT_ANIM), + SCENE_ENTRY(Z2_TENMON_DAI, 0x0114, SCENE_DRAW_CFG_MAT_ANIM), + SCENE_ENTRY(Z2_LAST_DEKU, 0x0000, SCENE_DRAW_CFG_DEFAULT), + SCENE_ENTRY(Z2_22DEKUCITY, 0x0118, SCENE_DRAW_CFG_MAT_ANIM), + SCENE_ENTRY(Z2_KAJIYA, 0x0127, SCENE_DRAW_CFG_MAT_ANIM), + SCENE_ENTRY(Z2_00KEIKOKU, 0x0100, SCENE_DRAW_CFG_MAT_ANIM), + SCENE_ENTRY(Z2_POSTHOUSE, 0x0111, SCENE_DRAW_CFG_DEFAULT), + SCENE_ENTRY(Z2_LABO, 0x013A, SCENE_DRAW_CFG_MAT_ANIM), + SCENE_ENTRY(Z2_DANPEI2TEST, 0x0113, SCENE_DRAW_CFG_MAT_ANIM), + SCENE_ENTRY_NONE(), + SCENE_ENTRY(Z2_16GORON_HOUSE, 0x0124, SCENE_DRAW_CFG_DEFAULT), + SCENE_ENTRY(Z2_33ZORACITY, 0x0136, SCENE_DRAW_CFG_MAT_ANIM), + SCENE_ENTRY(Z2_8ITEMSHOP, 0x010F, SCENE_DRAW_CFG_MAT_ANIM), + SCENE_ENTRY(Z2_F01, 0x012E, SCENE_DRAW_CFG_DEFAULT), + SCENE_ENTRY(Z2_INISIE_BS, 0x0000, SCENE_DRAW_CFG_MAT_ANIM), + SCENE_ENTRY(Z2_30GYOSON, 0x0134, SCENE_DRAW_CFG_MAT_ANIM), + SCENE_ENTRY(Z2_31MISAKI, 0x0134, SCENE_DRAW_CFG_MAT_ANIM), + SCENE_ENTRY(Z2_TAKARAKUJI, 0x0112, SCENE_DRAW_CFG_DEFAULT), + SCENE_ENTRY_NONE(), + SCENE_ENTRY(Z2_TORIDE, 0x0138, SCENE_DRAW_CFG_MAT_ANIM), + SCENE_ENTRY(Z2_FISHERMAN, 0x013B, SCENE_DRAW_CFG_MAT_ANIM), + SCENE_ENTRY(Z2_GORONSHOP, 0x0129, SCENE_DRAW_CFG_MAT_ANIM), + SCENE_ENTRY(Z2_DEKU_KING, 0x011C, SCENE_DRAW_CFG_MAT_ANIM), + SCENE_ENTRY(Z2_LAST_GORON, 0x0000, SCENE_DRAW_CFG_DEFAULT), + SCENE_ENTRY(Z2_24KEMONOMITI, 0x0000, SCENE_DRAW_CFG_MAT_ANIM), + SCENE_ENTRY(Z2_F01_B, 0x0130, SCENE_DRAW_CFG_DEFAULT), + SCENE_ENTRY(Z2_F01C, 0x012F, SCENE_DRAW_CFG_DEFAULT), + SCENE_ENTRY(Z2_BOTI, 0x0106, SCENE_DRAW_CFG_DEFAULT), + SCENE_ENTRY(Z2_HAKUGIN_BS, 0x0000, SCENE_DRAW_CFG_DEFAULT), + SCENE_ENTRY(Z2_20SICHITAI, 0x0116, SCENE_DRAW_CFG_MAT_ANIM), + SCENE_ENTRY(Z2_21MITURINMAE, 0x0117, SCENE_DRAW_CFG_MAT_ANIM), + SCENE_ENTRY(Z2_LAST_ZORA, 0x0000, SCENE_DRAW_CFG_MAT_ANIM), + SCENE_ENTRY(Z2_11GORONNOSATO2, 0x0123, SCENE_DRAW_CFG_MAT_ANIM), + SCENE_ENTRY(Z2_SEA, 0x013D, SCENE_DRAW_CFG_GREAT_BAY_TEMPLE), + SCENE_ENTRY(Z2_35TAKI, 0x0137, SCENE_DRAW_CFG_MAT_ANIM), + SCENE_ENTRY(Z2_REDEAD, 0x0145, SCENE_DRAW_CFG_MAT_ANIM), + SCENE_ENTRY(Z2_BANDROOM, 0x0000, SCENE_DRAW_CFG_MAT_ANIM), + SCENE_ENTRY(Z2_11GORONNOSATO, 0x0123, SCENE_DRAW_CFG_MAT_ANIM), + SCENE_ENTRY(Z2_GORON_HAKA, 0x012A, SCENE_DRAW_CFG_MAT_ANIM), + SCENE_ENTRY(Z2_SECOM, 0x0143, SCENE_DRAW_CFG_MAT_ANIM_MANUAL_STEP), + SCENE_ENTRY(Z2_10YUKIYAMANOMURA, 0x0122, SCENE_DRAW_CFG_MAT_ANIM), + SCENE_ENTRY(Z2_TOUGITES, 0x0146, SCENE_DRAW_CFG_DEFAULT), + SCENE_ENTRY(Z2_DANPEI, 0x0120, SCENE_DRAW_CFG_MAT_ANIM), + SCENE_ENTRY(Z2_IKANAMAE, 0x0000, SCENE_DRAW_CFG_DEFAULT), + SCENE_ENTRY(Z2_DOUJOU, 0x0110, SCENE_DRAW_CFG_DEFAULT), + SCENE_ENTRY(Z2_MUSICHOUSE, 0x0147, SCENE_DRAW_CFG_MAT_ANIM_MANUAL_STEP), + SCENE_ENTRY(Z2_IKNINSIDE, 0x0142, SCENE_DRAW_CFG_MAT_ANIM), + SCENE_ENTRY(Z2_MAP_SHOP, 0x0119, SCENE_DRAW_CFG_DEFAULT), + SCENE_ENTRY(Z2_F40, 0x0140, SCENE_DRAW_CFG_DEFAULT), + SCENE_ENTRY(Z2_F41, 0x0000, SCENE_DRAW_CFG_DEFAULT), + SCENE_ENTRY(Z2_10YUKIYAMANOMURA2, 0x0122, SCENE_DRAW_CFG_MAT_ANIM), + SCENE_ENTRY(Z2_14YUKIDAMANOMITI, 0x0000, SCENE_DRAW_CFG_DEFAULT), + SCENE_ENTRY(Z2_12HAKUGINMAE, 0x0125, SCENE_DRAW_CFG_MAT_ANIM), + SCENE_ENTRY(Z2_17SETUGEN, 0x0000, SCENE_DRAW_CFG_MAT_ANIM), + SCENE_ENTRY(Z2_17SETUGEN2, 0x0000, SCENE_DRAW_CFG_MAT_ANIM), + SCENE_ENTRY(Z2_SEA_BS, 0x0000, SCENE_DRAW_CFG_MAT_ANIM), + SCENE_ENTRY(Z2_RANDOM, 0x012C, SCENE_DRAW_CFG_MAT_ANIM), + SCENE_ENTRY(Z2_YADOYA, 0x010A, SCENE_DRAW_CFG_MAT_ANIM), + SCENE_ENTRY(Z2_KONPEKI_ENT, 0x0139, SCENE_DRAW_CFG_MAT_ANIM), + SCENE_ENTRY(Z2_INSIDETOWER, 0x0000, SCENE_DRAW_CFG_MAT_ANIM), + SCENE_ENTRY(Z2_26SARUNOMORI, 0x011D, SCENE_DRAW_CFG_MAT_ANIM), + SCENE_ENTRY(Z2_LOST_WOODS, 0x0000, SCENE_DRAW_CFG_MAT_ANIM), + SCENE_ENTRY(Z2_LAST_LINK, 0x0000, SCENE_DRAW_CFG_DEFAULT), + SCENE_ENTRY(Z2_SOUGEN, 0x0000, SCENE_DRAW_CFG_DEFAULT), + SCENE_ENTRY(Z2_BOMYA, 0x010D, SCENE_DRAW_CFG_DEFAULT), + SCENE_ENTRY(Z2_KYOJINNOMA, 0x0000, SCENE_DRAW_CFG_MAT_ANIM), + SCENE_ENTRY(Z2_KOEPONARACE, 0x0131, SCENE_DRAW_CFG_MAT_ANIM), + SCENE_ENTRY(Z2_GORONRACE, 0x0126, SCENE_DRAW_CFG_DEFAULT), + SCENE_ENTRY(Z2_TOWN, 0x0101, SCENE_DRAW_CFG_DEFAULT), + SCENE_ENTRY(Z2_ICHIBA, 0x0102, SCENE_DRAW_CFG_DEFAULT), + SCENE_ENTRY(Z2_BACKTOWN, 0x0103, SCENE_DRAW_CFG_DEFAULT), + SCENE_ENTRY(Z2_CLOCKTOWER, 0x0104, SCENE_DRAW_CFG_MAT_ANIM), + SCENE_ENTRY(Z2_ALLEY, 0x0105, SCENE_DRAW_CFG_MAT_ANIM), +}; + +static EntranceTableEntry sMayorsResidenceEntrance0[] = { + { 0x12, 0x00, 0x4102 }, +}; + +static EntranceTableEntry sMayorsResidenceEntrance1[] = { + { 0x12, 0x01, 0x4102 }, +}; + +static EntranceTableEntry sMayorsResidenceEntrance2[] = { + { 0x12, 0x02, 0x4102 }, +}; + +static EntranceTableEntry* sMayorsResidenceEntranceTable[] = { + sMayorsResidenceEntrance0, + sMayorsResidenceEntrance1, + sMayorsResidenceEntrance2, +}; + +static EntranceTableEntry sMajorasLairEntrance0[] = { + { 0xF5, 0x00, 0x0387 }, +}; + +static EntranceTableEntry* sMajorasLairEntranceTable[] = { + sMajorasLairEntrance0, +}; + +static EntranceTableEntry sMagicHagsPotionShopEntrance0[] = { + { 0x0A, 0x00, 0x4102 }, +}; + +static EntranceTableEntry* sMagicHagsPotionShopEntranceTable[] = { + sMagicHagsPotionShopEntrance0, +}; + +static EntranceTableEntry sRanchHouseEntrance0[] = { + { 0x10, 0x00, 0x0102 }, +}; + +static EntranceTableEntry sRanchHouseEntrance1[] = { + { 0x10, 0x01, 0x4102 }, +}; + +static EntranceTableEntry* sRanchHouseEntranceTable[] = { + sRanchHouseEntrance0, + sRanchHouseEntrance1, +}; + +static EntranceTableEntry sHoneyAndDarlingsShopEntrance0[] = { + { 0x11, 0x00, 0x4102 }, +}; + +static EntranceTableEntry* sHoneyAndDarlingsShopEntranceTable[] = { + sHoneyAndDarlingsShopEntrance0, +}; + +static EntranceTableEntry sBeneathTheGraveryardEntrance0[] = { + { 0xF4, 0x00, 0x4102 }, +}; + +static EntranceTableEntry sBeneathTheGraveryardEntrance1[] = { + { 0xF4, 0x01, 0x4102 }, +}; + +static EntranceTableEntry* sBeneathTheGraveryardEntranceTable[] = { + sBeneathTheGraveryardEntrance0, + sBeneathTheGraveryardEntrance1, +}; + +static EntranceTableEntry sSouthernSwampClearedEntrance0[] = { + { 0x00, 0x00, 0xCA14 }, +}; + +static EntranceTableEntry sSouthernSwampClearedEntrance1[] = { + { 0x00, 0x01, 0x4102 }, +}; + +static EntranceTableEntry sSouthernSwampClearedEntrance2[] = { + { 0x00, 0x02, 0xC102 }, +}; + +static EntranceTableEntry sSouthernSwampClearedEntrance3[] = { + { 0x00, 0x03, 0x4102 }, +}; + +static EntranceTableEntry sSouthernSwampClearedEntrance4[] = { + { 0x00, 0x04, 0x4102 }, +}; + +static EntranceTableEntry sSouthernSwampClearedEntrance5[] = { + { 0x00, 0x05, 0x4102 }, +}; + +static EntranceTableEntry sSouthernSwampClearedEntrance6[] = { + { 0x00, 0x06, 0x0102 }, +}; + +static EntranceTableEntry sSouthernSwampClearedEntrance7[] = { + { 0x00, 0x07, 0x4102 }, +}; + +static EntranceTableEntry sSouthernSwampClearedEntrance8[] = { + { 0x00, 0x08, 0x4102 }, +}; + +static EntranceTableEntry sSouthernSwampClearedEntrance9[] = { + { 0x00, 0x09, 0x4A14 }, +}; + +static EntranceTableEntry sSouthernSwampClearedEntrance10[] = { + { 0x00, 0x0A, 0x4A14 }, +}; + +static EntranceTableEntry* sSouthernSwampClearedEntranceTable[] = { + sSouthernSwampClearedEntrance0, sSouthernSwampClearedEntrance1, sSouthernSwampClearedEntrance2, + sSouthernSwampClearedEntrance3, sSouthernSwampClearedEntrance4, sSouthernSwampClearedEntrance5, + sSouthernSwampClearedEntrance6, sSouthernSwampClearedEntrance7, sSouthernSwampClearedEntrance8, + sSouthernSwampClearedEntrance9, sSouthernSwampClearedEntrance10, +}; + +static EntranceTableEntry sCuriosityShopEntrance0[] = { + { 0x0D, 0x00, 0x4102 }, +}; + +static EntranceTableEntry sCuriosityShopEntrance1[] = { + { 0x0D, 0x01, 0x0102 }, +}; + +static EntranceTableEntry sCuriosityShopEntrance2[] = { + { 0x0D, 0x02, 0x8A95 }, +}; + +static EntranceTableEntry sCuriosityShopEntrance3[] = { + { 0x0D, 0x03, 0x8102 }, +}; + +static EntranceTableEntry* sCuriosityShopEntranceTable[] = { + sCuriosityShopEntrance0, + sCuriosityShopEntrance1, + sCuriosityShopEntrance2, + sCuriosityShopEntrance3, +}; + +static EntranceTableEntry sIkanaCanyonEntrance0[] = { + { 0x13, 0x00, 0xCA14 }, { 0x13, 0x00, 0x8A14 }, { 0x13, 0x00, 0x0A14 }, + { 0x13, 0x00, 0x4A14 }, { 0x13, 0x00, 0x8102 }, +}; + +static EntranceTableEntry sIkanaCanyonEntrance1[] = { + { 0x13, 0x01, 0x4102 }, + { 0x13, 0x01, 0x4102 }, + { 0x13, 0x01, 0xCA14 }, + { 0x13, 0x01, 0x4102 }, +}; + +static EntranceTableEntry sIkanaCanyonEntrance2[] = { + { 0x13, 0x02, 0x4102 }, + { 0x13, 0x02, 0x4102 }, + { 0x13, 0x02, 0x4102 }, + { 0x13, 0x02, 0x4102 }, +}; + +static EntranceTableEntry sIkanaCanyonEntrance3[] = { + { 0x13, 0x03, 0x4102 }, + { 0x13, 0x03, 0x4102 }, + { 0x13, 0x03, 0x4102 }, + { 0x13, 0x03, 0x4102 }, +}; + +static EntranceTableEntry sIkanaCanyonEntrance4[] = { + { 0x13, 0x04, 0x4A14 }, + { 0x13, 0x04, 0x4A14 }, + { 0x13, 0x04, 0x4A14 }, + { 0x13, 0x04, 0x4A14 }, +}; + +static EntranceTableEntry sIkanaCanyonEntrance5[] = { + { 0x13, 0x05, 0x4102 }, + { 0x13, 0x05, 0x4102 }, + { 0x13, 0x05, 0x4102 }, + { 0x13, 0x05, 0x4102 }, +}; + +static EntranceTableEntry sIkanaCanyonEntrance6[] = { + { 0x13, 0x06, 0x4102 }, + { 0x13, 0x06, 0x4102 }, + { 0x13, 0x06, 0x4102 }, + { 0x13, 0x06, 0x4102 }, +}; + +static EntranceTableEntry sIkanaCanyonEntrance7[] = { + { 0x13, 0x07, 0x4A14 }, + { 0x13, 0x07, 0x4A14 }, + { 0x13, 0x07, 0x4A14 }, + { 0x13, 0x07, 0x4A14 }, +}; + +static EntranceTableEntry sIkanaCanyonEntrance8[] = { + { 0x13, 0x08, 0x4102 }, + { 0x13, 0x08, 0x4102 }, + { 0x13, 0x08, 0x4102 }, + { 0x13, 0x08, 0x4102 }, +}; + +static EntranceTableEntry sIkanaCanyonEntrance9[] = { + { 0x13, 0x09, 0x4A14 }, + { 0x13, 0x09, 0x4A14 }, + { 0x13, 0x09, 0x4A14 }, + { 0x13, 0x09, 0x4A14 }, +}; + +static EntranceTableEntry sIkanaCanyonEntrance10[] = { + { 0x13, 0x0A, 0x4A14 }, + { 0x13, 0x0A, 0x4A14 }, + { 0x13, 0x0A, 0x4A14 }, + { 0x13, 0x0A, 0x4A14 }, +}; + +static EntranceTableEntry sIkanaCanyonEntrance11[] = { + { 0x13, 0x0B, 0x4102 }, + { 0x13, 0x0B, 0x4102 }, + { 0x13, 0x0B, 0x4102 }, + { 0x13, 0x0B, 0x4102 }, +}; + +static EntranceTableEntry sIkanaCanyonEntrance12[] = { + { 0x13, 0x0C, 0x4102 }, + { 0x13, 0x0C, 0x4102 }, + { 0x13, 0x0C, 0x4102 }, + { 0x13, 0x0C, 0x4102 }, +}; + +static EntranceTableEntry sIkanaCanyonEntrance13[] = { + { 0x13, 0x0D, 0x8102 }, + { 0x13, 0x0D, 0x8102 }, + { 0x13, 0x0D, 0x8102 }, + { 0x13, 0x0D, 0x8102 }, +}; + +static EntranceTableEntry sIkanaCanyonEntrance14[] = { + { 0x13, 0x0E, 0x8102 }, + { 0x13, 0x0E, 0x8102 }, + { 0x13, 0x0E, 0x8102 }, + { 0x13, 0x0E, 0x8102 }, +}; + +static EntranceTableEntry sIkanaCanyonEntrance15[] = { + { 0x13, 0x0F, 0x8102 }, + { 0x13, 0x0F, 0x8102 }, + { 0x13, 0x0F, 0x8102 }, + { 0x13, 0x0F, 0x0183 }, +}; + +static EntranceTableEntry* sIkanaCanyonEntranceTable[] = { + sIkanaCanyonEntrance0, sIkanaCanyonEntrance1, sIkanaCanyonEntrance2, sIkanaCanyonEntrance3, + sIkanaCanyonEntrance4, sIkanaCanyonEntrance5, sIkanaCanyonEntrance6, sIkanaCanyonEntrance7, + sIkanaCanyonEntrance8, sIkanaCanyonEntrance9, sIkanaCanyonEntrance10, sIkanaCanyonEntrance11, + sIkanaCanyonEntrance12, sIkanaCanyonEntrance13, sIkanaCanyonEntrance14, sIkanaCanyonEntrance15, +}; + +static EntranceTableEntry sPiratesFortressEntrance0[] = { + { 0x14, 0x00, 0x8102 }, + { 0x14, 0x00, 0x8102 }, + { 0x14, 0x00, 0x8102 }, +}; + +static EntranceTableEntry sPiratesFortressEntrance1[] = { + { 0x14, 0x01, 0x8102 }, + { 0x14, 0x01, 0x8102 }, +}; + +static EntranceTableEntry sPiratesFortressEntrance2[] = { + { 0x14, 0x02, 0x8102 }, +}; + +static EntranceTableEntry sPiratesFortressEntrance3[] = { + { 0x14, 0x03, 0x8102 }, +}; + +static EntranceTableEntry sPiratesFortressEntrance4[] = { + { 0x14, 0x04, 0x8102 }, +}; + +static EntranceTableEntry sPiratesFortressEntrance5[] = { + { 0x14, 0x05, 0x8102 }, +}; + +static EntranceTableEntry sPiratesFortressEntrance6[] = { + { 0x14, 0x06, 0x8102 }, +}; + +static EntranceTableEntry sPiratesFortressEntrance7[] = { + { 0x14, 0x07, 0x8102 }, +}; + +static EntranceTableEntry sPiratesFortressEntrance8[] = { + { 0x14, 0x08, 0x8102 }, +}; + +static EntranceTableEntry sPiratesFortressEntrance9[] = { + { 0x14, 0x09, 0x8102 }, +}; + +static EntranceTableEntry sPiratesFortressEntrance10[] = { + { 0x14, 0x0A, 0x8A95 }, +}; + +static EntranceTableEntry sPiratesFortressEntrance11[] = { + { 0x14, 0x0B, 0x8102 }, +}; + +static EntranceTableEntry sPiratesFortressEntrance12[] = { + { 0x14, 0x0C, 0x8102 }, +}; + +static EntranceTableEntry sPiratesFortressEntrance13[] = { + { 0x14, 0x0D, 0x8102 }, +}; + +static EntranceTableEntry sPiratesFortressEntrance14[] = { + { 0x14, 0x0E, 0x8102 }, +}; + +static EntranceTableEntry* sPiratesFortressEntranceTable[] = { + sPiratesFortressEntrance0, sPiratesFortressEntrance1, sPiratesFortressEntrance2, sPiratesFortressEntrance3, + sPiratesFortressEntrance4, sPiratesFortressEntrance5, sPiratesFortressEntrance6, sPiratesFortressEntrance7, + sPiratesFortressEntrance8, sPiratesFortressEntrance9, sPiratesFortressEntrance10, sPiratesFortressEntrance11, + sPiratesFortressEntrance12, sPiratesFortressEntrance13, sPiratesFortressEntrance14, +}; + +static EntranceTableEntry sMilkBarEntrance0[] = { + { 0x15, 0x00, 0x4102 }, { 0x15, 0x00, 0x8102 }, { 0x15, 0x00, 0x8102 }, + { 0x15, 0x00, 0x8102 }, { 0x15, 0x00, 0x8102 }, +}; + +static EntranceTableEntry* sMilkBarEntranceTable[] = { + sMilkBarEntrance0, +}; + +static EntranceTableEntry sStoneTowerTempleEntrance0[] = { + { 0xEA, 0x00, 0xC102 }, +}; + +static EntranceTableEntry sStoneTowerTempleEntrance1[] = { + { 0xEA, 0x01, 0x4102 }, +}; + +static EntranceTableEntry* sStoneTowerTempleEntranceTable[] = { + sStoneTowerTempleEntrance0, + sStoneTowerTempleEntrance1, +}; + +static EntranceTableEntry sTreasureChestShopEntrance0[] = { + { 0x17, 0x00, 0x4102 }, +}; + +static EntranceTableEntry sTreasureChestShopEntrance1[] = { + { 0x17, 0x01, 0x0102 }, +}; + +static EntranceTableEntry* sTreasureChestShopEntranceTable[] = { + sTreasureChestShopEntrance0, + sTreasureChestShopEntrance1, +}; + +static EntranceTableEntry sStoneTowerTempleReversedEntrance0[] = { + { 0xE8, 0x00, 0xC102 }, +}; + +static EntranceTableEntry sStoneTowerTempleReversedEntrance1[] = { + { 0xE8, 0x01, 0x8102 }, +}; + +static EntranceTableEntry sStoneTowerTempleReversedEntrance2[] = { + { 0xE8, 0x02, 0x8102 }, +}; + +static EntranceTableEntry* sStoneTowerTempleReversedEntranceTable[] = { + sStoneTowerTempleReversedEntrance0, + sStoneTowerTempleReversedEntrance1, + sStoneTowerTempleReversedEntrance2, +}; + +static EntranceTableEntry sClockTowerRooftopEntrance0[] = { + { 0xE7, 0x00, 0x0102 }, + { 0xE7, 0x00, 0x8102 }, + { 0xE7, 0x00, 0x0102 }, + { 0xE7, 0x00, 0x0102 }, +}; + +static EntranceTableEntry sClockTowerRooftopEntrance1[] = { + { 0xE7, 0x01, 0x0102 }, + { 0xE7, 0x01, 0x0102 }, + { 0xE7, 0x01, 0x0102 }, +}; + +static EntranceTableEntry sClockTowerRooftopEntrance2[] = { + { 0xE7, 0x02, 0x858B }, + { 0xE7, 0x02, 0x858B }, + { 0xE7, 0x02, 0x8102 }, +}; + +static EntranceTableEntry* sClockTowerRooftopEntranceTable[] = { + sClockTowerRooftopEntrance0, + sClockTowerRooftopEntrance1, + sClockTowerRooftopEntrance2, +}; + +static EntranceTableEntry sOpeningDungeonEntrance0[] = { + { 0xE6, 0x00, 0x0102 }, + { 0xE6, 0x00, 0x8102 }, +}; + +static EntranceTableEntry sOpeningDungeonEntrance1[] = { + { 0xE6, 0x01, 0x0102 }, +}; + +static EntranceTableEntry sOpeningDungeonEntrance2[] = { + { 0xE6, 0x02, 0x0102 }, +}; + +static EntranceTableEntry sOpeningDungeonEntrance3[] = { + { 0xE6, 0x03, 0x0102 }, +}; + +static EntranceTableEntry sOpeningDungeonEntrance4[] = { + { 0xE6, 0x04, 0x058B }, +}; + +static EntranceTableEntry* sOpeningDungeonEntranceTable[] = { + sOpeningDungeonEntrance0, sOpeningDungeonEntrance1, sOpeningDungeonEntrance2, + sOpeningDungeonEntrance3, sOpeningDungeonEntrance4, +}; + +static EntranceTableEntry sWoodfallTempleEntrance0[] = { + { 0xE5, 0x00, 0x4102 }, +}; + +static EntranceTableEntry sWoodfallTempleEntrance1[] = { + { 0xE5, 0x01, 0x0102 }, +}; + +static EntranceTableEntry sWoodfallTempleEntrance2[] = { + { 0xE5, 0x02, 0x0102 }, +}; + +static EntranceTableEntry* sWoodfallTempleEntranceTable[] = { + sWoodfallTempleEntrance0, + sWoodfallTempleEntrance1, + sWoodfallTempleEntrance2, +}; + +static EntranceTableEntry sPathToMountainVillageEntrance0[] = { + { 0x1C, 0x00, 0x8A14 }, + { 0x1C, 0x00, 0x8A14 }, +}; + +static EntranceTableEntry sPathToMountainVillageEntrance1[] = { + { 0x1C, 0x01, 0x8A14 }, + { 0x1C, 0x01, 0x8A14 }, +}; + +static EntranceTableEntry* sPathToMountainVillageEntranceTable[] = { + sPathToMountainVillageEntrance0, + sPathToMountainVillageEntrance1, +}; + +static EntranceTableEntry sIkanaCastleEntrance0[] = { + { 0xE3, 0x00, 0x4102 }, +}; + +static EntranceTableEntry sIkanaCastleEntrance1[] = { + { 0xE3, 0x01, 0x4102 }, +}; + +static EntranceTableEntry sIkanaCastleEntrance2[] = { + { 0xE3, 0x02, 0x8102 }, +}; + +static EntranceTableEntry sIkanaCastleEntrance3[] = { + { 0xE3, 0x03, 0x8102 }, +}; + +static EntranceTableEntry sIkanaCastleEntrance4[] = { + { 0xE3, 0x04, 0x8102 }, +}; + +static EntranceTableEntry sIkanaCastleEntrance5[] = { + { 0xE3, 0x05, 0x8102 }, +}; + +static EntranceTableEntry sIkanaCastleEntrance6[] = { + { 0xE3, 0x06, 0x8102 }, +}; + +static EntranceTableEntry* sIkanaCastleEntranceTable[] = { + sIkanaCastleEntrance0, sIkanaCastleEntrance1, sIkanaCastleEntrance2, sIkanaCastleEntrance3, + sIkanaCastleEntrance4, sIkanaCastleEntrance5, sIkanaCastleEntrance6, +}; + +static EntranceTableEntry sDekuScrubPlaygroundEntrance0[] = { + { 0x1E, 0x00, 0x0102 }, +}; + +static EntranceTableEntry sDekuScrubPlaygroundEntrance1[] = { + { 0x1E, 0x01, 0x0102 }, +}; + +static EntranceTableEntry* sDekuScrubPlaygroundEntranceTable[] = { + sDekuScrubPlaygroundEntrance0, + sDekuScrubPlaygroundEntrance1, +}; + +static EntranceTableEntry sOdolwasLairEntrance0[] = { + { 0xE1, 0x00, 0x8102 }, +}; + +static EntranceTableEntry* sOdolwasLairEntranceTable[] = { + sOdolwasLairEntrance0, +}; + +static EntranceTableEntry sTownShootingGalleryEntrance0[] = { + { 0x20, 0x00, 0x4102 }, +}; + +static EntranceTableEntry sTownShootingGalleryEntrance1[] = { + { 0x20, 0x01, 0x0102 }, +}; + +static EntranceTableEntry* sTownShootingGalleryEntranceTable[] = { + sTownShootingGalleryEntrance0, + sTownShootingGalleryEntrance1, +}; + +static EntranceTableEntry sSnowheadTempleEntrance0[] = { + { 0xDF, 0x00, 0x4102 }, +}; + +static EntranceTableEntry sSnowheadTempleEntrance1[] = { + { 0xDF, 0x01, 0x4102 }, +}; + +static EntranceTableEntry* sSnowheadTempleEntranceTable[] = { + sSnowheadTempleEntrance0, + sSnowheadTempleEntrance1, +}; + +static EntranceTableEntry sMilkRoadEntrance0[] = { + { 0x22, 0x00, 0xCA14 }, +}; + +static EntranceTableEntry sMilkRoadEntrance1[] = { + { 0x22, 0x01, 0x4A14 }, +}; + +static EntranceTableEntry sMilkRoadEntrance2[] = { + { 0x22, 0x02, 0x4A14 }, +}; + +static EntranceTableEntry sMilkRoadEntrance3[] = { + { 0x22, 0x03, 0x4A14 }, +}; + +static EntranceTableEntry sMilkRoadEntrance4[] = { + { 0x22, 0x04, 0x4A14 }, +}; + +static EntranceTableEntry sMilkRoadEntrance5[] = { + { 0x22, 0x05, 0x0102 }, +}; + +static EntranceTableEntry sMilkRoadEntrance6[] = { + { 0x22, 0x06, 0x0102 }, +}; + +static EntranceTableEntry* sMilkRoadEntranceTable[] = { + sMilkRoadEntrance0, sMilkRoadEntrance1, sMilkRoadEntrance2, sMilkRoadEntrance3, + sMilkRoadEntrance4, sMilkRoadEntrance5, sMilkRoadEntrance6, +}; + +static EntranceTableEntry sPiratesFortressInteriorEntrance0[] = { + { 0x23, 0x00, 0x8102 }, +}; + +static EntranceTableEntry sPiratesFortressInteriorEntrance1[] = { + { 0x23, 0x01, 0x8102 }, +}; + +static EntranceTableEntry sPiratesFortressInteriorEntrance2[] = { + { 0x23, 0x02, 0x8102 }, +}; + +static EntranceTableEntry sPiratesFortressInteriorEntrance3[] = { + { 0x23, 0x03, 0x8102 }, +}; + +static EntranceTableEntry sPiratesFortressInteriorEntrance4[] = { + { 0x23, 0x04, 0x8102 }, +}; + +static EntranceTableEntry sPiratesFortressInteriorEntrance5[] = { + { 0x23, 0x05, 0x8102 }, +}; + +static EntranceTableEntry sPiratesFortressInteriorEntrance6[] = { + { 0x23, 0x06, 0x8102 }, +}; + +static EntranceTableEntry sPiratesFortressInteriorEntrance7[] = { + { 0x23, 0x07, 0x8102 }, +}; + +static EntranceTableEntry sPiratesFortressInteriorEntrance8[] = { + { 0x23, 0x08, 0x8102 }, +}; + +static EntranceTableEntry sPiratesFortressInteriorEntrance9[] = { + { 0x23, 0x09, 0x8993 }, +}; + +static EntranceTableEntry sPiratesFortressInteriorEntrance10[] = { + { 0x23, 0x0A, 0x8102 }, +}; + +static EntranceTableEntry sPiratesFortressInteriorEntrance11[] = { + { 0x23, 0x0B, 0x8102 }, +}; + +static EntranceTableEntry sPiratesFortressInteriorEntrance12[] = { + { 0x23, 0x0C, 0x8102 }, +}; + +static EntranceTableEntry sPiratesFortressInteriorEntrance13[] = { + { 0x23, 0x0D, 0x8102 }, +}; + +static EntranceTableEntry sPiratesFortressInteriorEntrance14[] = { + { 0x23, 0x0E, 0x8102 }, +}; + +static EntranceTableEntry sPiratesFortressInteriorEntrance15[] = { + { 0x23, 0x0F, 0x8102 }, +}; + +static EntranceTableEntry* sPiratesFortressInteriorEntranceTable[] = { + sPiratesFortressInteriorEntrance0, sPiratesFortressInteriorEntrance1, sPiratesFortressInteriorEntrance2, + sPiratesFortressInteriorEntrance3, sPiratesFortressInteriorEntrance4, sPiratesFortressInteriorEntrance5, + sPiratesFortressInteriorEntrance6, sPiratesFortressInteriorEntrance7, sPiratesFortressInteriorEntrance8, + sPiratesFortressInteriorEntrance9, sPiratesFortressInteriorEntrance10, sPiratesFortressInteriorEntrance11, + sPiratesFortressInteriorEntrance12, sPiratesFortressInteriorEntrance13, sPiratesFortressInteriorEntrance14, + sPiratesFortressInteriorEntrance15, +}; + +static EntranceTableEntry sSwampShootingGalleryEntrance0[] = { + { 0x24, 0x00, 0x4102 }, +}; + +static EntranceTableEntry* sSwampShootingGalleryEntranceTable[] = { + sSwampShootingGalleryEntrance0, +}; + +static EntranceTableEntry sPinaccleRockEntrance0[] = { + { 0x25, 0x00, 0x4A14 }, +}; + +static EntranceTableEntry sPinaccleRockEntrance1[] = { + { 0x25, 0x01, 0x0A14 }, +}; + +static EntranceTableEntry* sPinaccleRockEntranceTable[] = { + sPinaccleRockEntrance0, + sPinaccleRockEntrance1, +}; + +static EntranceTableEntry sFairyFountainEntrance0[] = { + { 0x26, 0x00, 0x4102 }, + { 0x26, 0x00, 0x8102 }, +}; + +static EntranceTableEntry sFairyFountainEntrance1[] = { + { 0x26, 0x01, 0x4102 }, +}; + +static EntranceTableEntry sFairyFountainEntrance2[] = { + { 0x26, 0x02, 0x4102 }, +}; + +static EntranceTableEntry sFairyFountainEntrance3[] = { + { 0x26, 0x03, 0x4102 }, +}; + +static EntranceTableEntry sFairyFountainEntrance4[] = { + { 0x26, 0x04, 0x4102 }, +}; + +static EntranceTableEntry sFairyFountainEntrance5[] = { + { 0x26, 0x05, 0x8183 }, +}; + +static EntranceTableEntry sFairyFountainEntrance6[] = { + { 0x26, 0x06, 0x858B }, +}; + +static EntranceTableEntry sFairyFountainEntrance7[] = { + { 0x26, 0x07, 0x858B }, +}; + +static EntranceTableEntry sFairyFountainEntrance8[] = { + { 0x26, 0x08, 0x858B }, +}; + +static EntranceTableEntry sFairyFountainEntrance9[] = { + { 0x26, 0x09, 0x858B }, +}; + +static EntranceTableEntry* sFairyFountainEntranceTable[] = { + sFairyFountainEntrance0, sFairyFountainEntrance1, sFairyFountainEntrance2, sFairyFountainEntrance3, + sFairyFountainEntrance4, sFairyFountainEntrance5, sFairyFountainEntrance6, sFairyFountainEntrance7, + sFairyFountainEntrance8, sFairyFountainEntrance9, +}; + +static EntranceTableEntry sSwampSpiderHouseEntrance0[] = { + { 0xD9, 0x00, 0x4102 }, +}; + +static EntranceTableEntry* sSwampSpiderHouseEntranceTable[] = { + sSwampSpiderHouseEntrance0, +}; + +static EntranceTableEntry sOceansideSpiderHouseEntrance0[] = { + { 0xD8, 0x00, 0x4102 }, +}; + +static EntranceTableEntry* sOceansideSpiderHouseEntranceTable[] = { + sOceansideSpiderHouseEntrance0, +}; + +static EntranceTableEntry sAstralObservatoryEntrance0[] = { + { 0x29, 0x00, 0x0102 }, +}; + +static EntranceTableEntry sAstralObservatoryEntrance1[] = { + { 0x29, 0x01, 0x4102 }, +}; + +static EntranceTableEntry sAstralObservatoryEntrance2[] = { + { 0x29, 0x02, 0x8115 }, +}; + +static EntranceTableEntry* sAstralObservatoryEntranceTable[] = { + sAstralObservatoryEntrance0, + sAstralObservatoryEntrance1, + sAstralObservatoryEntrance2, +}; + +static EntranceTableEntry sMoonDekuTrialEntrance0[] = { + { 0xD6, 0x00, 0x0387 }, +}; + +static EntranceTableEntry* sMoonDekuTrialEntranceTable[] = { + sMoonDekuTrialEntrance0, +}; + +static EntranceTableEntry sDekuPalaceEntrance0[] = { + { 0x2B, 0x00, 0x4102 }, +}; + +static EntranceTableEntry sDekuPalaceEntrance1[] = { + { 0x2B, 0x01, 0x8A14 }, +}; + +static EntranceTableEntry sDekuPalaceEntrance2[] = { + { 0x2B, 0x02, 0xC102 }, +}; + +static EntranceTableEntry sDekuPalaceEntrance3[] = { + { 0x2B, 0x03, 0xC102 }, +}; + +static EntranceTableEntry sDekuPalaceEntrance4[] = { + { 0x2B, 0x04, 0x4102 }, +}; + +static EntranceTableEntry sDekuPalaceEntrance5[] = { + { 0x2B, 0x05, 0x4102 }, +}; + +static EntranceTableEntry sDekuPalaceEntrance6[] = { + { 0x2B, 0x06, 0x4102 }, +}; + +static EntranceTableEntry sDekuPalaceEntrance7[] = { + { 0x2B, 0x07, 0x4102 }, +}; + +static EntranceTableEntry sDekuPalaceEntrance8[] = { + { 0x2B, 0x08, 0x4102 }, +}; + +static EntranceTableEntry sDekuPalaceEntrance9[] = { + { 0x2B, 0x09, 0x4102 }, +}; + +static EntranceTableEntry sDekuPalaceEntrance10[] = { + { 0x2B, 0x0A, 0x4102 }, +}; + +static EntranceTableEntry* sDekuPalaceEntranceTable[] = { + sDekuPalaceEntrance0, sDekuPalaceEntrance1, sDekuPalaceEntrance2, sDekuPalaceEntrance3, + sDekuPalaceEntrance4, sDekuPalaceEntrance5, sDekuPalaceEntrance6, sDekuPalaceEntrance7, + sDekuPalaceEntrance8, sDekuPalaceEntrance9, sDekuPalaceEntrance10, +}; + +static EntranceTableEntry sMountainSmithyEntrance0[] = { + { 0x2C, 0x00, 0x4102 }, +}; + +static EntranceTableEntry* sMountainSmithyEntranceTable[] = { + sMountainSmithyEntrance0, +}; + +static EntranceTableEntry sTerminaFieldEntrance0[] = { + { 0x2D, 0x00, 0x4102 }, { 0xD3, 0x00, 0x0A14 }, { 0xD3, 0x00, 0x0A14 }, { 0xD3, 0x00, 0x058B }, + { 0x2D, 0x00, 0x0A14 }, { 0x2D, 0x00, 0x0A14 }, { 0x2D, 0x00, 0x058B }, { 0x2D, 0x00, 0x8102 }, + { 0x2D, 0x00, 0x0102 }, { 0x2D, 0x00, 0x8102 }, +}; + +static EntranceTableEntry sTerminaFieldEntrance1[] = { + { 0x2D, 0x01, 0xCA14 }, { 0x2D, 0x01, 0x0A14 }, { 0x2D, 0x01, 0x058B }, { 0xD3, 0x01, 0x858B }, + { 0x2D, 0x01, 0x0A14 }, { 0x2D, 0x01, 0x0A14 }, { 0x2D, 0x01, 0x058B }, { 0x2D, 0x01, 0x858B }, + { 0x2D, 0x01, 0x0102 }, { 0x2D, 0x01, 0x8102 }, +}; + +static EntranceTableEntry sTerminaFieldEntrance2[] = { + { 0x2D, 0x02, 0xCA14 }, { 0xD3, 0x02, 0x0A14 }, { 0xD3, 0x02, 0x0A14 }, + { 0xD3, 0x02, 0x058B }, { 0x2D, 0x02, 0x0A14 }, { 0x2D, 0x02, 0x0A14 }, +}; + +static EntranceTableEntry sTerminaFieldEntrance3[] = { + { 0x2D, 0x03, 0xCA14 }, { 0xD3, 0x03, 0x0A14 }, { 0xD3, 0x03, 0x0A14 }, + { 0xD3, 0x03, 0x058B }, { 0x2D, 0x03, 0x0A14 }, { 0x2D, 0x03, 0x0A14 }, +}; + +static EntranceTableEntry sTerminaFieldEntrance4[] = { + { 0x2D, 0x04, 0xCA14 }, { 0xD3, 0x04, 0x0A14 }, { 0xD3, 0x04, 0x0A14 }, + { 0xD3, 0x04, 0x058B }, { 0x2D, 0x04, 0x0A14 }, { 0x2D, 0x04, 0x0A14 }, +}; + +static EntranceTableEntry sTerminaFieldEntrance5[] = { + { 0x2D, 0x05, 0xCA14 }, { 0xD3, 0x05, 0x0A14 }, { 0xD3, 0x05, 0x0A14 }, + { 0xD3, 0x05, 0x858B }, { 0x2D, 0x05, 0x0A14 }, { 0x2D, 0x05, 0x0A14 }, +}; + +static EntranceTableEntry sTerminaFieldEntrance6[] = { + { 0x2D, 0x06, 0x4102 }, { 0xD3, 0x06, 0x0A14 }, { 0xD3, 0x06, 0x0A14 }, + { 0xD3, 0x06, 0x858B }, { 0x2D, 0x06, 0x0A14 }, { 0x2D, 0x06, 0x0A14 }, +}; + +static EntranceTableEntry sTerminaFieldEntrance7[] = { + { 0x2D, 0x07, 0x4102 }, { 0xD3, 0x07, 0x0A14 }, { 0xD3, 0x07, 0x0A14 }, + { 0xD3, 0x07, 0x858B }, { 0x2D, 0x07, 0x0A14 }, { 0x2D, 0x07, 0x0A14 }, +}; + +static EntranceTableEntry sTerminaFieldEntrance8[] = { + { 0x2D, 0x08, 0x4102 }, { 0xD3, 0x08, 0x0A14 }, { 0xD3, 0x08, 0x0A14 }, + { 0xD3, 0x08, 0x058B }, { 0x2D, 0x08, 0x0A14 }, { 0x2D, 0x08, 0x0A14 }, +}; + +static EntranceTableEntry sTerminaFieldEntrance9[] = { + { 0x2D, 0x09, 0x4102 }, { 0xD3, 0x09, 0x0A14 }, { 0xD3, 0x09, 0x0A14 }, + { 0xD3, 0x09, 0x058B }, { 0x2D, 0x09, 0x0A14 }, { 0x2D, 0x09, 0x0A14 }, +}; + +static EntranceTableEntry sTerminaFieldEntrance10[] = { + { 0x2D, 0x0A, 0x8A95 }, { 0xD3, 0x0A, 0x0A14 }, { 0xD3, 0x0A, 0x0A14 }, + { 0xD3, 0x0A, 0x058B }, { 0x2D, 0x0A, 0x0A14 }, { 0x2D, 0x0A, 0x0A95 }, +}; + +static EntranceTableEntry sTerminaFieldEntrance11[] = { + { 0x2D, 0x0B, 0x4A14 }, { 0xD3, 0x0B, 0x0A14 }, { 0xD3, 0x0B, 0x0A14 }, + { 0xD3, 0x0B, 0x058B }, { 0x2D, 0x0B, 0x0A14 }, { 0x2D, 0x0B, 0x0A14 }, +}; + +static EntranceTableEntry sTerminaFieldEntrance12[] = { + { 0x2D, 0x0C, 0x0A14 }, { 0xD3, 0x0C, 0x0A14 }, { 0xD3, 0x0C, 0x0A14 }, + { 0xD3, 0x0C, 0x058B }, { 0x2D, 0x0C, 0x0A14 }, { 0x2D, 0x0C, 0x0A14 }, +}; + +static EntranceTableEntry sTerminaFieldEntrance13[] = { + { 0x2D, 0x0D, 0x0A14 }, { 0xD3, 0x0D, 0x0A14 }, { 0xD3, 0x0D, 0x0A14 }, + { 0xD3, 0x0D, 0x058B }, { 0x2D, 0x0D, 0x0A14 }, { 0x2D, 0x0D, 0x0A14 }, +}; + +static EntranceTableEntry sTerminaFieldEntrance14[] = { + { 0x2D, 0x0E, 0x858B }, +}; + +static EntranceTableEntry* sTerminaFieldEntranceTable[] = { + sTerminaFieldEntrance0, sTerminaFieldEntrance1, sTerminaFieldEntrance2, sTerminaFieldEntrance3, + sTerminaFieldEntrance4, sTerminaFieldEntrance5, sTerminaFieldEntrance6, sTerminaFieldEntrance7, + sTerminaFieldEntrance8, sTerminaFieldEntrance9, sTerminaFieldEntrance10, sTerminaFieldEntrance11, + sTerminaFieldEntrance12, sTerminaFieldEntrance13, sTerminaFieldEntrance14, +}; + +static EntranceTableEntry sPostOfficeEntrance0[] = { + { 0x2E, 0x00, 0x4102 }, +}; + +static EntranceTableEntry* sPostOfficeEntranceTable[] = { + sPostOfficeEntrance0, +}; + +static EntranceTableEntry sMarineResearchLabEntrance0[] = { + { 0x2F, 0x00, 0x4102 }, +}; + +static EntranceTableEntry* sMarineResearchLabEntranceTable[] = { + sMarineResearchLabEntrance0, +}; + +static EntranceTableEntry sDampesHouseEntrance0[] = { + { 0x30, 0x00, 0x4102 }, +}; + +static EntranceTableEntry sDampesHouseEntrance1[] = { + { 0x30, 0x01, 0x0102 }, +}; + +static EntranceTableEntry* sDampesHouseEntranceTable[] = { + sDampesHouseEntrance0, + sDampesHouseEntrance1, +}; + +static EntranceTableEntry sGoronShrineEntrance0[] = { + { 0x32, 0x00, 0x4102 }, + { 0x32, 0x00, 0x4102 }, +}; + +static EntranceTableEntry sGoronShrineEntrance1[] = { + { 0x32, 0x01, 0x0102 }, + { 0x32, 0x01, 0x0102 }, +}; + +static EntranceTableEntry sGoronShrineEntrance2[] = { + { 0x32, 0x02, 0x058B }, + { 0x32, 0x02, 0x058B }, +}; + +static EntranceTableEntry sGoronShrineEntrance3[] = { + { 0x32, 0x03, 0x0102 }, + { 0x32, 0x03, 0x0102 }, +}; + +static EntranceTableEntry* sGoronShrineEntranceTable[] = { + sGoronShrineEntrance0, + sGoronShrineEntrance1, + sGoronShrineEntrance2, + sGoronShrineEntrance3, +}; + +static EntranceTableEntry sZoraHallEntrance0[] = { + { 0x33, 0x00, 0x4993 }, + { 0x33, 0x00, 0x8102 }, +}; + +static EntranceTableEntry sZoraHallEntrance1[] = { + { 0x33, 0x01, 0x4102 }, +}; + +static EntranceTableEntry sZoraHallEntrance2[] = { + { 0x33, 0x02, 0x4102 }, +}; + +static EntranceTableEntry sZoraHallEntrance3[] = { + { 0x33, 0x03, 0x4102 }, +}; + +static EntranceTableEntry sZoraHallEntrance4[] = { + { 0x33, 0x04, 0x4102 }, +}; + +static EntranceTableEntry sZoraHallEntrance5[] = { + { 0x33, 0x05, 0x4102 }, +}; + +static EntranceTableEntry sZoraHallEntrance6[] = { + { 0x33, 0x06, 0x4102 }, +}; + +static EntranceTableEntry sZoraHallEntrance7[] = { + { 0x33, 0x07, 0x058B }, +}; + +static EntranceTableEntry sZoraHallEntrance8[] = { + { 0x33, 0x08, 0x8183 }, +}; + +static EntranceTableEntry* sZoraHallEntranceTable[] = { + sZoraHallEntrance0, sZoraHallEntrance1, sZoraHallEntrance2, sZoraHallEntrance3, sZoraHallEntrance4, + sZoraHallEntrance5, sZoraHallEntrance6, sZoraHallEntrance7, sZoraHallEntrance8, +}; + +static EntranceTableEntry sTradingPostEntrance0[] = { + { 0x34, 0x00, 0x4102 }, +}; + +static EntranceTableEntry sTradingPostEntrance1[] = { + { 0x34, 0x01, 0x0102 }, +}; + +static EntranceTableEntry* sTradingPostEntranceTable[] = { + sTradingPostEntrance0, + sTradingPostEntrance1, +}; + +static EntranceTableEntry sRomaniRanchEntrance0[] = { + { 0x35, 0x00, 0x4A14 }, { 0x35, 0x00, 0x0A14 }, { 0x35, 0x00, 0x8102 }, { 0x35, 0x00, 0x858B }, + { 0x35, 0x00, 0x858B }, { 0x35, 0x00, 0x0102 }, { 0x35, 0x00, 0x8102 }, +}; + +static EntranceTableEntry sRomaniRanchEntrance1[] = { + { 0x35, 0x01, 0x0A14 }, +}; + +static EntranceTableEntry sRomaniRanchEntrance2[] = { + { 0x35, 0x02, 0x0102 }, +}; + +static EntranceTableEntry sRomaniRanchEntrance3[] = { + { 0x35, 0x03, 0x0102 }, +}; + +static EntranceTableEntry sRomaniRanchEntrance4[] = { + { 0x35, 0x04, 0x8102 }, +}; + +static EntranceTableEntry sRomaniRanchEntrance5[] = { + { 0x35, 0x05, 0x8102 }, +}; + +static EntranceTableEntry sRomaniRanchEntrance6[] = { + { 0x35, 0x06, 0x0A14 }, +}; + +static EntranceTableEntry sRomaniRanchEntrance7[] = { + { 0x35, 0x07, 0x0A14 }, +}; + +static EntranceTableEntry sRomaniRanchEntrance8[] = { + { 0x35, 0x08, 0x0A14 }, +}; + +static EntranceTableEntry sRomaniRanchEntrance9[] = { + { 0x35, 0x09, 0x0102 }, +}; + +static EntranceTableEntry sRomaniRanchEntrance10[] = { + { 0x35, 0x0A, 0x0102 }, +}; + +static EntranceTableEntry sRomaniRanchEntrance11[] = { + { 0x35, 0x0B, 0x0102 }, +}; + +static EntranceTableEntry* sRomaniRanchEntranceTable[] = { + sRomaniRanchEntrance0, sRomaniRanchEntrance1, sRomaniRanchEntrance2, sRomaniRanchEntrance3, + sRomaniRanchEntrance4, sRomaniRanchEntrance5, sRomaniRanchEntrance6, sRomaniRanchEntrance7, + sRomaniRanchEntrance8, sRomaniRanchEntrance9, sRomaniRanchEntrance10, sRomaniRanchEntrance11, +}; + +static EntranceTableEntry sTwinmoldsLairEntrance0[] = { + { 0xCA, 0x00, 0x0102 }, +}; + +static EntranceTableEntry sTwinmoldsLairEntrance1[] = { + { 0xCA, 0x01, 0x0102 }, +}; + +static EntranceTableEntry sTwinmoldsLairEntrance2[] = { + { 0xCA, 0x02, 0x0102 }, +}; + +static EntranceTableEntry sTwinmoldsLairEntrance3[] = { + { 0xCA, 0x03, 0x0102 }, +}; + +static EntranceTableEntry sTwinmoldsLairEntrance4[] = { + { 0xCA, 0x04, 0x0102 }, +}; + +static EntranceTableEntry* sTwinmoldsLairEntranceTable[] = { + sTwinmoldsLairEntrance0, sTwinmoldsLairEntrance1, sTwinmoldsLairEntrance2, + sTwinmoldsLairEntrance3, sTwinmoldsLairEntrance4, +}; + +static EntranceTableEntry sGreatBayCoastEntrance0[] = { + { 0x37, 0x00, 0xCA14 }, + { 0x37, 0x00, 0xCA14 }, + { 0x37, 0x00, 0x8102 }, +}; + +static EntranceTableEntry sGreatBayCoastEntrance1[] = { + { 0x37, 0x01, 0xCA14 }, + { 0x37, 0x01, 0xCA14 }, +}; + +static EntranceTableEntry sGreatBayCoastEntrance2[] = { + { 0x37, 0x02, 0x4993 }, + { 0x37, 0x02, 0x4993 }, +}; + +static EntranceTableEntry sGreatBayCoastEntrance3[] = { + { 0x37, 0x03, 0x4A14 }, + { 0x37, 0x03, 0x4A14 }, +}; + +static EntranceTableEntry sGreatBayCoastEntrance4[] = { + { 0x37, 0x04, 0x4102 }, + { 0x37, 0x04, 0x4102 }, +}; + +static EntranceTableEntry sGreatBayCoastEntrance5[] = { + { 0x37, 0x05, 0x4993 }, + { 0x37, 0x05, 0x4993 }, +}; + +static EntranceTableEntry sGreatBayCoastEntrance6[] = { + { 0x37, 0x06, 0x4993 }, + { 0x37, 0x06, 0x4993 }, +}; + +static EntranceTableEntry sGreatBayCoastEntrance7[] = { + { 0x37, 0x07, 0x4102 }, + { 0x37, 0x07, 0x4102 }, +}; + +static EntranceTableEntry sGreatBayCoastEntrance8[] = { + { 0x37, 0x08, 0x4102 }, + { 0x37, 0x08, 0x4102 }, +}; + +static EntranceTableEntry sGreatBayCoastEntrance9[] = { + { 0x37, 0x09, 0x058B }, + { 0x37, 0x09, 0x058B }, +}; + +static EntranceTableEntry sGreatBayCoastEntrance10[] = { + { 0x37, 0x0A, 0x858B }, + { 0x37, 0x0A, 0x858B }, +}; + +static EntranceTableEntry sGreatBayCoastEntrance11[] = { + { 0x37, 0x0B, 0x0A14 }, + { 0x37, 0x0B, 0x0A14 }, +}; + +static EntranceTableEntry sGreatBayCoastEntrance12[] = { + { 0x37, 0x0C, 0x0A14 }, + { 0x37, 0x0C, 0x0A14 }, +}; + +static EntranceTableEntry sGreatBayCoastEntrance13[] = { + { 0x37, 0x0D, 0x0A14 }, + { 0x37, 0x0D, 0x0A14 }, +}; + +static EntranceTableEntry* sGreatBayCoastEntranceTable[] = { + sGreatBayCoastEntrance0, sGreatBayCoastEntrance1, sGreatBayCoastEntrance2, sGreatBayCoastEntrance3, + sGreatBayCoastEntrance4, sGreatBayCoastEntrance5, sGreatBayCoastEntrance6, sGreatBayCoastEntrance7, + sGreatBayCoastEntrance8, sGreatBayCoastEntrance9, sGreatBayCoastEntrance10, sGreatBayCoastEntrance11, + sGreatBayCoastEntrance12, sGreatBayCoastEntrance13, +}; + +static EntranceTableEntry sZoraCapeEntrance0[] = { + { 0x38, 0x00, 0x8A14 }, + { 0x38, 0x00, 0x8A14 }, +}; + +static EntranceTableEntry sZoraCapeEntrance1[] = { + { 0x38, 0x01, 0x4993 }, + { 0x38, 0x01, 0x4993 }, +}; + +static EntranceTableEntry sZoraCapeEntrance2[] = { + { 0x38, 0x02, 0x4102 }, + { 0x38, 0x02, 0x4102 }, +}; + +static EntranceTableEntry sZoraCapeEntrance3[] = { + { 0x38, 0x03, 0x0993 }, + { 0x38, 0x03, 0x0993 }, +}; + +static EntranceTableEntry sZoraCapeEntrance4[] = { + { 0x38, 0x04, 0x4102 }, + { 0x38, 0x04, 0x4102 }, +}; + +static EntranceTableEntry sZoraCapeEntrance5[] = { + { 0x38, 0x05, 0x0102 }, + { 0x38, 0x05, 0x0102 }, +}; + +static EntranceTableEntry sZoraCapeEntrance6[] = { + { 0x38, 0x06, 0x0A14 }, + { 0x38, 0x06, 0x0A14 }, +}; + +static EntranceTableEntry sZoraCapeEntrance7[] = { + { 0x38, 0x07, 0x0A14 }, + { 0x38, 0x07, 0x0A14 }, +}; + +static EntranceTableEntry sZoraCapeEntrance8[] = { + { 0x38, 0x08, 0x0A14 }, + { 0x38, 0x08, 0x0A14 }, +}; + +static EntranceTableEntry sZoraCapeEntrance9[] = { + { 0x38, 0x09, 0x0A14 }, + { 0x38, 0x09, 0x0A14 }, +}; + +static EntranceTableEntry* sZoraCapeEntranceTable[] = { + sZoraCapeEntrance0, sZoraCapeEntrance1, sZoraCapeEntrance2, sZoraCapeEntrance3, sZoraCapeEntrance4, + sZoraCapeEntrance5, sZoraCapeEntrance6, sZoraCapeEntrance7, sZoraCapeEntrance8, sZoraCapeEntrance9, +}; + +static EntranceTableEntry sLotteryShopEntrance0[] = { + { 0x39, 0x00, 0x4102 }, +}; + +static EntranceTableEntry* sLotteryShopEntranceTable[] = { + sLotteryShopEntrance0, +}; + +static EntranceTableEntry sPiratesFortressExteriorEntrance0[] = { + { 0x3B, 0x00, 0x4993 }, +}; + +static EntranceTableEntry sPiratesFortressExteriorEntrance1[] = { + { 0x3B, 0x01, 0x8102 }, +}; + +static EntranceTableEntry sPiratesFortressExteriorEntrance2[] = { + { 0x3B, 0x02, 0x8993 }, +}; + +static EntranceTableEntry sPiratesFortressExteriorEntrance3[] = { + { 0x3B, 0x03, 0x8993 }, +}; + +static EntranceTableEntry sPiratesFortressExteriorEntrance4[] = { + { 0x3B, 0x04, 0x8102 }, +}; + +static EntranceTableEntry sPiratesFortressExteriorEntrance5[] = { + { 0x3B, 0x05, 0x8102 }, +}; + +static EntranceTableEntry sPiratesFortressExteriorEntrance6[] = { + { 0x3B, 0x06, 0x8102 }, +}; + +static EntranceTableEntry* sPiratesFortressExteriorEntranceTable[] = { + sPiratesFortressExteriorEntrance0, sPiratesFortressExteriorEntrance1, sPiratesFortressExteriorEntrance2, + sPiratesFortressExteriorEntrance3, sPiratesFortressExteriorEntrance4, sPiratesFortressExteriorEntrance5, + sPiratesFortressExteriorEntrance6, +}; + +static EntranceTableEntry sFishermansHutEntrance0[] = { + { 0x3C, 0x00, 0x4102 }, +}; + +static EntranceTableEntry* sFishermansHutEntranceTable[] = { + sFishermansHutEntrance0, +}; + +static EntranceTableEntry sGoronShopEntrance0[] = { + { 0x3D, 0x00, 0x4102 }, +}; + +static EntranceTableEntry* sGoronShopEntranceTable[] = { + sGoronShopEntrance0, +}; + +static EntranceTableEntry sDekuKingsChamberEntrance0[] = { + { 0xC2, 0x00, 0xC102 }, + { 0xC2, 0x00, 0x8102 }, +}; + +static EntranceTableEntry sDekuKingsChamberEntrance1[] = { + { 0xC2, 0x01, 0xC102 }, +}; + +static EntranceTableEntry sDekuKingsChamberEntrance2[] = { + { 0xC2, 0x02, 0x858B }, +}; + +static EntranceTableEntry sDekuKingsChamberEntrance3[] = { + { 0xC2, 0x03, 0x0102 }, +}; + +static EntranceTableEntry* sDekuKingsChamberEntranceTable[] = { + sDekuKingsChamberEntrance0, + sDekuKingsChamberEntrance1, + sDekuKingsChamberEntrance2, + sDekuKingsChamberEntrance3, +}; + +static EntranceTableEntry sMoonGoronTrialEntrance0[] = { + { 0xC1, 0x00, 0x0387 }, +}; + +static EntranceTableEntry* sMoonGoronTrialEntranceTable[] = { + sMoonGoronTrialEntrance0, +}; + +static EntranceTableEntry sRoadToSouthernSwampEntrance0[] = { + { 0x40, 0x00, 0x8A14 }, +}; + +static EntranceTableEntry sRoadToSouthernSwampEntrance1[] = { + { 0x40, 0x01, 0x8A14 }, +}; + +static EntranceTableEntry sRoadToSouthernSwampEntrance2[] = { + { 0x40, 0x02, 0x0102 }, +}; + +static EntranceTableEntry* sRoadToSouthernSwampEntranceTable[] = { + sRoadToSouthernSwampEntrance0, + sRoadToSouthernSwampEntrance1, + sRoadToSouthernSwampEntrance2, +}; + +static EntranceTableEntry sDoggyRacetrackEntrance0[] = { + { 0x41, 0x00, 0xC102 }, +}; + +static EntranceTableEntry sDoggyRacetrackEntrance1[] = { + { 0x41, 0x01, 0x0A14 }, +}; + +static EntranceTableEntry* sDoggyRacetrackEntranceTable[] = { + sDoggyRacetrackEntrance0, + sDoggyRacetrackEntrance1, +}; + +static EntranceTableEntry sCuccoShackEntrance0[] = { + { 0x42, 0x00, 0xC102 }, + { 0x42, 0x00, 0x8102 }, +}; + +static EntranceTableEntry sCuccoShackEntrance1[] = { + { 0x42, 0x01, 0x0A14 }, +}; + +static EntranceTableEntry* sCuccoShackEntranceTable[] = { + sCuccoShackEntrance0, + sCuccoShackEntrance1, +}; + +static EntranceTableEntry sIkanaGraveyardEntrance0[] = { + { 0x43, 0x00, 0x4A14 }, + { 0x43, 0x00, 0x8102 }, +}; + +static EntranceTableEntry sIkanaGraveyardEntrance1[] = { + { 0x43, 0x01, 0x4102 }, +}; + +static EntranceTableEntry sIkanaGraveyardEntrance2[] = { + { 0x43, 0x02, 0x4102 }, +}; + +static EntranceTableEntry sIkanaGraveyardEntrance3[] = { + { 0x43, 0x03, 0x4102 }, +}; + +static EntranceTableEntry sIkanaGraveyardEntrance4[] = { + { 0x43, 0x04, 0x4102 }, +}; + +static EntranceTableEntry sIkanaGraveyardEntrance5[] = { + { 0x43, 0x05, 0x058B }, +}; + +static EntranceTableEntry* sIkanaGraveyardEntranceTable[] = { + sIkanaGraveyardEntrance0, sIkanaGraveyardEntrance1, sIkanaGraveyardEntrance2, + sIkanaGraveyardEntrance3, sIkanaGraveyardEntrance4, sIkanaGraveyardEntrance5, +}; + +static EntranceTableEntry sGohtsLairEntrance0[] = { + { 0xBC, 0x00, 0x8102 }, +}; + +static EntranceTableEntry* sGohtsLairEntranceTable[] = { + sGohtsLairEntrance0, +}; + +static EntranceTableEntry sSouthernSwampPoisonedEntrance0[] = { + { 0x45, 0x00, 0xCA14 }, +}; + +static EntranceTableEntry sSouthernSwampPoisonedEntrance1[] = { + { 0x45, 0x01, 0x4102 }, +}; + +static EntranceTableEntry sSouthernSwampPoisonedEntrance2[] = { + { 0x45, 0x02, 0xC102 }, +}; + +static EntranceTableEntry sSouthernSwampPoisonedEntrance3[] = { + { 0x45, 0x03, 0x4102 }, +}; + +static EntranceTableEntry sSouthernSwampPoisonedEntrance4[] = { + { 0x45, 0x04, 0x4102 }, +}; + +static EntranceTableEntry sSouthernSwampPoisonedEntrance5[] = { + { 0x45, 0x05, 0x4102 }, +}; + +static EntranceTableEntry sSouthernSwampPoisonedEntrance6[] = { + { 0x45, 0x06, 0x0102 }, +}; + +static EntranceTableEntry sSouthernSwampPoisonedEntrance7[] = { + { 0x45, 0x07, 0x4102 }, +}; + +static EntranceTableEntry sSouthernSwampPoisonedEntrance8[] = { + { 0x45, 0x08, 0x4102 }, +}; + +static EntranceTableEntry sSouthernSwampPoisonedEntrance9[] = { + { 0x45, 0x09, 0x4A14 }, +}; + +static EntranceTableEntry sSouthernSwampPoisonedEntrance10[] = { + { 0x45, 0x0A, 0x4A14 }, +}; + +static EntranceTableEntry* sSouthernSwampPoisonedEntranceTable[] = { + sSouthernSwampPoisonedEntrance0, sSouthernSwampPoisonedEntrance1, sSouthernSwampPoisonedEntrance2, + sSouthernSwampPoisonedEntrance3, sSouthernSwampPoisonedEntrance4, sSouthernSwampPoisonedEntrance5, + sSouthernSwampPoisonedEntrance6, sSouthernSwampPoisonedEntrance7, sSouthernSwampPoisonedEntrance8, + sSouthernSwampPoisonedEntrance9, sSouthernSwampPoisonedEntrance10, +}; + +static EntranceTableEntry sWoodfallEntrance0[] = { + { 0x46, 0x00, 0xC102 }, + { 0x46, 0x00, 0x0183 }, + { 0x46, 0x00, 0xC102 }, +}; + +static EntranceTableEntry sWoodfallEntrance1[] = { + { 0x46, 0x01, 0x4102 }, + { 0x46, 0x01, 0x0183 }, + { 0x46, 0x01, 0x4102 }, +}; + +static EntranceTableEntry sWoodfallEntrance2[] = { + { 0x46, 0x02, 0x4102 }, + { 0x46, 0x02, 0x0183 }, + { 0x46, 0x02, 0x4102 }, +}; + +static EntranceTableEntry sWoodfallEntrance3[] = { + { 0x46, 0x03, 0x4102 }, + { 0x46, 0x03, 0x0183 }, + { 0x46, 0x03, 0x4102 }, +}; + +static EntranceTableEntry sWoodfallEntrance4[] = { + { 0x46, 0x04, 0x4102 }, + { 0x46, 0x04, 0x0183 }, + { 0x46, 0x04, 0x4102 }, +}; + +static EntranceTableEntry* sWoodfallEntranceTable[] = { + sWoodfallEntrance0, sWoodfallEntrance1, sWoodfallEntrance2, sWoodfallEntrance3, sWoodfallEntrance4, +}; + +static EntranceTableEntry sMoonZoraTrialEntrance0[] = { + { 0xB9, 0x00, 0x0387 }, +}; + +static EntranceTableEntry sMoonZoraTrialEntrance1[] = { + { 0xB9, 0x01, 0x0102 }, +}; + +static EntranceTableEntry* sMoonZoraTrialEntranceTable[] = { + sMoonZoraTrialEntrance0, + sMoonZoraTrialEntrance1, +}; + +static EntranceTableEntry sGoronVillageSpringEntrance0[] = { + { 0x48, 0x00, 0xC102 }, + { 0x48, 0x00, 0x8102 }, +}; + +static EntranceTableEntry sGoronVillageSpringEntrance1[] = { + { 0x48, 0x01, 0x4102 }, +}; + +static EntranceTableEntry sGoronVillageSpringEntrance2[] = { + { 0x48, 0x02, 0x4102 }, +}; + +static EntranceTableEntry sGoronVillageSpringEntrance3[] = { + { 0x48, 0x03, 0x4102 }, +}; + +static EntranceTableEntry sGoronVillageSpringEntrance4[] = { + { 0x48, 0x04, 0x0A14 }, +}; + +static EntranceTableEntry* sGoronVillageSpringEntranceTable[] = { + sGoronVillageSpringEntrance0, sGoronVillageSpringEntrance1, sGoronVillageSpringEntrance2, + sGoronVillageSpringEntrance3, sGoronVillageSpringEntrance4, +}; + +static EntranceTableEntry sGreatBayTempleEntrance0[] = { + { 0xB7, 0x00, 0x4102 }, +}; + +static EntranceTableEntry sGreatBayTempleEntrance1[] = { + { 0xB7, 0x01, 0x0102 }, +}; + +static EntranceTableEntry sGreatBayTempleEntrance2[] = { + { 0xB7, 0x02, 0x0102 }, +}; + +static EntranceTableEntry* sGreatBayTempleEntranceTable[] = { + sGreatBayTempleEntrance0, + sGreatBayTempleEntrance1, + sGreatBayTempleEntrance2, +}; + +static EntranceTableEntry sWaterfallRapidsEntrance0[] = { + { 0x4A, 0x00, 0x4102 }, +}; + +static EntranceTableEntry sWaterfallRapidsEntrance1[] = { + { 0x4A, 0x01, 0x0A14 }, +}; + +static EntranceTableEntry sWaterfallRapidsEntrance2[] = { + { 0x4A, 0x02, 0x0A14 }, +}; + +static EntranceTableEntry sWaterfallRapidsEntrance3[] = { + { 0x4A, 0x03, 0x0A14 }, +}; + +static EntranceTableEntry* sWaterfallRapidsEntranceTable[] = { + sWaterfallRapidsEntrance0, + sWaterfallRapidsEntrance1, + sWaterfallRapidsEntrance2, + sWaterfallRapidsEntrance3, +}; + +static EntranceTableEntry sBeneathTheWellEntrance0[] = { + { 0xB5, 0x00, 0x4102 }, +}; + +static EntranceTableEntry sBeneathTheWellEntrance1[] = { + { 0xB5, 0x01, 0x4102 }, +}; + +static EntranceTableEntry* sBeneathTheWellEntranceTable[] = { + sBeneathTheWellEntrance0, + sBeneathTheWellEntrance1, +}; + +static EntranceTableEntry sZoraHallRoomsEntrance0[] = { + { 0x4C, 0x00, 0x0102 }, +}; + +static EntranceTableEntry sZoraHallRoomsEntrance1[] = { + { 0x4C, 0x01, 0x0102 }, +}; + +static EntranceTableEntry sZoraHallRoomsEntrance2[] = { + { 0x4C, 0x02, 0x0102 }, +}; + +static EntranceTableEntry sZoraHallRoomsEntrance3[] = { + { 0x4C, 0x03, 0x0102 }, +}; + +static EntranceTableEntry sZoraHallRoomsEntrance4[] = { + { 0x4C, 0x04, 0x858B }, +}; + +static EntranceTableEntry sZoraHallRoomsEntrance5[] = { + { 0x4C, 0x05, 0x0102 }, +}; + +static EntranceTableEntry sZoraHallRoomsEntrance6[] = { + { 0x4C, 0x06, 0x0102 }, +}; + +static EntranceTableEntry* sZoraHallRoomsEntranceTable[] = { + sZoraHallRoomsEntrance0, sZoraHallRoomsEntrance1, sZoraHallRoomsEntrance2, sZoraHallRoomsEntrance3, + sZoraHallRoomsEntrance4, sZoraHallRoomsEntrance5, sZoraHallRoomsEntrance6, +}; + +static EntranceTableEntry sGoronVillageWinterEntrance0[] = { + { 0x4D, 0x00, 0xC102 }, +}; + +static EntranceTableEntry sGoronVillageWinterEntrance1[] = { + { 0x4D, 0x01, 0x4102 }, +}; + +static EntranceTableEntry sGoronVillageWinterEntrance2[] = { + { 0x4D, 0x02, 0x4102 }, +}; + +static EntranceTableEntry sGoronVillageWinterEntrance3[] = { + { 0x4D, 0x03, 0x4102 }, +}; + +static EntranceTableEntry sGoronVillageWinterEntrance4[] = { + { 0x4D, 0x04, 0x0A14 }, +}; + +static EntranceTableEntry* sGoronVillageWinterEntranceTable[] = { + sGoronVillageWinterEntrance0, sGoronVillageWinterEntrance1, sGoronVillageWinterEntrance2, + sGoronVillageWinterEntrance3, sGoronVillageWinterEntrance4, +}; + +static EntranceTableEntry sGoronGraveryardEntrance0[] = { + { 0x4E, 0x00, 0x4102 }, +}; + +static EntranceTableEntry sGoronGraveryardEntrance1[] = { + { 0x4E, 0x01, 0x058B }, +}; + +static EntranceTableEntry* sGoronGraveryardEntranceTable[] = { + sGoronGraveryardEntrance0, + sGoronGraveryardEntrance1, +}; + +static EntranceTableEntry sSakonsHideoutEntrance0[] = { + { 0x4F, 0x00, 0x4102 }, +}; + +static EntranceTableEntry* sSakonsHideoutEntranceTable[] = { + sSakonsHideoutEntrance0, +}; + +static EntranceTableEntry sMountainVillageWinterEntrance0[] = { + { 0x50, 0x00, 0x4A14 }, +}; + +static EntranceTableEntry sMountainVillageWinterEntrance1[] = { + { 0x50, 0x01, 0x4102 }, +}; + +static EntranceTableEntry sMountainVillageWinterEntrance2[] = { + { 0x50, 0x02, 0xCA14 }, +}; + +static EntranceTableEntry sMountainVillageWinterEntrance3[] = { + { 0x50, 0x03, 0x4102 }, +}; + +static EntranceTableEntry sMountainVillageWinterEntrance4[] = { + { 0x50, 0x04, 0xCA14 }, +}; + +static EntranceTableEntry sMountainVillageWinterEntrance5[] = { + { 0x50, 0x05, 0x4102 }, +}; + +static EntranceTableEntry sMountainVillageWinterEntrance6[] = { + { 0x50, 0x06, 0x4A14 }, +}; + +static EntranceTableEntry sMountainVillageWinterEntrance7[] = { + { 0x50, 0x07, 0x4A14 }, +}; + +static EntranceTableEntry sMountainVillageWinterEntrance8[] = { + { 0x50, 0x08, 0x4A14 }, +}; + +static EntranceTableEntry* sMountainVillageWinterEntranceTable[] = { + sMountainVillageWinterEntrance0, sMountainVillageWinterEntrance1, sMountainVillageWinterEntrance2, + sMountainVillageWinterEntrance3, sMountainVillageWinterEntrance4, sMountainVillageWinterEntrance5, + sMountainVillageWinterEntrance6, sMountainVillageWinterEntrance7, sMountainVillageWinterEntrance8, +}; + +static EntranceTableEntry sGhostHutEntrance0[] = { + { 0x51, 0x00, 0x4102 }, +}; + +static EntranceTableEntry sGhostHutEntrance1[] = { + { 0x51, 0x01, 0x0102 }, +}; + +static EntranceTableEntry sGhostHutEntrance2[] = { + { 0x51, 0x02, 0x0102 }, +}; + +static EntranceTableEntry* sGhostHutEntranceTable[] = { + sGhostHutEntrance0, + sGhostHutEntrance1, + sGhostHutEntrance2, +}; + +static EntranceTableEntry sDekuShrineEntrance0[] = { + { 0x52, 0x00, 0x4102 }, +}; + +static EntranceTableEntry sDekuShrineEntrance1[] = { + { 0x52, 0x01, 0x0102 }, +}; + +static EntranceTableEntry sDekuShrineEntrance2[] = { + { 0x52, 0x02, 0x0102 }, +}; + +static EntranceTableEntry* sDekuShrineEntranceTable[] = { + sDekuShrineEntrance0, + sDekuShrineEntrance1, + sDekuShrineEntrance2, +}; + +static EntranceTableEntry sRoadToIkanaEntrance0[] = { + { 0x53, 0x00, 0x8A14 }, +}; + +static EntranceTableEntry sRoadToIkanaEntrance1[] = { + { 0x53, 0x01, 0x8A14 }, +}; + +static EntranceTableEntry sRoadToIkanaEntrance2[] = { + { 0x53, 0x02, 0x0A14 }, +}; + +static EntranceTableEntry* sRoadToIkanaEntranceTable[] = { + sRoadToIkanaEntrance0, + sRoadToIkanaEntrance1, + sRoadToIkanaEntrance2, +}; + +static EntranceTableEntry sMusicBoxHouseEntrance0[] = { + { 0x55, 0x00, 0x4102 }, +}; + +static EntranceTableEntry* sMusicBoxHouseEntranceTable[] = { + sMusicBoxHouseEntrance0, +}; + +static EntranceTableEntry sIgosDuIkanasLairEntrance0[] = { + { 0xAA, 0x00, 0x8102 }, + { 0xAA, 0x00, 0x8102 }, +}; + +static EntranceTableEntry* sIgosDuIkanasLairEntranceTable[] = { + sIgosDuIkanasLairEntrance0, +}; + +static EntranceTableEntry sSwordmansSchoolEntrance0[] = { + { 0x54, 0x00, 0x4102 }, +}; + +static EntranceTableEntry* sSwordmansSchoolEntranceTable[] = { + sSwordmansSchoolEntrance0, +}; + +static EntranceTableEntry sTouristInformationEntrance0[] = { + { 0x57, 0x00, 0x4102 }, +}; + +static EntranceTableEntry sTouristInformationEntrance1[] = { + { 0x57, 0x01, 0x0102 }, +}; + +static EntranceTableEntry sTouristInformationEntrance2[] = { + { 0x57, 0x02, 0x0102 }, +}; + +static EntranceTableEntry* sTouristInformationEntranceTable[] = { + sTouristInformationEntrance0, + sTouristInformationEntrance1, + sTouristInformationEntrance2, +}; + +static EntranceTableEntry sStoneTowerEntrance0[] = { + { 0x58, 0x00, 0x4102 }, +}; + +static EntranceTableEntry sStoneTowerEntrance1[] = { + { 0x58, 0x01, 0xCA14 }, +}; + +static EntranceTableEntry sStoneTowerEntrance2[] = { + { 0x58, 0x02, 0xC102 }, +}; + +static EntranceTableEntry sStoneTowerEntrance3[] = { + { 0x58, 0x03, 0x4A14 }, +}; + +static EntranceTableEntry* sStoneTowerEntranceTable[] = { + sStoneTowerEntrance0, + sStoneTowerEntrance1, + sStoneTowerEntrance2, + sStoneTowerEntrance3, +}; + +static EntranceTableEntry sStoneTowerInvertedEntrance0[] = { + { 0x59, 0x00, 0x4A14 }, +}; + +static EntranceTableEntry sStoneTowerInvertedEntrance1[] = { + { 0x59, 0x01, 0xC102 }, +}; + +static EntranceTableEntry* sStoneTowerInvertedEntranceTable[] = { + sStoneTowerInvertedEntrance0, + sStoneTowerInvertedEntrance1, +}; + +static EntranceTableEntry sMountainVillageSpringEntrance0[] = { + { 0x5A, 0x00, 0x4A14 }, + { 0x5A, 0x00, 0x4A14 }, +}; + +static EntranceTableEntry sMountainVillageSpringEntrance1[] = { + { 0x5A, 0x01, 0x4102 }, +}; + +static EntranceTableEntry sMountainVillageSpringEntrance2[] = { + { 0x5A, 0x02, 0xCA14 }, +}; + +static EntranceTableEntry sMountainVillageSpringEntrance3[] = { + { 0x5A, 0x03, 0x4102 }, +}; + +static EntranceTableEntry sMountainVillageSpringEntrance4[] = { + { 0x5A, 0x04, 0xCA14 }, +}; + +static EntranceTableEntry sMountainVillageSpringEntrance5[] = { + { 0x5A, 0x05, 0x4102 }, +}; + +static EntranceTableEntry sMountainVillageSpringEntrance6[] = { + { 0x5A, 0x06, 0xCA14 }, +}; + +static EntranceTableEntry sMountainVillageSpringEntrance7[] = { + { 0x5A, 0x07, 0x458B }, +}; + +static EntranceTableEntry sMountainVillageSpringEntrance8[] = { + { 0x5A, 0x08, 0x4A14 }, +}; + +static EntranceTableEntry* sMountainVillageSpringEntranceTable[] = { + sMountainVillageSpringEntrance0, sMountainVillageSpringEntrance1, sMountainVillageSpringEntrance2, + sMountainVillageSpringEntrance3, sMountainVillageSpringEntrance4, sMountainVillageSpringEntrance5, + sMountainVillageSpringEntrance6, sMountainVillageSpringEntrance7, sMountainVillageSpringEntrance8, +}; + +static EntranceTableEntry sPathToSnowheadEntrance0[] = { + { 0x5B, 0x00, 0xCA14 }, + { 0x5B, 0x00, 0xCA14 }, +}; + +static EntranceTableEntry sPathToSnowheadEntrance1[] = { + { 0x5B, 0x01, 0xCA14 }, + { 0x5B, 0x01, 0xCA14 }, +}; + +static EntranceTableEntry* sPathToSnowheadEntranceTable[] = { + sPathToSnowheadEntrance0, + sPathToSnowheadEntrance1, +}; + +static EntranceTableEntry sSnowheadEntrance0[] = { + { 0x5C, 0x00, 0xCA14 }, + { 0x5C, 0x00, 0xCA14 }, +}; + +static EntranceTableEntry sSnowheadEntrance1[] = { + { 0x5C, 0x01, 0x4102 }, + { 0x5C, 0x01, 0x4102 }, +}; + +static EntranceTableEntry sSnowheadEntrance2[] = { + { 0x5C, 0x02, 0x4102 }, + { 0x5C, 0x02, 0x4102 }, +}; + +static EntranceTableEntry sSnowheadEntrance3[] = { + { 0x5C, 0x03, 0x4102 }, + { 0x5C, 0x03, 0x4102 }, +}; + +static EntranceTableEntry* sSnowheadEntranceTable[] = { + sSnowheadEntrance0, + sSnowheadEntrance1, + sSnowheadEntrance2, + sSnowheadEntrance3, +}; + +static EntranceTableEntry sPathToGoronVillageWinterEntrance0[] = { + { 0x5D, 0x00, 0x8A14 }, +}; + +static EntranceTableEntry sPathToGoronVillageWinterEntrance1[] = { + { 0x5D, 0x01, 0x8102 }, +}; + +static EntranceTableEntry sPathToGoronVillageWinterEntrance2[] = { + { 0x5D, 0x02, 0x0102 }, +}; + +static EntranceTableEntry* sPathToGoronVillageWinterEntranceTable[] = { + sPathToGoronVillageWinterEntrance0, + sPathToGoronVillageWinterEntrance1, + sPathToGoronVillageWinterEntrance2, +}; + +static EntranceTableEntry sPathToGoronVillageSpringEntrance0[] = { + { 0x5E, 0x00, 0x8A14 }, +}; + +static EntranceTableEntry sPathToGoronVillageSpringEntrance1[] = { + { 0x5E, 0x01, 0x8102 }, +}; + +static EntranceTableEntry sPathToGoronVillageSpringEntrance2[] = { + { 0x5E, 0x02, 0x0102 }, +}; + +static EntranceTableEntry* sPathToGoronVillageSpringEntranceTable[] = { + sPathToGoronVillageSpringEntrance0, + sPathToGoronVillageSpringEntrance1, + sPathToGoronVillageSpringEntrance2, +}; + +static EntranceTableEntry sGyorgsLairEntrance0[] = { + { 0xA1, 0x00, 0x8102 }, +}; + +static EntranceTableEntry sGyorgsLairEntrance1[] = { + { 0xA1, 0x01, 0x8102 }, +}; + +static EntranceTableEntry* sGyorgsLairEntranceTable[] = { + sGyorgsLairEntrance0, + sGyorgsLairEntrance1, +}; + +static EntranceTableEntry sSecretShrineEntrance0[] = { + { 0xA0, 0x00, 0x4102 }, +}; + +static EntranceTableEntry* sSecretShrineEntranceTable[] = { + sSecretShrineEntrance0, +}; + +static EntranceTableEntry sStockPotInnEntrance0[] = { + { 0x61, 0x00, 0x4102 }, + { 0x61, 0x00, 0x8102 }, +}; + +static EntranceTableEntry sStockPotInnEntrance1[] = { + { 0x61, 0x01, 0x4102 }, +}; + +static EntranceTableEntry sStockPotInnEntrance2[] = { + { 0x61, 0x02, 0x0102 }, +}; + +static EntranceTableEntry sStockPotInnEntrance3[] = { + { 0x61, 0x03, 0x0102 }, +}; + +static EntranceTableEntry sStockPotInnEntrance4[] = { + { 0x61, 0x04, 0x0102 }, +}; + +static EntranceTableEntry sStockPotInnEntrance5[] = { + { 0x61, 0x05, 0x0102 }, +}; + +static EntranceTableEntry* sStockPotInnEntranceTable[] = { + sStockPotInnEntrance0, sStockPotInnEntrance1, sStockPotInnEntrance2, + sStockPotInnEntrance3, sStockPotInnEntrance4, sStockPotInnEntrance5, +}; + +static EntranceTableEntry sGreatBayCutsceneEntrance0[] = { + { 0x62, 0x00, 0x4102 }, +}; + +static EntranceTableEntry* sGreatBayCutsceneEntranceTable[] = { + sGreatBayCutsceneEntrance0, +}; + +static EntranceTableEntry sClockTowerInteriorEntrance0[] = { + { 0x63, 0x00, 0x0102 }, +}; + +static EntranceTableEntry sClockTowerInteriorEntrance1[] = { + { 0x63, 0x01, 0x0102 }, +}; + +static EntranceTableEntry sClockTowerInteriorEntrance2[] = { + { 0x63, 0x02, 0x058B }, +}; + +static EntranceTableEntry sClockTowerInteriorEntrance3[] = { + { 0x63, 0x03, 0x0102 }, +}; + +static EntranceTableEntry sClockTowerInteriorEntrance4[] = { + { 0x63, 0x04, 0x058B }, +}; + +static EntranceTableEntry sClockTowerInteriorEntrance5[] = { + { 0x63, 0x05, 0x0102 }, +}; + +static EntranceTableEntry sClockTowerInteriorEntrance6[] = { + { 0x63, 0x06, 0x858B }, +}; + +static EntranceTableEntry* sClockTowerInteriorEntranceTable[] = { + sClockTowerInteriorEntrance0, sClockTowerInteriorEntrance1, sClockTowerInteriorEntrance2, + sClockTowerInteriorEntrance3, sClockTowerInteriorEntrance4, sClockTowerInteriorEntrance5, + sClockTowerInteriorEntrance6, +}; + +static EntranceTableEntry sWoodsOfMysteryEntrance0[] = { + { 0x64, 0x00, 0x4102 }, +}; + +static EntranceTableEntry* sWoodsOfMysteryEntranceTable[] = { + sWoodsOfMysteryEntrance0, +}; + +static EntranceTableEntry sLostWoodsEntrance0[] = { + { 0x9B, 0x00, 0x858B }, + { 0x9B, 0x00, 0x8183 }, + { 0x9B, 0x00, 0x858B }, + { 0x9B, 0x00, 0x8102 }, +}; + +static EntranceTableEntry sLostWoodsEntrance1[] = { + { 0x9B, 0x01, 0x058B }, + { 0x9B, 0x01, 0x058B }, + { 0x9B, 0x01, 0x058B }, + { 0x9B, 0x01, 0x058B }, +}; + +static EntranceTableEntry sLostWoodsEntrance2[] = { + { 0x9B, 0x02, 0x058B }, + { 0x9B, 0x02, 0x058B }, + { 0x9B, 0x02, 0x058B }, + { 0x9B, 0x02, 0x058B }, +}; + +static EntranceTableEntry* sLostWoodsEntranceTable[] = { + sLostWoodsEntrance0, + sLostWoodsEntrance1, + sLostWoodsEntrance2, +}; + +static EntranceTableEntry sMoonLinkTrialEntrance0[] = { + { 0x66, 0x00, 0x0387 }, +}; + +static EntranceTableEntry* sMoonLinkTrialEntranceTable[] = { + sMoonLinkTrialEntrance0, +}; + +static EntranceTableEntry sTheMoonEntrance0[] = { + { 0x67, 0x00, 0x0387 }, +}; + +static EntranceTableEntry* sTheMoonEntranceTable[] = { + sTheMoonEntrance0, +}; + +static EntranceTableEntry sBombShopEntrance0[] = { + { 0x68, 0x00, 0x4102 }, +}; + +static EntranceTableEntry sBombShopEntrance1[] = { + { 0x68, 0x01, 0x0102 }, +}; + +static EntranceTableEntry* sBombShopEntranceTable[] = { + sBombShopEntrance0, + sBombShopEntrance1, +}; + +static EntranceTableEntry sGiantsChamberEntrance0[] = { + { 0x69, 0x00, 0x0102 }, { 0x69, 0x00, 0x0102 }, { 0x69, 0x00, 0x0102 }, { 0x69, 0x00, 0x0102 }, + { 0x69, 0x00, 0x0102 }, { 0x69, 0x00, 0x0102 }, { 0x69, 0x00, 0x0102 }, { 0x69, 0x00, 0x0102 }, + { 0x69, 0x00, 0x0102 }, { 0x69, 0x00, 0x0102 }, { 0x69, 0x00, 0x0102 }, +}; + +static EntranceTableEntry* sGiantsChamberEntranceTable[] = { + sGiantsChamberEntrance0, +}; + +static EntranceTableEntry sGormanTrackEntrance0[] = { + { 0x6A, 0x00, 0x4A14 }, +}; + +static EntranceTableEntry sGormanTrackEntrance1[] = { + { 0x6A, 0x01, 0x4A14 }, +}; + +static EntranceTableEntry sGormanTrackEntrance2[] = { + { 0x6A, 0x02, 0x4A14 }, +}; + +static EntranceTableEntry sGormanTrackEntrance3[] = { + { 0x6A, 0x03, 0x4A14 }, +}; + +static EntranceTableEntry sGormanTrackEntrance4[] = { + { 0x6A, 0x04, 0x0102 }, +}; + +static EntranceTableEntry sGormanTrackEntrance5[] = { + { 0x6A, 0x05, 0x0A14 }, +}; + +static EntranceTableEntry* sGormanTrackEntranceTable[] = { + sGormanTrackEntrance0, sGormanTrackEntrance1, sGormanTrackEntrance2, + sGormanTrackEntrance3, sGormanTrackEntrance4, sGormanTrackEntrance5, +}; + +static EntranceTableEntry sGoronRacetrackEntrance0[] = { + { 0x6B, 0x00, 0x4102 }, + { 0x6B, 0x00, 0x4102 }, +}; + +static EntranceTableEntry sGoronRacetrackEntrance1[] = { + { 0x6B, 0x01, 0x8A14 }, + { 0x6B, 0x01, 0x8A14 }, +}; + +static EntranceTableEntry sGoronRacetrackEntrance2[] = { + { 0x6B, 0x02, 0x0A14 }, + { 0x6B, 0x02, 0x0A14 }, +}; + +static EntranceTableEntry* sGoronRacetrackEntranceTable[] = { + sGoronRacetrackEntrance0, + sGoronRacetrackEntrance1, + sGoronRacetrackEntrance2, +}; + +static EntranceTableEntry sEastClockTownEntrance0[] = { + { 0x6C, 0x00, 0x4102 }, + { 0x6C, 0x00, 0x8102 }, + { 0x6C, 0x00, 0x058B }, +}; + +static EntranceTableEntry sEastClockTownEntrance1[] = { + { 0x6C, 0x01, 0xCA14 }, +}; + +static EntranceTableEntry sEastClockTownEntrance2[] = { + { 0x6C, 0x02, 0x4102 }, +}; + +static EntranceTableEntry sEastClockTownEntrance3[] = { + { 0x6C, 0x03, 0xC102 }, +}; + +static EntranceTableEntry sEastClockTownEntrance4[] = { + { 0x6C, 0x04, 0x4102 }, +}; + +static EntranceTableEntry sEastClockTownEntrance5[] = { + { 0x6C, 0x05, 0xC102 }, +}; + +static EntranceTableEntry sEastClockTownEntrance6[] = { + { 0x6C, 0x06, 0x4102 }, +}; + +static EntranceTableEntry sEastClockTownEntrance7[] = { + { 0x6C, 0x07, 0x4102 }, +}; + +static EntranceTableEntry sEastClockTownEntrance8[] = { + { 0x6C, 0x08, 0x4102 }, +}; + +static EntranceTableEntry sEastClockTownEntrance9[] = { + { 0x6C, 0x09, 0x4102 }, +}; + +static EntranceTableEntry sEastClockTownEntrance10[] = { + { 0x6C, 0x0A, 0x4102 }, +}; + +static EntranceTableEntry sEastClockTownEntrance11[] = { + { 0x6C, 0x0B, 0x4102 }, +}; + +static EntranceTableEntry sEastClockTownEntrance12[] = { + { 0x6C, 0x0C, 0x4102 }, +}; + +static EntranceTableEntry* sEastClockTownEntranceTable[] = { + sEastClockTownEntrance0, sEastClockTownEntrance1, sEastClockTownEntrance2, sEastClockTownEntrance3, + sEastClockTownEntrance4, sEastClockTownEntrance5, sEastClockTownEntrance6, sEastClockTownEntrance7, + sEastClockTownEntrance8, sEastClockTownEntrance9, sEastClockTownEntrance10, sEastClockTownEntrance11, + sEastClockTownEntrance12, +}; + +static EntranceTableEntry sWestClockTownEntrance0[] = { + { 0x6D, 0x00, 0x4102 }, + { 0x6D, 0x00, 0x8102 }, +}; + +static EntranceTableEntry sWestClockTownEntrance1[] = { + { 0x6D, 0x01, 0xC102 }, +}; + +static EntranceTableEntry sWestClockTownEntrance2[] = { + { 0x6D, 0x02, 0xCA14 }, +}; + +static EntranceTableEntry sWestClockTownEntrance3[] = { + { 0x6D, 0x03, 0x4102 }, +}; + +static EntranceTableEntry sWestClockTownEntrance4[] = { + { 0x6D, 0x04, 0x4102 }, +}; + +static EntranceTableEntry sWestClockTownEntrance5[] = { + { 0x6D, 0x05, 0x4102 }, +}; + +static EntranceTableEntry sWestClockTownEntrance6[] = { + { 0x6D, 0x06, 0x4102 }, +}; + +static EntranceTableEntry sWestClockTownEntrance7[] = { + { 0x6D, 0x07, 0x4102 }, +}; + +static EntranceTableEntry sWestClockTownEntrance8[] = { + { 0x6D, 0x08, 0x4102 }, +}; + +static EntranceTableEntry sWestClockTownEntrance9[] = { + { 0x6D, 0x09, 0x4A14 }, +}; + +static EntranceTableEntry* sWestClockTownEntranceTable[] = { + sWestClockTownEntrance0, sWestClockTownEntrance1, sWestClockTownEntrance2, sWestClockTownEntrance3, + sWestClockTownEntrance4, sWestClockTownEntrance5, sWestClockTownEntrance6, sWestClockTownEntrance7, + sWestClockTownEntrance8, sWestClockTownEntrance9, +}; + +static EntranceTableEntry sNorthClockTownEntrance0[] = { + { 0x6E, 0x00, 0x4102 }, + { 0x6E, 0x00, 0x458B }, +}; + +static EntranceTableEntry sNorthClockTownEntrance1[] = { + { 0x6E, 0x01, 0xC102 }, +}; + +static EntranceTableEntry sNorthClockTownEntrance2[] = { + { 0x6E, 0x02, 0xC102 }, +}; + +static EntranceTableEntry sNorthClockTownEntrance3[] = { + { 0x6E, 0x03, 0x4102 }, +}; + +static EntranceTableEntry sNorthClockTownEntrance4[] = { + { 0x6E, 0x04, 0x4102 }, +}; + +static EntranceTableEntry sNorthClockTownEntrance5[] = { + { 0x6E, 0x05, 0x8A14 }, +}; + +static EntranceTableEntry sNorthClockTownEntrance6[] = { + { 0x6E, 0x06, 0x8A14 }, +}; + +static EntranceTableEntry sNorthClockTownEntrance7[] = { + { 0x6E, 0x07, 0x8A14 }, +}; + +static EntranceTableEntry* sNorthClockTownEntranceTable[] = { + sNorthClockTownEntrance0, sNorthClockTownEntrance1, sNorthClockTownEntrance2, sNorthClockTownEntrance3, + sNorthClockTownEntrance4, sNorthClockTownEntrance5, sNorthClockTownEntrance6, sNorthClockTownEntrance7, +}; + +static EntranceTableEntry sSouthClockTownEntrance0[] = { + { 0x6F, 0x00, 0x4102 }, + { 0x6F, 0x00, 0x8102 }, + { 0x6F, 0x00, 0x0A14 }, + { 0x6F, 0x00, 0x0102 }, +}; + +static EntranceTableEntry sSouthClockTownEntrance1[] = { + { 0x6F, 0x01, 0x4102 }, + { 0x6F, 0x01, 0x8102 }, +}; + +static EntranceTableEntry sSouthClockTownEntrance2[] = { + { 0x6F, 0x02, 0xC102 }, +}; + +static EntranceTableEntry sSouthClockTownEntrance3[] = { + { 0x6F, 0x03, 0xCA14 }, +}; + +static EntranceTableEntry sSouthClockTownEntrance4[] = { + { 0x6F, 0x04, 0xC102 }, +}; + +static EntranceTableEntry sSouthClockTownEntrance5[] = { + { 0x6F, 0x05, 0xC102 }, +}; + +static EntranceTableEntry sSouthClockTownEntrance6[] = { + { 0x6F, 0x06, 0xCA14 }, +}; + +static EntranceTableEntry sSouthClockTownEntrance7[] = { + { 0x6F, 0x07, 0xCA14 }, +}; + +static EntranceTableEntry sSouthClockTownEntrance8[] = { + { 0x6F, 0x08, 0x4A14 }, +}; + +static EntranceTableEntry sSouthClockTownEntrance9[] = { + { 0x6F, 0x09, 0x4A14 }, +}; + +static EntranceTableEntry sSouthClockTownEntrance10[] = { + { 0x6F, 0x0A, 0x058B }, +}; + +static EntranceTableEntry* sSouthClockTownEntranceTable[] = { + sSouthClockTownEntrance0, sSouthClockTownEntrance1, sSouthClockTownEntrance2, sSouthClockTownEntrance3, + sSouthClockTownEntrance4, sSouthClockTownEntrance5, sSouthClockTownEntrance6, sSouthClockTownEntrance7, + sSouthClockTownEntrance8, sSouthClockTownEntrance9, sSouthClockTownEntrance10, +}; + +static EntranceTableEntry sLaundryPoolEntrance0[] = { + { 0x70, 0x00, 0xCA14 }, +}; + +static EntranceTableEntry sLaundryPoolEntrance1[] = { + { 0x70, 0x01, 0x4A14 }, +}; + +static EntranceTableEntry sLaundryPoolEntrance2[] = { + { 0x70, 0x02, 0x4102 }, +}; + +static EntranceTableEntry* sLaundryPoolEntranceTable[] = { + sLaundryPoolEntrance0, + sLaundryPoolEntrance1, + sLaundryPoolEntrance2, +}; + +static EntranceTableEntry sGrottosEntrance0[] = { + { 0x07, 0x00, 0x0102 }, +}; + +static EntranceTableEntry sGrottosEntrance1[] = { + { 0x07, 0x01, 0x0102 }, +}; + +static EntranceTableEntry sGrottosEntrance2[] = { + { 0x07, 0x02, 0x0102 }, +}; + +static EntranceTableEntry sGrottosEntrance3[] = { + { 0x07, 0x03, 0x0102 }, +}; + +static EntranceTableEntry sGrottosEntrance4[] = { + { 0x07, 0x04, 0x0102 }, +}; + +static EntranceTableEntry sGrottosEntrance5[] = { + { 0x07, 0x05, 0x0102 }, +}; + +static EntranceTableEntry sGrottosEntrance6[] = { + { 0x07, 0x06, 0x0102 }, +}; + +static EntranceTableEntry sGrottosEntrance7[] = { + { 0x07, 0x07, 0x0102 }, +}; + +static EntranceTableEntry sGrottosEntrance8[] = { + { 0x07, 0x08, 0x0102 }, +}; + +static EntranceTableEntry sGrottosEntrance9[] = { + { 0x07, 0x09, 0x0102 }, +}; + +static EntranceTableEntry sGrottosEntrance10[] = { + { 0x07, 0x0A, 0x0102 }, +}; + +static EntranceTableEntry sGrottosEntrance11[] = { + { 0x07, 0x0B, 0x0102 }, +}; + +static EntranceTableEntry sGrottosEntrance12[] = { + { 0x07, 0x0C, 0x0102 }, +}; + +static EntranceTableEntry sGrottosEntrance13[] = { + { 0x07, 0x0D, 0x0102 }, +}; + +static EntranceTableEntry sGrottosEntrance14[] = { + { 0x07, 0x0E, 0x0102 }, +}; + +static EntranceTableEntry sGrottosEntrance15[] = { + { 0x07, 0x0F, 0x0102 }, +}; + +static EntranceTableEntry sGrottosEntrance16[] = { + { 0x07, 0x10, 0x0102 }, +}; + +static EntranceTableEntry* sGrottosEntranceTable[] = { + sGrottosEntrance0, sGrottosEntrance1, sGrottosEntrance2, sGrottosEntrance3, sGrottosEntrance4, + sGrottosEntrance5, sGrottosEntrance6, sGrottosEntrance7, sGrottosEntrance8, sGrottosEntrance9, + sGrottosEntrance10, sGrottosEntrance11, sGrottosEntrance12, sGrottosEntrance13, sGrottosEntrance14, + sGrottosEntrance15, sGrottosEntrance16, +}; + +static EntranceTableEntry sCutsceneEntrance0[] = { + { 0xF8, 0x00, 0x0102 }, { 0xF8, 0x00, 0x0102 }, { 0xF8, 0x00, 0x8102 }, { 0xF8, 0x00, 0x0102 }, + { 0xF8, 0x00, 0x058B }, { 0xF8, 0x00, 0x058B }, { 0xF8, 0x00, 0x058B }, { 0xF8, 0x00, 0x058B }, + { 0xF8, 0x00, 0x0183 }, { 0xF8, 0x00, 0x0183 }, { 0xF8, 0x00, 0x8102 }, { 0xF8, 0x00, 0x0102 }, +}; + +static EntranceTableEntry sCutsceneEntrance1[] = { + { 0xF8, 0x01, 0x0183 }, { 0xF8, 0x01, 0x0102 }, { 0xF8, 0x01, 0x8102 }, { 0xF8, 0x01, 0x0102 }, + { 0xF8, 0x01, 0x8102 }, { 0xF8, 0x01, 0x058B }, { 0xF8, 0x01, 0x058B }, { 0xF8, 0x01, 0x058B }, + { 0xF8, 0x01, 0x058B }, { 0xF8, 0x01, 0x8102 }, { 0xF8, 0x01, 0x8102 }, { 0xF8, 0x01, 0x0102 }, +}; + +static EntranceTableEntry sCutsceneEntrance2[] = { + { 0xF8, 0x02, 0x0183 }, { 0xF8, 0x02, 0x0102 }, { 0xF8, 0x02, 0x8102 }, { 0xF8, 0x02, 0x0102 }, + { 0xF8, 0x02, 0x8102 }, { 0xF8, 0x02, 0x058B }, { 0xF8, 0x02, 0x058B }, { 0xF8, 0x02, 0x058B }, + { 0xF8, 0x02, 0x058B }, { 0xF8, 0x02, 0x858B }, { 0xF8, 0x02, 0x8102 }, +}; + +static EntranceTableEntry sCutsceneEntrance3[] = { + { 0xF8, 0x03, 0x0183 }, { 0xF8, 0x03, 0x0102 }, { 0xF8, 0x03, 0x8102 }, { 0xF8, 0x03, 0x0102 }, + { 0xF8, 0x03, 0x058B }, { 0xF8, 0x03, 0x058B }, { 0xF8, 0x03, 0x058B }, { 0xF8, 0x03, 0x058B }, + { 0xF8, 0x03, 0x058B }, { 0xF8, 0x03, 0x058B }, { 0xF8, 0x03, 0x8102 }, +}; + +static EntranceTableEntry sCutsceneEntrance4[] = { + { 0xF8, 0x04, 0x0183 }, { 0xF8, 0x04, 0x0102 }, { 0xF8, 0x04, 0x8102 }, { 0xF8, 0x04, 0x0102 }, + { 0xF8, 0x04, 0x058B }, { 0xF8, 0x04, 0x058B }, { 0xF8, 0x04, 0x058B }, { 0xF8, 0x04, 0x058B }, + { 0xF8, 0x04, 0x058B }, { 0xF8, 0x04, 0x058B }, { 0xF8, 0x04, 0x8102 }, +}; + +static EntranceTableEntry sCutsceneEntrance5[] = { + { 0xF8, 0x05, 0x0183 }, { 0xF8, 0x05, 0x0102 }, { 0xF8, 0x05, 0x8102 }, { 0xF8, 0x05, 0x0102 }, + { 0xF8, 0x05, 0x058B }, { 0xF8, 0x05, 0x058B }, { 0xF8, 0x05, 0x058B }, { 0xF8, 0x05, 0x058B }, + { 0xF8, 0x05, 0x058B }, { 0xF8, 0x05, 0x858B }, { 0xF8, 0x05, 0x8102 }, +}; + +static EntranceTableEntry sCutsceneEntrance6[] = { + { 0xF8, 0x06, 0x0183 }, { 0xF8, 0x06, 0x0102 }, { 0xF8, 0x06, 0x8102 }, { 0xF8, 0x06, 0x0102 }, + { 0xF8, 0x06, 0x058B }, { 0xF8, 0x06, 0x058B }, { 0xF8, 0x06, 0x058B }, { 0xF8, 0x06, 0x058B }, + { 0xF8, 0x06, 0x058B }, { 0xF8, 0x06, 0x858B }, { 0xF8, 0x06, 0x8102 }, +}; + +static EntranceTableEntry sCutsceneEntrance7[] = { + { 0xF8, 0x07, 0x0183 }, { 0xF8, 0x07, 0x0102 }, { 0xF8, 0x07, 0x8102 }, { 0xF8, 0x07, 0x0102 }, + { 0xF8, 0x07, 0x058B }, { 0xF8, 0x07, 0x058B }, { 0xF8, 0x07, 0x058B }, { 0xF8, 0x07, 0x058B }, + { 0xF8, 0x07, 0x058B }, { 0xF8, 0x07, 0x858B }, { 0xF8, 0x07, 0x8102 }, +}; + +static EntranceTableEntry sCutsceneEntrance8[] = { + { 0xF8, 0x08, 0x0183 }, { 0xF8, 0x08, 0x0102 }, { 0xF8, 0x08, 0x8102 }, { 0xF8, 0x08, 0x0102 }, + { 0xF8, 0x08, 0x058B }, { 0xF8, 0x08, 0x058B }, { 0xF8, 0x08, 0x058B }, { 0xF8, 0x08, 0x058B }, + { 0xF8, 0x08, 0x058B }, { 0xF8, 0x08, 0x858B }, { 0xF8, 0x08, 0x8102 }, +}; + +static EntranceTableEntry sCutsceneEntrance9[] = { + { 0xF8, 0x09, 0x0183 }, { 0xF8, 0x09, 0x0102 }, { 0xF8, 0x09, 0x8102 }, { 0xF8, 0x09, 0x0102 }, + { 0xF8, 0x09, 0x058B }, { 0xF8, 0x09, 0x058B }, { 0xF8, 0x09, 0x058B }, { 0xF8, 0x09, 0x058B }, + { 0xF8, 0x09, 0x058B }, { 0xF8, 0x09, 0x858B }, { 0xF8, 0x09, 0x8102 }, +}; + +static EntranceTableEntry* sCutsceneEntranceTable[] = { + sCutsceneEntrance0, sCutsceneEntrance1, sCutsceneEntrance2, sCutsceneEntrance3, sCutsceneEntrance4, + sCutsceneEntrance5, sCutsceneEntrance6, sCutsceneEntrance7, sCutsceneEntrance8, sCutsceneEntrance9, +}; + +#define SCENE_ENTRANCE(entranceTable, name) \ + { ARRAY_COUNT(entranceTable), entranceTable, name } + +#define SCENE_ENTRANCE_NONE() \ + { 0, NULL, NULL } + +/*static*/ SceneEntranceTableEntry sSceneEntranceTable[] = { + SCENE_ENTRANCE(sMayorsResidenceEntranceTable, "Z2_SONCHONOIE"), + SCENE_ENTRANCE(sMajorasLairEntranceTable, "Z2_LAST_BS"), + SCENE_ENTRANCE(sMagicHagsPotionShopEntranceTable, "Z2_WITCH_SHOP"), + SCENE_ENTRANCE(sRanchHouseEntranceTable, "Z2_OMOYA"), + SCENE_ENTRANCE(sHoneyAndDarlingsShopEntranceTable, "Z2_BOWLING"), + SCENE_ENTRANCE(sBeneathTheGraveryardEntranceTable, "Z2_HAKASHITA"), + SCENE_ENTRANCE(sSouthernSwampClearedEntranceTable, "Z2_20SICHITAI2"), + SCENE_ENTRANCE(sCuriosityShopEntranceTable, "Z2_AYASHIISHOP"), + SCENE_ENTRANCE_NONE(), + SCENE_ENTRANCE_NONE(), + SCENE_ENTRANCE(sGrottosEntranceTable, "KAKUSIANA"), + SCENE_ENTRANCE_NONE(), + SCENE_ENTRANCE_NONE(), + SCENE_ENTRANCE_NONE(), + SCENE_ENTRANCE(sCutsceneEntranceTable, "SPOT00"), + SCENE_ENTRANCE_NONE(), + SCENE_ENTRANCE(sIkanaCanyonEntranceTable, "Z2_IKANA"), + SCENE_ENTRANCE(sPiratesFortressEntranceTable, "Z2_KAIZOKU"), + SCENE_ENTRANCE(sMilkBarEntranceTable, "Z2_MILK_BAR"), + SCENE_ENTRANCE(sStoneTowerTempleEntranceTable, "Z2_INISIE_N"), + SCENE_ENTRANCE(sTreasureChestShopEntranceTable, "Z2_TAKARAYA"), + SCENE_ENTRANCE(sStoneTowerTempleReversedEntranceTable, "Z2_INISIE_R"), + SCENE_ENTRANCE(sClockTowerRooftopEntranceTable, "Z2_OKUJOU"), + SCENE_ENTRANCE(sOpeningDungeonEntranceTable, "Z2_OPENINGDAN"), + SCENE_ENTRANCE(sWoodfallTempleEntranceTable, "Z2_MITURIN"), + SCENE_ENTRANCE(sPathToMountainVillageEntranceTable, "Z2_13HUBUKINOMITI"), + SCENE_ENTRANCE(sIkanaCastleEntranceTable, "Z2_CASTLE"), + SCENE_ENTRANCE(sDekuScrubPlaygroundEntranceTable, "Z2_DEKUTES"), + SCENE_ENTRANCE(sOdolwasLairEntranceTable, "Z2_MITURIN_BS"), + SCENE_ENTRANCE(sTownShootingGalleryEntranceTable, "Z2_SYATEKI_MIZU"), + SCENE_ENTRANCE(sSnowheadTempleEntranceTable, "Z2_HAKUGIN"), + SCENE_ENTRANCE(sMilkRoadEntranceTable, "Z2_ROMANYMAE"), + SCENE_ENTRANCE(sPiratesFortressInteriorEntranceTable, "Z2_PIRATE"), + SCENE_ENTRANCE(sSwampShootingGalleryEntranceTable, "Z2_SYATEKI_MORI"), + SCENE_ENTRANCE(sPinaccleRockEntranceTable, "Z2_SINKAI"), + SCENE_ENTRANCE(sFairyFountainEntranceTable, "Z2_YOUSEI_IZUMI"), + SCENE_ENTRANCE(sSwampSpiderHouseEntranceTable, "Z2_KINSTA1"), + SCENE_ENTRANCE(sOceansideSpiderHouseEntranceTable, "Z2_KINDAN2"), + SCENE_ENTRANCE(sAstralObservatoryEntranceTable, "Z2_TENMON_DAI"), + SCENE_ENTRANCE(sMoonDekuTrialEntranceTable, "Z2_LAST_DEKU"), + SCENE_ENTRANCE(sDekuPalaceEntranceTable, "Z2_22DEKUCITY"), + SCENE_ENTRANCE(sMountainSmithyEntranceTable, "Z2_KAJIYA"), + SCENE_ENTRANCE(sTerminaFieldEntranceTable, "Z2_00KEIKOKU"), + SCENE_ENTRANCE(sPostOfficeEntranceTable, "Z2_POSTHOUSE"), + SCENE_ENTRANCE(sMarineResearchLabEntranceTable, "Z2_LABO"), + SCENE_ENTRANCE(sDampesHouseEntranceTable, "Z2_DANPEI2TEST"), + SCENE_ENTRANCE_NONE(), + SCENE_ENTRANCE(sGoronShrineEntranceTable, "Z2_16GORON_HOUSE"), + SCENE_ENTRANCE(sZoraHallEntranceTable, "Z2_33ZORACITY"), + SCENE_ENTRANCE(sTradingPostEntranceTable, "Z2_8ITEMSHOP"), + SCENE_ENTRANCE(sRomaniRanchEntranceTable, "Z2_F01"), + SCENE_ENTRANCE(sTwinmoldsLairEntranceTable, "Z2_INISIE_BS"), + SCENE_ENTRANCE(sGreatBayCoastEntranceTable, "Z2_30GYOSON"), + SCENE_ENTRANCE(sZoraCapeEntranceTable, "Z2_31MISAKI"), + SCENE_ENTRANCE(sLotteryShopEntranceTable, "Z2_TAKARAKUJI"), + SCENE_ENTRANCE_NONE(), + SCENE_ENTRANCE(sPiratesFortressExteriorEntranceTable, "Z2_TORIDE"), + SCENE_ENTRANCE(sFishermansHutEntranceTable, "Z2_FISHERMAN"), + SCENE_ENTRANCE(sGoronShopEntranceTable, "Z2_GORONSHOP"), + SCENE_ENTRANCE(sDekuKingsChamberEntranceTable, "Z2_DEKU_KING"), + SCENE_ENTRANCE(sMoonGoronTrialEntranceTable, "Z2_LAST_GORON"), + SCENE_ENTRANCE(sRoadToSouthernSwampEntranceTable, "Z2_24KEMONOMITI"), + SCENE_ENTRANCE(sDoggyRacetrackEntranceTable, "Z2_F01_B"), + SCENE_ENTRANCE(sCuccoShackEntranceTable, "Z2_F01C"), + SCENE_ENTRANCE(sIkanaGraveyardEntranceTable, "Z2_BOTI"), + SCENE_ENTRANCE(sGohtsLairEntranceTable, "Z2_HAKUGIN_BS"), + SCENE_ENTRANCE(sSouthernSwampPoisonedEntranceTable, "Z2_20SICHITAI"), + SCENE_ENTRANCE(sWoodfallEntranceTable, "Z2_21MITURINMAE"), + SCENE_ENTRANCE(sMoonZoraTrialEntranceTable, "Z2_LAST_ZORA"), + SCENE_ENTRANCE(sGoronVillageSpringEntranceTable, "Z2_11GORONNOSATO2"), + SCENE_ENTRANCE(sGreatBayTempleEntranceTable, "Z2_SEA"), + SCENE_ENTRANCE(sWaterfallRapidsEntranceTable, "Z2_35TAKI"), + SCENE_ENTRANCE(sBeneathTheWellEntranceTable, "Z2_REDEAD"), + SCENE_ENTRANCE(sZoraHallRoomsEntranceTable, "Z2_BANDROOM"), + SCENE_ENTRANCE(sGoronVillageWinterEntranceTable, "Z2_11GORONNOSATO"), + SCENE_ENTRANCE(sGoronGraveryardEntranceTable, "Z2_GORON_HAKA"), + SCENE_ENTRANCE(sSakonsHideoutEntranceTable, "Z2_SECOM"), + SCENE_ENTRANCE(sMountainVillageWinterEntranceTable, "Z2_10YUKIYAMANOMURA"), + SCENE_ENTRANCE(sGhostHutEntranceTable, "Z2_TOUGITES"), + SCENE_ENTRANCE(sDekuShrineEntranceTable, "Z2_DANPEI"), + SCENE_ENTRANCE(sRoadToIkanaEntranceTable, "Z2_IKANAMAE"), + SCENE_ENTRANCE(sSwordmansSchoolEntranceTable, "Z2_DOUJOU"), + SCENE_ENTRANCE(sMusicBoxHouseEntranceTable, "Z2_MUSICHOUSE"), + SCENE_ENTRANCE(sIgosDuIkanasLairEntranceTable, "Z2_IKNINSIDE"), + SCENE_ENTRANCE(sTouristInformationEntranceTable, "Z2_MAP_SHOP"), + SCENE_ENTRANCE(sStoneTowerEntranceTable, "Z2_F40"), + SCENE_ENTRANCE(sStoneTowerInvertedEntranceTable, "Z2_F41"), + SCENE_ENTRANCE(sMountainVillageSpringEntranceTable, "Z2_10YUKIYAMANOMURA2"), + SCENE_ENTRANCE(sPathToSnowheadEntranceTable, "Z2_14YUKIDAMANOMITI"), + SCENE_ENTRANCE(sSnowheadEntranceTable, "Z2_12HAKUGINMAE"), + SCENE_ENTRANCE(sPathToGoronVillageWinterEntranceTable, "Z2_17SETUGEN"), + SCENE_ENTRANCE(sPathToGoronVillageSpringEntranceTable, "Z2_17SETUGEN2"), + SCENE_ENTRANCE(sGyorgsLairEntranceTable, "Z2_SEA_BS"), + SCENE_ENTRANCE(sSecretShrineEntranceTable, "Z2_RANDOM"), + SCENE_ENTRANCE(sStockPotInnEntranceTable, "Z2_YADOYA"), + SCENE_ENTRANCE(sGreatBayCutsceneEntranceTable, "Z2_KONPEKI_ENT"), + SCENE_ENTRANCE(sClockTowerInteriorEntranceTable, "Z2_INSIDETOWER"), + SCENE_ENTRANCE(sWoodsOfMysteryEntranceTable, "Z2_26SARUNOMORI"), + SCENE_ENTRANCE(sLostWoodsEntranceTable, "Z2_LOST_WOODS"), + SCENE_ENTRANCE(sMoonLinkTrialEntranceTable, "Z2_LAST_LINK"), + SCENE_ENTRANCE(sTheMoonEntranceTable, "Z2_SOUGEN"), + SCENE_ENTRANCE(sBombShopEntranceTable, "Z2_BOMYA"), + SCENE_ENTRANCE(sGiantsChamberEntranceTable, "Z2_KYOJINNOMA"), + SCENE_ENTRANCE(sGormanTrackEntranceTable, "Z2_KOEPONARACE"), + SCENE_ENTRANCE(sGoronRacetrackEntranceTable, "Z2_GORONRACE"), + SCENE_ENTRANCE(sEastClockTownEntranceTable, "Z2_TOWN"), + SCENE_ENTRANCE(sWestClockTownEntranceTable, "Z2_ICHIBA"), + SCENE_ENTRANCE(sNorthClockTownEntranceTable, "Z2_BACKTOWN"), + SCENE_ENTRANCE(sSouthClockTownEntranceTable, "Z2_CLOCKTOWER"), + SCENE_ENTRANCE(sLaundryPoolEntranceTable, "Z2_ALLEY"), +}; + +/** + * Returns a pointer to an entrance table from a given entrance index. + */ +EntranceTableEntry* Entrance_GetTableEntry(u16 entranceIndex) { + u32 entranceIndex2 = entranceIndex; + EntranceTableEntry** tableEntryP = sSceneEntranceTable[entranceIndex2 >> 9].table; + EntranceTableEntry* tableEntry = tableEntryP[(entranceIndex2 >> 4) & 0x1F]; + + return &tableEntry[entranceIndex2 & 0xF]; +} + +/** + * Returns the scene index from a given entrance index. + */ +s32 Entrance_GetSceneNum(u16 entranceIndex) { + EntranceTableEntry* tableEntry = Entrance_GetTableEntry(entranceIndex); + + return tableEntry->sceneNum; +} + +/** + * Returns the absolute value scene index (since for some reason some of them are negative) from a given entrance index. + */ +s32 Entrance_GetSceneNumAbsolute(u16 entranceIndex) { + EntranceTableEntry* tableEntry = Entrance_GetTableEntry(entranceIndex); + + return ABS_ALT(tableEntry->sceneNum); +} + +/** + * Returns the spawn index from a given entrance index. + */ +s32 Entrance_GetSpawnNum(u16 entranceIndex) { + EntranceTableEntry* tableEntry = Entrance_GetTableEntry(entranceIndex); + + return tableEntry->spawnNum; +} + +/** + * Returns the transition effect flags from a given entrance index. + */ +s32 Entrance_GetTransitionFlags(u16 entranceIndex) { + EntranceTableEntry* tableEntry = Entrance_GetTableEntry(entranceIndex); + + return tableEntry->flags; +} |
