summaryrefslogtreecommitdiff
path: root/src/code
diff options
context:
space:
mode:
authorZelllll <56516451+Zelllll@users.noreply.github.com>2021-05-09 21:12:42 -0500
committerGitHub <noreply@github.com>2021-05-09 22:12:42 -0400
commit874a75f456b8943d09e5e682811397c578ae6671 (patch)
tree95756da6012c3177510e9d7b52f37fa5ce34a0a5 /src/code
parente39141fb3df04cfd7c0df63e4570340db5df9e1a (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.c6
-rw-r--r--src/code/z_effect_soft_sprite_old_init.c2
-rw-r--r--src/code/z_en_item00.c20
-rw-r--r--src/code/z_scene.c652
-rw-r--r--src/code/z_scene_proc.c1079
-rw-r--r--src/code/z_scene_table.c2818
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;
+}