From f30e76e7b13de7493a6b4638e554f7bded65d513 Mon Sep 17 00:00:00 2001 From: Garrett Cox Date: Sat, 16 Sep 2023 23:20:13 -0500 Subject: [PATCH 001/113] MVP ValueViewer --- soh/soh/Enhancements/debugger/valueViewer.cpp | 219 ++++++++++++++++++ soh/soh/Enhancements/debugger/valueViewer.h | 53 +++++ soh/soh/SohGui.cpp | 4 + soh/soh/SohGui.hpp | 1 + soh/soh/SohMenuBar.cpp | 8 + soh/src/code/graph.c | 23 ++ 6 files changed, 308 insertions(+) create mode 100644 soh/soh/Enhancements/debugger/valueViewer.cpp create mode 100644 soh/soh/Enhancements/debugger/valueViewer.h diff --git a/soh/soh/Enhancements/debugger/valueViewer.cpp b/soh/soh/Enhancements/debugger/valueViewer.cpp new file mode 100644 index 000000000..14a571dac --- /dev/null +++ b/soh/soh/Enhancements/debugger/valueViewer.cpp @@ -0,0 +1,219 @@ +#include "valueViewer.h" +#include "../../UIWidgets.hpp" + +extern "C" { +#include +#include "variables.h" +#include "functions.h" +#include "macros.h" +extern PlayState* gPlayState; +void GfxPrint_SetColor(GfxPrint* printer, u32 r, u32 g, u32 b, u32 a); +void GfxPrint_SetPos(GfxPrint* printer, s32 x, s32 y); +s32 GfxPrint_Printf(GfxPrint* printer, const char* fmt, ...); +} + +ImVec4 WHITE = ImVec4(1.0f, 1.0f, 1.0f, 1.0f); + +std::vector valueTable = { + { "Time", "gSaveContext.dayTime", "TIME:", TYPE_U16, false, []() -> void* { return &gSaveContext.dayTime; }, WHITE }, + { "Age", "gSaveContext.linkAge", "AGE:", TYPE_S32, false, []() -> void* { return &gSaveContext.linkAge; }, WHITE }, + { "Health", "gSaveContext.health", "HP:", TYPE_S16, false, []() -> void* { return &gSaveContext.health; }, WHITE }, + { "Navi Timer", "gSaveContext.naviTimer", "NAVI:", TYPE_U16, false, []() -> void* { return &gSaveContext.naviTimer; }, WHITE }, + { "Scene ID", "play->sceneNum", "SCENE:", TYPE_S16, true, []() -> void* { return &gPlayState->sceneNum; }, WHITE }, + { "Room ID", "play->roomCtx.curRoom.num", "ROOM:", TYPE_S8, true, []() -> void* { return &gPlayState->roomCtx.curRoom.num; }, WHITE }, + { "Entrance ID", "gSaveContext.entranceIndex", "ENTR:", TYPE_S32, false, []() -> void* { return &gSaveContext.entranceIndex; }, WHITE }, + { "Cutscene ID", "gSaveContext.cutsceneIndex", "CUTS:", TYPE_S32, false, []() -> void* { return &gSaveContext.cutsceneIndex; }, WHITE }, + { "Link X", "Player->actor.world.pos.x", "X:", TYPE_FLOAT, true, []() -> void* { return &GET_PLAYER(gPlayState)->actor.world.pos.x; }, WHITE }, + { "Link Y", "Player->actor.world.pos.y", "Y:", TYPE_FLOAT, true, []() -> void* { return &GET_PLAYER(gPlayState)->actor.world.pos.y; }, WHITE }, + { "Link Z", "Player->actor.world.pos.z", "Z:", TYPE_FLOAT, true, []() -> void* { return &GET_PLAYER(gPlayState)->actor.world.pos.z; }, WHITE }, + { "Link Yaw", "Player->actor.world.rot.y", "ROT:", TYPE_S16, true, []() -> void* { return &GET_PLAYER(gPlayState)->actor.world.rot.y; }, WHITE }, + { "Link Velocity", "Player->linearVelocity", "V:", TYPE_FLOAT, true, []() -> void* { return &GET_PLAYER(gPlayState)->linearVelocity; }, WHITE }, + { "Link X Velocity", "Player->actor.velocity.x", "XV:", TYPE_FLOAT, true, []() -> void* { return &GET_PLAYER(gPlayState)->actor.velocity.x; }, WHITE }, + { "Link Y Velocity", "Player->actor.velocity.y", "YV:", TYPE_FLOAT, true, []() -> void* { return &GET_PLAYER(gPlayState)->actor.velocity.y; }, WHITE }, + { "Link Z Velocity", "Player->actor.velocity.z", "ZV:", TYPE_FLOAT, true, []() -> void* { return &GET_PLAYER(gPlayState)->actor.velocity.z; }, WHITE }, + { "Text ID", "play->msgCtx.textId", "TEXTID:", TYPE_U16, true, []() -> void* { return &gPlayState->msgCtx.textId; }, WHITE }, + { "Analog Stick X", "play->state.input->cur.stick_x", "AX:", TYPE_S8, true, []() -> void* { return &gPlayState->state.input->cur.stick_x; }, WHITE }, + { "Analog Stick Y", "play->state.input->cur.stick_y", "AY:", TYPE_S8, true, []() -> void* { return &gPlayState->state.input->cur.stick_y; }, WHITE }, + /* TODO: Find these (from GZ) + "XZ Units Traveled (Camera based speed variable)" f32 0x801C9018 + "Movement Angle" x16 0x801DBB1C + "Camera Angle" u16 0x801C907C + "Time of Day" x16 0x8011AC8C + "Global Frame Counter" s32 0x801C8DFC + "Lit Deku Stick Timer" u16 0x801DBB40 + "Cutscene Pointer" u32 0x801CAAC8 + "Get Item Value" s8 0x801DB714 + "Last RNG Value" x32 0x80105A80 + "Last Item Button Pressed" u8 0x801DB430 + "Last Damage Value" x32 0x801DB7DC + "Temp B Value" u8 0x8011C062 + "Framerate Divisor" u8 0x801C7861 + "Heads Up Display (HUD)" u16 0x8011C068 + "Analog Stick Angle" s16 0x803AA698 + "Deku Tree Warp Timer (Reload Room)" u16 0x801F0352 + "Dodongo's Cavern Warp Timer" u16 0x801E30B2 + "Jabu-Jabu Warp Timer" u16 0x802008B2 + "Forest Temple Warp Timer" u16 0x801EC5B2 + "Fire Temple Warp Timer" u16 0x801F3E42 + "Water Temple Warp Timer" u16 0x801F8762 + "Shadow Temple Warp Timer" u16 0x801F48A2 + "Spirit Temple Warp Timer" u16 0x801FD562 + "Deku Tree Warp Timer" u16 0x801F83A2 + */ +}; + +extern "C" void ValueViewer_Draw(GfxPrint* printer) { + for (int i = 0; i < valueTable.size(); i++) { + ValueTableElement& element = valueTable[i]; + if (!element.isActive || !element.isPrinted || (gPlayState == NULL && element.requiresPlayState)) continue; + GfxPrint_SetColor(printer, element.color.x * 255, element.color.y * 255, element.color.z * 255, element.color.w * 255); + GfxPrint_SetPos(printer, element.x, element.y); + switch (element.type) { + case TYPE_S8: + GfxPrint_Printf(printer, (element.typeFormat ? "%s0x%x" : "%s%d"), element.prefix.c_str(), *(s8*)element.valueFn()); + break; + case TYPE_U8: + GfxPrint_Printf(printer, (element.typeFormat ? "%s0x%x" : "%s%u"), element.prefix.c_str(), *(u8*)element.valueFn()); + break; + case TYPE_S16: + GfxPrint_Printf(printer, (element.typeFormat ? "%s0x%x" : "%s%d"), element.prefix.c_str(), *(s16*)element.valueFn()); + break; + case TYPE_U16: + GfxPrint_Printf(printer, (element.typeFormat ? "%s0x%x" : "%s%u"), element.prefix.c_str(), *(u16*)element.valueFn()); + break; + case TYPE_S32: + GfxPrint_Printf(printer, (element.typeFormat ? "%s0x%x" : "%s%d"), element.prefix.c_str(), *(s32*)element.valueFn()); + break; + case TYPE_U32: + GfxPrint_Printf(printer, (element.typeFormat ? "%s0x%x" : "%s%u"), element.prefix.c_str(), *(u32*)element.valueFn()); + break; + case TYPE_CHAR: + GfxPrint_Printf(printer, "%s%c", element.prefix.c_str(), *(char*)element.valueFn()); + break; + case TYPE_STRING: + GfxPrint_Printf(printer, "%s%s", element.prefix.c_str(), (char*)element.valueFn()); + break; + case TYPE_FLOAT: + GfxPrint_Printf(printer, (element.typeFormat ? "%s%4.1f" : "%s%f"), element.prefix.c_str(), *(float*)element.valueFn()); + break; + } + } +} + +void ValueViewerWindow::DrawElement() { + ImGui::SetNextWindowSize(ImVec2(520, 600), ImGuiCond_FirstUseEver); + if (!ImGui::Begin("Value Viewer", &mIsVisible, ImGuiWindowFlags_NoFocusOnAppearing)) { + ImGui::End(); + return; + } + + UIWidgets::PaddedEnhancementCheckbox("Enable Printing", "gValueViewer.EnablePrinting"); + + ImGui::BeginGroup(); + static int selectedElement = -1; + std::string selectedElementText = (selectedElement == -1) ? "Select a value" : ( + std::string(valueTable[selectedElement].name) + " (" + std::string(valueTable[selectedElement].path) + ")" + ); + if (ImGui::BeginCombo("##valueViewerElement", selectedElementText.c_str())) { + for (int i = 0; i < valueTable.size(); i++) { + if (valueTable[i].isActive) continue; + bool isSelected = (selectedElement == i); + std::string elementText = ( + std::string(valueTable[i].name) + " (" + std::string(valueTable[i].path) + ")" + ); + if (ImGui::Selectable(elementText.c_str(), isSelected)) { + selectedElement = i; + } + if (isSelected) { + ImGui::SetItemDefaultFocus(); + } + } + ImGui::EndCombo(); + } + ImGui::SameLine(); + if (selectedElement != -1 && ImGui::Button("+")) { + valueTable[selectedElement].isActive = true; + selectedElement = -1; + } + ImGui::EndGroup(); + + for (int i = 0; i < valueTable.size(); i++) { + ValueTableElement& element = valueTable[i]; + if (!element.isActive || (gPlayState == NULL && element.requiresPlayState)) continue; + if (ImGui::Button(("x##" + std::string(element.name)).c_str())) { + element.isActive = false; + element.isPrinted = false; + } + ImGui::SameLine(); + ImGui::Text("%s:", element.name); + ImGui::SameLine(); + switch (element.type) { + case TYPE_S8: + ImGui::Text(element.typeFormat ? "0x%x" : "%d", *(s8*)element.valueFn()); + break; + case TYPE_U8: + ImGui::Text(element.typeFormat ? "0x%x" : "%u", *(u8*)element.valueFn()); + break; + case TYPE_S16: + ImGui::Text(element.typeFormat ? "0x%x" : "%d", *(s16*)element.valueFn()); + break; + case TYPE_U16: + ImGui::Text(element.typeFormat ? "0x%x" : "%u", *(u16*)element.valueFn()); + break; + case TYPE_S32: + ImGui::Text(element.typeFormat ? "0x%x" : "%d", *(s32*)element.valueFn()); + break; + case TYPE_U32: + ImGui::Text(element.typeFormat ? "0x%x" : "%u", *(u32*)element.valueFn()); + break; + case TYPE_CHAR: + ImGui::Text("%c", *(char*)element.valueFn()); + break; + case TYPE_STRING: + ImGui::Text("%s", (char*)element.valueFn()); + break; + case TYPE_FLOAT: + ImGui::Text(element.typeFormat ? "%4.1f" : "%f", *(float*)element.valueFn()); + break; + } + ImGui::SameLine(); + + if (element.type <= TYPE_U32) { + ImGui::Checkbox(("Hex##" + std::string(element.name)).c_str(), &element.typeFormat); + ImGui::SameLine(); + } else if (element.type == TYPE_FLOAT) { + ImGui::Checkbox(("Trim##" + std::string(element.name)).c_str(), &element.typeFormat); + ImGui::SameLine(); + } + + ImGui::BeginGroup(); + if (CVarGetInteger("gValueViewer.EnablePrinting", 0)) { + ImGui::Checkbox(("Print##" + std::string(element.name)).c_str(), &element.isPrinted); + if (element.isPrinted) { + char* prefix = (char*)element.prefix.c_str(); + ImGui::SameLine(); + ImGui::SetNextItemWidth(80.0f); + if (ImGui::InputText(("Prefix##" + std::string(element.name)).c_str(), prefix, 10)) { + element.prefix = prefix; + } + ImGui::SameLine(); + ImGui::ColorEdit3(("##color" + std::string(element.name)).c_str(), (float*)&element.color, ImGuiColorEditFlags_NoInputs | ImGuiColorEditFlags_NoLabel); + ImGui::SameLine(); + if (ImGui::Button(("Position##" + std::string(element.name)).c_str())) { + ImGui::OpenPopup(("Position Picker##" + std::string(element.name)).c_str()); + } + if (ImGui::BeginPopup(("Position Picker##" + std::string(element.name)).c_str())) { + ImGui::DragInt("X", (int*)&element.x, 1.0f, 0, 44); + ImGui::DragInt("Y", (int*)&element.y, 1.0f, 0, 29); + ImGui::EndPopup(); + } + } + } + ImGui::EndGroup(); + } + + ImGui::End(); +} + +void ValueViewerWindow::InitElement() { +} diff --git a/soh/soh/Enhancements/debugger/valueViewer.h b/soh/soh/Enhancements/debugger/valueViewer.h new file mode 100644 index 000000000..7631b8c3f --- /dev/null +++ b/soh/soh/Enhancements/debugger/valueViewer.h @@ -0,0 +1,53 @@ +#pragma once + +#ifdef __cplusplus + +#include + +typedef enum { + TYPE_S8, + TYPE_U8, + TYPE_S16, + TYPE_U16, + TYPE_S32, + TYPE_U32, + TYPE_CHAR, + TYPE_STRING, + TYPE_FLOAT, +} ValueType; + +typedef void* (*ValueFn)(); + +typedef struct { + const char* name; + const char* path; + std::string prefix; + ValueType type; + bool requiresPlayState; + ValueFn valueFn; + ImVec4 color; + bool isActive; + bool isPrinted; + bool typeFormat; + uint32_t x; + uint32_t y; +} ValueTableElement; + +class ValueViewerWindow : public LUS::GuiWindow { + public: + using GuiWindow::GuiWindow; + + void InitElement() override; + void DrawElement() override; + void UpdateElement() override {}; +}; + +extern "C" { +#include +#endif + +void ValueViewer_Draw(GfxPrint* printer); + +#ifdef __cplusplus +} +#endif \ No newline at end of file diff --git a/soh/soh/SohGui.cpp b/soh/soh/SohGui.cpp index 73b006df9..af452352b 100644 --- a/soh/soh/SohGui.cpp +++ b/soh/soh/SohGui.cpp @@ -118,6 +118,7 @@ namespace SohGui { std::shared_ptr mColViewerWindow; std::shared_ptr mSaveEditorWindow; std::shared_ptr mDLViewerWindow; + std::shared_ptr mValueViewerWindow; std::shared_ptr mGameplayStatsWindow; std::shared_ptr mCheckTrackerSettingsWindow; std::shared_ptr mCheckTrackerWindow; @@ -169,6 +170,8 @@ namespace SohGui { gui->AddGuiWindow(mSaveEditorWindow); mDLViewerWindow = std::make_shared("gDLViewerEnabled", "Display List Viewer"); gui->AddGuiWindow(mDLViewerWindow); + mValueViewerWindow = std::make_shared("gValueViewer.WindowOpen", "Value Viewer"); + gui->AddGuiWindow(mValueViewerWindow); mGameplayStatsWindow = std::make_shared("gGameplayStatsEnabled", "Gameplay Stats"); gui->AddGuiWindow(mGameplayStatsWindow); mCheckTrackerWindow = std::make_shared("gCheckTrackerEnabled", "Check Tracker"); @@ -194,6 +197,7 @@ namespace SohGui { mCheckTrackerSettingsWindow = nullptr; mGameplayStatsWindow = nullptr; mDLViewerWindow = nullptr; + mValueViewerWindow = nullptr; mSaveEditorWindow = nullptr; mColViewerWindow = nullptr; mActorViewerWindow = nullptr; diff --git a/soh/soh/SohGui.hpp b/soh/soh/SohGui.hpp index 59333fd42..fccc29c1f 100644 --- a/soh/soh/SohGui.hpp +++ b/soh/soh/SohGui.hpp @@ -17,6 +17,7 @@ #include "Enhancements/debugger/colViewer.h" #include "Enhancements/debugger/debugSaveEditor.h" #include "Enhancements/debugger/dlViewer.h" +#include "Enhancements/debugger/valueViewer.h" #include "Enhancements/gameplaystatswindow.h" #include "Enhancements/randomizer/randomizer_check_tracker.h" #include "Enhancements/randomizer/randomizer_entrance_tracker.h" diff --git a/soh/soh/SohMenuBar.cpp b/soh/soh/SohMenuBar.cpp index d8cbefd0b..10ffc7030 100644 --- a/soh/soh/SohMenuBar.cpp +++ b/soh/soh/SohMenuBar.cpp @@ -22,6 +22,7 @@ #include "Enhancements/debugger/colViewer.h" #include "Enhancements/debugger/debugSaveEditor.h" #include "Enhancements/debugger/dlViewer.h" +#include "Enhancements/debugger/valueViewer.h" #include "Enhancements/gameplaystatswindow.h" #include "Enhancements/randomizer/randomizer_check_tracker.h" #include "Enhancements/randomizer/randomizer_entrance_tracker.h" @@ -1377,6 +1378,7 @@ extern std::shared_ptr mSaveEditorWindow; extern std::shared_ptr mColViewerWindow; extern std::shared_ptr mActorViewerWindow; extern std::shared_ptr mDLViewerWindow; +extern std::shared_ptr mValueViewerWindow; void DrawDeveloperToolsMenu() { if (ImGui::BeginMenu("Developer Tools")) { @@ -1446,6 +1448,12 @@ void DrawDeveloperToolsMenu() { mDLViewerWindow->ToggleVisibility(); } } + UIWidgets::Spacer(0); + if (mValueViewerWindow) { + if (ImGui::Button(GetWindowButtonText("Value Viewer", CVarGetInteger("gValueViewer.WindowOpen", 0)).c_str(), ImVec2(-1.0f, 0.0f))) { + mValueViewerWindow->ToggleVisibility(); + } + } ImGui::PopStyleVar(3); ImGui::PopStyleColor(1); diff --git a/soh/src/code/graph.c b/soh/src/code/graph.c index 85169db77..d273e7643 100644 --- a/soh/src/code/graph.c +++ b/soh/src/code/graph.c @@ -7,6 +7,7 @@ #include #include "soh/Enhancements/debugger/colViewer.h" +#include "soh/Enhancements/debugger/valueViewer.h" #include "soh/Enhancements/gameconsole.h" #include "soh/OTRGlobals.h" @@ -289,6 +290,28 @@ void Graph_Update(GraphicsContext* gfxCtx, GameState* gameState) { OPEN_DISPS(gfxCtx); + if (CVarGetInteger("gValueViewer.EnablePrinting", 0)) { + Gfx* gfx; + Gfx* polyOpa; + GfxPrint printer; + + polyOpa = POLY_OPA_DISP; + gfx = Graph_GfxPlusOne(polyOpa); + gSPDisplayList(OVERLAY_DISP++, gfx); + + GfxPrint_Init(&printer); + GfxPrint_Open(&printer, gfx); + + ValueViewer_Draw(&printer); + + gfx = GfxPrint_Close(&printer); + GfxPrint_Destroy(&printer); + + gSPEndDisplayList(gfx++); + Graph_BranchDlist(polyOpa, gfx); + POLY_OPA_DISP = gfx; + } + gDPNoOpString(WORK_DISP++, "WORK_DISP 終了", 0); gDPNoOpString(POLY_OPA_DISP++, "POLY_OPA_DISP 終了", 0); gDPNoOpString(POLY_XLU_DISP++, "POLY_XLU_DISP 終了", 0); From 03ea465251f4bf78599457fb475a0fa71f3f1be0 Mon Sep 17 00:00:00 2001 From: inspectredc Date: Wed, 18 Oct 2023 21:21:50 +0100 Subject: [PATCH 002/113] Toggle Strength --- soh/soh/SohMenuBar.cpp | 6 +++ soh/src/code/z_player_lib.c | 4 ++ .../ovl_kaleido_scope/z_kaleido_equipment.c | 45 ++++++++++++++++--- 3 files changed, 50 insertions(+), 5 deletions(-) diff --git a/soh/soh/SohMenuBar.cpp b/soh/soh/SohMenuBar.cpp index 04f25d2e8..c7233aef4 100644 --- a/soh/soh/SohMenuBar.cpp +++ b/soh/soh/SohMenuBar.cpp @@ -604,6 +604,12 @@ void DrawEnhancementsMenu() { UIWidgets::Tooltip("Prevent bombchus from forcing the camera into first-person mode when released."); UIWidgets::PaddedEnhancementCheckbox("Aiming reticle for the bow/slingshot", "gBowReticle", true, false); UIWidgets::Tooltip("Aiming with a bow or slingshot will display a reticle as with the hookshot when the projectile is ready to fire."); + if (UIWidgets::PaddedEnhancementCheckbox("Allow strength equipment to be toggled", "gToggleStrength", true, false)) { + if (!CVarGetInteger("gToggleStrength", 0)) { + CVarSetInteger("gStrengthDisabled", 0); + } + } + UIWidgets::Tooltip("Allows strength to be toggled on and off by pressing A on the strength upgrade in the equipment subscreen of the pause menu"); ImGui::EndMenu(); } diff --git a/soh/src/code/z_player_lib.c b/soh/src/code/z_player_lib.c index 32a3e6e48..0153cdbd5 100644 --- a/soh/src/code/z_player_lib.c +++ b/soh/src/code/z_player_lib.c @@ -509,6 +509,10 @@ s32 Player_IsBurningStickInRange(PlayState* play, Vec3f* pos, f32 xzRange, f32 y s32 Player_GetStrength(void) { s32 strengthUpgrade = CUR_UPG_VALUE(UPG_STRENGTH); + if (CVarGetInteger("gToggleStrength", 0) && CVarGetInteger("gStrengthDisabled", 0)) { + return PLAYER_STR_NONE; + } + if (CVarGetInteger("gTimelessEquipment", 0) || LINK_IS_ADULT) { return strengthUpgrade; } else if (strengthUpgrade != 0) { diff --git a/soh/src/overlays/misc/ovl_kaleido_scope/z_kaleido_equipment.c b/soh/src/overlays/misc/ovl_kaleido_scope/z_kaleido_equipment.c index dd6ea6a16..ec16564eb 100644 --- a/soh/src/overlays/misc/ovl_kaleido_scope/z_kaleido_equipment.c +++ b/soh/src/overlays/misc/ovl_kaleido_scope/z_kaleido_equipment.c @@ -488,6 +488,12 @@ void KaleidoScope_DrawEquipment(PlayState* play) { } } + // Grey Out Strength Upgrade Name when Disabled + if ((pauseCtx->cursorX[PAUSE_EQUIP] == 0) && (pauseCtx->cursorY[PAUSE_EQUIP] == 2) && + CVarGetInteger("gToggleStrength", 0) && CVarGetInteger("gStrengthDisabled", 0)) { + pauseCtx->nameColorSet = 1; + } + if ((pauseCtx->cursorX[PAUSE_EQUIP] == 0) && (pauseCtx->cursorY[PAUSE_EQUIP] == 0)) { if (LINK_AGE_IN_YEARS != YEARS_CHILD) { if ((cursorItem >= ITEM_BULLET_BAG_30) && (cursorItem <= ITEM_BULLET_BAG_50)) { @@ -507,6 +513,13 @@ void KaleidoScope_DrawEquipment(PlayState* play) { buttonsToCheck |= BTN_DUP | BTN_DDOWN | BTN_DLEFT | BTN_DRIGHT; } + // Allow Toggling of Strength when Pressing A on Strength Upgrade Slot + if ((pauseCtx->cursorSpecialPos == 0) && (pauseCtx->state == 6) && + (pauseCtx->unk_1E4 == 0) && CHECK_BTN_ALL(input->press.button, BTN_A) && + (pauseCtx->cursorX[PAUSE_EQUIP] == 0) && (pauseCtx->cursorY[PAUSE_EQUIP] == 2) && CVarGetInteger("gToggleStrength", 0)) { + CVarSetInteger("gStrengthDisabled", !CVarGetInteger("gStrengthDisabled", 0)); + } + if ((pauseCtx->cursorSpecialPos == 0) && (cursorItem != PAUSE_ITEM_NONE) && (pauseCtx->state == 6) && (pauseCtx->unk_1E4 == 0) && CHECK_BTN_ANY(input->press.button, buttonsToCheck) && (pauseCtx->cursorX[PAUSE_EQUIP] != 0)) { @@ -659,6 +672,22 @@ void KaleidoScope_DrawEquipment(PlayState* play) { } } + // Add zoom effect to strength item if cursor is hovering over it and strength is not disabled when the toggle is on + if ((pauseCtx->cursorX[PAUSE_EQUIP] == 0) && (pauseCtx->cursorY[PAUSE_EQUIP] == 2) && + CVarGetInteger("gToggleStrength", 0) && !CVarGetInteger("gStrengthDisabled", 0)) { + i = 2; // row + k = 0; // column + j = 16 * i + 4 * k; // vtx index + pauseCtx->equipVtx[j].v.ob[0] = pauseCtx->equipVtx[j + 2].v.ob[0] = + pauseCtx->equipVtx[j].v.ob[0] - 2; + pauseCtx->equipVtx[j + 1].v.ob[0] = pauseCtx->equipVtx[j + 3].v.ob[0] = + pauseCtx->equipVtx[j + 1].v.ob[0] + 4; + pauseCtx->equipVtx[j].v.ob[1] = pauseCtx->equipVtx[j + 1].v.ob[1] = + pauseCtx->equipVtx[j].v.ob[1] + 2; + pauseCtx->equipVtx[j + 2].v.ob[1] = pauseCtx->equipVtx[j + 3].v.ob[1] = + pauseCtx->equipVtx[j + 2].v.ob[1] - 4; + } + Gfx_SetupDL_42Opa(play->state.gfxCtx); gDPSetCombineMode(POLY_KAL_DISP++, G_CC_MODULATEIA_PRIM, G_CC_MODULATEIA_PRIM); @@ -670,9 +699,12 @@ void KaleidoScope_DrawEquipment(PlayState* play) { if (LINK_AGE_IN_YEARS == YEARS_CHILD) { point = CUR_UPG_VALUE(sChildUpgrades[i]); if ((point != 0) && (CUR_UPG_VALUE(sChildUpgrades[i]) != 0)) { - if (drawGreyItems && + // Grey Out the Gauntlets as Child + // Grey Out Strength Upgrades when Disabled and the Toggle Option is on + if ((drawGreyItems && ((sChildUpgradeItemBases[i] + CUR_UPG_VALUE(sChildUpgrades[i]) - 1) == ITEM_GAUNTLETS_SILVER || - (sChildUpgradeItemBases[i] + CUR_UPG_VALUE(sChildUpgrades[i]) - 1) == ITEM_GAUNTLETS_GOLD)) { // Grey Out the Gauntlets + (sChildUpgradeItemBases[i] + CUR_UPG_VALUE(sChildUpgrades[i]) - 1) == ITEM_GAUNTLETS_GOLD)) || + (CVarGetInteger("gToggleStrength", 0) && CVarGetInteger("gStrengthDisabled", 0) && sChildUpgrades[i] == UPG_STRENGTH)) { gDPSetGrayscaleColor(POLY_KAL_DISP++, 109, 109, 109, 255); gSPGrayscale(POLY_KAL_DISP++, true); } @@ -688,9 +720,12 @@ void KaleidoScope_DrawEquipment(PlayState* play) { KaleidoScope_DrawQuadTextureRGBA32(play->state.gfxCtx, gItemIcons[sChildUpgradeItemBases[i] + CUR_UPG_VALUE(sChildUpgrades[i]) - 1], 32, 32, 0); gSPGrayscale(POLY_KAL_DISP++, false); } else if (CUR_UPG_VALUE(sAdultUpgrades[i]) != 0) { - if (drawGreyItems && - ((sAdultUpgradeItemBases[i] + CUR_UPG_VALUE(sAdultUpgrades[i]) - 1) == ITEM_BRACELET && - !(IS_RANDO))) { // Grey Out the Goron Bracelet when Not Randomized + // Grey Out the Goron Bracelet when Not Randomized + // Grey Out Strength Upgrades when Disabled and the Toggle Option is on + if ((drawGreyItems && + (((sAdultUpgradeItemBases[i] + CUR_UPG_VALUE(sAdultUpgrades[i]) - 1) == ITEM_BRACELET && + !(IS_RANDO)))) || + (CVarGetInteger("gToggleStrength", 0) && CVarGetInteger("gStrengthDisabled", 0) && sAdultUpgrades[i] == UPG_STRENGTH)) { gDPSetGrayscaleColor(POLY_KAL_DISP++, 109, 109, 109, 255); gSPGrayscale(POLY_KAL_DISP++, true); } From c22d1e724db4717df2ebf39580b042c6399c1d51 Mon Sep 17 00:00:00 2001 From: inspectredc Date: Wed, 18 Oct 2023 21:29:00 +0100 Subject: [PATCH 003/113] No longer grey out bracelet as adult when toggle option is on and strength enabled --- .../overlays/misc/ovl_kaleido_scope/z_kaleido_equipment.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/soh/src/overlays/misc/ovl_kaleido_scope/z_kaleido_equipment.c b/soh/src/overlays/misc/ovl_kaleido_scope/z_kaleido_equipment.c index ec16564eb..2c1779c55 100644 --- a/soh/src/overlays/misc/ovl_kaleido_scope/z_kaleido_equipment.c +++ b/soh/src/overlays/misc/ovl_kaleido_scope/z_kaleido_equipment.c @@ -700,7 +700,7 @@ void KaleidoScope_DrawEquipment(PlayState* play) { point = CUR_UPG_VALUE(sChildUpgrades[i]); if ((point != 0) && (CUR_UPG_VALUE(sChildUpgrades[i]) != 0)) { // Grey Out the Gauntlets as Child - // Grey Out Strength Upgrades when Disabled and the Toggle Option is on + // Grey Out Strength Upgrades when Disabled and the Toggle Strength Option is on if ((drawGreyItems && ((sChildUpgradeItemBases[i] + CUR_UPG_VALUE(sChildUpgrades[i]) - 1) == ITEM_GAUNTLETS_SILVER || (sChildUpgradeItemBases[i] + CUR_UPG_VALUE(sChildUpgrades[i]) - 1) == ITEM_GAUNTLETS_GOLD)) || @@ -720,11 +720,11 @@ void KaleidoScope_DrawEquipment(PlayState* play) { KaleidoScope_DrawQuadTextureRGBA32(play->state.gfxCtx, gItemIcons[sChildUpgradeItemBases[i] + CUR_UPG_VALUE(sChildUpgrades[i]) - 1], 32, 32, 0); gSPGrayscale(POLY_KAL_DISP++, false); } else if (CUR_UPG_VALUE(sAdultUpgrades[i]) != 0) { - // Grey Out the Goron Bracelet when Not Randomized - // Grey Out Strength Upgrades when Disabled and the Toggle Option is on + // Grey Out the Goron Bracelet when Not Randomized and Toggle Strength Option is off + // Grey Out Strength Upgrades when Disabled and the Toggle Strength Option is on if ((drawGreyItems && (((sAdultUpgradeItemBases[i] + CUR_UPG_VALUE(sAdultUpgrades[i]) - 1) == ITEM_BRACELET && - !(IS_RANDO)))) || + !(IS_RANDO) && !CVarGetInteger("gToggleStrength", 0)))) || (CVarGetInteger("gToggleStrength", 0) && CVarGetInteger("gStrengthDisabled", 0) && sAdultUpgrades[i] == UPG_STRENGTH)) { gDPSetGrayscaleColor(POLY_KAL_DISP++, 109, 109, 109, 255); gSPGrayscale(POLY_KAL_DISP++, true); From 9950c02fb281f5f137f058d0c1c02a8937b3d2f2 Mon Sep 17 00:00:00 2001 From: inspectredc Date: Wed, 18 Oct 2023 21:39:04 +0100 Subject: [PATCH 004/113] Strength name un-greyed out and apply zoom regardless of strength disabled --- .../misc/ovl_kaleido_scope/z_kaleido_equipment.c | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/soh/src/overlays/misc/ovl_kaleido_scope/z_kaleido_equipment.c b/soh/src/overlays/misc/ovl_kaleido_scope/z_kaleido_equipment.c index 2c1779c55..406c2ba67 100644 --- a/soh/src/overlays/misc/ovl_kaleido_scope/z_kaleido_equipment.c +++ b/soh/src/overlays/misc/ovl_kaleido_scope/z_kaleido_equipment.c @@ -489,11 +489,17 @@ void KaleidoScope_DrawEquipment(PlayState* play) { } // Grey Out Strength Upgrade Name when Disabled + // Do not Grey Out Strength Upgrade Name when Enabled if ((pauseCtx->cursorX[PAUSE_EQUIP] == 0) && (pauseCtx->cursorY[PAUSE_EQUIP] == 2) && - CVarGetInteger("gToggleStrength", 0) && CVarGetInteger("gStrengthDisabled", 0)) { - pauseCtx->nameColorSet = 1; + CVarGetInteger("gToggleStrength", 0)) { + if (CVarGetInteger("gStrengthDisabled", 0)) { + pauseCtx->nameColorSet = 1; + } else { + pauseCtx->nameColorSet = 0; + } } + if ((pauseCtx->cursorX[PAUSE_EQUIP] == 0) && (pauseCtx->cursorY[PAUSE_EQUIP] == 0)) { if (LINK_AGE_IN_YEARS != YEARS_CHILD) { if ((cursorItem >= ITEM_BULLET_BAG_30) && (cursorItem <= ITEM_BULLET_BAG_50)) { @@ -672,9 +678,9 @@ void KaleidoScope_DrawEquipment(PlayState* play) { } } - // Add zoom effect to strength item if cursor is hovering over it and strength is not disabled when the toggle is on + // Add zoom effect to strength item if cursor is hovering over it when toggle option is on if ((pauseCtx->cursorX[PAUSE_EQUIP] == 0) && (pauseCtx->cursorY[PAUSE_EQUIP] == 2) && - CVarGetInteger("gToggleStrength", 0) && !CVarGetInteger("gStrengthDisabled", 0)) { + CVarGetInteger("gToggleStrength", 0)) { i = 2; // row k = 0; // column j = 16 * i + 4 * k; // vtx index From 1b2a31e34b38aa5babf45a2f678cd7b7d4e1db1f Mon Sep 17 00:00:00 2001 From: inspectredc Date: Wed, 18 Oct 2023 22:11:04 +0100 Subject: [PATCH 005/113] Add success sound for toggle and equipping delay --- .../ovl_kaleido_scope/z_kaleido_equipment.c | 40 +++++++++++-------- 1 file changed, 23 insertions(+), 17 deletions(-) diff --git a/soh/src/overlays/misc/ovl_kaleido_scope/z_kaleido_equipment.c b/soh/src/overlays/misc/ovl_kaleido_scope/z_kaleido_equipment.c index 406c2ba67..51e092017 100644 --- a/soh/src/overlays/misc/ovl_kaleido_scope/z_kaleido_equipment.c +++ b/soh/src/overlays/misc/ovl_kaleido_scope/z_kaleido_equipment.c @@ -488,18 +488,6 @@ void KaleidoScope_DrawEquipment(PlayState* play) { } } - // Grey Out Strength Upgrade Name when Disabled - // Do not Grey Out Strength Upgrade Name when Enabled - if ((pauseCtx->cursorX[PAUSE_EQUIP] == 0) && (pauseCtx->cursorY[PAUSE_EQUIP] == 2) && - CVarGetInteger("gToggleStrength", 0)) { - if (CVarGetInteger("gStrengthDisabled", 0)) { - pauseCtx->nameColorSet = 1; - } else { - pauseCtx->nameColorSet = 0; - } - } - - if ((pauseCtx->cursorX[PAUSE_EQUIP] == 0) && (pauseCtx->cursorY[PAUSE_EQUIP] == 0)) { if (LINK_AGE_IN_YEARS != YEARS_CHILD) { if ((cursorItem >= ITEM_BULLET_BAG_30) && (cursorItem <= ITEM_BULLET_BAG_50)) { @@ -514,16 +502,21 @@ void KaleidoScope_DrawEquipment(PlayState* play) { KaleidoScope_SetCursorVtx(pauseCtx, cursorSlot * 4, pauseCtx->equipVtx); - u16 buttonsToCheck = BTN_A | BTN_CLEFT | BTN_CDOWN | BTN_CRIGHT; - if (CVarGetInteger("gDpadEquips", 0) && (!CVarGetInteger("gDpadPause", 0) || CHECK_BTN_ALL(input->cur.button, BTN_CUP))) { - buttonsToCheck |= BTN_DUP | BTN_DDOWN | BTN_DLEFT | BTN_DRIGHT; - } - // Allow Toggling of Strength when Pressing A on Strength Upgrade Slot if ((pauseCtx->cursorSpecialPos == 0) && (pauseCtx->state == 6) && (pauseCtx->unk_1E4 == 0) && CHECK_BTN_ALL(input->press.button, BTN_A) && (pauseCtx->cursorX[PAUSE_EQUIP] == 0) && (pauseCtx->cursorY[PAUSE_EQUIP] == 2) && CVarGetInteger("gToggleStrength", 0)) { CVarSetInteger("gStrengthDisabled", !CVarGetInteger("gStrengthDisabled", 0)); + // Equip success sound + Audio_PlaySoundGeneral(NA_SE_SY_DECIDE, &D_801333D4, 4, &D_801333E0, &D_801333E0, &D_801333E8); + // Wait 10 frames before accepting input again + pauseCtx->unk_1E4 = 7; + sEquipTimer = 10; + } + + u16 buttonsToCheck = BTN_A | BTN_CLEFT | BTN_CDOWN | BTN_CRIGHT; + if (CVarGetInteger("gDpadEquips", 0) && (!CVarGetInteger("gDpadPause", 0) || CHECK_BTN_ALL(input->cur.button, BTN_CUP))) { + buttonsToCheck |= BTN_DUP | BTN_DDOWN | BTN_DLEFT | BTN_DRIGHT; } if ((pauseCtx->cursorSpecialPos == 0) && (cursorItem != PAUSE_ITEM_NONE) && (pauseCtx->state == 6) && @@ -657,6 +650,19 @@ void KaleidoScope_DrawEquipment(PlayState* play) { } } + + // Grey Out Strength Upgrade Name when Disabled + // Do not Grey Out Strength Upgrade Name when Enabled + // This needs to be outside the previous block since otherwise the nameColorSet is cleared to 0 by other menu pages when toggling + if ((pauseCtx->pageIndex == PAUSE_EQUIP) && (pauseCtx->cursorX[PAUSE_EQUIP] == 0) && + (pauseCtx->cursorY[PAUSE_EQUIP] == 2) && CVarGetInteger("gToggleStrength", 0)) { + if (CVarGetInteger("gStrengthDisabled", 0)) { + pauseCtx->nameColorSet = 1; + } else { + pauseCtx->nameColorSet = 0; + } + } + for (rowStart = 0, i = 0, point = 4; i < 4; i++, rowStart += 4, point += 16) { for (k = 0, temp = rowStart + 1, bit = rowStart, j = point; k < 3; k++, bit++, j += 4, temp++) { From 38d70dd12fbd50a1bb1d90715edf8e84def0ad73 Mon Sep 17 00:00:00 2001 From: inspectredc Date: Wed, 18 Oct 2023 23:04:55 +0100 Subject: [PATCH 006/113] update tooltip to mention glitch use --- soh/soh/SohMenuBar.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/soh/soh/SohMenuBar.cpp b/soh/soh/SohMenuBar.cpp index c7233aef4..c27037cc3 100644 --- a/soh/soh/SohMenuBar.cpp +++ b/soh/soh/SohMenuBar.cpp @@ -609,7 +609,7 @@ void DrawEnhancementsMenu() { CVarSetInteger("gStrengthDisabled", 0); } } - UIWidgets::Tooltip("Allows strength to be toggled on and off by pressing A on the strength upgrade in the equipment subscreen of the pause menu"); + UIWidgets::Tooltip("Allows strength to be toggled on and off by pressing A on the strength upgrade in the equipment subscreen of the pause menu (This allows performing some glitches that require the player to not have strength)."); ImGui::EndMenu(); } From b294188782c162b26d77b13dc4a74aaed3f6f51f Mon Sep 17 00:00:00 2001 From: Pepper0ni Date: Fri, 20 Oct 2023 12:28:37 +0100 Subject: [PATCH 007/113] Faster Swim animations, full credit to kimimaru4000 Co-authored-by: kimimaru4000 --- soh/soh/Enhancements/presets.h | 1 + soh/soh/SohMenuBar.cpp | 2 ++ .../overlays/actors/ovl_player_actor/z_player.c | 16 +++++++++++++--- 3 files changed, 16 insertions(+), 3 deletions(-) diff --git a/soh/soh/Enhancements/presets.h b/soh/soh/Enhancements/presets.h index 6afc36248..f73655160 100644 --- a/soh/soh/Enhancements/presets.h +++ b/soh/soh/Enhancements/presets.h @@ -136,6 +136,7 @@ const std::vector enhancementsCvars = { "gInjectItemCounts", "gDayGravePull", "gDampeAllNight", + "gSkipSwimDeepEndAnim", "gSkipScarecrow", "gBlueFireArrows", "gSunlightArrows", diff --git a/soh/soh/SohMenuBar.cpp b/soh/soh/SohMenuBar.cpp index 04f25d2e8..328a31204 100644 --- a/soh/soh/SohMenuBar.cpp +++ b/soh/soh/SohMenuBar.cpp @@ -567,6 +567,8 @@ void DrawEnhancementsMenu() { "- Obtained the Master Sword\n" "- Not within range of Time Block\n" "- Not within range of Ocarina playing spots"); + UIWidgets::PaddedEnhancementCheckbox("Skip water take breath animation", "gSkipSwimDeepEndAnim", true, false); + UIWidgets::Tooltip("Skips Link's taking breath animation after coming up from water. This setting does not interfere with getting items from underwater."); ImGui::EndMenu(); } diff --git a/soh/src/overlays/actors/ovl_player_actor/z_player.c b/soh/src/overlays/actors/ovl_player_actor/z_player.c index 5f799227b..d20e25d42 100644 --- a/soh/src/overlays/actors/ovl_player_actor/z_player.c +++ b/soh/src/overlays/actors/ovl_player_actor/z_player.c @@ -5827,9 +5827,19 @@ s32 func_8083D12C(PlayState* play, Player* this, Input* arg2) { } func_80832340(play, this); - func_80832B0C(play, this, - (this->stateFlags1 & PLAYER_STATE1_ITEM_OVER_HEAD) ? &gPlayerAnim_link_swimer_swim_get - : &gPlayerAnim_link_swimer_swim_deep_end); + // Skip take breath animation on surface if Link didn't grab an item while underwater and the setting is enabled + if (CVarGetInteger("gSkipSwimDeepEndAnim", 0) && !(this->stateFlags1 & PLAYER_STATE1_ITEM_OVER_HEAD)) + { + auto lastAnimFrame = Animation_GetLastFrame(&gPlayerAnim_link_swimer_swim_deep_end); + LinkAnimation_Change(play, &this->skelAnime, &gPlayerAnim_link_swimer_swim_deep_end, 1.0f, + lastAnimFrame, lastAnimFrame, ANIMMODE_ONCE, -6.0f); + } + else + { + func_80832B0C(play, this, + (this->stateFlags1 & PLAYER_STATE1_ITEM_OVER_HEAD) ? &gPlayerAnim_link_swimer_swim_get + : &gPlayerAnim_link_swimer_swim_deep_end); + } if (func_8083CFA8(play, this, this->actor.velocity.y, 500)) { Player_PlaySfx(&this->actor, NA_SE_PL_FACE_UP); From f56e839480cdb98dc507edf3fd536393a52a1ab6 Mon Sep 17 00:00:00 2001 From: quellen-sol Date: Fri, 20 Oct 2023 15:40:28 -0700 Subject: [PATCH 008/113] Add Geo rupee name (Hollow Knight) --- .../Enhancements/randomizer/randomizer.cpp | 47 ++++++++++--------- 1 file changed, 24 insertions(+), 23 deletions(-) diff --git a/soh/soh/Enhancements/randomizer/randomizer.cpp b/soh/soh/Enhancements/randomizer/randomizer.cpp index 578532a33..63d73766b 100644 --- a/soh/soh/Enhancements/randomizer/randomizer.cpp +++ b/soh/soh/Enhancements/randomizer/randomizer.cpp @@ -63,7 +63,7 @@ const std::string Randomizer::NaviRandoMessageTableID = "RandomizerNavi"; const std::string Randomizer::IceTrapRandoMessageTableID = "RandomizerIceTrap"; const std::string Randomizer::randoMiscHintsTableID = "RandomizerMiscHints"; -static const char* englishRupeeNames[170] = { +static const char* englishRupeeNames[171] = { "[P]", "Bad RNG Rolls", "Bananas", "Beanbean Coins", "Beans", "Beli", "Bells", "Berries", "Bison Dollars", "Bitcoin", "Blue Essence", "Bolts", "Bones", "Boondollars", "Bottle Caps", @@ -76,28 +76,29 @@ static const char* englishRupeeNames[170] = { "Dollarydoos", "Dosh", "Doubloons", "Dwarfbucks", "Emeralds", "Energon", "Eris", "Ether", "Euro", "Experience", "Extinction Points", "Floopies", "Flurbos", "FPS", "Friends", - "Frog Coins", "Gald", "Gekz", "Gems", "Gil", - "Glimmer", "Glitches", "Gold", "Gold Dragons", "Goober Dollars", - "Green Herbs", "Greg Siblings", "Gummybears", "Hell", "Hylian Loaches", - "Ice Traps", "ISK", "Jiggies", "KF7 Ammo", "Kinstones", - "Kremcoins", "Kroner", "Leaves ", "Lemmings", "Lien", - "Lira", "Lumber", "Lungmen Dollars", "Macca", "Mana", - "Mann Co. Keys", "Meat", "Meat Stacks", "Medaparts", "Meseta", - "Mesetas", "Minerals", "Monopoly Money", "Moons", "Mora", - "Mumbo Tokens", "Munny", "Mushrooms", "Mysteries", "Neopoints", - "Notes", "Nuyen", "Orbs", "Pix", "Pixels", - "Platinum", "Pokédollars", "Pokémon", "Poko", "Pokos", - "Potch", "Pounds", "Power Pellets", "Primogems", "Réals", - "Refined Metal", "Remote Mines", "Retweets", "Rhinu", "Rings", - "Riot Points", "Robux", "Rubies", "Rubles", "Runite Ore", - "Rupees", "Saint Quartz", "Septims", "Shekels", "Shillings", - "Silver", "Simoleons", "Smackaroos", "Social Credit", "Souls", - "Spent Casings", "Spice", "Spondulicks", "Spoons", "Star Bits", - "Star Chips", "Stars", "Stones of Jordan", "Store Credit", "Strawbs", - "Studs", "Super Sea Snails", "Talent", "Teef", "Telecrystals", - "Tiberium", "TokKul", "Toys", "Turnips", "Upvotes", - "V-Bucks", "Vespene Gas", "Watts", "Widgets", "Woolongs", - "World Dollars", "Wumpa Fruit", "Yen", "Zenny", "Zorkmids" + "Frog Coins", "Gald", "Gekz", "Gems", "Geo", + "Gil", "Glimmer", "Glitches", "Gold", "Gold Dragons", + "Goober Dollars", "Green Herbs", "Greg Siblings", "Gummybears", "Hell", + "Hylian Loaches", "Ice Traps", "ISK", "Jiggies", "KF7 Ammo", + "Kinstones", "Kremcoins", "Kroner", "Leaves ", "Lemmings", + "Lien", "Lira", "Lumber", "Lungmen Dollars", "Macca", + "Mana", "Mann Co. Keys", "Meat", "Meat Stacks", "Medaparts", + "Meseta", "Mesetas", "Minerals", "Monopoly Money", "Moons", + "Mora", "Mumbo Tokens", "Munny", "Mushrooms", "Mysteries", + "Neopoints", "Notes", "Nuyen", "Orbs", "Pix", + "Pixels", "Platinum", "Pokédollars", "Pokémon", "Poko", + "Pokos", "Potch", "Pounds", "Power Pellets", "Primogems", + "Réals", "Refined Metal", "Remote Mines", "Retweets", "Rhinu", + "Rings", "Riot Points", "Robux", "Rubies", "Rubles", + "Runite Ore", "Rupees", "Saint Quartz", "Septims", "Shekels", + "Shillings", "Silver", "Simoleons", "Smackaroos", "Social Credit", + "Souls", "Spent Casings", "Spice", "Spondulicks", "Spoons", + "Star Bits", "Star Chips", "Stars", "Stones of Jordan", "Store Credit", + "Strawbs", "Studs", "Super Sea Snails", "Talent", "Teef", + "Telecrystals", "Tiberium", "TokKul", "Toys", "Turnips", + "Upvotes", "V-Bucks", "Vespene Gas", "Watts", "Widgets", + "Woolongs", "World Dollars", "Wumpa Fruit", "Yen", "Zenny", + "Zorkmids" }; static const char* germanRupeeNames[41] = { From 2cbbaba9cc4e7be0418840410a4699d86c439e24 Mon Sep 17 00:00:00 2001 From: inspectredc Date: Thu, 26 Oct 2023 18:41:45 +0100 Subject: [PATCH 009/113] draw a button --- .../ovl_kaleido_scope/z_kaleido_equipment.c | 72 +++++++++++++++---- 1 file changed, 60 insertions(+), 12 deletions(-) diff --git a/soh/src/overlays/misc/ovl_kaleido_scope/z_kaleido_equipment.c b/soh/src/overlays/misc/ovl_kaleido_scope/z_kaleido_equipment.c index 51e092017..5e2843f06 100644 --- a/soh/src/overlays/misc/ovl_kaleido_scope/z_kaleido_equipment.c +++ b/soh/src/overlays/misc/ovl_kaleido_scope/z_kaleido_equipment.c @@ -1,6 +1,7 @@ #include "z_kaleido_scope.h" #include "textures/icon_item_static/icon_item_static.h" #include "textures/parameter_static/parameter_static.h" +#include "soh/Enhancements/cosmetics/cosmeticsTypes.h" static u8 sChildUpgrades[] = { UPG_BULLET_BAG, UPG_BOMB_BAG, UPG_STRENGTH, UPG_SCALE }; static u8 sAdultUpgrades[] = { UPG_QUIVER, UPG_BOMB_BAG, UPG_STRENGTH, UPG_SCALE }; @@ -14,6 +15,15 @@ static u8 sEquipmentItemOffsets[] = { 0x00, 0x00, 0x01, 0x02, 0x00, 0x03, 0x04, 0x05, 0x00, 0x06, 0x07, 0x08, 0x00, 0x09, 0x0A, 0x0B, }; +// Vertices for A button indicator (coordinates 0.75x the texture size) +// pt (-97, -36) +static Vtx sStrengthAButtonVtx[] = { + VTX(-9, 6, 0, 0 << 5, 0 << 5, 0xFF, 0xFF, 0xFF, 0xFF), + VTX( 9, 6, 0, 24 << 5, 0 << 5, 0xFF, 0xFF, 0xFF, 0xFF), + VTX(-9, -6, 0, 0 << 5, 16 << 5, 0xFF, 0xFF, 0xFF, 0xFF), + VTX( 9, -6, 0, 24 << 5, 16 << 5, 0xFF, 0xFF, 0xFF, 0xFF), +}; + static s16 sEquipTimer = 0; void KaleidoScope_DrawEquipmentImage(PlayState* play, void* source, u32 width, u32 height) { @@ -89,6 +99,30 @@ void KaleidoScope_DrawEquipmentImage(PlayState* play, void* source, u32 width, u CLOSE_DISPS(play->state.gfxCtx); } +void KaleidoScope_DrawAButton(PlayState* play, Vtx* vtx, int16_t xTranslate, int16_t yTranslate) { + PauseContext* pauseCtx = &play->pauseCtx; + OPEN_DISPS(play->state.gfxCtx); + Matrix_Push(); + + Matrix_Translate(xTranslate, yTranslate, 0, MTXMODE_APPLY); + gSPMatrix(POLY_KAL_DISP++, MATRIX_NEWMTX(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW); + Color_RGB8 aButtonColor = { 0, 100, 255 }; + if (CVarGetInteger("gCosmetics.Hud_AButton.Changed", 0)) { + aButtonColor = CVarGetColor24("gCosmetics.Hud_AButton.Value", aButtonColor); + } else if (CVarGetInteger("gCosmetics.DefaultColorScheme", COLORSCHEME_N64) == COLORSCHEME_GAMECUBE) { + aButtonColor = (Color_RGB8){ 0, 255, 100 }; + } + + gSPVertex(POLY_KAL_DISP++, vtx, 4, 0); + gDPSetPrimColor(POLY_KAL_DISP++, 0, 0, aButtonColor.r, aButtonColor.g, aButtonColor.b, pauseCtx->alpha); + gDPLoadTextureBlock(POLY_KAL_DISP++, gABtnSymbolTex, G_IM_FMT_IA, G_IM_SIZ_8b, 24, 16, 0, + G_TX_NOMIRROR | G_TX_CLAMP, G_TX_NOMIRROR | G_TX_CLAMP, 4, 4, G_TX_NOLOD, G_TX_NOLOD); + gSP1Quadrangle(POLY_KAL_DISP++, 0, 2, 3, 1, 0); + Matrix_Pop(); + gSPMatrix(POLY_KAL_DISP++, MATRIX_NEWMTX(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW); + CLOSE_DISPS(play->state.gfxCtx); +} + Vec3s link_kaleido_rot = { 0, 32300, 0 }; // Default rotation link face us. void KaleidoScope_DrawPlayerWork(PlayState* play) { @@ -686,18 +720,18 @@ void KaleidoScope_DrawEquipment(PlayState* play) { // Add zoom effect to strength item if cursor is hovering over it when toggle option is on if ((pauseCtx->cursorX[PAUSE_EQUIP] == 0) && (pauseCtx->cursorY[PAUSE_EQUIP] == 2) && - CVarGetInteger("gToggleStrength", 0)) { - i = 2; // row - k = 0; // column - j = 16 * i + 4 * k; // vtx index - pauseCtx->equipVtx[j].v.ob[0] = pauseCtx->equipVtx[j + 2].v.ob[0] = - pauseCtx->equipVtx[j].v.ob[0] - 2; - pauseCtx->equipVtx[j + 1].v.ob[0] = pauseCtx->equipVtx[j + 3].v.ob[0] = - pauseCtx->equipVtx[j + 1].v.ob[0] + 4; - pauseCtx->equipVtx[j].v.ob[1] = pauseCtx->equipVtx[j + 1].v.ob[1] = - pauseCtx->equipVtx[j].v.ob[1] + 2; - pauseCtx->equipVtx[j + 2].v.ob[1] = pauseCtx->equipVtx[j + 3].v.ob[1] = - pauseCtx->equipVtx[j + 2].v.ob[1] - 4; + CVarGetInteger("gToggleStrength", 0) && pauseCtx->cursorSpecialPos == 0) { + u8 row = 2; + u8 column = 0; + u8 equipVtxIndex = 16 * row + 4 * column; + pauseCtx->equipVtx[equipVtxIndex].v.ob[0] = pauseCtx->equipVtx[equipVtxIndex + 2].v.ob[0] = + pauseCtx->equipVtx[equipVtxIndex].v.ob[0] - 2; + pauseCtx->equipVtx[equipVtxIndex + 1].v.ob[0] = pauseCtx->equipVtx[equipVtxIndex + 3].v.ob[0] = + pauseCtx->equipVtx[equipVtxIndex + 1].v.ob[0] + 4; + pauseCtx->equipVtx[equipVtxIndex].v.ob[1] = pauseCtx->equipVtx[equipVtxIndex + 1].v.ob[1] = + pauseCtx->equipVtx[equipVtxIndex].v.ob[1] + 2; + pauseCtx->equipVtx[equipVtxIndex + 2].v.ob[1] = pauseCtx->equipVtx[equipVtxIndex + 3].v.ob[1] = + pauseCtx->equipVtx[equipVtxIndex + 2].v.ob[1] - 4; } Gfx_SetupDL_42Opa(play->state.gfxCtx); @@ -765,6 +799,20 @@ void KaleidoScope_DrawEquipment(PlayState* play) { } } + // Render A button indicator when hovered over strength + if ((pauseCtx->cursorX[PAUSE_EQUIP] == 0) && (pauseCtx->cursorY[PAUSE_EQUIP] == 2) && + CVarGetInteger("gToggleStrength", 0) && pauseCtx->cursorSpecialPos == 0 + && pauseCtx->unk_1E4 == 0 && pauseCtx->state == 6) { + u8 row = 2; + u8 column = 0; + u8 equipVtxIndex = 16 * row + 4 * column; + // Get Bottom Bisector of the Quad + s16 translateX = (pauseCtx->equipVtx[equipVtxIndex].v.ob[0] + pauseCtx->equipVtx[equipVtxIndex + 1].v.ob[0]) / 2; + // Add 4 since the icon will be zoomed in on + s16 translateY = pauseCtx->equipVtx[equipVtxIndex + 2].v.ob[1] + 4; + KaleidoScope_DrawAButton(play, sStrengthAButtonVtx, translateX, translateY); + } + KaleidoScope_DrawPlayerWork(play); //if ((pauseCtx->unk_1E4 == 7) && (sEquipTimer == 10)) { From dd6271ecae9868c99bdc79324c6143f082fbcc65 Mon Sep 17 00:00:00 2001 From: PurpleHato Date: Tue, 14 Nov 2023 00:13:46 +0100 Subject: [PATCH 010/113] ADD: No HUD Heart animation (#3348) * ADD: No HUD Heart Animation I've seen this requested multiple times for modding purposes for the case of using "lifebars" instead of hearts * TWEAK: Move it under the the mods * REM: Whitespace * REM: Whitespace2 * Tweak: Cvar Oppsie --- soh/soh/SohMenuBar.cpp | 2 ++ soh/src/code/z_lifemeter.c | 25 ++++++++++++++++++------- 2 files changed, 20 insertions(+), 7 deletions(-) diff --git a/soh/soh/SohMenuBar.cpp b/soh/soh/SohMenuBar.cpp index a5fc12299..c871a8d04 100644 --- a/soh/soh/SohMenuBar.cpp +++ b/soh/soh/SohMenuBar.cpp @@ -913,6 +913,8 @@ void DrawEnhancementsMenu() { UIWidgets::Tooltip("Disables grottos rotating with the camera. To be used in conjunction with mods that want to replace grottos with 3D objects."); UIWidgets::PaddedEnhancementCheckbox("Invisible Bunny Hood", "gHideBunnyHood", true, false); UIWidgets::Tooltip("Turns Bunny Hood invisible while still maintaining its effects."); + UIWidgets::PaddedEnhancementCheckbox("Disable HUD Heart animations", "gNoHUDHeartAnimation", true, false); + UIWidgets::Tooltip("Disables the beating animation of the hearts on the HUD."); ImGui::EndMenu(); } diff --git a/soh/src/code/z_lifemeter.c b/soh/src/code/z_lifemeter.c index 8d5e41a20..69cba24b4 100644 --- a/soh/src/code/z_lifemeter.c +++ b/soh/src/code/z_lifemeter.c @@ -601,13 +601,24 @@ void HealthMeter_Draw(PlayState* play) { { Mtx* matrix = Graph_Alloc(gfxCtx, sizeof(Mtx)); - Matrix_SetTranslateScaleMtx2(matrix, - HeartsScale+(HeartsScale/3) - ((HeartsScale/3) * sp144), - HeartsScale+(HeartsScale/3) - ((HeartsScale/3) * sp144), - HeartsScale+(HeartsScale/3) - ((HeartsScale/3) * sp144), - -130+offsetX, //Pos X - (-94+offsetY) *-1, //Pos Y - 0.0f); + + if (CVarGetInteger("gNoHUDHeartAnimation", 0)) { + Matrix_SetTranslateScaleMtx2(matrix, + HeartsScale, // Scale X + HeartsScale, // Scale Y + HeartsScale, // Scale Z + -130 + offsetX, // Pos X + (-94 + offsetY) * -1, // Pos Y + 0.0f); + } else { + Matrix_SetTranslateScaleMtx2(matrix, HeartsScale + (HeartsScale / 3) - ((HeartsScale / 3) * sp144), + HeartsScale + (HeartsScale / 3) - ((HeartsScale / 3) * sp144), + HeartsScale + (HeartsScale / 3) - ((HeartsScale / 3) * sp144), + -130 + offsetX, // Pos X + (-94 + offsetY) * -1, // Pos Y + 0.0f); + } + gSPMatrix(OVERLAY_DISP++, matrix, G_MTX_MODELVIEW | G_MTX_LOAD); gSPVertex(OVERLAY_DISP++, sp154, 4, 0); gSP1Quadrangle(OVERLAY_DISP++, 0, 2, 3, 1, 0); From a8e387b94970ffd8b8c58bb672df0c7f6f389476 Mon Sep 17 00:00:00 2001 From: briaguya <70942617+briaguya-ai@users.noreply.github.com> Date: Sat, 18 Nov 2023 18:11:44 -0800 Subject: [PATCH 011/113] cache vcpkg on windows ci (#3384) --- .github/workflows/generate-builds.yml | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/.github/workflows/generate-builds.yml b/.github/workflows/generate-builds.yml index cd8a6fd9b..f95051515 100644 --- a/.github/workflows/generate-builds.yml +++ b/.github/workflows/generate-builds.yml @@ -281,13 +281,20 @@ jobs: with: submodules: true - name: ccache - uses: dcvz/ccache-action@27b9f33213c0079872f064f6b6ba0233dfa16ba2 + uses: hendrikmuhs/ccache-action@v1.2 with: key: ${{ runner.os }}-ccache - - uses: ilammy/msvc-dev-cmd@v1 + - name: vcpkg + uses: johnwason/vcpkg-action@v5 + with: + pkgs: zlib bzip2 libpng sdl2 sdl2-net glew glfw3 + token: ${{ github.token }} + triplet: 'x64-windows-static' + - name: Configure Developer Command Prompt + uses: ilammy/msvc-dev-cmd@v1 - name: Build SoH env: - VCPKG_ROOT: D:/a/vcpkg + VCPKG_ROOT: ${{github.workspace}}/vcpkg run: | set $env:PATH="$env:USERPROFILE/.cargo/bin;$env:PATH" cmake -S . -B build-windows -G Ninja -DCMAKE_MAKE_PROGRAM=ninja -DCMAKE_BUILD_TYPE:STRING=Release -DCMAKE_C_COMPILER_LAUNCHER=ccache -DCMAKE_CXX_COMPILER_LAUNCHER=ccache From 2b1327c41aad3e2fca2e4af50597a2c1f93116f3 Mon Sep 17 00:00:00 2001 From: inspectredc <78732756+inspectredc@users.noreply.github.com> Date: Sun, 19 Nov 2023 07:38:07 +0000 Subject: [PATCH 012/113] Transition docs (#3322) * transition variables renamed * transition circle * transition wipe * sand storm * remaining sceneloadflag rename * transition trigger macros * transition mode enum * transition type enum * tc set params * creg debug transitions --- soh/include/functions.h | 2 +- soh/include/regs.h | 2 + soh/include/z64.h | 80 ++- soh/include/z64environment.h | 8 + soh/include/z64transition.h | 15 +- soh/soh/Enhancements/boss-rush/BossRush.cpp | 4 +- soh/soh/Enhancements/debugconsole.cpp | 22 +- .../GameInteractor_RawAction.cpp | 6 +- soh/soh/Enhancements/mods.cpp | 16 +- .../randomizer/randomizer_entrance.c | 10 +- .../randomizer/randomizer_grotto.c | 6 +- soh/src/code/z_camera.c | 2 +- soh/src/code/z_common_data.c | 2 +- soh/src/code/z_demo.c | 468 +++++++++--------- soh/src/code/z_fbdemo_circle.c | 64 +-- soh/src/code/z_fbdemo_wipe1.c | 10 +- soh/src/code/z_kaleido_setup.c | 2 +- soh/src/code/z_kankyo.c | 22 +- soh/src/code/z_parameter.c | 36 +- soh/src/code/z_play.c | 262 +++++----- soh/src/code/z_player_lib.c | 2 +- soh/src/code/z_scene_table.c | 2 +- .../z_bg_spot00_hanebasi.c | 4 +- .../actors/ovl_Boss_Ganon/z_boss_ganon.c | 4 +- .../actors/ovl_Boss_Ganon2/z_boss_ganon2.c | 4 +- .../overlays/actors/ovl_Demo_Im/z_demo_im.c | 10 +- .../overlays/actors/ovl_Door_Ana/z_door_ana.c | 2 +- .../actors/ovl_Door_Warp1/z_door_warp1.c | 18 +- soh/src/overlays/actors/ovl_En_Eg/z_en_eg.c | 2 +- soh/src/overlays/actors/ovl_En_Ge1/z_en_ge1.c | 8 +- soh/src/overlays/actors/ovl_En_Ge2/z_en_ge2.c | 8 +- .../overlays/actors/ovl_En_GeldB/z_en_geldb.c | 4 +- .../actors/ovl_En_Heishi1/z_en_heishi1.c | 6 +- .../actors/ovl_En_Heishi3/z_en_heishi3.c | 6 +- .../actors/ovl_En_Heishi4/z_en_heishi4.c | 6 +- .../overlays/actors/ovl_En_Horse/z_en_horse.c | 4 +- .../z_en_horse_game_check.c | 20 +- soh/src/overlays/actors/ovl_En_In/z_en_in.c | 26 +- soh/src/overlays/actors/ovl_En_Ma1/z_en_ma1.c | 4 +- soh/src/overlays/actors/ovl_En_Ma3/z_en_ma3.c | 4 +- soh/src/overlays/actors/ovl_En_Mag/z_en_mag.c | 12 +- .../z_en_okarina_effect.c | 2 +- .../overlays/actors/ovl_En_Ossan/z_en_ossan.c | 4 +- soh/src/overlays/actors/ovl_En_Owl/z_en_owl.c | 8 +- .../ovl_En_Syateki_Niw/z_en_syateki_niw.c | 2 +- soh/src/overlays/actors/ovl_En_Ta/z_en_ta.c | 10 +- soh/src/overlays/actors/ovl_En_Zl4/z_en_zl4.c | 4 +- .../actors/ovl_Item_Ocarina/z_item_ocarina.c | 6 +- .../actors/ovl_player_actor/z_player.c | 40 +- .../ovl_file_choose/z_file_choose.c | 2 +- .../ovl_kaleido_scope/z_kaleido_scope_PAL.c | 2 +- 51 files changed, 685 insertions(+), 590 deletions(-) diff --git a/soh/include/functions.h b/soh/include/functions.h index 3a1aa8ae2..40a49cead 100644 --- a/soh/include/functions.h +++ b/soh/include/functions.h @@ -1537,7 +1537,7 @@ void KaleidoScopeCall_Draw(PlayState* play); void func_800BC490(PlayState* play, s16 point); s32 func_800BC56C(PlayState* play, s16 arg1); void func_800BC590(PlayState* play); -void func_800BC5E0(PlayState* play, s32 arg1); +void Gameplay_SetupTransition(PlayState* play, s32 arg1); Gfx* Play_SetFog(PlayState* play, Gfx* gfx); void Play_Destroy(GameState* thisx); void Play_Init(GameState* thisx); diff --git a/soh/include/regs.h b/soh/include/regs.h index 74b8a43df..cfbd1ae20 100644 --- a/soh/include/regs.h +++ b/soh/include/regs.h @@ -86,6 +86,8 @@ #define R_ITEM_ICON_X(i) ZREG(82 + i) #define R_ITEM_ICON_Y(i) ZREG(86 + i) #define R_ITEM_ICON_DD(i) ZREG(90 + i) +#define R_TRANS_DBG_ENABLED CREG(11) +#define R_TRANS_DBG_TYPE CREG(12) #define R_ENV_WIND_DIR(i) CREG(16 + i) #define R_ENV_WIND_SPEED CREG(19) #define R_A_BTN_Y XREG(16) diff --git a/soh/include/z64.h b/soh/include/z64.h index 23ffcfb17..5fb30004a 100644 --- a/soh/include/z64.h +++ b/soh/include/z64.h @@ -1119,6 +1119,82 @@ typedef struct { /* 0x4C */ u32 unk_4C; } PreRender; // size = 0x50 +#define TRANS_TRIGGER_OFF 0 // transition is not active +#define TRANS_TRIGGER_START 20 // start transition (exiting an area) +#define TRANS_TRIGGER_END -20 // transition is ending (arriving in a new area) + +typedef enum { + /* 0 */ TRANS_MODE_OFF, + /* 1 */ TRANS_MODE_SETUP, + /* 2 */ TRANS_MODE_INSTANCE_INIT, + /* 3 */ TRANS_MODE_INSTANCE_RUNNING, + /* 4 */ TRANS_MODE_FILL_WHITE_INIT, + /* 5 */ TRANS_MODE_FILL_IN, + /* 6 */ TRANS_MODE_FILL_OUT, + /* 7 */ TRANS_MODE_FILL_BROWN_INIT, + /* 8 */ TRANS_MODE_08, // unused + /* 9 */ TRANS_MODE_09, // unused + /* 10 */ TRANS_MODE_INSTANT, + /* 11 */ TRANS_MODE_INSTANCE_WAIT, + /* 12 */ TRANS_MODE_SANDSTORM_INIT, + /* 13 */ TRANS_MODE_SANDSTORM, + /* 14 */ TRANS_MODE_SANDSTORM_END_INIT, + /* 15 */ TRANS_MODE_SANDSTORM_END, + /* 16 */ TRANS_MODE_CS_BLACK_FILL_INIT, + /* 17 */ TRANS_MODE_CS_BLACK_FILL +} TransitionMode; + +typedef enum { + /* 0 */ TRANS_TYPE_WIPE, + /* 1 */ TRANS_TYPE_TRIFORCE, + /* 2 */ TRANS_TYPE_FADE_BLACK, + /* 3 */ TRANS_TYPE_FADE_WHITE, + /* 4 */ TRANS_TYPE_FADE_BLACK_FAST, + /* 5 */ TRANS_TYPE_FADE_WHITE_FAST, + /* 6 */ TRANS_TYPE_FADE_BLACK_SLOW, + /* 7 */ TRANS_TYPE_FADE_WHITE_SLOW, + /* 8 */ TRANS_TYPE_WIPE_FAST, + /* 9 */ TRANS_TYPE_FILL_WHITE2, + /* 10 */ TRANS_TYPE_FILL_WHITE, + /* 11 */ TRANS_TYPE_INSTANT, + /* 12 */ TRANS_TYPE_FILL_BROWN, + /* 13 */ TRANS_TYPE_FADE_WHITE_CS_DELAYED, + /* 14 */ TRANS_TYPE_SANDSTORM_PERSIST, + /* 15 */ TRANS_TYPE_SANDSTORM_END, + /* 16 */ TRANS_TYPE_CS_BLACK_FILL, + /* 17 */ TRANS_TYPE_FADE_WHITE_INSTANT, + /* 18 */ TRANS_TYPE_FADE_GREEN, + /* 19 */ TRANS_TYPE_FADE_BLUE, + // transition types 20 - 31 are unused + // transition types 32 - 55 are constructed using the TRANS_TYPE_CIRCLE macro + /* 56 */ TRANS_TYPE_MAX = 56 +} TransitionType; + +#define TRANS_NEXT_TYPE_DEFAULT 0xFF // when `nextTransitionType` is set to default, the type will be taken from the entrance table for the ending transition + +typedef enum { + /* 0 */ TCA_NORMAL, + /* 1 */ TCA_WAVE, + /* 2 */ TCA_RIPPLE, + /* 3 */ TCA_STARBURST +} TransitionCircleAppearance; + +typedef enum { + /* 0 */ TCC_BLACK, + /* 1 */ TCC_WHITE, + /* 2 */ TCC_GRAY, + /* 3 */ TCC_SPECIAL // color varies depending on appearance. unused and appears broken +} TransitionCircleColor; + +typedef enum { + /* 0 */ TCS_FAST, + /* 1 */ TCS_SLOW +} TransitionCircleSpeed; + +#define TC_SET_PARAMS (1 << 7) + +#define TRANS_TYPE_CIRCLE(appearance, color, speed) ((1 << 5) | ((color & 3) << 3) | ((appearance & 3) << 1) | (speed & 1)) + typedef struct { union { TransitionFade fade; @@ -1381,14 +1457,14 @@ typedef struct PlayState { /* 0x11E0C */ ElfMessage* cUpElfMsgs; /* 0x11E10 */ void* specialEffects; /* 0x11E14 */ u8 skyboxId; - /* 0x11E15 */ s8 sceneLoadFlag; // "fade_direction" + /* 0x11E15 */ s8 transitionTrigger; // "fade_direction" /* 0x11E16 */ s16 unk_11E16; /* 0x11E18 */ s16 unk_11E18; /* 0x11E1A */ s16 nextEntranceIndex; /* 0x11E1C */ char unk_11E1C[0x40]; /* 0x11E5C */ s8 shootingGalleryStatus; /* 0x11E5D */ s8 bombchuBowlingStatus; // "bombchu_game_flag" - /* 0x11E5E */ u8 fadeTransition; + /* 0x11E5E */ u8 transitionType; /* 0x11E60 */ CollisionCheckContext colChkCtx; /* 0x120FC */ u16 envFlags[20]; /* 0x12124 */ PreRender pauseBgPreRender; diff --git a/soh/include/z64environment.h b/soh/include/z64environment.h index b2badccd3..8cb69ddc4 100644 --- a/soh/include/z64environment.h +++ b/soh/include/z64environment.h @@ -30,6 +30,14 @@ typedef enum { /* 13 */ SKYBOX_DMA_PAL2_START } SkyboxDmaState; +typedef enum { + /* 0 */ SANDSTORM_OFF, + /* 1 */ SANDSTORM_FILL, + /* 2 */ SANDSTORM_UNFILL, + /* 3 */ SANDSTORM_ACTIVE, + /* 4 */ SANDSTORM_DISSIPATE +} SandstormState; + typedef struct { /* 0x00 */ u8 state; /* 0x01 */ u8 flashRed; diff --git a/soh/include/z64transition.h b/soh/include/z64transition.h index 30b1246f5..5a59e958b 100644 --- a/soh/include/z64transition.h +++ b/soh/include/z64transition.h @@ -50,11 +50,16 @@ typedef struct { /* 0x004 */ Color_RGBA8_u32 envColor; /* 0x008 */ s32 texX; /* 0x00C */ s32 texY; - /* 0x010 */ s32 step; - /* 0x014 */ u8 unk_14; - /* 0x015 */ u8 typeColor; - /* 0x016 */ u8 speed; - /* 0x017 */ u8 effect; + // /* 0x010 */ s32 step; + // /* 0x014 */ u8 unk_14; + // /* 0x015 */ u8 typeColor; + // /* 0x016 */ u8 speed; + // /* 0x017 */ u8 effect; + /* 0x010 */ s32 speed; + /* 0x014 */ u8 direction; + /* 0x015 */ u8 colorType; + /* 0x016 */ u8 speedType; + /* 0x017 */ u8 appearanceType; /* 0x018 */ u8 isDone; /* 0x019 */ u8 frame; /* 0x01A */ u16 normal; diff --git a/soh/soh/Enhancements/boss-rush/BossRush.cpp b/soh/soh/Enhancements/boss-rush/BossRush.cpp index e9d94c503..7a0bbab6d 100644 --- a/soh/soh/Enhancements/boss-rush/BossRush.cpp +++ b/soh/soh/Enhancements/boss-rush/BossRush.cpp @@ -218,8 +218,8 @@ void BossRush_HandleBlueWarp(PlayState* play, f32 warpPosX, f32 warpPosZ) { } else if (gSaveContext.bossRushOptions[BR_OPTIONS_BOSSES] == BR_CHOICE_BOSSES_CHILD) { play->nextEntranceIndex = 0x6B; gSaveContext.nextCutsceneIndex = 0xFFF2; - play->sceneLoadFlag = 0x14; - play->fadeTransition = 3; + play->transitionTrigger = TRANS_TRIGGER_START; + play->transitionType = TRANS_TYPE_FADE_WHITE; } } } diff --git a/soh/soh/Enhancements/debugconsole.cpp b/soh/soh/Enhancements/debugconsole.cpp index 88a23718e..6bc441d03 100644 --- a/soh/soh/Enhancements/debugconsole.cpp +++ b/soh/soh/Enhancements/debugconsole.cpp @@ -397,9 +397,9 @@ static bool EntranceHandler(std::shared_ptr Console, const std::ve } gPlayState->nextEntranceIndex = entrance; - gPlayState->sceneLoadFlag = 0x14; - gPlayState->fadeTransition = 11; - gSaveContext.nextTransitionType = 11; + gPlayState->transitionTrigger = TRANS_TRIGGER_START; + gPlayState->transitionType = TRANS_TYPE_INSTANT; + gSaveContext.nextTransitionType = TRANS_TYPE_INSTANT; } static bool VoidHandler(std::shared_ptr Console, const std::vector& args, std::string* output) { @@ -407,10 +407,10 @@ static bool VoidHandler(std::shared_ptr Console, const std::vector gSaveContext.respawn[RESPAWN_MODE_DOWN].tempSwchFlags = gPlayState->actorCtx.flags.tempSwch; gSaveContext.respawn[RESPAWN_MODE_DOWN].tempCollectFlags = gPlayState->actorCtx.flags.tempCollect; gSaveContext.respawnFlag = 1; - gPlayState->sceneLoadFlag = 0x14; + gPlayState->transitionTrigger = TRANS_TRIGGER_START; gPlayState->nextEntranceIndex = gSaveContext.respawn[RESPAWN_MODE_DOWN].entranceIndex; - gPlayState->fadeTransition = 2; - gSaveContext.nextTransitionType = 2; + gPlayState->transitionType = TRANS_TYPE_FADE_BLACK; + gSaveContext.nextTransitionType = TRANS_TYPE_FADE_BLACK; } else { ERROR_MESSAGE("gPlayState == nullptr"); return 1; @@ -421,9 +421,9 @@ static bool VoidHandler(std::shared_ptr Console, const std::vector static bool ReloadHandler(std::shared_ptr Console, const std::vector& args, std::string* output) { if (gPlayState != nullptr) { gPlayState->nextEntranceIndex = gSaveContext.entranceIndex; - gPlayState->sceneLoadFlag = 0x14; - gPlayState->fadeTransition = 11; - gSaveContext.nextTransitionType = 11; + gPlayState->transitionTrigger = TRANS_TRIGGER_START; + gPlayState->transitionType = TRANS_TYPE_INSTANT; + gSaveContext.nextTransitionType = TRANS_TYPE_INSTANT; } else { ERROR_MESSAGE("gPlayState == nullptr"); return 1; @@ -457,9 +457,9 @@ static bool FWHandler(std::shared_ptr Console, const std::vector 0) { - gPlayState->sceneLoadFlag = 0x14; + gPlayState->transitionTrigger = TRANS_TRIGGER_START; gPlayState->nextEntranceIndex = gSaveContext.respawn[RESPAWN_MODE_TOP].entranceIndex; - gPlayState->fadeTransition = 5; + gPlayState->transitionType = TRANS_TYPE_FADE_WHITE_FAST; } else { ERROR_MESSAGE("Farore's wind not set!"); return 1; diff --git a/soh/soh/Enhancements/game-interactor/GameInteractor_RawAction.cpp b/soh/soh/Enhancements/game-interactor/GameInteractor_RawAction.cpp index 54a3b8e7b..1bde59242 100644 --- a/soh/soh/Enhancements/game-interactor/GameInteractor_RawAction.cpp +++ b/soh/soh/Enhancements/game-interactor/GameInteractor_RawAction.cpp @@ -326,9 +326,9 @@ void GameInteractor::RawAction::UpdateActor(void* refActor) { void GameInteractor::RawAction::TeleportPlayer(int32_t nextEntrance) { Audio_PlaySoundGeneral(NA_SE_EN_GANON_LAUGH, &D_801333D4, 4, &D_801333E0, &D_801333E0, &D_801333E8); gPlayState->nextEntranceIndex = nextEntrance; - gPlayState->sceneLoadFlag = 0x14; - gPlayState->fadeTransition = 2; - gSaveContext.nextTransitionType = 2; + gPlayState->transitionTrigger = TRANS_TRIGGER_START; + gPlayState->transitionType = TRANS_TYPE_FADE_BLACK; + gSaveContext.nextTransitionType = TRANS_TYPE_FADE_BLACK; } void GameInteractor::RawAction::ClearAssignedButtons(uint8_t buttonSet) { diff --git a/soh/soh/Enhancements/mods.cpp b/soh/soh/Enhancements/mods.cpp index 0bbeff8ca..8263c6780 100644 --- a/soh/soh/Enhancements/mods.cpp +++ b/soh/soh/Enhancements/mods.cpp @@ -39,9 +39,9 @@ uint32_t ResourceMgr_IsSceneMasterQuest(s16 sceneNum); // TODO: When there's more uses of something like this, create a new GI::RawAction? void ReloadSceneTogglingLinkAge() { gPlayState->nextEntranceIndex = gSaveContext.entranceIndex; - gPlayState->sceneLoadFlag = 0x14; - gPlayState->fadeTransition = 42; // Fade Out - gSaveContext.nextTransitionType = 42; + gPlayState->transitionTrigger = TRANS_TRIGGER_START; + gPlayState->transitionType = TRANS_TYPE_CIRCLE(TCA_WAVE, TCC_WHITE, TCS_FAST); // Fade Out + gSaveContext.nextTransitionType = TRANS_TYPE_CIRCLE(TCA_WAVE, TCC_WHITE, TCS_FAST); gPlayState->linkAgeOnLoad ^= 1; // toggle linkAgeOnLoad } @@ -205,8 +205,8 @@ void RegisterSwitchAge() { warped = true; } - if (warped && gPlayState->sceneLoadFlag != 0x0014 && - gSaveContext.nextTransitionType == 255) { + if (warped && gPlayState->transitionTrigger != TRANS_TRIGGER_START && + gSaveContext.nextTransitionType == TRANS_NEXT_TYPE_DEFAULT) { GET_PLAYER(gPlayState)->actor.shape.rot.y = playerYaw; GET_PLAYER(gPlayState)->actor.world.pos = playerPos; if (roomNum != roomCtx->curRoom.num) { @@ -630,8 +630,8 @@ void RegisterTriforceHunt() { if (GameInteractor::State::TriforceHuntCreditsWarpActive) { gPlayState->nextEntranceIndex = 0x6B; gSaveContext.nextCutsceneIndex = 0xFFF2; - gPlayState->sceneLoadFlag = 0x14; - gPlayState->fadeTransition = 3; + gPlayState->transitionTrigger = TRANS_TRIGGER_START; + gPlayState->transitionType = TRANS_TYPE_FADE_WHITE; GameInteractor::State::TriforceHuntCreditsWarpActive = 0; } @@ -649,7 +649,7 @@ void RegisterTriforceHunt() { uint8_t requiredPieces = OTRGlobals::Instance->gRandomizer->GetRandoSettingValue(RSK_TRIFORCE_HUNT_PIECES_REQUIRED); // Give Boss Key when player loads back into the savefile. - if (currentPieces >= requiredPieces && gPlayState->sceneLoadFlag != 0x14 && + if (currentPieces >= requiredPieces && gPlayState->transitionTrigger != TRANS_TRIGGER_START && (1 << 0 & gSaveContext.inventory.dungeonItems[SCENE_GANONS_TOWER]) == 0) { GetItemEntry getItemEntry = ItemTableManager::Instance->RetrieveItemEntry(MOD_RANDOMIZER, RG_GANONS_CASTLE_BOSS_KEY); GiveItemEntryWithoutActor(gPlayState, getItemEntry); diff --git a/soh/soh/Enhancements/randomizer/randomizer_entrance.c b/soh/soh/Enhancements/randomizer/randomizer_entrance.c index f2f1a8a3f..68c8e2e8c 100644 --- a/soh/soh/Enhancements/randomizer/randomizer_entrance.c +++ b/soh/soh/Enhancements/randomizer/randomizer_entrance.c @@ -406,8 +406,8 @@ void Entrance_SetSavewarpEntrance(void) { } void Entrance_SetWarpSongEntrance(void) { - gPlayState->sceneLoadFlag = 0x14; - gPlayState->fadeTransition = 5; + gPlayState->transitionTrigger = TRANS_TRIGGER_START; + gPlayState->transitionType = TRANS_TYPE_FADE_WHITE_FAST; switch (gPlayState->msgCtx.lastPlayedSong) { case 0: gPlayState->nextEntranceIndex = Entrance_OverrideNextIndex(0x0600); // Minuet @@ -428,7 +428,7 @@ void Entrance_SetWarpSongEntrance(void) { gPlayState->nextEntranceIndex = Entrance_OverrideNextIndex(0x05F4); // Prelude break; default: - gPlayState->sceneLoadFlag = 0; // if something goes wrong, the animation plays normally + gPlayState->transitionTrigger = TRANS_TRIGGER_OFF; // if something goes wrong, the animation plays normally } // If one of the warp songs happens to lead to a grotto return, then we @@ -481,8 +481,8 @@ void Entrance_OverrideCutsceneEntrance(u16 cutsceneCmd) { switch (cutsceneCmd) { case 24: // Dropping a fish for Jabu Jabu gPlayState->nextEntranceIndex = Entrance_OverrideNextIndex(newJabuJabusBellyEntrance); - gPlayState->sceneLoadFlag = 0x14; - gPlayState->fadeTransition = 2; + gPlayState->transitionTrigger = TRANS_TRIGGER_START; + gPlayState->transitionType = TRANS_TYPE_FADE_BLACK; // In case Jabu's mouth leads to a grotto return Grotto_ForceGrottoReturnOnSpecialEntrance(); break; diff --git a/soh/soh/Enhancements/randomizer/randomizer_grotto.c b/soh/soh/Enhancements/randomizer/randomizer_grotto.c index 408dc0160..9f30e3be8 100644 --- a/soh/soh/Enhancements/randomizer/randomizer_grotto.c +++ b/soh/soh/Enhancements/randomizer/randomizer_grotto.c @@ -161,12 +161,12 @@ s16 Grotto_OverrideSpecialEntrance(s16 nextEntranceIndex) { if (gPlayState != NULL && gPlayState->nextEntranceIndex != -1) { gSaveContext.respawnFlag = 2; nextEntranceIndex = grotto.entranceIndex; - gPlayState->fadeTransition = 3; - gSaveContext.nextTransitionType = 3; + gPlayState->transitionType = TRANS_TYPE_FADE_WHITE; + gSaveContext.nextTransitionType = TRANS_TYPE_FADE_WHITE; } else if (gPlayState == NULL) { // Handle spawn position when loading from a save file gSaveContext.respawnFlag = 2; nextEntranceIndex = grotto.entranceIndex; - gSaveContext.nextTransitionType = 3; + gSaveContext.nextTransitionType = TRANS_TYPE_FADE_WHITE; // Otherwise return 0x7FFF and let the game handle it } else { nextEntranceIndex = 0x7FFF; diff --git a/soh/src/code/z_camera.c b/soh/src/code/z_camera.c index a177e29e7..e31a73dcf 100644 --- a/soh/src/code/z_camera.c +++ b/soh/src/code/z_camera.c @@ -7594,7 +7594,7 @@ Vec3s Camera_Update(Camera* camera) { D_8011D3F0--; sCameraInterfaceFlags = 0x3200; Camera_UpdateInterface(sCameraInterfaceFlags); - } else if (camera->play->transitionMode != 0) { + } else if (camera->play->transitionMode != TRANS_MODE_OFF) { sCameraInterfaceFlags = 0xF200; Camera_UpdateInterface(sCameraInterfaceFlags); } else if (camera->play->csCtx.state != CS_STATE_IDLE) { diff --git a/soh/src/code/z_common_data.c b/soh/src/code/z_common_data.c index 83486b2d7..2a903b26e 100644 --- a/soh/src/code/z_common_data.c +++ b/soh/src/code/z_common_data.c @@ -14,6 +14,6 @@ void SaveContext_Init(void) { gSaveContext.nextDayTime = 0xFFFF; gSaveContext.skyboxTime = 0; gSaveContext.dogIsLost = true; - gSaveContext.nextTransitionType = 0xFF; + gSaveContext.nextTransitionType = TRANS_NEXT_TYPE_DEFAULT; gSaveContext.unk_13EE = 50; } diff --git a/soh/src/code/z_demo.c b/soh/src/code/z_demo.c index 1955a9235..0d769ca65 100644 --- a/soh/src/code/z_demo.c +++ b/soh/src/code/z_demo.c @@ -168,7 +168,7 @@ void func_800645A0(PlayState* play, CutsceneContext* csCtx) { gSaveContext.cutsceneTrigger = 1; } - if ((gSaveContext.cutsceneTrigger != 0) && (play->sceneLoadFlag == 0x14)) { + if ((gSaveContext.cutsceneTrigger != 0) && (play->transitionTrigger == TRANS_TRIGGER_START)) { gSaveContext.cutsceneTrigger = 0; } @@ -409,7 +409,7 @@ void func_80064824(PlayState* play, CutsceneContext* csCtx, CsCmdBase* cmd) { break; case 32: if (sp3F != 0) { - play->envCtx.sandstormState = 1; + play->envCtx.sandstormState = SANDSTORM_FILL; } func_800788CC(NA_SE_EV_SAND_STORM - SFX_FLAG); break; @@ -506,7 +506,7 @@ void Cutscene_Command_Terminator(PlayState* play, CutsceneContext* csCtx, CsCmdB (CHECK_BTN_ALL(play->state.input[0].press.button, BTN_A) || CHECK_BTN_ALL(play->state.input[0].press.button, BTN_B) || CHECK_BTN_ALL(play->state.input[0].press.button, BTN_START)) && - (gSaveContext.fileNum != 0xFEDC) && (play->sceneLoadFlag == 0)) { + (gSaveContext.fileNum != 0xFEDC) && (play->transitionTrigger == TRANS_TRIGGER_OFF)) { Audio_PlaySoundGeneral(NA_SE_SY_PIECE_OF_HEART, &D_801333D4, 4, &D_801333E0, &D_801333E0, &D_801333E8); temp = 1; } @@ -576,44 +576,44 @@ void Cutscene_Command_Terminator(PlayState* play, CutsceneContext* csCtx, CsCmdB case 1: play->nextEntranceIndex = 0x00A0; gSaveContext.cutsceneIndex = 0xFFF1; - play->sceneLoadFlag = 0x14; - play->fadeTransition = 2; + play->transitionTrigger = TRANS_TRIGGER_START; + play->transitionType = TRANS_TYPE_FADE_BLACK; break; case 2: play->nextEntranceIndex = 0x00A0; gSaveContext.cutsceneIndex = 0xFFF0; - play->sceneLoadFlag = 0x14; - play->fadeTransition = 10; + play->transitionTrigger = TRANS_TRIGGER_START; + play->transitionType = TRANS_TYPE_FILL_WHITE; break; case 3: play->nextEntranceIndex = 0x0117; gSaveContext.cutsceneIndex = 0xFFF1; - play->sceneLoadFlag = 0x14; - play->fadeTransition = 10; + play->transitionTrigger = TRANS_TRIGGER_START; + play->transitionType = TRANS_TYPE_FILL_WHITE; break; case 4: play->nextEntranceIndex = 0x013D; gSaveContext.cutsceneIndex = 0xFFF0; - play->sceneLoadFlag = 0x14; - play->fadeTransition = 10; + play->transitionTrigger = TRANS_TRIGGER_START; + play->transitionType = TRANS_TYPE_FILL_WHITE; break; case 5: play->nextEntranceIndex = 0x00EE; gSaveContext.cutsceneIndex = 0xFFF0; - play->sceneLoadFlag = 0x14; - play->fadeTransition = 10; + play->transitionTrigger = TRANS_TRIGGER_START; + play->transitionType = TRANS_TYPE_FILL_WHITE; break; case 6: play->nextEntranceIndex = 0x00A0; gSaveContext.cutsceneIndex = 0xFFF2; - play->sceneLoadFlag = 0x14; - play->fadeTransition = 10; + play->transitionTrigger = TRANS_TRIGGER_START; + play->transitionType = TRANS_TYPE_FILL_WHITE; break; case 7: play->nextEntranceIndex = 0x00EE; gSaveContext.cutsceneIndex = 0xFFF2; - play->sceneLoadFlag = 0x14; - play->fadeTransition = 11; + play->transitionTrigger = TRANS_TRIGGER_START; + play->transitionType = TRANS_TYPE_INSTANT; break; case 8: if (CVarGetInteger("gBetterFW", 0)) { @@ -627,9 +627,9 @@ void Cutscene_Command_Terminator(PlayState* play, CutsceneContext* csCtx, CsCmdB if (!Flags_GetEventChkInf(EVENTCHKINF_PULLED_MASTER_SWORD_FROM_PEDESTAL)) { Flags_SetEventChkInf(EVENTCHKINF_PULLED_MASTER_SWORD_FROM_PEDESTAL); play->nextEntranceIndex = 0x00A0; - play->sceneLoadFlag = 0x14; + play->transitionTrigger = TRANS_TRIGGER_START; gSaveContext.cutsceneIndex = 0xFFF3; - play->fadeTransition = 11; + play->transitionType = TRANS_TYPE_INSTANT; } else { if (gSaveContext.sceneSetupIndex < 4) { if (!LINK_IS_ADULT) { @@ -639,254 +639,254 @@ void Cutscene_Command_Terminator(PlayState* play, CutsceneContext* csCtx, CsCmdB } } play->nextEntranceIndex = 0x02CA; - play->sceneLoadFlag = 0x14; - play->fadeTransition = 3; - gSaveContext.nextTransitionType = 3; + play->transitionTrigger = TRANS_TRIGGER_START; + play->transitionType = TRANS_TYPE_FADE_WHITE; + gSaveContext.nextTransitionType = TRANS_TYPE_FADE_WHITE; } break; case 9: play->nextEntranceIndex = 0x0117; gSaveContext.cutsceneIndex = 0xFFF0; - play->sceneLoadFlag = 0x14; - play->fadeTransition = 12; + play->transitionTrigger = TRANS_TRIGGER_START; + play->transitionType = TRANS_TYPE_FILL_BROWN; break; case 10: play->nextEntranceIndex = 0x00BB; gSaveContext.cutsceneIndex = 0xFFF0; - play->sceneLoadFlag = 0x14; - play->fadeTransition = 2; + play->transitionTrigger = TRANS_TRIGGER_START; + play->transitionType = TRANS_TYPE_FADE_BLACK; break; case 11: play->nextEntranceIndex = 0x00EE; gSaveContext.cutsceneIndex = 0xFFF3; - play->sceneLoadFlag = 0x14; - play->fadeTransition = 3; + play->transitionTrigger = TRANS_TRIGGER_START; + play->transitionType = TRANS_TYPE_FADE_WHITE; break; case 12: play->nextEntranceIndex = 0x047A; - play->sceneLoadFlag = 0x14; - play->fadeTransition = 2; + play->transitionTrigger = TRANS_TRIGGER_START; + play->transitionType = TRANS_TYPE_FADE_BLACK; break; case 13: play->nextEntranceIndex = 0x010E; - play->sceneLoadFlag = 0x14; - play->fadeTransition = 2; - gSaveContext.nextTransitionType = 2; + play->transitionTrigger = TRANS_TRIGGER_START; + play->transitionType = TRANS_TYPE_FADE_BLACK; + gSaveContext.nextTransitionType = TRANS_TYPE_FADE_BLACK; break; case 14: play->nextEntranceIndex = 0x0457; - play->sceneLoadFlag = 0x14; - play->fadeTransition = 2; + play->transitionTrigger = TRANS_TRIGGER_START; + play->transitionType = TRANS_TYPE_FADE_BLACK; break; case 15: play->nextEntranceIndex = 0x0053; - play->sceneLoadFlag = 0x14; + play->transitionTrigger = TRANS_TRIGGER_START; gSaveContext.cutsceneIndex = 0xFFF4; - play->fadeTransition = 3; + play->transitionType = TRANS_TYPE_FADE_WHITE; break; case 16: play->nextEntranceIndex = 0x0053; - play->sceneLoadFlag = 0x14; + play->transitionTrigger = TRANS_TRIGGER_START; gSaveContext.cutsceneIndex = 0xFFF5; - play->fadeTransition = 3; + play->transitionType = TRANS_TYPE_FADE_WHITE; break; case 17: play->nextEntranceIndex = 0x0053; - play->sceneLoadFlag = 0x14; + play->transitionTrigger = TRANS_TRIGGER_START; gSaveContext.cutsceneIndex = 0xFFF6; - play->fadeTransition = 3; + play->transitionType = TRANS_TYPE_FADE_WHITE; break; case 18: Flags_SetEventChkInf(EVENTCHKINF_ENTERED_MASTER_SWORD_CHAMBER); play->nextEntranceIndex = 0x0324; - play->sceneLoadFlag = 0x14; - play->fadeTransition = 2; - gSaveContext.nextTransitionType = 2; + play->transitionTrigger = TRANS_TRIGGER_START; + play->transitionType = TRANS_TYPE_FADE_BLACK; + gSaveContext.nextTransitionType = TRANS_TYPE_FADE_BLACK; break; case 19: play->nextEntranceIndex = 0x013D; - play->sceneLoadFlag = 0x14; - play->fadeTransition = 4; + play->transitionTrigger = TRANS_TRIGGER_START; + play->transitionType = TRANS_TYPE_FADE_BLACK_FAST; gSaveContext.cutsceneIndex = 0x8000; break; case 21: play->nextEntranceIndex = 0x0102; - play->sceneLoadFlag = 0x14; + play->transitionTrigger = TRANS_TRIGGER_START; gSaveContext.cutsceneIndex = 0xFFF0; - play->fadeTransition = 3; + play->transitionType = TRANS_TYPE_FADE_WHITE; break; case 22: Item_Give(play, ITEM_SONG_REQUIEM); play->nextEntranceIndex = 0x0123; - play->sceneLoadFlag = 0x14; + play->transitionTrigger = TRANS_TRIGGER_START; gSaveContext.cutsceneIndex = 0xFFF0; - play->fadeTransition = 3; + play->transitionType = TRANS_TYPE_FADE_WHITE; break; case 23: play->nextEntranceIndex = 0x00A0; - play->sceneLoadFlag = 0x14; + play->transitionTrigger = TRANS_TRIGGER_START; gSaveContext.cutsceneIndex = 0xFFF8; - play->fadeTransition = 3; + play->transitionType = TRANS_TYPE_FADE_WHITE; break; case 24: play->nextEntranceIndex = 0x0028; - play->sceneLoadFlag = 0x14; - play->fadeTransition = 2; + play->transitionTrigger = TRANS_TRIGGER_START; + play->transitionType = TRANS_TYPE_FADE_BLACK; break; case 25: play->linkAgeOnLoad = 0; play->nextEntranceIndex = 0x006B; - play->sceneLoadFlag = 0x14; + play->transitionTrigger = TRANS_TRIGGER_START; gSaveContext.cutsceneIndex = 0xFFF0; - play->fadeTransition = 3; + play->transitionType = TRANS_TYPE_FADE_WHITE; break; case 26: play->nextEntranceIndex = 0x0053; - play->sceneLoadFlag = 0x14; + play->transitionTrigger = TRANS_TRIGGER_START; gSaveContext.cutsceneIndex = 0xFFF4; - play->fadeTransition = 3; + play->transitionType = TRANS_TYPE_FADE_WHITE; break; case 27: play->nextEntranceIndex = 0x0053; - play->sceneLoadFlag = 0x14; + play->transitionTrigger = TRANS_TRIGGER_START; gSaveContext.cutsceneIndex = 0xFFF5; - play->fadeTransition = 3; + play->transitionType = TRANS_TYPE_FADE_WHITE; break; case 28: play->nextEntranceIndex = 0x0053; - play->sceneLoadFlag = 0x14; + play->transitionTrigger = TRANS_TRIGGER_START; gSaveContext.cutsceneIndex = 0xFFF6; - play->fadeTransition = 3; + play->transitionType = TRANS_TYPE_FADE_WHITE; break; case 29: play->nextEntranceIndex = 0x006B; - play->sceneLoadFlag = 0x14; + play->transitionTrigger = TRANS_TRIGGER_START; gSaveContext.chamberCutsceneNum = 0; - play->fadeTransition = 3; + play->transitionType = TRANS_TYPE_FADE_WHITE; break; case 30: play->nextEntranceIndex = 0x006B; - play->sceneLoadFlag = 0x14; - play->fadeTransition = 3; + play->transitionTrigger = TRANS_TRIGGER_START; + play->transitionType = TRANS_TYPE_FADE_WHITE; Item_Give(play, ITEM_MEDALLION_FIRE); gSaveContext.chamberCutsceneNum = 1; break; case 31: play->nextEntranceIndex = 0x006B; - play->sceneLoadFlag = 0x14; - play->fadeTransition = 3; + play->transitionTrigger = TRANS_TRIGGER_START; + play->transitionType = TRANS_TYPE_FADE_WHITE; gSaveContext.chamberCutsceneNum = 2; break; case 32: play->linkAgeOnLoad = 1; play->nextEntranceIndex = 0x00CD; - play->sceneLoadFlag = 0x14; + play->transitionTrigger = TRANS_TRIGGER_START; gSaveContext.cutsceneIndex = 0xFFF2; - play->fadeTransition = 11; + play->transitionType = TRANS_TYPE_INSTANT; break; case 33: play->nextEntranceIndex = 0x00CD; - play->sceneLoadFlag = 0x14; - play->fadeTransition = 3; + play->transitionTrigger = TRANS_TRIGGER_START; + play->transitionType = TRANS_TYPE_FADE_WHITE; break; case 34: play->nextEntranceIndex = 0x00A0; - play->sceneLoadFlag = 0x14; + play->transitionTrigger = TRANS_TRIGGER_START; gSaveContext.cutsceneIndex = 0xFFF3; - play->fadeTransition = 3; + play->transitionType = TRANS_TYPE_FADE_WHITE; break; case 35: play->nextEntranceIndex = 0x00CD; - play->sceneLoadFlag = 0x14; + play->transitionTrigger = TRANS_TRIGGER_START; gSaveContext.cutsceneIndex = 0xFFF0; - play->fadeTransition = 4; + play->transitionType = TRANS_TYPE_FADE_BLACK_FAST; break; case 38: play->nextEntranceIndex = 0x00A0; - play->sceneLoadFlag = 0x14; + play->transitionTrigger = TRANS_TRIGGER_START; gSaveContext.cutsceneIndex = 0xFFF4; - play->fadeTransition = 4; + play->transitionType = TRANS_TYPE_FADE_BLACK_FAST; break; case 39: play->nextEntranceIndex = 0x0053; - play->sceneLoadFlag = 0x14; + play->transitionTrigger = TRANS_TRIGGER_START; gSaveContext.cutsceneIndex = 0xFFF9; - play->fadeTransition = 4; + play->transitionType = TRANS_TYPE_FADE_BLACK_FAST; break; case 40: play->linkAgeOnLoad = 0; play->nextEntranceIndex = 0x0053; - play->sceneLoadFlag = 0x14; + play->transitionTrigger = TRANS_TRIGGER_START; gSaveContext.cutsceneIndex = 0xFFFA; - play->fadeTransition = 4; + play->transitionType = TRANS_TYPE_FADE_BLACK_FAST; break; case 41: play->nextEntranceIndex = 0x04E6; - play->sceneLoadFlag = 0x14; - play->fadeTransition = 2; + play->transitionTrigger = TRANS_TRIGGER_START; + play->transitionType = TRANS_TYPE_FADE_BLACK; break; case 42: play->nextEntranceIndex = 0x00DB; - play->sceneLoadFlag = 0x14; + play->transitionTrigger = TRANS_TRIGGER_START; gSaveContext.cutsceneIndex = 0xFFF2; - play->fadeTransition = 4; + play->transitionType = TRANS_TYPE_FADE_BLACK_FAST; break; case 43: play->nextEntranceIndex = 0x0503; - play->sceneLoadFlag = 0x14; - play->fadeTransition = 4; + play->transitionTrigger = TRANS_TRIGGER_START; + play->transitionType = TRANS_TYPE_FADE_BLACK_FAST; break; case 44: play->nextEntranceIndex = 0x0320; - play->sceneLoadFlag = 0x14; - play->fadeTransition = 17; + play->transitionTrigger = TRANS_TRIGGER_START; + play->transitionType = TRANS_TYPE_FADE_WHITE_INSTANT; break; case 46: Flags_SetEventChkInf(EVENTCHKINF_ENTERED_MASTER_SWORD_CHAMBER); play->nextEntranceIndex = 0x0324; - play->sceneLoadFlag = 0x14; - play->fadeTransition = 4; + play->transitionTrigger = TRANS_TRIGGER_START; + play->transitionType = TRANS_TYPE_FADE_BLACK_FAST; break; case 47: Item_Give(play, ITEM_SONG_NOCTURNE); Flags_SetEventChkInf(EVENTCHKINF_LEARNED_NOCTURNE_OF_SHADOW); play->nextEntranceIndex = 0x00DB; - play->sceneLoadFlag = 0x14; + play->transitionTrigger = TRANS_TRIGGER_START; gSaveContext.cutsceneIndex = 0xFFF1; - play->fadeTransition = 4; + play->transitionType = TRANS_TYPE_FADE_BLACK_FAST; break; case 48: play->nextEntranceIndex = 0x01ED; - play->sceneLoadFlag = 0x14; - play->fadeTransition = 15; - gSaveContext.nextTransitionType = 15; + play->transitionTrigger = TRANS_TRIGGER_START; + play->transitionType = TRANS_TYPE_SANDSTORM_END; + gSaveContext.nextTransitionType = TRANS_TYPE_SANDSTORM_END; break; case 49: play->nextEntranceIndex = 0x058C; - play->sceneLoadFlag = 0x14; - play->fadeTransition = 4; + play->transitionTrigger = TRANS_TRIGGER_START; + play->transitionType = TRANS_TYPE_FADE_BLACK_FAST; break; case 50: play->nextEntranceIndex = 0x0513; - play->sceneLoadFlag = 0x14; - play->fadeTransition = 17; + play->transitionTrigger = TRANS_TRIGGER_START; + play->transitionType = TRANS_TYPE_FADE_WHITE_INSTANT; break; case 51: play->nextEntranceIndex = 0x00CD; gSaveContext.cutsceneIndex = 0xFFF8; - play->sceneLoadFlag = 0x14; - play->fadeTransition = 41; + play->transitionTrigger = TRANS_TRIGGER_START; + play->transitionType = TRANS_TYPE_CIRCLE(TCA_NORMAL, TCC_WHITE, TCS_SLOW); break; case 52: play->nextEntranceIndex = 0x0053; gSaveContext.cutsceneIndex = 0xFFF7; - play->sceneLoadFlag = 0x14; - play->fadeTransition = 11; + play->transitionTrigger = TRANS_TRIGGER_START; + play->transitionType = TRANS_TYPE_INSTANT; break; case 53: play->nextEntranceIndex = 0x050F; - play->sceneLoadFlag = 0x14; - play->fadeTransition = 3; + play->transitionTrigger = TRANS_TRIGGER_START; + play->transitionType = TRANS_TYPE_FADE_WHITE; break; case 54: gSaveContext.gameMode = 3; @@ -894,104 +894,104 @@ void Cutscene_Command_Terminator(PlayState* play, CutsceneContext* csCtx, CsCmdB play->linkAgeOnLoad = 1; play->nextEntranceIndex = 0x0117; gSaveContext.cutsceneIndex = 0xFFF2; - play->sceneLoadFlag = 0x14; - play->fadeTransition = 2; + play->transitionTrigger = TRANS_TRIGGER_START; + play->transitionType = TRANS_TYPE_FADE_BLACK; break; case 55: play->nextEntranceIndex = 0x0129; gSaveContext.cutsceneIndex = 0xFFF1; - play->sceneLoadFlag = 0x14; - play->fadeTransition = 2; + play->transitionTrigger = TRANS_TRIGGER_START; + play->transitionType = TRANS_TYPE_FADE_BLACK; break; case 56: play->nextEntranceIndex = 0x00DB; gSaveContext.cutsceneIndex = 0xFFF4; - play->sceneLoadFlag = 0x14; - play->fadeTransition = 2; + play->transitionTrigger = TRANS_TRIGGER_START; + play->transitionType = TRANS_TYPE_FADE_BLACK; break; case 57: play->nextEntranceIndex = 0x013D; gSaveContext.cutsceneIndex = 0xFFF3; - play->sceneLoadFlag = 0x14; - play->fadeTransition = 2; + play->transitionTrigger = TRANS_TRIGGER_START; + play->transitionType = TRANS_TYPE_FADE_BLACK; break; case 58: play->nextEntranceIndex = 0x014D; gSaveContext.cutsceneIndex = 0xFFF1; - play->sceneLoadFlag = 0x14; - play->fadeTransition = 2; + play->transitionTrigger = TRANS_TRIGGER_START; + play->transitionType = TRANS_TYPE_FADE_BLACK; break; case 59: play->nextEntranceIndex = 0x0102; gSaveContext.cutsceneIndex = 0xFFF1; - play->sceneLoadFlag = 0x14; - play->fadeTransition = 2; + play->transitionTrigger = TRANS_TRIGGER_START; + play->transitionType = TRANS_TYPE_FADE_BLACK; break; case 60: play->nextEntranceIndex = 0x010E; gSaveContext.cutsceneIndex = 0xFFF2; - play->sceneLoadFlag = 0x14; - play->fadeTransition = 2; + play->transitionTrigger = TRANS_TRIGGER_START; + play->transitionType = TRANS_TYPE_FADE_BLACK; break; case 61: play->nextEntranceIndex = 0x0108; gSaveContext.cutsceneIndex = 0xFFF0; - play->sceneLoadFlag = 0x14; - play->fadeTransition = 2; + play->transitionTrigger = TRANS_TRIGGER_START; + play->transitionType = TRANS_TYPE_FADE_BLACK; break; case 62: play->linkAgeOnLoad = 0; play->nextEntranceIndex = 0x00EE; gSaveContext.cutsceneIndex = 0xFFF6; - play->sceneLoadFlag = 0x14; - play->fadeTransition = 2; + play->transitionTrigger = TRANS_TRIGGER_START; + play->transitionType = TRANS_TYPE_FADE_BLACK; break; case 63: play->nextEntranceIndex = 0x00EE; gSaveContext.cutsceneIndex = 0xFFF7; - play->sceneLoadFlag = 0x14; - play->fadeTransition = 2; + play->transitionTrigger = TRANS_TRIGGER_START; + play->transitionType = TRANS_TYPE_FADE_BLACK; break; case 64: play->nextEntranceIndex = 0x00CD; gSaveContext.cutsceneIndex = 0xFFF5; - play->sceneLoadFlag = 0x14; - play->fadeTransition = 2; + play->transitionTrigger = TRANS_TRIGGER_START; + play->transitionType = TRANS_TYPE_FADE_BLACK; break; case 65: play->linkAgeOnLoad = 1; play->nextEntranceIndex = 0x0157; gSaveContext.cutsceneIndex = 0xFFF2; - play->sceneLoadFlag = 0x14; - play->fadeTransition = 2; + play->transitionTrigger = TRANS_TRIGGER_START; + play->transitionType = TRANS_TYPE_FADE_BLACK; break; case 66: play->nextEntranceIndex = 0x0554; - play->sceneLoadFlag = 0x14; - play->fadeTransition = 2; + play->transitionTrigger = TRANS_TRIGGER_START; + play->transitionType = TRANS_TYPE_FADE_BLACK; break; case 67: play->nextEntranceIndex = 0x027E; - play->sceneLoadFlag = 0x14; - play->fadeTransition = 2; + play->transitionTrigger = TRANS_TRIGGER_START; + play->transitionType = TRANS_TYPE_FADE_BLACK; break; case 68: play->nextEntranceIndex = 0x00A0; - play->sceneLoadFlag = 0x14; + play->transitionTrigger = TRANS_TRIGGER_START; gSaveContext.cutsceneIndex = 0xFFF5; - play->fadeTransition = 2; + play->transitionType = TRANS_TYPE_FADE_BLACK; break; case 69: play->nextEntranceIndex = 0x05E8; - play->sceneLoadFlag = 0x14; - play->fadeTransition = 2; + play->transitionTrigger = TRANS_TRIGGER_START; + play->transitionType = TRANS_TYPE_FADE_BLACK; break; case 70: play->nextEntranceIndex = 0x013D; - play->sceneLoadFlag = 0x14; + play->transitionTrigger = TRANS_TRIGGER_START; gSaveContext.cutsceneIndex = 0xFFF4; - play->fadeTransition = 2; - gSaveContext.nextTransitionType = 2; + play->transitionType = TRANS_TYPE_FADE_BLACK; + gSaveContext.nextTransitionType = TRANS_TYPE_FADE_BLACK; break; case 71: gSaveContext.equips.equipment |= EQUIP_VALUE_TUNIC_KOKIRI << (EQUIP_TYPE_TUNIC * 4); @@ -1000,57 +1000,57 @@ void Cutscene_Command_Terminator(PlayState* play, CutsceneContext* csCtx, CsCmdB Player_SetEquipmentData(play, player); play->linkAgeOnLoad = 1; play->nextEntranceIndex = 0x0053; - play->sceneLoadFlag = 0x14; + play->transitionTrigger = TRANS_TRIGGER_START; gSaveContext.cutsceneIndex = 0xFFF1; - play->fadeTransition = 2; + play->transitionType = TRANS_TYPE_FADE_BLACK; break; case 72: play->nextEntranceIndex = 0x0400; - play->sceneLoadFlag = 0x14; + play->transitionTrigger = TRANS_TRIGGER_START; gSaveContext.cutsceneIndex = 0xFFF0; - play->fadeTransition = 2; - gSaveContext.nextTransitionType = 2; + play->transitionType = TRANS_TYPE_FADE_BLACK; + gSaveContext.nextTransitionType = TRANS_TYPE_FADE_BLACK; break; case 73: play->linkAgeOnLoad = 1; play->nextEntranceIndex = 0x0157; - play->sceneLoadFlag = 0x14; + play->transitionTrigger = TRANS_TRIGGER_START; gSaveContext.cutsceneIndex = 0xFFF2; - play->fadeTransition = 2; + play->transitionType = TRANS_TYPE_FADE_BLACK; break; case 74: play->nextEntranceIndex = 0x0157; - play->sceneLoadFlag = 0x14; + play->transitionTrigger = TRANS_TRIGGER_START; gSaveContext.cutsceneIndex = 0xFFF3; - play->fadeTransition = 3; - gSaveContext.nextTransitionType = 3; + play->transitionType = TRANS_TYPE_FADE_WHITE; + gSaveContext.nextTransitionType = TRANS_TYPE_FADE_WHITE; break; case 75: play->linkAgeOnLoad = 1; play->nextEntranceIndex = 0x0157; - play->sceneLoadFlag = 0x14; + play->transitionTrigger = TRANS_TRIGGER_START; gSaveContext.cutsceneIndex = 0xFFF4; - play->fadeTransition = 2; + play->transitionType = TRANS_TYPE_FADE_BLACK; break; case 76: play->linkAgeOnLoad = 0; play->nextEntranceIndex = 0x0157; - play->sceneLoadFlag = 0x14; + play->transitionTrigger = TRANS_TRIGGER_START; gSaveContext.cutsceneIndex = 0xFFF5; - play->fadeTransition = 2; + play->transitionType = TRANS_TYPE_FADE_BLACK; break; case 77: play->linkAgeOnLoad = 1; play->nextEntranceIndex = 0x0157; - play->sceneLoadFlag = 0x14; + play->transitionTrigger = TRANS_TRIGGER_START; gSaveContext.cutsceneIndex = 0xFFF6; - play->fadeTransition = 2; + play->transitionType = TRANS_TYPE_FADE_BLACK; break; case 78: play->nextEntranceIndex = 0x0157; - play->sceneLoadFlag = 0x14; + play->transitionTrigger = TRANS_TRIGGER_START; gSaveContext.cutsceneIndex = 0xFFF7; - play->fadeTransition = 2; + play->transitionType = TRANS_TYPE_FADE_BLACK; break; case 79: case 80: @@ -1068,38 +1068,38 @@ void Cutscene_Command_Terminator(PlayState* play, CutsceneContext* csCtx, CsCmdB case 92: case 93: play->nextEntranceIndex = 0x0157; - play->sceneLoadFlag = 0x14; - play->fadeTransition = 2; + play->transitionTrigger = TRANS_TRIGGER_START; + play->transitionType = TRANS_TYPE_FADE_BLACK; break; case 94: play->nextEntranceIndex = 0x02AE; - play->sceneLoadFlag = 0x14; - play->fadeTransition = 3; + play->transitionTrigger = TRANS_TRIGGER_START; + play->transitionType = TRANS_TYPE_FADE_WHITE; break; case 95: if ((Flags_GetEventChkInf(EVENTCHKINF_USED_FOREST_TEMPLE_BLUE_WARP)) && (Flags_GetEventChkInf(EVENTCHKINF_USED_FIRE_TEMPLE_BLUE_WARP)) && (Flags_GetEventChkInf(EVENTCHKINF_USED_WATER_TEMPLE_BLUE_WARP))) { play->nextEntranceIndex = 0x0053; - play->sceneLoadFlag = 0x14; + play->transitionTrigger = TRANS_TRIGGER_START; gSaveContext.cutsceneIndex = 0xFFF3; - play->fadeTransition = 2; + play->transitionType = TRANS_TYPE_FADE_BLACK; } else { switch (gSaveContext.sceneSetupIndex) { case 8: play->nextEntranceIndex = 0x00FC; - play->sceneLoadFlag = 0x14; - play->fadeTransition = 2; + play->transitionTrigger = TRANS_TRIGGER_START; + play->transitionType = TRANS_TYPE_FADE_BLACK; break; case 9: play->nextEntranceIndex = 0x0147; - play->sceneLoadFlag = 0x14; - play->fadeTransition = 2; + play->transitionTrigger = TRANS_TRIGGER_START; + play->transitionType = TRANS_TYPE_FADE_BLACK; break; case 10: play->nextEntranceIndex = 0x0102; - play->sceneLoadFlag = 0x14; + play->transitionTrigger = TRANS_TRIGGER_START; gSaveContext.cutsceneIndex = 0xFFF0; - play->fadeTransition = 3; + play->transitionType = TRANS_TYPE_FADE_WHITE; break; } } @@ -1107,130 +1107,130 @@ void Cutscene_Command_Terminator(PlayState* play, CutsceneContext* csCtx, CsCmdB case 96: if (CHECK_QUEST_ITEM(QUEST_MEDALLION_SHADOW)) { play->nextEntranceIndex = 0x006B; - play->sceneLoadFlag = 0x14; + play->transitionTrigger = TRANS_TRIGGER_START; gSaveContext.cutsceneIndex = 0xFFF1; - play->fadeTransition = 5; + play->transitionType = TRANS_TYPE_FADE_WHITE_FAST; } else { Flags_SetEventChkInf(EVENTCHKINF_OBTAINED_SPIRIT_MEDALLION); play->nextEntranceIndex = 0x0610; - play->sceneLoadFlag = 0x14; - play->fadeTransition = 3; - gSaveContext.nextTransitionType = 3; + play->transitionTrigger = TRANS_TRIGGER_START; + play->transitionType = TRANS_TYPE_FADE_WHITE; + gSaveContext.nextTransitionType = TRANS_TYPE_FADE_WHITE; } break; case 97: if (CHECK_QUEST_ITEM(QUEST_MEDALLION_SPIRIT)) { play->nextEntranceIndex = 0x006B; - play->sceneLoadFlag = 0x14; + play->transitionTrigger = TRANS_TRIGGER_START; gSaveContext.cutsceneIndex = 0xFFF1; - play->fadeTransition = 5; + play->transitionType = TRANS_TYPE_FADE_WHITE_FAST; } else { play->nextEntranceIndex = 0x0580; - play->sceneLoadFlag = 0x14; - play->fadeTransition = 3; - gSaveContext.nextTransitionType = 3; + play->transitionTrigger = TRANS_TRIGGER_START; + play->transitionType = TRANS_TYPE_FADE_WHITE; + gSaveContext.nextTransitionType = TRANS_TYPE_FADE_WHITE; } break; case 98: play->nextEntranceIndex = 0x0564; - play->sceneLoadFlag = 0x14; - play->fadeTransition = 3; - gSaveContext.nextTransitionType = 3; + play->transitionTrigger = TRANS_TRIGGER_START; + play->transitionType = TRANS_TYPE_FADE_WHITE; + gSaveContext.nextTransitionType = TRANS_TYPE_FADE_WHITE; break; case 99: play->nextEntranceIndex = 0x0608; - play->sceneLoadFlag = 0x14; - play->fadeTransition = 2; - gSaveContext.nextTransitionType = 2; + play->transitionTrigger = TRANS_TRIGGER_START; + play->transitionType = TRANS_TYPE_FADE_BLACK; + gSaveContext.nextTransitionType = TRANS_TYPE_FADE_BLACK; break; case 100: play->nextEntranceIndex = 0x00EE; gSaveContext.cutsceneIndex = 0xFFF8; - play->sceneLoadFlag = 0x14; - play->fadeTransition = 3; - gSaveContext.nextTransitionType = 3; + play->transitionTrigger = TRANS_TRIGGER_START; + play->transitionType = TRANS_TYPE_FADE_WHITE; + gSaveContext.nextTransitionType = TRANS_TYPE_FADE_WHITE; break; case 101: play->nextEntranceIndex = 0x01F5; - play->sceneLoadFlag = 0x14; - play->fadeTransition = 15; + play->transitionTrigger = TRANS_TRIGGER_START; + play->transitionType = TRANS_TYPE_SANDSTORM_END; break; case 102: play->nextEntranceIndex = 0x0590; - play->sceneLoadFlag = 0x14; - play->fadeTransition = 2; + play->transitionTrigger = TRANS_TRIGGER_START; + play->transitionType = TRANS_TYPE_FADE_BLACK; break; case 103: play->nextEntranceIndex = 0x00CD; - play->sceneLoadFlag = 0x14; + play->transitionTrigger = TRANS_TRIGGER_START; gSaveContext.cutsceneIndex = 0xFFF3; - play->fadeTransition = 2; + play->transitionType = TRANS_TYPE_FADE_BLACK; break; case 104: switch (sTitleCsState) { case 0: play->nextEntranceIndex = 0x008D; - play->sceneLoadFlag = 0x14; + play->transitionTrigger = TRANS_TRIGGER_START; gSaveContext.cutsceneIndex = 0xFFF2; - play->fadeTransition = 2; + play->transitionType = TRANS_TYPE_FADE_BLACK; sTitleCsState++; break; case 1: play->nextEntranceIndex = 0x0147; - play->sceneLoadFlag = 0x14; + play->transitionTrigger = TRANS_TRIGGER_START; gSaveContext.cutsceneIndex = 0xFFF1; - play->fadeTransition = 2; + play->transitionType = TRANS_TYPE_FADE_BLACK; sTitleCsState++; break; case 2: play->nextEntranceIndex = 0x00A0; - play->sceneLoadFlag = 0x14; + play->transitionTrigger = TRANS_TRIGGER_START; gSaveContext.cutsceneIndex = 0xFFF6; - play->fadeTransition = 2; + play->transitionType = TRANS_TYPE_FADE_BLACK; sTitleCsState = 0; break; } break; case 105: play->nextEntranceIndex = 0x00E4; - play->sceneLoadFlag = 0x14; + play->transitionTrigger = TRANS_TRIGGER_START; gSaveContext.cutsceneIndex = 0xFFF1; - play->fadeTransition = 2; + play->transitionType = TRANS_TYPE_FADE_BLACK; break; case 106: play->nextEntranceIndex = 0x0574; - play->sceneLoadFlag = 0x14; - play->fadeTransition = 2; + play->transitionTrigger = TRANS_TRIGGER_START; + play->transitionType = TRANS_TYPE_FADE_BLACK; break; case 107: play->nextEntranceIndex = 0x0538; - play->sceneLoadFlag = 0x14; - play->fadeTransition = 2; + play->transitionTrigger = TRANS_TRIGGER_START; + play->transitionType = TRANS_TYPE_FADE_BLACK; break; case 108: play->nextEntranceIndex = 0x053C; - play->sceneLoadFlag = 0x14; - play->fadeTransition = 2; + play->transitionTrigger = TRANS_TRIGGER_START; + play->transitionType = TRANS_TYPE_FADE_BLACK; break; case 109: play->nextEntranceIndex = 0x0540; - play->sceneLoadFlag = 0x14; - play->fadeTransition = 2; + play->transitionTrigger = TRANS_TRIGGER_START; + play->transitionType = TRANS_TYPE_FADE_BLACK; break; case 110: play->nextEntranceIndex = 0x0544; - play->sceneLoadFlag = 0x14; - play->fadeTransition = 2; + play->transitionTrigger = TRANS_TRIGGER_START; + play->transitionType = TRANS_TYPE_FADE_BLACK; break; case 111: play->nextEntranceIndex = 0x0548; - play->sceneLoadFlag = 0x14; - play->fadeTransition = 2; + play->transitionTrigger = TRANS_TRIGGER_START; + play->transitionType = TRANS_TYPE_FADE_BLACK; break; case 112: play->nextEntranceIndex = 0x054C; - play->sceneLoadFlag = 0x14; - play->fadeTransition = 2; + play->transitionTrigger = TRANS_TRIGGER_START; + play->transitionType = TRANS_TYPE_FADE_BLACK; break; case 113: if (Flags_GetEventChkInf(EVENTCHKINF_COMPLETED_FOREST_TRIAL) && Flags_GetEventChkInf(EVENTCHKINF_COMPLETED_WATER_TRIAL) && Flags_GetEventChkInf(EVENTCHKINF_COMPLETED_SHADOW_TRIAL) && @@ -1247,26 +1247,26 @@ void Cutscene_Command_Terminator(PlayState* play, CutsceneContext* csCtx, CsCmdB break; case 114: play->nextEntranceIndex = 0x0185; - play->sceneLoadFlag = 0x14; - play->fadeTransition = 2; + play->transitionTrigger = TRANS_TRIGGER_START; + play->transitionType = TRANS_TYPE_FADE_BLACK; break; case 115: play->nextEntranceIndex = 0x0594; - play->sceneLoadFlag = 0x14; - play->fadeTransition = 2; - gSaveContext.nextTransitionType = 2; + play->transitionTrigger = TRANS_TRIGGER_START; + play->transitionType = TRANS_TYPE_FADE_BLACK; + gSaveContext.nextTransitionType = TRANS_TYPE_FADE_BLACK; break; case 116: if (Flags_GetEventChkInf(EVENTCHKINF_OBTAINED_SPIRIT_MEDALLION)) { play->nextEntranceIndex = 0x0580; - play->sceneLoadFlag = 0x14; - play->fadeTransition = 3; + play->transitionTrigger = TRANS_TRIGGER_START; + play->transitionType = TRANS_TYPE_FADE_WHITE; } else { play->nextEntranceIndex = 0x0610; - play->sceneLoadFlag = 0x14; - play->fadeTransition = 3; + play->transitionTrigger = TRANS_TRIGGER_START; + play->transitionType = TRANS_TYPE_FADE_WHITE; } - gSaveContext.nextTransitionType = 3; + gSaveContext.nextTransitionType = TRANS_TYPE_FADE_WHITE; break; case 117: gSaveContext.gameMode = 3; @@ -1274,21 +1274,21 @@ void Cutscene_Command_Terminator(PlayState* play, CutsceneContext* csCtx, CsCmdB play->linkAgeOnLoad = 0; play->nextEntranceIndex = 0x00CD; gSaveContext.cutsceneIndex = 0xFFF7; - play->sceneLoadFlag = 0x14; - play->fadeTransition = 3; + play->transitionTrigger = TRANS_TRIGGER_START; + play->transitionType = TRANS_TYPE_FADE_WHITE; break; case 118: gSaveContext.respawn[RESPAWN_MODE_DOWN].entranceIndex = 0x0517; Play_TriggerVoidOut(play); gSaveContext.respawnFlag = -2; - gSaveContext.nextTransitionType = 2; + gSaveContext.nextTransitionType = TRANS_TYPE_FADE_BLACK; break; case 119: gSaveContext.dayTime = 0x8000; gSaveContext.skyboxTime = 0x8000; play->nextEntranceIndex = 0x05F0; - play->sceneLoadFlag = 0x14; - play->fadeTransition = 3; + play->transitionTrigger = TRANS_TRIGGER_START; + play->transitionType = TRANS_TYPE_FADE_WHITE; break; } diff --git a/soh/src/code/z_fbdemo_circle.c b/soh/src/code/z_fbdemo_circle.c index a3ebbabd4..98183023a 100644 --- a/soh/src/code/z_fbdemo_circle.c +++ b/soh/src/code/z_fbdemo_circle.c @@ -39,16 +39,16 @@ Gfx __sCircleDList[] = { void TransitionCircle_Start(void* thisx) { TransitionCircle* this = (TransitionCircle*)thisx; - this->isDone = 0; + this->isDone = false; - switch (this->effect) { - case 1: + switch (this->appearanceType) { + case TCA_WAVE: this->texture = sTransCircleWaveTex; break; - case 2: + case TCA_RIPPLE: this->texture = sTransCircleRippleTex; break; - case 3: + case TCA_STARBURST: this->texture = sTransCircleStarburstTex; break; default: @@ -56,34 +56,34 @@ void TransitionCircle_Start(void* thisx) { break; } - if (this->speed == 0) { - this->step = 0x14; + if (this->speedType == TCS_FAST) { + this->speed = 20; } else { - this->step = 0xA; + this->speed = 10; } - if (this->typeColor == 0) { + if (this->colorType == TCC_BLACK) { this->color.rgba = RGBA8(0, 0, 0, 255); - } else if (this->typeColor == 1) { + } else if (this->colorType == TCC_WHITE) { this->color.rgba = RGBA8(160, 160, 160, 255); - } else if (this->typeColor == 2) { + } else if (this->colorType == TCC_GRAY) { // yes, really. this->color.r = 100; this->color.g = 100; this->color.b = 100; this->color.a = 255; } else { - this->step = 0x28; - this->color.rgba = this->effect == 1 ? RGBA8(0, 0, 0, 255) : RGBA8(160, 160, 160, 255); + this->speed = 40; + this->color.rgba = this->appearanceType == TCA_WAVE ? RGBA8(0, 0, 0, 255) : RGBA8(160, 160, 160, 255); } - if (this->unk_14 != 0) { + if (this->direction != 0) { this->texY = 0; - if (this->typeColor == 3) { + if (this->colorType == TCC_SPECIAL) { this->texY = 0xFA; } } else { this->texY = 0x1F4; - if (this->effect == 2) { + if (this->appearanceType == TCA_RIPPLE) { Audio_PlaySoundGeneral(NA_SE_OC_SECRET_WARP_OUT, &D_801333D4, 4, &D_801333E0, &D_801333E0, &D_801333E8); } } @@ -106,28 +106,28 @@ void TransitionCircle_Update(void* thisx, s32 updateRate) { s32 temp_t2; s32 temp_t3; - if (this->unk_14 != 0) { + if (this->direction != 0) { if (this->texY == 0) { - if (this->effect == 2) { + if (this->appearanceType == TCA_RIPPLE) { Audio_PlaySoundGeneral(NA_SE_OC_SECRET_WARP_IN, &D_801333D4, 4, &D_801333E0, &D_801333E0, &D_801333E8); } } - this->texY += this->step * 3 / updateRate; + this->texY += this->speed * 3 / updateRate; if (this->texY >= 0x1F4) { this->texY = 0x1F4; - this->isDone = 1; + this->isDone = true; } } else { - this->texY -= this->step * 3 / updateRate; - if (this->typeColor != 3) { + this->texY -= this->speed * 3 / updateRate; + if (this->colorType != TCC_SPECIAL) { if (this->texY <= 0) { this->texY = 0; - this->isDone = 1; + this->isDone = true; } } else { if (this->texY < 0xFB) { this->texY = 0xFA; - this->isDone = 1; + this->isDone = true; } } } @@ -194,15 +194,17 @@ s32 TransitionCircle_IsDone(void* thisx) { void TransitionCircle_SetType(void* thisx, s32 type) { TransitionCircle* this = (TransitionCircle*)thisx; - if (type & 0x80) { - this->unk_14 = (type >> 5) & 0x1; - this->typeColor = (type >> 3) & 0x3; - this->speed = type & 0x1; - this->effect = (type >> 1) & 0x3; + if (type & TC_SET_PARAMS) { + // SetType is called twice for circles, the actual direction value will be set on the second call. + // The direction set here will be overwritten on that second call. + this->direction = (type >> 5) & 0x1; + this->colorType = (type >> 3) & 0x3; + this->speedType = type & 0x1; + this->appearanceType = (type >> 1) & 0x3; } else if (type == 1) { - this->unk_14 = 1; + this->direction = 1; } else { - this->unk_14 = 0; + this->direction = 0; } } diff --git a/soh/src/code/z_fbdemo_wipe1.c b/soh/src/code/z_fbdemo_wipe1.c index df5cbbc2d..6bc3fb039 100644 --- a/soh/src/code/z_fbdemo_wipe1.c +++ b/soh/src/code/z_fbdemo_wipe1.c @@ -64,18 +64,18 @@ void TransitionWipe_Destroy(void* thisx) { void TransitionWipe_Update(void* thisx, s32 updateRate) { TransitionWipe* this = (TransitionWipe*)thisx; - u8 unk1419; + u8 speed; if (this->direction != 0) { - unk1419 = gSaveContext.transWipeSpeed; - this->texY += (unk1419 * 3) / updateRate; + speed = gSaveContext.transWipeSpeed; + this->texY += (speed * 3) / updateRate; if (this->texY >= 0x264) { this->texY = 0x264; this->isDone = 1; } } else { - unk1419 = gSaveContext.transWipeSpeed; - this->texY -= (unk1419 * 3) / updateRate; + speed = gSaveContext.transWipeSpeed; + this->texY -= (speed * 3) / updateRate; if (this->texY < 0x14E) { this->texY = 0x14D; this->isDone = 1; diff --git a/soh/src/code/z_kaleido_setup.c b/soh/src/code/z_kaleido_setup.c index 77cc43e99..e4001e6ce 100644 --- a/soh/src/code/z_kaleido_setup.c +++ b/soh/src/code/z_kaleido_setup.c @@ -13,7 +13,7 @@ void KaleidoSetup_Update(PlayState* play) { Input* input = &play->state.input[0]; if (pauseCtx->state == 0 && pauseCtx->debugState == 0 && play->gameOverCtx.state == GAMEOVER_INACTIVE && - play->sceneLoadFlag == 0 && play->transitionMode == 0 && gSaveContext.cutsceneIndex < 0xFFF0 && + play->transitionTrigger == TRANS_TRIGGER_OFF && play->transitionMode == TRANS_MODE_OFF && gSaveContext.cutsceneIndex < 0xFFF0 && gSaveContext.nextCutsceneIndex < 0xFFF0 && !Play_InCsMode(play) && play->shootingGalleryStatus <= 1 && gSaveContext.magicState != MAGIC_STATE_STEP_CAPACITY && gSaveContext.magicState != MAGIC_STATE_FILL && (play->sceneNum != SCENE_BOMBCHU_BOWLING_ALLEY || !Flags_GetSwitch(play, 0x38))) { diff --git a/soh/src/code/z_kankyo.c b/soh/src/code/z_kankyo.c index 4474c2d8b..41bf060df 100644 --- a/soh/src/code/z_kankyo.c +++ b/soh/src/code/z_kankyo.c @@ -289,7 +289,7 @@ void Environment_Init(PlayState* play2, EnvironmentContext* envCtx, s32 unused) envCtx->skyboxFilterColor[1] = 0; envCtx->skyboxFilterColor[2] = 0; envCtx->skyboxFilterColor[3] = 0; - envCtx->sandstormState = 0; + envCtx->sandstormState = SANDSTORM_OFF; envCtx->sandstormPrimA = 0; envCtx->sandstormEnvA = 0; @@ -925,7 +925,7 @@ void Environment_Update(PlayState* play, EnvironmentContext* envCtx, LightContex if ((pauseCtx->state == 0) && (gameOverCtx->state == GAMEOVER_INACTIVE)) { if (((msgCtx->msgLength == 0) && (msgCtx->msgMode == 0)) || (((void)0, gSaveContext.gameMode) == 3)) { if ((envCtx->unk_1A == 0) && !FrameAdvance_IsEnabled(play) && - (play->transitionMode == 0 || ((void)0, gSaveContext.gameMode) != 0)) { + (play->transitionMode == TRANS_MODE_OFF || ((void)0, gSaveContext.gameMode) != 0)) { if (IS_DAY || gTimeIncrement >= 0x190) { gSaveContext.dayTime += gTimeIncrement; @@ -2336,7 +2336,7 @@ void Environment_DrawSandstorm(PlayState* play, u8 sandstormState) { Environment_PatchSandstorm(play); switch (sandstormState) { - case 3: + case SANDSTORM_ACTIVE: if ((play->sceneNum == SCENE_HAUNTED_WASTELAND) && (play->roomCtx.curRoom.num == 0)) { envA1 = 0; primA1 = (play->envCtx.sandstormEnvA > 128) ? 255 : play->envCtx.sandstormEnvA >> 1; @@ -2349,11 +2349,11 @@ void Environment_DrawSandstorm(PlayState* play, u8 sandstormState) { envA1 = 128; } break; - case 1: + case SANDSTORM_FILL: primA1 = 255; envA1 = (play->envCtx.sandstormPrimA >= 255) ? 255 : 128; break; - case 2: + case SANDSTORM_UNFILL: envA1 = 128; if (play->envCtx.sandstormEnvA > 128) { primA1 = 0xFF; @@ -2365,15 +2365,15 @@ void Environment_DrawSandstorm(PlayState* play, u8 sandstormState) { primA1 += 73; } if ((primA1 >= primA) && (primA1 != 255)) { - play->envCtx.sandstormState = 3; + play->envCtx.sandstormState = SANDSTORM_ACTIVE; } break; - case 4: + case SANDSTORM_DISSIPATE: envA1 = 0; primA1 = (play->envCtx.sandstormEnvA > 128) ? 255 : play->envCtx.sandstormEnvA >> 1; if (primA == 0) { - play->envCtx.sandstormState = 0; + play->envCtx.sandstormState = SANDSTORM_OFF; } break; } @@ -2541,9 +2541,9 @@ void Environment_WarpSongLeave(PlayState* play) { gSaveContext.cutsceneIndex = 0; gSaveContext.respawnFlag = -3; play->nextEntranceIndex = gSaveContext.respawn[RESPAWN_MODE_RETURN].entranceIndex; - play->sceneLoadFlag = 0x14; - play->fadeTransition = 3; - gSaveContext.nextTransitionType = 3; + play->transitionTrigger = TRANS_TRIGGER_START; + play->transitionType = TRANS_TYPE_FADE_WHITE; + gSaveContext.nextTransitionType = TRANS_TYPE_FADE_WHITE; switch (play->nextEntranceIndex) { case 0x147: diff --git a/soh/src/code/z_parameter.c b/soh/src/code/z_parameter.c index bbaa8d90b..bc51079f1 100644 --- a/soh/src/code/z_parameter.c +++ b/soh/src/code/z_parameter.c @@ -893,7 +893,7 @@ void func_80083108(PlayState* play) { Interface_ChangeAlpha(6); } - if (play->transitionMode != 0) { + if (play->transitionMode != TRANS_MODE_OFF) { Interface_ChangeAlpha(1); } else if (gSaveContext.minigameState == 1) { Interface_ChangeAlpha(8); @@ -1344,7 +1344,7 @@ void func_80083108(PlayState* play) { if (sp28) { gSaveContext.unk_13EA = 0; - if ((play->sceneLoadFlag == 0) && (play->transitionMode == 0)) { + if ((play->transitionTrigger == TRANS_TRIGGER_OFF) && (play->transitionMode == TRANS_MODE_OFF)) { Interface_ChangeAlpha(50); osSyncPrintf("???????? alpha_change( 50 ); ?????\n"); } else { @@ -3463,7 +3463,7 @@ void Interface_UpdateMagicBar(PlayState* play) { case MAGIC_STATE_CONSUME_LENS: if ((play->pauseCtx.state == 0) && (play->pauseCtx.debugState == 0) && (msgCtx->msgMode == MSGMODE_NONE) && (play->gameOverCtx.state == GAMEOVER_INACTIVE) && - (play->sceneLoadFlag == 0) && (play->transitionMode == 0) && !Play_InCsMode(play)) { + (play->transitionTrigger == TRANS_TRIGGER_OFF) && (play->transitionMode == TRANS_MODE_OFF) && !Play_InCsMode(play)) { bool hasLens = false; for (int buttonIndex = 1; buttonIndex < (CVarGetInteger("gDpadEquips", 0) != 0) ? ARRAY_COUNT(gSaveContext.equips.buttonItems) : 4; buttonIndex++) { if (gSaveContext.equips.buttonItems[buttonIndex] == ITEM_LENS) { @@ -5788,8 +5788,8 @@ void Interface_Draw(PlayState* play) { // Trade quest timer reached 0 D_8015FFE6 = 40; gSaveContext.cutsceneIndex = 0; - play->sceneLoadFlag = 0x14; - play->fadeTransition = 3; + play->transitionTrigger = TRANS_TRIGGER_START; + play->transitionType = TRANS_TYPE_FADE_WHITE; gSaveContext.timer2State = 0; if ((gSaveContext.equips.buttonItems[0] != ITEM_SWORD_KOKIRI) && @@ -5824,8 +5824,8 @@ void Interface_Draw(PlayState* play) { if ((play->pauseCtx.state == 0) && (play->pauseCtx.debugState == 0) && (play->gameOverCtx.state == GAMEOVER_INACTIVE) && (msgCtx->msgMode == MSGMODE_NONE) && - !(player->stateFlags2 & 0x01000000) && (play->sceneLoadFlag == 0) && - (play->transitionMode == 0) && !Play_InCsMode(play) && (gSaveContext.minigameState != 1) && + !(player->stateFlags2 & 0x01000000) && (play->transitionTrigger == TRANS_TRIGGER_OFF) && + (play->transitionMode == TRANS_MODE_OFF) && !Play_InCsMode(play) && (gSaveContext.minigameState != 1) && (play->shootingGalleryStatus <= 1) && !((play->sceneNum == SCENE_BOMBCHU_BOWLING_ALLEY) && Flags_GetSwitch(play, 0x38))) { svar6 = 0; @@ -6516,8 +6516,8 @@ void Interface_Update(PlayState* play) { HealthMeter_Update(play); if ((gSaveContext.timer1State >= 3) && (play->pauseCtx.state == 0) && (play->pauseCtx.debugState == 0) && - (msgCtx->msgMode == MSGMODE_NONE) && !(player->stateFlags2 & 0x01000000) && (play->sceneLoadFlag == 0) && - (play->transitionMode == 0) && !Play_InCsMode(play)) {} + (msgCtx->msgMode == MSGMODE_NONE) && !(player->stateFlags2 & 0x01000000) && (play->transitionTrigger == TRANS_TRIGGER_OFF) && + (play->transitionMode == TRANS_MODE_OFF) && !Play_InCsMode(play)) {} if (gSaveContext.rupeeAccumulator != 0) { if (gSaveContext.rupeeAccumulator > 0) { @@ -6612,8 +6612,8 @@ void Interface_Update(PlayState* play) { WREG(7) = interfaceCtx->unk_1F4; if ((play->pauseCtx.state == 0) && (play->pauseCtx.debugState == 0) && - (msgCtx->msgMode == MSGMODE_NONE) && (play->sceneLoadFlag == 0) && - (play->gameOverCtx.state == GAMEOVER_INACTIVE) && (play->transitionMode == 0) && + (msgCtx->msgMode == MSGMODE_NONE) && (play->transitionTrigger == TRANS_TRIGGER_OFF) && + (play->gameOverCtx.state == GAMEOVER_INACTIVE) && (play->transitionMode == TRANS_MODE_OFF) && ((play->csCtx.state == CS_STATE_IDLE) || !Player_InCsMode(play))) { if ((gSaveContext.isMagicAcquired != 0) && (gSaveContext.magicLevel == 0)) { gSaveContext.magicLevel = gSaveContext.isDoubleMagicAcquired + 1; @@ -6710,19 +6710,19 @@ void Interface_Update(PlayState* play) { (interfaceCtx->restrictions.sunsSong != 3)) { if ((gSaveContext.dayTime >= 0x4555) && (gSaveContext.dayTime < 0xC001)) { gSaveContext.nextDayTime = 0; - play->fadeTransition = 4; - gSaveContext.nextTransitionType = 2; + play->transitionType = TRANS_TYPE_FADE_BLACK_FAST; + gSaveContext.nextTransitionType = TRANS_TYPE_FADE_BLACK; play->unk_11DE9 = 1; } else { gSaveContext.nextDayTime = 0x8001; - play->fadeTransition = 5; - gSaveContext.nextTransitionType = 3; + play->transitionType = TRANS_TYPE_FADE_WHITE_FAST; + gSaveContext.nextTransitionType = TRANS_TYPE_FADE_WHITE; play->unk_11DE9 = 1; } if (play->sceneNum == SCENE_HAUNTED_WASTELAND) { - play->fadeTransition = 14; - gSaveContext.nextTransitionType = 14; + play->transitionType = TRANS_TYPE_SANDSTORM_PERSIST; + gSaveContext.nextTransitionType = TRANS_TYPE_SANDSTORM_PERSIST; } gSaveContext.respawnFlag = -2; @@ -6733,7 +6733,7 @@ void Interface_Update(PlayState* play) { Grotto_ForceGrottoReturn(); } - play->sceneLoadFlag = 0x14; + play->transitionTrigger = TRANS_TRIGGER_START; gSaveContext.sunsSongState = SUNSSONG_INACTIVE; func_800F6964(30); gSaveContext.seqId = (u8)NA_BGM_DISABLED; diff --git a/soh/src/code/z_play.c b/soh/src/code/z_play.c index 59a5d0619..698a41b70 100644 --- a/soh/src/code/z_play.c +++ b/soh/src/code/z_play.c @@ -72,13 +72,14 @@ void func_800BC590(PlayState* play) { } } -void func_800BC5E0(PlayState* play, s32 transitionType) { +void Gameplay_SetupTransition(PlayState* play, s32 transitionType) { TransitionContext* transitionCtx = &play->transitionCtx; memset(transitionCtx,0, sizeof(TransitionContext)); transitionCtx->transitionType = transitionType; + // Circle Transition Types if ((transitionCtx->transitionType >> 5) == 1) { transitionCtx->init = TransitionCircle_Init; transitionCtx->destroy = TransitionCircle_Destroy; @@ -91,7 +92,7 @@ void func_800BC5E0(PlayState* play, s32 transitionType) { transitionCtx->setEnvColor = TransitionCircle_SetEnvColor; } else { switch (transitionCtx->transitionType) { - case 1: + case TRANS_TYPE_TRIFORCE: transitionCtx->init = TransitionTriforce_Init; transitionCtx->destroy = TransitionTriforce_Destroy; transitionCtx->start = TransitionTriforce_Start; @@ -102,8 +103,8 @@ void func_800BC5E0(PlayState* play, s32 transitionType) { transitionCtx->setColor = TransitionTriforce_SetColor; transitionCtx->setEnvColor = NULL; break; - case 0: - case 8: + case TRANS_TYPE_WIPE: + case TRANS_TYPE_WIPE_FAST: transitionCtx->init = TransitionWipe_Init; transitionCtx->destroy = TransitionWipe_Destroy; transitionCtx->start = TransitionWipe_Start; @@ -114,16 +115,16 @@ void func_800BC5E0(PlayState* play, s32 transitionType) { transitionCtx->setColor = TransitionWipe_SetColor; transitionCtx->setEnvColor = NULL; break; - case 2: - case 3: - case 4: - case 5: - case 6: - case 7: - case 13: - case 17: - case 18: - case 19: + case TRANS_TYPE_FADE_BLACK: + case TRANS_TYPE_FADE_WHITE: + case TRANS_TYPE_FADE_BLACK_FAST: + case TRANS_TYPE_FADE_WHITE_FAST: + case TRANS_TYPE_FADE_BLACK_SLOW: + case TRANS_TYPE_FADE_WHITE_SLOW: + case TRANS_TYPE_FADE_WHITE_CS_DELAYED: + case TRANS_TYPE_FADE_WHITE_INSTANT: + case TRANS_TYPE_FADE_GREEN: + case TRANS_TYPE_FADE_BLUE: transitionCtx->init = TransitionFade_Init; transitionCtx->destroy = TransitionFade_Destroy; transitionCtx->start = TransitionFade_Start; @@ -134,24 +135,24 @@ void func_800BC5E0(PlayState* play, s32 transitionType) { transitionCtx->setColor = TransitionFade_SetColor; transitionCtx->setEnvColor = NULL; break; - case 9: - case 10: - play->transitionMode = 4; + case TRANS_TYPE_FILL_WHITE2: + case TRANS_TYPE_FILL_WHITE: + play->transitionMode = TRANS_MODE_FILL_WHITE_INIT; break; - case 11: - play->transitionMode = 10; + case TRANS_TYPE_INSTANT: + play->transitionMode = TRANS_MODE_INSTANT; break; - case 12: - play->transitionMode = 7; + case TRANS_TYPE_FILL_BROWN: + play->transitionMode = TRANS_MODE_FILL_BROWN_INIT; break; - case 14: - play->transitionMode = 12; + case TRANS_TYPE_SANDSTORM_PERSIST: + play->transitionMode = TRANS_MODE_SANDSTORM_INIT; break; - case 15: - play->transitionMode = 14; + case TRANS_TYPE_SANDSTORM_END: + play->transitionMode = TRANS_MODE_SANDSTORM_END_INIT; break; - case 16: - play->transitionMode = 16; + case TRANS_TYPE_CS_BLACK_FILL: + play->transitionMode = TRANS_MODE_CS_BLACK_FILL_INIT; break; default: Fault_AddHungupAndCrash(__FILE__, __LINE__); @@ -200,10 +201,10 @@ void Play_Destroy(GameState* thisx) { gTrnsnUnkState = 0; } - if (play->transitionMode == 3) { + if (play->transitionMode == TRANS_MODE_INSTANCE_RUNNING) { play->transitionCtx.destroy(&play->transitionCtx.data); func_800BC88C(play); - play->transitionMode = 0; + play->transitionMode = TRANS_MODE_OFF; } ShrinkWindow_Destroy(); @@ -229,7 +230,7 @@ void GivePlayerRandoRewardSongOfTime(PlayState* play, RandomizerCheck check) { Player* player = GET_PLAYER(play); if (gSaveContext.entranceIndex == 0x050F && player != NULL && !Player_InBlockingCsMode(play, player) && - !Flags_GetTreasure(play, 0x1F) && gSaveContext.nextTransitionType == 0xFF && !gSaveContext.pendingIceTrapCount) { + !Flags_GetTreasure(play, 0x1F) && gSaveContext.nextTransitionType == TRANS_NEXT_TYPE_DEFAULT && !gSaveContext.pendingIceTrapCount) { GetItemEntry getItemEntry = Randomizer_GetItemFromKnownCheck(check, RG_SONG_OF_TIME); GiveItemEntryWithoutActor(play, getItemEntry); player->pendingFlag.flagID = 0x1F; @@ -442,7 +443,7 @@ void GivePlayerRandoRewardZeldaLightArrowsGift(PlayState* play, RandomizerCheck if (meetsRequirements && LINK_IS_ADULT && (gEntranceTable[((void)0, gSaveContext.entranceIndex)].scene == SCENE_TEMPLE_OF_TIME) && !Flags_GetTreasure(play, 0x1E) && player != NULL && !Player_InBlockingCsMode(play, player) && - play->sceneLoadFlag == 0) { + play->transitionTrigger == TRANS_TRIGGER_OFF) { GetItemEntry getItem = Randomizer_GetItemFromKnownCheck(check, GI_ARROW_LIGHT); if (GiveItemEntryWithoutActor(play, getItem)) { player->pendingFlag.flagID = 0x1E; @@ -624,12 +625,12 @@ void Play_Init(GameState* thisx) { PreRender_SetValuesSave(&play->pauseBgPreRender, SCREEN_WIDTH, SCREEN_HEIGHT, 0, 0, 0); PreRender_SetValues(&play->pauseBgPreRender, SCREEN_WIDTH, SCREEN_HEIGHT, 0, 0); gTrnsnUnkState = 0; - play->transitionMode = 0; + play->transitionMode = TRANS_MODE_OFF; if (CVarGetInteger("gSceneTransitions", 255)!= 255){ play->transitionMode = CVarGetInteger("gSceneTransitions", 0); gSaveContext.nextTransitionType = CVarGetInteger("gSceneTransitions", 0); - play->fadeTransition = CVarGetInteger("gSceneTransitions", 0); + play->transitionType = CVarGetInteger("gSceneTransitions", 0); } FrameAdvance_Init(&play->frameAdvCtx); @@ -637,21 +638,21 @@ void Play_Init(GameState* thisx) { Matrix_Init(&play->state); play->state.main = Play_Main; play->state.destroy = Play_Destroy; - play->sceneLoadFlag = -0x14; + play->transitionTrigger = TRANS_TRIGGER_END; play->unk_11E16 = 0xFF; play->unk_11E18 = 0; play->unk_11DE9 = 0; if (gSaveContext.gameMode != 1) { - if (gSaveContext.nextTransitionType == 0xFF) { - play->fadeTransition = + if (gSaveContext.nextTransitionType == TRANS_NEXT_TYPE_DEFAULT) { + play->transitionType = (gEntranceTable[((void)0, gSaveContext.entranceIndex) + tempSetupIndex].field >> 7) & 0x7F; // Fade In } else { - play->fadeTransition = gSaveContext.nextTransitionType; - gSaveContext.nextTransitionType = 0xFF; + play->transitionType = gSaveContext.nextTransitionType; + gSaveContext.nextTransitionType = TRANS_NEXT_TYPE_DEFAULT; } } else { - play->fadeTransition = 6; + play->transitionType = TRANS_TYPE_FADE_BLACK_SLOW; } ShrinkWindow_Init(); @@ -808,8 +809,8 @@ void Play_Update(PlayState* play) { gSegments[2] = VIRTUAL_TO_PHYSICAL(play->sceneSegment); if (FrameAdvance_Update(&play->frameAdvCtx, &input[1])) { - if ((play->transitionMode == 0) && (play->sceneLoadFlag != 0)) { - play->transitionMode = 1; + if ((play->transitionMode == TRANS_MODE_OFF) && (play->transitionTrigger != TRANS_TRIGGER_OFF)) { + play->transitionMode = TRANS_MODE_SETUP; } // Gameplay stats: Count button presses @@ -858,8 +859,8 @@ void Play_Update(PlayState* play) { if (play->transitionMode) { switch (play->transitionMode) { - case 1: - if (play->sceneLoadFlag != -0x14) { + case TRANS_MODE_SETUP: + if (play->transitionTrigger != TRANS_TRIGGER_END) { s16 sp6E = 0; Interface_ChangeAlpha(1); @@ -870,7 +871,7 @@ void Play_Update(PlayState* play) { if (!(gEntranceTable[play->nextEntranceIndex + sp6E].field & 0x8000)) { // Continue BGM Off // "Sound initalized. 111" osSyncPrintf("\n\n\nサウンドイニシャル来ました。111"); - if ((play->fadeTransition < 56) && !Environment_IsForcedSequenceDisabled()) { + if ((play->transitionType < TRANS_TYPE_MAX) && !Environment_IsForcedSequenceDisabled()) { // "Sound initalized. 222" osSyncPrintf("\n\n\nサウンドイニシャル来ました。222"); func_800F6964(0x14); @@ -880,58 +881,59 @@ void Play_Update(PlayState* play) { } } - if (CREG(11) == 0) { - func_800BC5E0(play, play->fadeTransition); + if (!R_TRANS_DBG_ENABLED) { + Gameplay_SetupTransition(play, play->transitionType); } else { - func_800BC5E0(play, CREG(12)); + Gameplay_SetupTransition(play, R_TRANS_DBG_TYPE); } - if (play->transitionMode >= 4) { + if (play->transitionMode >= TRANS_MODE_FILL_WHITE_INIT) { break; } - case 2: + case TRANS_MODE_INSTANCE_INIT: play->transitionCtx.init(&play->transitionCtx.data); + // Circle Transition Types if ((play->transitionCtx.transitionType >> 5) == 1) { play->transitionCtx.setType(&play->transitionCtx.data, - play->transitionCtx.transitionType | 0x80); + play->transitionCtx.transitionType | TC_SET_PARAMS); } gSaveContext.transWipeSpeed = 14; - if ((play->transitionCtx.transitionType == 8) || - (play->transitionCtx.transitionType == 9)) { + if ((play->transitionCtx.transitionType == TRANS_TYPE_WIPE_FAST) || + (play->transitionCtx.transitionType == TRANS_TYPE_FILL_WHITE2)) { gSaveContext.transWipeSpeed = 28; } gSaveContext.transFadeDuration = 60; - if ((play->transitionCtx.transitionType == 4) || - (play->transitionCtx.transitionType == 5)) { + if ((play->transitionCtx.transitionType == TRANS_TYPE_FADE_BLACK_FAST) || + (play->transitionCtx.transitionType == TRANS_TYPE_FADE_WHITE_FAST)) { gSaveContext.transFadeDuration = 20; - } else if ((play->transitionCtx.transitionType == 6) || - (play->transitionCtx.transitionType == 7)) { + } else if ((play->transitionCtx.transitionType == TRANS_TYPE_FADE_BLACK_SLOW) || + (play->transitionCtx.transitionType == TRANS_TYPE_FADE_WHITE_SLOW)) { gSaveContext.transFadeDuration = 150; - } else if (play->transitionCtx.transitionType == 17) { + } else if (play->transitionCtx.transitionType == TRANS_TYPE_FADE_WHITE_INSTANT) { gSaveContext.transFadeDuration = 2; } - if ((play->transitionCtx.transitionType == 3) || - (play->transitionCtx.transitionType == 5) || - (play->transitionCtx.transitionType == 7) || - (play->transitionCtx.transitionType == 13) || - (play->transitionCtx.transitionType == 17)) { + if ((play->transitionCtx.transitionType == TRANS_TYPE_FADE_WHITE) || + (play->transitionCtx.transitionType == TRANS_TYPE_FADE_WHITE_FAST) || + (play->transitionCtx.transitionType == TRANS_TYPE_FADE_WHITE_SLOW) || + (play->transitionCtx.transitionType == TRANS_TYPE_FADE_WHITE_CS_DELAYED) || + (play->transitionCtx.transitionType == TRANS_TYPE_FADE_WHITE_INSTANT)) { play->transitionCtx.setColor(&play->transitionCtx.data, RGBA8(160, 160, 160, 255)); if (play->transitionCtx.setEnvColor != NULL) { play->transitionCtx.setEnvColor(&play->transitionCtx.data, RGBA8(160, 160, 160, 255)); } - } else if (play->transitionCtx.transitionType == 18) { + } else if (play->transitionCtx.transitionType == TRANS_TYPE_FADE_GREEN) { play->transitionCtx.setColor(&play->transitionCtx.data, RGBA8(140, 140, 100, 255)); if (play->transitionCtx.setEnvColor != NULL) { play->transitionCtx.setEnvColor(&play->transitionCtx.data, RGBA8(140, 140, 100, 255)); } - } else if (play->transitionCtx.transitionType == 19) { + } else if (play->transitionCtx.transitionType == TRANS_TYPE_FADE_BLUE) { play->transitionCtx.setColor(&play->transitionCtx.data, RGBA8(70, 100, 110, 255)); if (play->transitionCtx.setEnvColor != NULL) { play->transitionCtx.setEnvColor(&play->transitionCtx.data, @@ -944,7 +946,7 @@ void Play_Update(PlayState* play) { } } - if (play->sceneLoadFlag == -0x14) { + if (play->transitionTrigger == TRANS_TRIGGER_END) { play->transitionCtx.setType(&play->transitionCtx.data, 1); } else { play->transitionCtx.setType(&play->transitionCtx.data, 2); @@ -952,22 +954,22 @@ void Play_Update(PlayState* play) { play->transitionCtx.start(&play->transitionCtx); - if (play->transitionCtx.transitionType == 13) { - play->transitionMode = 11; + if (play->transitionCtx.transitionType == TRANS_TYPE_FADE_WHITE_CS_DELAYED) { + play->transitionMode = TRANS_MODE_INSTANCE_WAIT; } else { - play->transitionMode = 3; + play->transitionMode = TRANS_MODE_INSTANCE_RUNNING; } break; - case 3: + case TRANS_MODE_INSTANCE_RUNNING: if (play->transitionCtx.isDone(&play->transitionCtx) != 0) { - if (play->transitionCtx.transitionType >= 56) { - if (play->sceneLoadFlag == -0x14) { + if (play->transitionCtx.transitionType >= TRANS_TYPE_MAX) { + if (play->transitionTrigger == TRANS_TRIGGER_END) { play->transitionCtx.destroy(&play->transitionCtx); func_800BC88C(play); - play->transitionMode = 0; + play->transitionMode = TRANS_MODE_OFF; } - } else if (play->sceneLoadFlag != -0x14) { + } else if (play->transitionTrigger != TRANS_TRIGGER_END) { play->state.running = 0; if (gSaveContext.gameMode != 2) { SET_NEXT_GAMESTATE(&play->state, Play_Init, PlayState); @@ -981,7 +983,7 @@ void Play_Update(PlayState* play) { } else { play->transitionCtx.destroy(&play->transitionCtx); func_800BC88C(play); - play->transitionMode = 0; + play->transitionMode = TRANS_MODE_OFF; if (gTrnsnUnkState == 3) { TransitionUnk_Destroy(&sTrnsnUnk); gTrnsnUnkState = 0; @@ -991,7 +993,7 @@ void Play_Update(PlayState* play) { // Transition end for standard transitions GameInteractor_ExecuteOnTransitionEndHooks(play->sceneNum); } - play->sceneLoadFlag = 0; + play->transitionTrigger = TRANS_TRIGGER_OFF; } else { play->transitionCtx.update(&play->transitionCtx.data, R_UPDATE_RATE); } @@ -999,104 +1001,104 @@ void Play_Update(PlayState* play) { } switch (play->transitionMode) { - case 4: + case TRANS_MODE_FILL_WHITE_INIT: D_801614C8 = 0; play->envCtx.fillScreen = true; play->envCtx.screenFillColor[0] = 160; play->envCtx.screenFillColor[1] = 160; play->envCtx.screenFillColor[2] = 160; - if (play->sceneLoadFlag != -0x14) { + if (play->transitionTrigger != TRANS_TRIGGER_END) { play->envCtx.screenFillColor[3] = 0; - play->transitionMode = 5; + play->transitionMode = TRANS_MODE_FILL_IN; } else { play->envCtx.screenFillColor[3] = 255; - play->transitionMode = 6; + play->transitionMode = TRANS_MODE_FILL_OUT; } break; - case 5: + case TRANS_MODE_FILL_IN: play->envCtx.screenFillColor[3] = (D_801614C8 / 20.0f) * 255.0f; if (D_801614C8 >= 20 && 1) { play->state.running = 0; SET_NEXT_GAMESTATE(&play->state, Play_Init, PlayState); gSaveContext.entranceIndex = play->nextEntranceIndex; - play->sceneLoadFlag = 0; - play->transitionMode = 0; + play->transitionTrigger = TRANS_TRIGGER_OFF; + play->transitionMode = TRANS_MODE_OFF; } else { D_801614C8++; } break; - case 6: + case TRANS_MODE_FILL_OUT: play->envCtx.screenFillColor[3] = (1 - D_801614C8 / 20.0f) * 255.0f; if (D_801614C8 >= 20 && 1) { gTrnsnUnkState = 0; R_UPDATE_RATE = 3; - play->sceneLoadFlag = 0; - play->transitionMode = 0; + play->transitionTrigger = TRANS_TRIGGER_OFF; + play->transitionMode = TRANS_MODE_OFF; play->envCtx.fillScreen = false; } else { D_801614C8++; } break; - case 7: + case TRANS_MODE_FILL_BROWN_INIT: D_801614C8 = 0; play->envCtx.fillScreen = true; play->envCtx.screenFillColor[0] = 170; play->envCtx.screenFillColor[1] = 160; play->envCtx.screenFillColor[2] = 150; - if (play->sceneLoadFlag != -0x14) { + if (play->transitionTrigger != TRANS_TRIGGER_END) { play->envCtx.screenFillColor[3] = 0; - play->transitionMode = 5; + play->transitionMode = TRANS_MODE_FILL_IN; } else { play->envCtx.screenFillColor[3] = 255; - play->transitionMode = 6; + play->transitionMode = TRANS_MODE_FILL_OUT; } break; - case 10: - if (play->sceneLoadFlag != -0x14) { + case TRANS_MODE_INSTANT: + if (play->transitionTrigger != TRANS_TRIGGER_END) { play->state.running = 0; SET_NEXT_GAMESTATE(&play->state, Play_Init, PlayState); gSaveContext.entranceIndex = play->nextEntranceIndex; - play->sceneLoadFlag = 0; - play->transitionMode = 0; + play->transitionTrigger = TRANS_TRIGGER_OFF; + play->transitionMode = TRANS_MODE_OFF; } else { gTrnsnUnkState = 0; R_UPDATE_RATE = 3; - play->sceneLoadFlag = 0; - play->transitionMode = 0; + play->transitionTrigger = TRANS_TRIGGER_OFF; + play->transitionMode = TRANS_MODE_OFF; } break; - case 11: + case TRANS_MODE_INSTANCE_WAIT: if (gSaveContext.cutsceneTransitionControl != 0) { - play->transitionMode = 3; + play->transitionMode = TRANS_MODE_INSTANCE_RUNNING; } break; - case 12: - if (play->sceneLoadFlag != -0x14) { - play->envCtx.sandstormState = 1; - play->transitionMode = 13; + case TRANS_MODE_SANDSTORM_INIT: + if (play->transitionTrigger != TRANS_TRIGGER_END) { + play->envCtx.sandstormState = SANDSTORM_FILL; + play->transitionMode = TRANS_MODE_SANDSTORM; } else { - play->envCtx.sandstormState = 2; + play->envCtx.sandstormState = SANDSTORM_UNFILL; play->envCtx.sandstormPrimA = 255; play->envCtx.sandstormEnvA = 255; - play->transitionMode = 13; + play->transitionMode = TRANS_MODE_SANDSTORM; } break; - case 13: + case TRANS_MODE_SANDSTORM: Audio_PlaySoundGeneral(NA_SE_EV_SAND_STORM - SFX_FLAG, &D_801333D4, 4, &D_801333E0, &D_801333E0, &D_801333E8); - if (play->sceneLoadFlag == -0x14) { + if (play->transitionTrigger == TRANS_TRIGGER_END) { if (play->envCtx.sandstormPrimA < 110) { gTrnsnUnkState = 0; R_UPDATE_RATE = 3; - play->sceneLoadFlag = 0; - play->transitionMode = 0; + play->transitionTrigger = TRANS_TRIGGER_OFF; + play->transitionMode = TRANS_MODE_OFF; // Transition end for sandstorm effect (delayed until effect is finished) GameInteractor_ExecuteOnTransitionEndHooks(play->sceneNum); @@ -1106,34 +1108,34 @@ void Play_Update(PlayState* play) { play->state.running = 0; SET_NEXT_GAMESTATE(&play->state, Play_Init, PlayState); gSaveContext.entranceIndex = play->nextEntranceIndex; - play->sceneLoadFlag = 0; - play->transitionMode = 0; + play->transitionTrigger = TRANS_TRIGGER_OFF; + play->transitionMode = TRANS_MODE_OFF; } } break; - case 14: - if (play->sceneLoadFlag == -0x14) { - play->envCtx.sandstormState = 4; + case TRANS_MODE_SANDSTORM_END_INIT: + if (play->transitionTrigger == TRANS_TRIGGER_END) { + play->envCtx.sandstormState = SANDSTORM_DISSIPATE; play->envCtx.sandstormPrimA = 255; play->envCtx.sandstormEnvA = 255; // "It's here!!!!!!!!!" LOG_STRING("来た!!!!!!!!!!!!!!!!!!!!!"); - play->transitionMode = 15; + play->transitionMode = TRANS_MODE_SANDSTORM_END; } else { - play->transitionMode = 12; + play->transitionMode = TRANS_MODE_SANDSTORM_INIT; } break; - case 15: + case TRANS_MODE_SANDSTORM_END: Audio_PlaySoundGeneral(NA_SE_EV_SAND_STORM - SFX_FLAG, &D_801333D4, 4, &D_801333E0, &D_801333E0, &D_801333E8); - if (play->sceneLoadFlag == -0x14) { + if (play->transitionTrigger == TRANS_TRIGGER_END) { if (play->envCtx.sandstormPrimA <= 0) { gTrnsnUnkState = 0; R_UPDATE_RATE = 3; - play->sceneLoadFlag = 0; - play->transitionMode = 0; + play->transitionTrigger = TRANS_TRIGGER_OFF; + play->transitionMode = TRANS_MODE_OFF; // Transition end for sandstorm effect (delayed until effect is finished) GameInteractor_ExecuteOnTransitionEndHooks(play->sceneNum); @@ -1141,24 +1143,24 @@ void Play_Update(PlayState* play) { } break; - case 16: + case TRANS_MODE_CS_BLACK_FILL_INIT: D_801614C8 = 0; play->envCtx.fillScreen = true; play->envCtx.screenFillColor[0] = 0; play->envCtx.screenFillColor[1] = 0; play->envCtx.screenFillColor[2] = 0; play->envCtx.screenFillColor[3] = 255; - play->transitionMode = 17; + play->transitionMode = TRANS_MODE_CS_BLACK_FILL; break; - case 17: + case TRANS_MODE_CS_BLACK_FILL: if (gSaveContext.cutsceneTransitionControl != 0) { play->envCtx.screenFillColor[3] = gSaveContext.cutsceneTransitionControl; if (gSaveContext.cutsceneTransitionControl < 0x65) { gTrnsnUnkState = 0; R_UPDATE_RATE = 3; - play->sceneLoadFlag = 0; - play->transitionMode = 0; + play->transitionTrigger = TRANS_TRIGGER_OFF; + play->transitionMode = TRANS_MODE_OFF; } } break; @@ -1546,8 +1548,8 @@ void Play_Draw(PlayState* play) { gSPDisplayList(OVERLAY_DISP++, gfxP); gSPGrayscale(gfxP++, false); - if ((play->transitionMode == 3) || (play->transitionMode == 11) || - (play->transitionCtx.transitionType >= 56)) { + if ((play->transitionMode == TRANS_MODE_INSTANCE_RUNNING) || (play->transitionMode == TRANS_MODE_INSTANCE_WAIT) || + (play->transitionCtx.transitionType >= TRANS_TYPE_MAX)) { View view; View_Init(&view, gfxCtx); @@ -1709,7 +1711,7 @@ void Play_Draw(PlayState* play) { } if ((HREG(80) != 10) || (HREG(88) != 0)) { - if (play->envCtx.sandstormState != 0) { + if (play->envCtx.sandstormState != SANDSTORM_OFF) { Environment_DrawSandstorm(play, play->envCtx.sandstormState); } } @@ -2253,14 +2255,14 @@ void Play_TriggerVoidOut(PlayState* play) { gSaveContext.respawn[RESPAWN_MODE_DOWN].tempSwchFlags = play->actorCtx.flags.tempSwch; gSaveContext.respawn[RESPAWN_MODE_DOWN].tempCollectFlags = play->actorCtx.flags.tempCollect; gSaveContext.respawnFlag = 1; - play->sceneLoadFlag = 0x14; + play->transitionTrigger = TRANS_TRIGGER_START; play->nextEntranceIndex = gSaveContext.respawn[RESPAWN_MODE_DOWN].entranceIndex; - play->fadeTransition = 2; + play->transitionType = TRANS_TYPE_FADE_BLACK; } void Play_LoadToLastEntrance(PlayState* play) { gSaveContext.respawnFlag = -1; - play->sceneLoadFlag = 0x14; + play->transitionTrigger = TRANS_TRIGGER_START; if ((play->sceneNum == SCENE_GANONS_TOWER_COLLAPSE_INTERIOR) || (play->sceneNum == SCENE_GANONS_TOWER_COLLAPSE_EXTERIOR) || (play->sceneNum == SCENE_INSIDE_GANONS_CASTLE_COLLAPSE) || (play->sceneNum == SCENE_GANON_BOSS)) { @@ -2273,7 +2275,7 @@ void Play_LoadToLastEntrance(PlayState* play) { play->nextEntranceIndex = gSaveContext.entranceIndex; } - play->fadeTransition = 2; + play->transitionType = TRANS_TYPE_FADE_BLACK; } void Play_TriggerRespawn(PlayState* play) { diff --git a/soh/src/code/z_player_lib.c b/soh/src/code/z_player_lib.c index 820f2c672..99df3a456 100644 --- a/soh/src/code/z_player_lib.c +++ b/soh/src/code/z_player_lib.c @@ -573,7 +573,7 @@ uint8_t Player_IsCustomLinkModel() { } s32 Player_InBlockingCsMode(PlayState* play, Player* this) { - return (this->stateFlags1 & 0x20000080) || (this->csMode != 0) || (play->sceneLoadFlag == 0x14) || + return (this->stateFlags1 & 0x20000080) || (this->csMode != 0) || (play->transitionTrigger == TRANS_TRIGGER_START) || (this->stateFlags1 & 1) || (this->stateFlags3 & 0x80) || ((gSaveContext.magicState != MAGIC_STATE_IDLE) && (Player_ActionToMagicSpell(this, this->itemAction) >= 0)); } diff --git a/soh/src/code/z_scene_table.c b/soh/src/code/z_scene_table.c index 52136e6a9..1d991e8c0 100644 --- a/soh/src/code/z_scene_table.c +++ b/soh/src/code/z_scene_table.c @@ -875,7 +875,7 @@ void func_800994A0(PlayState* play) { } } - play->fadeTransition = gEntranceTable[computedEntranceIndex].field & 0x7F; // Fade out + play->transitionType = gEntranceTable[computedEntranceIndex].field & 0x7F; // Fade out } // Scene Draw Config 0 diff --git a/soh/src/overlays/actors/ovl_Bg_Spot00_Hanebasi/z_bg_spot00_hanebasi.c b/soh/src/overlays/actors/ovl_Bg_Spot00_Hanebasi/z_bg_spot00_hanebasi.c index 8019d414e..cee95f9b7 100644 --- a/soh/src/overlays/actors/ovl_Bg_Spot00_Hanebasi/z_bg_spot00_hanebasi.c +++ b/soh/src/overlays/actors/ovl_Bg_Spot00_Hanebasi/z_bg_spot00_hanebasi.c @@ -226,8 +226,8 @@ void BgSpot00Hanebasi_Update(Actor* thisx, PlayState* play) { func_8002DF54(play, &player->actor, 8); play->nextEntranceIndex = 0x00CD; gSaveContext.nextCutsceneIndex = 0xFFF1; - play->sceneLoadFlag = 0x14; - play->fadeTransition = 4; + play->transitionTrigger = TRANS_TRIGGER_START; + play->transitionType = TRANS_TYPE_FADE_BLACK_FAST; } else if (Actor_IsFacingAndNearPlayer(&this->dyna.actor, 3000.0f, 0x7530)) { play->envCtx.gloomySkyMode = 1; } diff --git a/soh/src/overlays/actors/ovl_Boss_Ganon/z_boss_ganon.c b/soh/src/overlays/actors/ovl_Boss_Ganon/z_boss_ganon.c index 6b8d2df5c..6a7a5a232 100644 --- a/soh/src/overlays/actors/ovl_Boss_Ganon/z_boss_ganon.c +++ b/soh/src/overlays/actors/ovl_Boss_Ganon/z_boss_ganon.c @@ -1538,7 +1538,7 @@ void BossGanon_DeathAndTowerCutscene(BossGanon* this, PlayState* play) { } if (this->csTimer == 180) { - play->sceneLoadFlag = 0x14; + play->transitionTrigger = TRANS_TRIGGER_START; if ((IS_RANDO && Randomizer_GetSettingValue(RSK_SKIP_TOWER_ESCAPE) || IS_BOSS_RUSH)) { Flags_SetEventChkInf(EVENTCHKINF_WATCHED_GANONS_CASTLE_COLLAPSE_CAUGHT_BY_GERUDO); play->nextEntranceIndex = 0x517; @@ -1546,7 +1546,7 @@ void BossGanon_DeathAndTowerCutscene(BossGanon* this, PlayState* play) { else { play->nextEntranceIndex = 0x43F; } - play->fadeTransition = 5; + play->transitionType = TRANS_TYPE_FADE_WHITE_FAST; } break; diff --git a/soh/src/overlays/actors/ovl_Boss_Ganon2/z_boss_ganon2.c b/soh/src/overlays/actors/ovl_Boss_Ganon2/z_boss_ganon2.c index cb00dbee8..6c3949418 100644 --- a/soh/src/overlays/actors/ovl_Boss_Ganon2/z_boss_ganon2.c +++ b/soh/src/overlays/actors/ovl_Boss_Ganon2/z_boss_ganon2.c @@ -1858,8 +1858,8 @@ void func_8090120C(BossGanon2* this, PlayState* play) { case 20: play->nextEntranceIndex = 0x6B; gSaveContext.nextCutsceneIndex = 0xFFF2; - play->sceneLoadFlag = 0x14; - play->fadeTransition = 3; + play->transitionTrigger = TRANS_TRIGGER_START; + play->transitionType = TRANS_TYPE_FADE_WHITE; play->linkAgeOnLoad = 1; break; } diff --git a/soh/src/overlays/actors/ovl_Demo_Im/z_demo_im.c b/soh/src/overlays/actors/ovl_Demo_Im/z_demo_im.c index c72fdc4fd..9111db025 100644 --- a/soh/src/overlays/actors/ovl_Demo_Im/z_demo_im.c +++ b/soh/src/overlays/actors/ovl_Demo_Im/z_demo_im.c @@ -873,8 +873,8 @@ void func_80986B2C(PlayState* play) { } else { play->nextEntranceIndex = 0xCD; } - play->fadeTransition = 38; - play->sceneLoadFlag = 0x14; + play->transitionType = TRANS_TYPE_CIRCLE(TCA_STARBURST, TCC_BLACK, TCS_FAST); + play->transitionTrigger = TRANS_TRIGGER_START; func_8002DF54(play, &player->actor, 8); } } @@ -913,9 +913,9 @@ void GivePlayerRandoRewardImpa(Actor* impa, PlayState* play, RandomizerCheck che GiveItemEntryFromActor(impa, play, getItemEntry, 75.0f, 50.0f); } else if (!Player_InBlockingCsMode(play, GET_PLAYER(play))) { Flags_SetEventChkInf(EVENTCHKINF_LEARNED_ZELDAS_LULLABY); - play->sceneLoadFlag = 0x14; - play->fadeTransition = 3; - gSaveContext.nextTransitionType = 3; + play->transitionTrigger = TRANS_TRIGGER_START; + play->transitionType = TRANS_TYPE_FADE_WHITE; + gSaveContext.nextTransitionType = TRANS_TYPE_FADE_WHITE; // In entrance rando have impa bring link back to the front of castle grounds if (Randomizer_GetSettingValue(RSK_SHUFFLE_OVERWORLD_ENTRANCES)) { play->nextEntranceIndex = 0x0138; diff --git a/soh/src/overlays/actors/ovl_Door_Ana/z_door_ana.c b/soh/src/overlays/actors/ovl_Door_Ana/z_door_ana.c index d5d5f7ea1..8cb0f0cde 100644 --- a/soh/src/overlays/actors/ovl_Door_Ana/z_door_ana.c +++ b/soh/src/overlays/actors/ovl_Door_Ana/z_door_ana.c @@ -133,7 +133,7 @@ void DoorAna_WaitOpen(DoorAna* this, PlayState* play) { player = GET_PLAYER(play); if (Math_StepToF(&this->actor.scale.x, 0.01f, 0.001f)) { - if ((this->actor.targetMode != 0) && (play->sceneLoadFlag == 0) && (player->stateFlags1 & 0x80000000) && + if ((this->actor.targetMode != 0) && (play->transitionTrigger == TRANS_TRIGGER_OFF) && (player->stateFlags1 & 0x80000000) && (player->unk_84F == 0)) { destinationIdx = ((this->actor.params >> 0xC) & 7) - 1; Play_SetupRespawnPoint(play, RESPAWN_MODE_RETURN, 0x4FF); diff --git a/soh/src/overlays/actors/ovl_Door_Warp1/z_door_warp1.c b/soh/src/overlays/actors/ovl_Door_Warp1/z_door_warp1.c index 5940f8c03..b260b57c9 100644 --- a/soh/src/overlays/actors/ovl_Door_Warp1/z_door_warp1.c +++ b/soh/src/overlays/actors/ovl_Door_Warp1/z_door_warp1.c @@ -567,7 +567,7 @@ void DoorWarp1_ChildWarpOut(DoorWarp1* this, PlayState* play) { this->warpTimer++; if (sWarpTimerTarget < this->warpTimer && gSaveContext.nextCutsceneIndex == 0xFFEF) { - osSyncPrintf("\n\n\nじかんがきたからおーしまい fade_direction=[%d]", play->sceneLoadFlag, 0x14); + osSyncPrintf("\n\n\nじかんがきたからおーしまい fade_direction=[%d]", play->transitionTrigger, TRANS_TRIGGER_START); if (play->sceneNum == SCENE_DODONGOS_CAVERN_BOSS) { if (!Flags_GetEventChkInf(EVENTCHKINF_USED_DODONGOS_CAVERN_BLUE_WARP)) { @@ -615,9 +615,9 @@ void DoorWarp1_ChildWarpOut(DoorWarp1* this, PlayState* play) { } osSyncPrintf("\n\n\nおわりおわり"); - play->sceneLoadFlag = 0x14; - play->fadeTransition = 7; - gSaveContext.nextTransitionType = 3; + play->transitionTrigger = TRANS_TRIGGER_START; + play->transitionType = TRANS_TYPE_FADE_WHITE_SLOW; + gSaveContext.nextTransitionType = TRANS_TYPE_FADE_WHITE; } Math_StepToF(&this->unk_194, 2.0f, 0.01f); @@ -721,8 +721,8 @@ void DoorWarp1_RutoWarpOut(DoorWarp1* this, PlayState* play) { Entrance_OverrideBlueWarp(); } - play->sceneLoadFlag = 0x14; - play->fadeTransition = 7; + play->transitionTrigger = TRANS_TRIGGER_START; + play->transitionType = TRANS_TYPE_FADE_WHITE_SLOW; } Math_StepToF(&this->unk_194, 2.0f, 0.01f); @@ -946,9 +946,9 @@ void DoorWarp1_AdultWarpOut(DoorWarp1* this, PlayState* play) { Entrance_OverrideBlueWarp(); } - play->sceneLoadFlag = 0x14; - play->fadeTransition = 3; - gSaveContext.nextTransitionType = 7; + play->transitionTrigger = TRANS_TRIGGER_START; + play->transitionType = TRANS_TYPE_FADE_WHITE; + gSaveContext.nextTransitionType = TRANS_TYPE_FADE_WHITE_SLOW; } if (this->warpTimer >= 141) { f32 screenFillAlpha; diff --git a/soh/src/overlays/actors/ovl_En_Eg/z_en_eg.c b/soh/src/overlays/actors/ovl_En_Eg/z_en_eg.c index 612e2e698..69121bb3e 100644 --- a/soh/src/overlays/actors/ovl_En_Eg/z_en_eg.c +++ b/soh/src/overlays/actors/ovl_En_Eg/z_en_eg.c @@ -55,7 +55,7 @@ void func_809FFDC8(EnEg* this, PlayState* play) { Play_TriggerRespawn(play); gSaveContext.respawnFlag = -2; Audio_QueueSeqCmd(SEQ_PLAYER_BGM_MAIN << 24 | NA_BGM_STOP); - play->fadeTransition = 2; + play->transitionType = TRANS_TYPE_FADE_BLACK; EnEg_PlayVoidOutSFX(); voided = true; } diff --git a/soh/src/overlays/actors/ovl_En_Ge1/z_en_ge1.c b/soh/src/overlays/actors/ovl_En_Ge1/z_en_ge1.c index 813ed9373..5e3341260 100644 --- a/soh/src/overlays/actors/ovl_En_Ge1/z_en_ge1.c +++ b/soh/src/overlays/actors/ovl_En_Ge1/z_en_ge1.c @@ -273,8 +273,8 @@ void EnGe1_KickPlayer(EnGe1* this, PlayState* play) { Entrance_OverrideGeurdoGuardCapture(); } - play->fadeTransition = 0x26; - play->sceneLoadFlag = 0x14; + play->transitionType = TRANS_TYPE_CIRCLE(TCA_STARBURST, TCC_BLACK, TCS_FAST); + play->transitionTrigger = TRANS_TRIGGER_START; } } @@ -656,8 +656,8 @@ void EnGe1_BeginGame_Archery(EnGe1* this, PlayState* play) { Rupees_ChangeBy(-20); play->nextEntranceIndex = 0x129; gSaveContext.nextCutsceneIndex = 0xFFF0; - play->fadeTransition = 0x26; - play->sceneLoadFlag = 0x14; + play->transitionType = TRANS_TYPE_CIRCLE(TCA_STARBURST, TCC_BLACK, TCS_FAST); + play->transitionTrigger = TRANS_TRIGGER_START; gSaveContext.eventInf[0] |= 0x100; Flags_SetEventChkInf(EVENTCHKINF_PLAYED_HORSEBACK_ARCHERY); diff --git a/soh/src/overlays/actors/ovl_En_Ge2/z_en_ge2.c b/soh/src/overlays/actors/ovl_En_Ge2/z_en_ge2.c index eba22b432..b59d8b8bc 100644 --- a/soh/src/overlays/actors/ovl_En_Ge2/z_en_ge2.c +++ b/soh/src/overlays/actors/ovl_En_Ge2/z_en_ge2.c @@ -263,8 +263,8 @@ void EnGe2_CaptureClose(EnGe2* this, PlayState* play) { Entrance_OverrideGeurdoGuardCapture(); } - play->fadeTransition = 0x26; - play->sceneLoadFlag = 0x14; + play->transitionType = TRANS_TYPE_CIRCLE(TCA_STARBURST, TCC_BLACK, TCS_FAST); + play->transitionTrigger = TRANS_TRIGGER_START; } } @@ -293,8 +293,8 @@ void EnGe2_CaptureCharge(EnGe2* this, PlayState* play) { Entrance_OverrideGeurdoGuardCapture(); } - play->fadeTransition = 0x26; - play->sceneLoadFlag = 0x14; + play->transitionType = TRANS_TYPE_CIRCLE(TCA_STARBURST, TCC_BLACK, TCS_FAST); + play->transitionTrigger = TRANS_TRIGGER_START; } } diff --git a/soh/src/overlays/actors/ovl_En_GeldB/z_en_geldb.c b/soh/src/overlays/actors/ovl_En_GeldB/z_en_geldb.c index f556a6c7f..757d0b68c 100644 --- a/soh/src/overlays/actors/ovl_En_GeldB/z_en_geldb.c +++ b/soh/src/overlays/actors/ovl_En_GeldB/z_en_geldb.c @@ -1579,8 +1579,8 @@ void EnGeldB_Draw(Actor* thisx, PlayState* play) { Entrance_OverrideGeurdoGuardCapture(); } - play->fadeTransition = 0x26; - play->sceneLoadFlag = 0x14; + play->transitionType = TRANS_TYPE_CIRCLE(TCA_STARBURST, TCC_BLACK, TCS_FAST); + play->transitionTrigger = TRANS_TRIGGER_START; } } } diff --git a/soh/src/overlays/actors/ovl_En_Heishi1/z_en_heishi1.c b/soh/src/overlays/actors/ovl_En_Heishi1/z_en_heishi1.c index 1b4529448..dd5105d87 100644 --- a/soh/src/overlays/actors/ovl_En_Heishi1/z_en_heishi1.c +++ b/soh/src/overlays/actors/ovl_En_Heishi1/z_en_heishi1.c @@ -367,11 +367,11 @@ void EnHeishi1_Kick(EnHeishi1* this, PlayState* play) { if (!this->loadStarted) { Flags_SetEventChkInf(EVENTCHKINF_CAUGHT_BY_CASTLE_GUARDS); play->nextEntranceIndex = 0x4FA; - play->sceneLoadFlag = 0x14; + play->transitionTrigger = TRANS_TRIGGER_START; this->loadStarted = true; sHeishi1PlayerIsCaught = false; - play->fadeTransition = 0x2E; - gSaveContext.nextTransitionType = 0x2E; + play->transitionType = TRANS_TYPE_CIRCLE(TCA_STARBURST, TCC_WHITE, TCS_FAST); + gSaveContext.nextTransitionType = TRANS_TYPE_CIRCLE(TCA_STARBURST, TCC_WHITE, TCS_FAST); } } } diff --git a/soh/src/overlays/actors/ovl_En_Heishi3/z_en_heishi3.c b/soh/src/overlays/actors/ovl_En_Heishi3/z_en_heishi3.c index 1ffae3633..ab4027796 100644 --- a/soh/src/overlays/actors/ovl_En_Heishi3/z_en_heishi3.c +++ b/soh/src/overlays/actors/ovl_En_Heishi3/z_en_heishi3.c @@ -207,10 +207,10 @@ void func_80A55D00(EnHeishi3* this, PlayState* play) { (this->respawnFlag == 0)) { Flags_SetEventChkInf(EVENTCHKINF_CAUGHT_BY_CASTLE_GUARDS); play->nextEntranceIndex = 0x47E; // Hyrule Castle from Guard Capture (outside) - play->sceneLoadFlag = 0x14; + play->transitionTrigger = TRANS_TRIGGER_START; this->respawnFlag = 1; - play->fadeTransition = 0x2E; - gSaveContext.nextTransitionType = 0x2E; + play->transitionType = TRANS_TYPE_CIRCLE(TCA_STARBURST, TCC_WHITE, TCS_FAST); + gSaveContext.nextTransitionType = TRANS_TYPE_CIRCLE(TCA_STARBURST, TCC_WHITE, TCS_FAST); } } diff --git a/soh/src/overlays/actors/ovl_En_Heishi4/z_en_heishi4.c b/soh/src/overlays/actors/ovl_En_Heishi4/z_en_heishi4.c index bab56427d..eb6e47ebe 100644 --- a/soh/src/overlays/actors/ovl_En_Heishi4/z_en_heishi4.c +++ b/soh/src/overlays/actors/ovl_En_Heishi4/z_en_heishi4.c @@ -362,9 +362,9 @@ void EnHeishi4_MarketSneak(EnHeishi4* this, PlayState* play) { } else { play->nextEntranceIndex = 0x00CD; // HF Near bridge (OoT cutscene entrance) to not fall in the water } - play->sceneLoadFlag = 0x14; - play->fadeTransition = 0x2E; - gSaveContext.nextTransitionType = 0x2E; + play->transitionTrigger = TRANS_TRIGGER_START; + play->transitionType = TRANS_TYPE_CIRCLE(TCA_STARBURST, TCC_WHITE, TCS_FAST); + gSaveContext.nextTransitionType = TRANS_TYPE_CIRCLE(TCA_STARBURST, TCC_WHITE, TCS_FAST); this->actionFunc = func_80A56614; break; case 1: //no diff --git a/soh/src/overlays/actors/ovl_En_Horse/z_en_horse.c b/soh/src/overlays/actors/ovl_En_Horse/z_en_horse.c index f3372f81a..4024c2004 100644 --- a/soh/src/overlays/actors/ovl_En_Horse/z_en_horse.c +++ b/soh/src/overlays/actors/ovl_En_Horse/z_en_horse.c @@ -2510,8 +2510,8 @@ void EnHorse_UpdateHorsebackArchery(EnHorse* this, PlayState* play) { if (sp20 != 1 && gSaveContext.minigameState != 3) { gSaveContext.cutsceneIndex = 0; play->nextEntranceIndex = 0x3B0; - play->sceneLoadFlag = 0x14; - play->fadeTransition = 0x20; + play->transitionTrigger = TRANS_TRIGGER_START; + play->transitionType = TRANS_TYPE_CIRCLE(TCA_NORMAL, TCC_BLACK, TCS_FAST); } } diff --git a/soh/src/overlays/actors/ovl_En_Horse_Game_Check/z_en_horse_game_check.c b/soh/src/overlays/actors/ovl_En_Horse_Game_Check/z_en_horse_game_check.c index d6f2c1c7f..179e4de75 100644 --- a/soh/src/overlays/actors/ovl_En_Horse_Game_Check/z_en_horse_game_check.c +++ b/soh/src/overlays/actors/ovl_En_Horse_Game_Check/z_en_horse_game_check.c @@ -114,22 +114,22 @@ void EnHorseGameCheck_FinishIngoRace(EnHorseGameCheckIngoRace* this, PlayState* if (gSaveContext.eventInf[0] & 0x40) { gSaveContext.eventInf[0] = (gSaveContext.eventInf[0] & ~0xF) | 6; gSaveContext.eventInf[0] = (gSaveContext.eventInf[0] & ~0x8000) | 0x8000; - play->fadeTransition = 3; + play->transitionType = TRANS_TYPE_FADE_WHITE; Environment_ForcePlaySequence(NA_BGM_INGO); } else { gSaveContext.eventInf[0] = (gSaveContext.eventInf[0] & ~0xF) | 4; gSaveContext.eventInf[0] = (gSaveContext.eventInf[0] & ~0x8000) | 0x8000; Environment_ForcePlaySequence(NA_BGM_INGO); - play->fadeTransition = 0x2E; + play->transitionType = TRANS_TYPE_CIRCLE(TCA_STARBURST, TCC_WHITE, TCS_FAST); } } else { play->nextEntranceIndex = 0x558; gSaveContext.eventInf[0] = (gSaveContext.eventInf[0] & ~0xF) | 3; - play->fadeTransition = 0x20; + play->transitionType = TRANS_TYPE_CIRCLE(TCA_NORMAL, TCC_BLACK, TCS_FAST); gSaveContext.eventInf[0] = (gSaveContext.eventInf[0] & ~0x8000) | 0x8000; } DREG(25) = 0; - play->sceneLoadFlag = 0x14; + play->transitionTrigger = TRANS_TRIGGER_START; gSaveContext.timer1State = 0; } @@ -294,22 +294,22 @@ void EnHorseGameCheck_FinishMalonRace(EnHorseGameCheckMalonRace* this, PlayState if ((this->result == MALONRACE_SUCCESS) || (this->result == MALONRACE_TIME_UP)) { gSaveContext.cutsceneIndex = 0; play->nextEntranceIndex = 0x4CE; - play->fadeTransition = 0x2E; - play->sceneLoadFlag = 0x14; + play->transitionType = TRANS_TYPE_CIRCLE(TCA_STARBURST, TCC_WHITE, TCS_FAST); + play->transitionTrigger = TRANS_TRIGGER_START; } else if (this->result == MALONRACE_FAILURE) { gSaveContext.timer1Value = 240; gSaveContext.timer1State = 0xF; gSaveContext.cutsceneIndex = 0; play->nextEntranceIndex = 0x4CE; - play->fadeTransition = 0x2E; - play->sceneLoadFlag = 0x14; + play->transitionType = TRANS_TYPE_CIRCLE(TCA_STARBURST, TCC_WHITE, TCS_FAST); + play->transitionTrigger = TRANS_TRIGGER_START; } else { // "not supported" osSyncPrintf("En_HGC_Spot20_Ta_end():対応せず\n"); gSaveContext.cutsceneIndex = 0; play->nextEntranceIndex = 0x157; - play->fadeTransition = 0x2E; - play->sceneLoadFlag = 0x14; + play->transitionType = TRANS_TYPE_CIRCLE(TCA_STARBURST, TCC_WHITE, TCS_FAST); + play->transitionTrigger = TRANS_TRIGGER_START; } } diff --git a/soh/src/overlays/actors/ovl_En_In/z_en_in.c b/soh/src/overlays/actors/ovl_En_In/z_en_in.c index 13014352a..c55d44926 100644 --- a/soh/src/overlays/actors/ovl_En_In/z_en_in.c +++ b/soh/src/overlays/actors/ovl_En_In/z_en_in.c @@ -425,15 +425,15 @@ void func_80A79AB4(EnIn* this, PlayState* play) { } } -void func_80A79BAC(EnIn* this, PlayState* play, s32 index, u32 arg3) { +void func_80A79BAC(EnIn* this, PlayState* play, s32 index, u32 transitionType) { s16 entrances[] = { 0x0558, 0x04CA, 0x0157 }; play->nextEntranceIndex = entrances[index]; if (index == 2) { gSaveContext.nextCutsceneIndex = 0xFFF0; } - play->fadeTransition = arg3; - play->sceneLoadFlag = 0x14; + play->transitionType = transitionType; + play->transitionTrigger = TRANS_TRIGGER_START; func_8002DF54(play, &this->actor, 8); Interface_ChangeAlpha(1); if (index == 0) { @@ -641,7 +641,7 @@ void func_80A7A4BC(EnIn* this, PlayState* play) { void func_80A7A4C8(EnIn* this, PlayState* play) { if (this->interactInfo.talkState == NPC_TALK_STATE_ACTION) { - func_80A79BAC(this, play, 1, 0x20); + func_80A79BAC(this, play, 1, TRANS_TYPE_CIRCLE(TCA_NORMAL, TCC_BLACK, TCS_FAST)); gSaveContext.eventInf[0] = (gSaveContext.eventInf[0] & ~0x000F) | 0x0001; gSaveContext.eventInf[0] = (gSaveContext.eventInf[0] & ~0x8000) | 0x8000; Flags_UnsetInfTable(INFTABLE_A2); @@ -655,7 +655,7 @@ void func_80A7A4C8(EnIn* this, PlayState* play) { void func_80A7A568(EnIn* this, PlayState* play) { Player* player = GET_PLAYER(play); s32 phi_a2; - s32 phi_a3; + s32 transitionType; if (!Flags_GetEventChkInf(EVENTCHKINF_RENTED_HORSE_FROM_INGO) && (player->stateFlags1 & 0x800000)) { Flags_SetInfTable(INFTABLE_AB); @@ -677,7 +677,7 @@ void func_80A7A568(EnIn* this, PlayState* play) { (gSaveContext.eventInf[0] & ~0x10) | (((EnHorse*)GET_PLAYER(play)->rideActor)->type << 4); gSaveContext.eventInf[0] = (gSaveContext.eventInf[0] & ~0xF) | 2; phi_a2 = 2; - phi_a3 = 2; + transitionType = TRANS_TYPE_FADE_BLACK; } else { Audio_PlaySoundGeneral(NA_SE_SY_FOUND, &D_801333D4, 4, &D_801333E0, &D_801333E0, &D_801333E8); if (!Flags_GetEventChkInf(EVENTCHKINF_RENTED_HORSE_FROM_INGO)) { @@ -688,9 +688,9 @@ void func_80A7A568(EnIn* this, PlayState* play) { } gSaveContext.eventInf[0] &= ~0xF; phi_a2 = 0; - phi_a3 = 0x20; + transitionType = TRANS_TYPE_CIRCLE(TCA_NORMAL, TCC_BLACK, TCS_FAST); } - func_80A79BAC(this, play, phi_a2, phi_a3); + func_80A79BAC(this, play, phi_a2, transitionType); play->msgCtx.stateTimer = 0; gSaveContext.eventInf[0] = (gSaveContext.eventInf[0] & ~0x8000) | 0x8000; play->msgCtx.msgMode = MSGMODE_TEXT_CLOSING; @@ -722,7 +722,7 @@ void func_80A7A848(EnIn* this, PlayState* play) { gSaveContext.eventInf[0] &= ~0xF; this->actionFunc = func_80A7A4C8; } else { - func_80A79BAC(this, play, 2, 0x26); + func_80A79BAC(this, play, 2, TRANS_TYPE_CIRCLE(TCA_STARBURST, TCC_BLACK, TCS_FAST)); gSaveContext.eventInf[0] = (gSaveContext.eventInf[0] & ~0xF) | 2; gSaveContext.eventInf[0] = (gSaveContext.eventInf[0] & ~0x8000) | 0x8000; play->msgCtx.stateTimer = 0; @@ -747,7 +747,7 @@ void func_80A7A940(EnIn* this, PlayState* play) { } if (this->interactInfo.talkState == NPC_TALK_STATE_ACTION) { this->actor.flags &= ~ACTOR_FLAG_WILL_TALK; - func_80A79BAC(this, play, 2, 0x26); + func_80A79BAC(this, play, 2, TRANS_TYPE_CIRCLE(TCA_STARBURST, TCC_BLACK, TCS_FAST)); gSaveContext.eventInf[0] = (gSaveContext.eventInf[0] & ~0x000F) | 0x0002; gSaveContext.eventInf[0] = (gSaveContext.eventInf[0] & ~0x8000) | 0x8000; play->msgCtx.stateTimer = 0; @@ -871,8 +871,8 @@ void func_80A7AEF0(EnIn* this, PlayState* play) { yaw = Math_Vec3f_Yaw(&pos, &player->actor.world.pos); if (ABS(yaw) > 0x4000) { play->nextEntranceIndex = 0x0476; - play->sceneLoadFlag = 0x14; - play->fadeTransition = 5; + play->transitionTrigger = TRANS_TRIGGER_START; + play->transitionType = TRANS_TYPE_FADE_WHITE_FAST; this->actionFunc = func_80A7B018; } else if (this->interactInfo.talkState == NPC_TALK_STATE_ACTION) { play->msgCtx.stateTimer = 4; @@ -896,7 +896,7 @@ void func_80A7B024(EnIn* this, PlayState* play) { Flags_SetEventChkInf(EVENTCHKINF_RENTED_HORSE_FROM_INGO); Flags_SetInfTable(INFTABLE_AB); } - func_80A79BAC(this, play, 0, 0x26); + func_80A79BAC(this, play, 0, TRANS_TYPE_CIRCLE(TCA_STARBURST, TCC_BLACK, TCS_FAST)); gSaveContext.eventInf[0] = gSaveContext.eventInf[0] & ~0xF; gSaveContext.eventInf[0] = (gSaveContext.eventInf[0] & ~0x8000) | 0x8000; play->msgCtx.stateTimer = 4; diff --git a/soh/src/overlays/actors/ovl_En_Ma1/z_en_ma1.c b/soh/src/overlays/actors/ovl_En_Ma1/z_en_ma1.c index f388d4989..a53da16c7 100644 --- a/soh/src/overlays/actors/ovl_En_Ma1/z_en_ma1.c +++ b/soh/src/overlays/actors/ovl_En_Ma1/z_en_ma1.c @@ -492,8 +492,8 @@ void func_80AA1150(EnMa1* this, PlayState* play) { if (!IS_RANDO) { play->nextEntranceIndex = 0x157; gSaveContext.nextCutsceneIndex = 0xFFF1; - play->fadeTransition = 42; - play->sceneLoadFlag = 0x14; + play->transitionType = TRANS_TYPE_CIRCLE(TCA_WAVE, TCC_WHITE, TCS_FAST); + play->transitionTrigger = TRANS_TRIGGER_START; this->actionFunc = EnMa1_DoNothing; } else { // When rando'ed, skip the cutscene, play the chime, reset some flags, diff --git a/soh/src/overlays/actors/ovl_En_Ma3/z_en_ma3.c b/soh/src/overlays/actors/ovl_En_Ma3/z_en_ma3.c index a424f8244..703154fed 100644 --- a/soh/src/overlays/actors/ovl_En_Ma3/z_en_ma3.c +++ b/soh/src/overlays/actors/ovl_En_Ma3/z_en_ma3.c @@ -117,8 +117,8 @@ s16 func_80AA2BD4(PlayState* play, Actor* thisx) { if (Message_ShouldAdvance(play)) { play->nextEntranceIndex = 0x157; gSaveContext.nextCutsceneIndex = 0xFFF0; - play->fadeTransition = 0x26; - play->sceneLoadFlag = 0x14; + play->transitionType = TRANS_TYPE_CIRCLE(TCA_STARBURST, TCC_BLACK, TCS_FAST); + play->transitionTrigger = TRANS_TRIGGER_START; gSaveContext.eventInf[0] |= 0x400; gSaveContext.timer1State = 0xF; } diff --git a/soh/src/overlays/actors/ovl_En_Mag/z_en_mag.c b/soh/src/overlays/actors/ovl_En_Mag/z_en_mag.c index 0a55661fe..adff5253e 100644 --- a/soh/src/overlays/actors/ovl_En_Mag/z_en_mag.c +++ b/soh/src/overlays/actors/ovl_En_Mag/z_en_mag.c @@ -244,15 +244,15 @@ void EnMag_UpdateMq(Actor* thisx, PlayState* play) { CHECK_BTN_ALL(play->state.input[0].press.button, BTN_A) || CHECK_BTN_ALL(play->state.input[0].press.button, BTN_B)) { - if (play->sceneLoadFlag != 20) { + if (play->transitionTrigger != TRANS_TRIGGER_START) { Audio_SetCutsceneFlag(0); Audio_PlaySoundGeneral(NA_SE_SY_PIECE_OF_HEART, &D_801333D4, 4, &D_801333E0, &D_801333E0, &D_801333E8); gSaveContext.gameMode = 2; - play->sceneLoadFlag = 20; - play->fadeTransition = 2; + play->transitionTrigger = TRANS_TRIGGER_START; + play->transitionType = TRANS_TYPE_FADE_BLACK; } this->copyrightAlphaStep = 15; @@ -404,15 +404,15 @@ void EnMag_UpdateVanilla(Actor* thisx, PlayState* play) { CHECK_BTN_ALL(play->state.input[0].press.button, BTN_A) || CHECK_BTN_ALL(play->state.input[0].press.button, BTN_B)) { - if (play->sceneLoadFlag != 20) { + if (play->transitionTrigger != TRANS_TRIGGER_START) { Audio_SetCutsceneFlag(0); Audio_PlaySoundGeneral(NA_SE_SY_PIECE_OF_HEART, &D_801333D4, 4, &D_801333E0, &D_801333E0, &D_801333E8); gSaveContext.gameMode = 2; - play->sceneLoadFlag = 20; - play->fadeTransition = 2; + play->transitionTrigger = TRANS_TRIGGER_START; + play->transitionType = TRANS_TYPE_FADE_BLACK; } this->copyrightAlphaStep = 15; diff --git a/soh/src/overlays/actors/ovl_En_Okarina_Effect/z_en_okarina_effect.c b/soh/src/overlays/actors/ovl_En_Okarina_Effect/z_en_okarina_effect.c index 07172972b..9daa4f501 100644 --- a/soh/src/overlays/actors/ovl_En_Okarina_Effect/z_en_okarina_effect.c +++ b/soh/src/overlays/actors/ovl_En_Okarina_Effect/z_en_okarina_effect.c @@ -73,7 +73,7 @@ void EnOkarinaEffect_ManageStorm(EnOkarinaEffect* this, PlayState* play) { Flags_UnsetEnv(play, 5); // clear storms env flag if (((play->pauseCtx.state == 0) && (play->gameOverCtx.state == GAMEOVER_INACTIVE) && (play->msgCtx.msgLength == 0) && (!FrameAdvance_IsEnabled(play)) && - ((play->transitionMode == 0) || (gSaveContext.gameMode != 0))) || + ((play->transitionMode == TRANS_MODE_OFF) || (gSaveContext.gameMode != 0))) || (this->timer >= 250)) { if (play->envCtx.indoors || play->envCtx.unk_1F != 1) { this->timer--; diff --git a/soh/src/overlays/actors/ovl_En_Ossan/z_en_ossan.c b/soh/src/overlays/actors/ovl_En_Ossan/z_en_ossan.c index 460c788b2..1ea46ba87 100644 --- a/soh/src/overlays/actors/ovl_En_Ossan/z_en_ossan.c +++ b/soh/src/overlays/actors/ovl_En_Ossan/z_en_ossan.c @@ -952,8 +952,8 @@ void EnOssan_State_StartConversation(EnOssan* this, PlayState* play, Player* pla } else { play->nextEntranceIndex = 0x1D1; } - play->sceneLoadFlag = 0x14; - play->fadeTransition = 0x2E; + play->transitionTrigger = TRANS_TRIGGER_START; + play->transitionType = TRANS_TYPE_CIRCLE(TCA_STARBURST, TCC_WHITE, TCS_FAST); return; } diff --git a/soh/src/overlays/actors/ovl_En_Owl/z_en_owl.c b/soh/src/overlays/actors/ovl_En_Owl/z_en_owl.c index b99c15f62..e9b997ef6 100644 --- a/soh/src/overlays/actors/ovl_En_Owl/z_en_owl.c +++ b/soh/src/overlays/actors/ovl_En_Owl/z_en_owl.c @@ -967,8 +967,8 @@ void func_80ACC00C(EnOwl* this, PlayState* play) { } else { play->nextEntranceIndex = 0x027E; } - play->sceneLoadFlag = 0x14; - play->fadeTransition = 2; + play->transitionTrigger = TRANS_TRIGGER_START; + play->transitionType = TRANS_TYPE_FADE_BLACK; break; } play->csCtx.segment = SEGMENTED_TO_VIRTUAL(gLakeHyliaOwlCs); @@ -982,8 +982,8 @@ void func_80ACC00C(EnOwl* this, PlayState* play) { } else { play->nextEntranceIndex = 0x0554; } - play->sceneLoadFlag = 0x14; - play->fadeTransition = 2; + play->transitionTrigger = TRANS_TRIGGER_START; + play->transitionType = TRANS_TYPE_FADE_BLACK; break; } play->csCtx.segment = SEGMENTED_TO_VIRTUAL(gDMTOwlCs); diff --git a/soh/src/overlays/actors/ovl_En_Syateki_Niw/z_en_syateki_niw.c b/soh/src/overlays/actors/ovl_En_Syateki_Niw/z_en_syateki_niw.c index 367831fca..7ab2d6f7b 100644 --- a/soh/src/overlays/actors/ovl_En_Syateki_Niw/z_en_syateki_niw.c +++ b/soh/src/overlays/actors/ovl_En_Syateki_Niw/z_en_syateki_niw.c @@ -468,7 +468,7 @@ void func_80B12460(EnSyatekiNiw* this, PlayState* play) { case 6: if (this->unk_25E == 1) { - play->sceneLoadFlag = 0x14; + play->transitionTrigger = TRANS_TRIGGER_START; play->nextEntranceIndex = gSaveContext.entranceIndex; play->shootingGalleryStatus = 0; player->actor.freezeTimer = 20; diff --git a/soh/src/overlays/actors/ovl_En_Ta/z_en_ta.c b/soh/src/overlays/actors/ovl_En_Ta/z_en_ta.c index 9b0dc07e2..87b200e17 100644 --- a/soh/src/overlays/actors/ovl_En_Ta/z_en_ta.c +++ b/soh/src/overlays/actors/ovl_En_Ta/z_en_ta.c @@ -672,14 +672,14 @@ void func_80B15424(EnTa* this, PlayState* play) { play->nextEntranceIndex = 0x5E4; if (gSaveContext.eventInf[0] & 0x100) { - play->fadeTransition = 46; - gSaveContext.nextTransitionType = 3; + play->transitionType = TRANS_TYPE_CIRCLE(TCA_STARBURST, TCC_WHITE, TCS_FAST); + gSaveContext.nextTransitionType = TRANS_TYPE_FADE_WHITE; } else { - play->fadeTransition = 38; - gSaveContext.nextTransitionType = 2; + play->transitionType = TRANS_TYPE_CIRCLE(TCA_STARBURST, TCC_BLACK, TCS_FAST); + gSaveContext.nextTransitionType = TRANS_TYPE_FADE_BLACK; } - play->sceneLoadFlag = 0x14; + play->transitionTrigger = TRANS_TRIGGER_START; gSaveContext.eventInf[0] |= 0x400; this->actionFunc = func_80B153D4; this->unk_2CC = 22; diff --git a/soh/src/overlays/actors/ovl_En_Zl4/z_en_zl4.c b/soh/src/overlays/actors/ovl_En_Zl4/z_en_zl4.c index 3f5412b05..56efc9c81 100644 --- a/soh/src/overlays/actors/ovl_En_Zl4/z_en_zl4.c +++ b/soh/src/overlays/actors/ovl_En_Zl4/z_en_zl4.c @@ -800,8 +800,8 @@ s32 EnZl4_CsAskName(EnZl4* this, PlayState* play) { play->msgCtx.msgMode = MSGMODE_PAUSED; play->nextEntranceIndex = 0xA0; gSaveContext.nextCutsceneIndex = 0xFFF7; - play->sceneLoadFlag = 0x14; - play->fadeTransition = 3; + play->transitionTrigger = TRANS_TRIGGER_START; + play->transitionType = TRANS_TYPE_FADE_WHITE; } break; } diff --git a/soh/src/overlays/actors/ovl_Item_Ocarina/z_item_ocarina.c b/soh/src/overlays/actors/ovl_Item_Ocarina/z_item_ocarina.c index 5cfb6b81f..eb0c4c4ce 100644 --- a/soh/src/overlays/actors/ovl_Item_Ocarina/z_item_ocarina.c +++ b/soh/src/overlays/actors/ovl_Item_Ocarina/z_item_ocarina.c @@ -173,9 +173,9 @@ void ItemOcarina_StartSoTCutscene(ItemOcarina* this, PlayState* play) { play->csCtx.segment = SEGMENTED_TO_VIRTUAL(gHyruleFieldZeldaSongOfTimeCs); gSaveContext.cutsceneTrigger = 1; } else { - play->sceneLoadFlag = 0x14; - play->fadeTransition = 3; - gSaveContext.nextTransitionType = 3; + play->transitionTrigger = TRANS_TRIGGER_START; + play->transitionType = TRANS_TYPE_FADE_WHITE; + gSaveContext.nextTransitionType = TRANS_TYPE_FADE_WHITE; play->nextEntranceIndex = 0x050F; gSaveContext.nextCutsceneIndex = 0; } diff --git a/soh/src/overlays/actors/ovl_player_actor/z_player.c b/soh/src/overlays/actors/ovl_player_actor/z_player.c index 497935a69..14cbac00f 100644 --- a/soh/src/overlays/actors/ovl_player_actor/z_player.c +++ b/soh/src/overlays/actors/ovl_player_actor/z_player.c @@ -2182,7 +2182,7 @@ void func_80834298(Player* this, PlayState* play) { ((this->heldItemAction == this->itemAction) || (this->stateFlags1 & PLAYER_STATE1_SHIELDING)) && (gSaveContext.health != 0) && (play->csCtx.state == CS_STATE_IDLE) && (this->csMode == 0) && (play->shootingGalleryStatus == 0) && (play->activeCamera == MAIN_CAM) && - (play->sceneLoadFlag != 0x14) && (gSaveContext.timer1State != 10)) { + (play->transitionTrigger != TRANS_TRIGGER_START) && (gSaveContext.timer1State != 10)) { func_80833DF8(this, play); } @@ -3332,7 +3332,7 @@ s32 func_80836FAC(PlayState* play, Player* this, f32* arg2, s16* arg3, f32 arg4) f32 temp_f14; f32 temp_f12; - if ((this->unk_6AD != 0) || (play->sceneLoadFlag == 0x14) || (this->stateFlags1 & PLAYER_STATE1_LOADING)) { + if ((this->unk_6AD != 0) || (play->transitionTrigger == TRANS_TRIGGER_START) || (this->stateFlags1 & PLAYER_STATE1_LOADING)) { *arg2 = 0.0f; *arg3 = this->actor.shape.rot.y; } else { @@ -4193,7 +4193,7 @@ void func_80838F5C(PlayState* play, Player* this) { } s32 func_80838FB8(PlayState* play, Player* this) { - if ((play->sceneLoadFlag == 0) && (this->stateFlags1 & PLAYER_STATE1_FLOOR_DISABLED)) { + if ((play->transitionTrigger == TRANS_TRIGGER_OFF) && (this->stateFlags1 & PLAYER_STATE1_FLOOR_DISABLED)) { func_80838F5C(play, this); func_80832284(play, this, &gPlayerAnim_link_normal_landing_wait); func_80832698(this, NA_SE_VO_LI_FALL_S); @@ -4233,7 +4233,7 @@ s32 func_80839034(PlayState* play, Player* this, CollisionPoly* poly, u32 bgId) if (this->actor.category == ACTORCAT_PLAYER) { sp3C = 0; - if (!(this->stateFlags1 & PLAYER_STATE1_DEAD) && (play->sceneLoadFlag == 0) && (this->csMode == 0) && + if (!(this->stateFlags1 & PLAYER_STATE1_DEAD) && (play->transitionTrigger == TRANS_TRIGGER_OFF) && (this->csMode == 0) && !(this->stateFlags1 & PLAYER_STATE1_LOADING) && (((poly != NULL) && (sp3C = SurfaceType_GetSceneExitIndex(&play->colCtx, poly, bgId), sp3C != 0)) || (func_8083816C(D_808535E4) && (this->unk_A7A == 12)))) { @@ -4259,8 +4259,8 @@ s32 func_80839034(PlayState* play, Player* this, CollisionPoly* poly, u32 bgId) if (play->nextEntranceIndex == 0x7FFF) { gSaveContext.respawnFlag = 2; play->nextEntranceIndex = gSaveContext.respawn[RESPAWN_MODE_RETURN].entranceIndex; - play->fadeTransition = 3; - gSaveContext.nextTransitionType = 3; + play->transitionType = TRANS_TYPE_FADE_WHITE; + gSaveContext.nextTransitionType = TRANS_TYPE_FADE_WHITE; } else if (play->nextEntranceIndex >= 0x7FF9) { // handle dynamic exits if (IS_RANDO) { @@ -4280,7 +4280,7 @@ s32 func_80839034(PlayState* play, Player* this, CollisionPoly* poly, u32 bgId) gSaveContext.retainWeatherMode = 1; func_800994A0(play); } - play->sceneLoadFlag = 0x14; + play->transitionTrigger = TRANS_TRIGGER_START; } if (!(this->stateFlags1 & (PLAYER_STATE1_ON_HORSE | PLAYER_STATE1_IN_CUTSCENE)) && @@ -4326,7 +4326,7 @@ s32 func_80839034(PlayState* play, Player* this, CollisionPoly* poly, u32 bgId) return 1; } else { - if (play->sceneLoadFlag == 0) { + if (play->transitionTrigger == TRANS_TRIGGER_OFF) { if ((this->actor.world.pos.y < -4000.0f) || (((this->unk_A7A == 5) || (this->unk_A7A == 12)) && @@ -4340,7 +4340,7 @@ s32 func_80839034(PlayState* play, Player* this, CollisionPoly* poly, u32 bgId) } else { Play_TriggerVoidOut(play); } - play->fadeTransition = 4; + play->transitionType = TRANS_TYPE_FADE_BLACK_FAST; func_80078884(NA_SE_OC_ABYSS); } else { func_80838F5C(play, this); @@ -10897,7 +10897,7 @@ void Player_UpdateCommon(Player* this, PlayState* play, Input* input) { } } else { if ((this->actor.parent == NULL) && - ((play->sceneLoadFlag == 0x14) || (this->unk_A87 != 0) || !func_808382DC(this, play))) { + ((play->transitionTrigger == TRANS_TRIGGER_START) || (this->unk_A87 != 0) || !func_808382DC(this, play))) { func_8083AA10(this, play); } else { this->fallStartHeight = this->actor.world.pos.y; @@ -12205,7 +12205,7 @@ s32 func_8084C9BC(Player* this, PlayState* play) { } } - if ((play->csCtx.state == CS_STATE_IDLE) && (play->transitionMode == 0) && + if ((play->csCtx.state == CS_STATE_IDLE) && (play->transitionMode == TRANS_MODE_OFF) && (EN_HORSE_CHECK_1(rideActor) || EN_HORSE_CHECK_4(rideActor))) { this->stateFlags2 |= PLAYER_STATE2_DO_ACTION_DOWN; @@ -12844,9 +12844,9 @@ s32 func_8084DFF4(PlayState* play, Player* this) { if (Message_GetState(&play->msgCtx) == TEXT_STATE_CLOSING) { if (this->getItemId == GI_GAUNTLETS_SILVER && !IS_RANDO) { play->nextEntranceIndex = 0x0123; - play->sceneLoadFlag = 0x14; + play->transitionTrigger = TRANS_TRIGGER_START; gSaveContext.nextCutsceneIndex = 0xFFF1; - play->fadeTransition = 0xF; + play->transitionType = TRANS_TYPE_SANDSTORM_END; this->stateFlags1 &= ~PLAYER_STATE1_IN_CUTSCENE; func_80852FFC(play, NULL, 8); } @@ -13560,7 +13560,7 @@ void func_8084F710(Player* this, PlayState* play) { void func_8084F88C(Player* this, PlayState* play) { LinkAnimation_Update(play, &this->skelAnime); - if ((this->unk_850++ > 8) && (play->sceneLoadFlag == 0)) { + if ((this->unk_850++ > 8) && (play->transitionTrigger == TRANS_TRIGGER_OFF)) { if (this->unk_84F != 0) { if (play->sceneNum == SCENE_ICE_CAVERN) { @@ -13576,16 +13576,16 @@ void func_8084F88C(Player* this, PlayState* play) { Play_TriggerVoidOut(play); } - play->fadeTransition = 4; + play->transitionType = TRANS_TYPE_FADE_BLACK_FAST; func_80078884(NA_SE_OC_ABYSS); } else { - play->fadeTransition = 2; - gSaveContext.nextTransitionType = 2; + play->transitionType = TRANS_TYPE_FADE_BLACK; + gSaveContext.nextTransitionType = TRANS_TYPE_FADE_WHITE; gSaveContext.seqId = (u8)NA_BGM_DISABLED; gSaveContext.natureAmbienceId = 0xFF; } - play->sceneLoadFlag = 0x14; + play->transitionTrigger = TRANS_TRIGGER_START; } } @@ -13903,9 +13903,9 @@ void func_8085063C(Player* this, PlayState* play) { if (play->msgCtx.choiceIndex == 0) { //Returns to FW gSaveContext.respawnFlag = 3; - play->sceneLoadFlag = 0x14; + play->transitionTrigger = TRANS_TRIGGER_START; play->nextEntranceIndex = gSaveContext.respawn[RESPAWN_MODE_TOP].entranceIndex; - play->fadeTransition = 5; + play->transitionType = TRANS_TYPE_FADE_WHITE_FAST; func_80088AF0(play); return; } diff --git a/soh/src/overlays/gamestates/ovl_file_choose/z_file_choose.c b/soh/src/overlays/gamestates/ovl_file_choose/z_file_choose.c index 9c83f9322..3f1c8ff44 100644 --- a/soh/src/overlays/gamestates/ovl_file_choose/z_file_choose.c +++ b/soh/src/overlays/gamestates/ovl_file_choose/z_file_choose.c @@ -2987,7 +2987,7 @@ void FileChoose_LoadGame(GameState* thisx) { gSaveContext.prevMagicState = MAGIC_STATE_IDLE; gSaveContext.forcedSeqId = NA_BGM_GENERAL_SFX; gSaveContext.skyboxTime = 0; - gSaveContext.nextTransitionType = 0xFF; + gSaveContext.nextTransitionType = TRANS_NEXT_TYPE_DEFAULT; gSaveContext.nextCutsceneIndex = 0xFFEF; gSaveContext.cutsceneTrigger = 0; gSaveContext.chamberCutsceneNum = 0; diff --git a/soh/src/overlays/misc/ovl_kaleido_scope/z_kaleido_scope_PAL.c b/soh/src/overlays/misc/ovl_kaleido_scope/z_kaleido_scope_PAL.c index 35490f079..382b19b13 100644 --- a/soh/src/overlays/misc/ovl_kaleido_scope/z_kaleido_scope_PAL.c +++ b/soh/src/overlays/misc/ovl_kaleido_scope/z_kaleido_scope_PAL.c @@ -4292,7 +4292,7 @@ void KaleidoScope_Update(PlayState* play) } // Reset frame counter to prevent autosave on respawn play->gameplayFrames = 0; - gSaveContext.nextTransitionType = 2; + gSaveContext.nextTransitionType = TRANS_TYPE_FADE_BLACK; gSaveContext.health = CVarGetInteger("gFullHealthSpawn", 0) ? gSaveContext.healthCapacity : 0x30; Audio_QueueSeqCmd(0xF << 28 | SEQ_PLAYER_BGM_MAIN << 24 | 0xA); gSaveContext.healthAccumulator = 0; From 80ef399c5256b401a70be76d93abe4b26672c6ee Mon Sep 17 00:00:00 2001 From: inspectredc <78732756+inspectredc@users.noreply.github.com> Date: Sun, 19 Nov 2023 19:29:56 +0000 Subject: [PATCH 013/113] Entrance Docs (#3332) * transition variables renamed * transition circle * transition wipe * sand storm * remaining sceneloadflag rename * transition trigger macros * transition mode enum * transition type enum * tc set params * creg debug transitions * introduce entrance table + return entrance indices + entrance info macros * randomizer entrance pass through * cleanup some missing scene enums * randomizer entrance tracker pass through * randomizer grotto pass through * gSaveContext.entranceIndex * misc lists * z_select pass through * respawn entrance index * nextEntranceIndex * add missing include --- soh/include/functions.h | 2 +- soh/include/tables/entrance_table.h | 1934 +++++++++++++++++ soh/include/variables.h | 2 +- soh/include/z64.h | 14 + soh/include/z64scene.h | 26 + soh/soh/Enhancements/boss-rush/BossRush.cpp | 22 +- .../game-interactor/GameInteractor.h | 15 +- soh/soh/Enhancements/mods.cpp | 2 +- .../Enhancements/randomizer/randomizer.cpp | 2 +- .../randomizer/randomizer_entrance.c | 263 +-- .../randomizer/randomizer_entrance.h | 74 +- .../randomizer_entrance_tracker.cpp | 525 ++--- .../randomizer/randomizer_grotto.c | 140 +- .../randomizer/randomizer_grotto.h | 2 +- soh/soh/Enhancements/randomizer/savefile.cpp | 2 +- soh/soh/OTRGlobals.cpp | 2 +- soh/soh/SaveManager.cpp | 4 +- soh/soh/z_scene_otr.cpp | 2 +- soh/src/code/z_actor.c | 8 +- soh/src/code/z_demo.c | 326 +-- soh/src/code/z_horse.c | 18 +- soh/src/code/z_kankyo.c | 16 +- soh/src/code/z_parameter.c | 4 +- soh/src/code/z_play.c | 38 +- soh/src/code/z_scene.c | 2 +- soh/src/code/z_scene_table.c | 807 +------ soh/src/code/z_sram.c | 49 +- .../z_bg_spot00_hanebasi.c | 2 +- .../actors/ovl_Boss_Ganon/z_boss_ganon.c | 4 +- .../actors/ovl_Boss_Ganon2/z_boss_ganon2.c | 2 +- .../actors/ovl_Demo_Effect/z_demo_effect.c | 40 +- .../overlays/actors/ovl_Demo_Im/z_demo_im.c | 8 +- .../actors/ovl_Demo_Kankyo/z_demo_kankyo.c | 12 +- .../overlays/actors/ovl_Door_Ana/z_door_ana.c | 9 +- .../actors/ovl_Door_Warp1/z_door_warp1.c | 70 +- soh/src/overlays/actors/ovl_En_Box/z_en_box.c | 4 +- soh/src/overlays/actors/ovl_En_Du/z_en_du.c | 2 +- .../actors/ovl_En_Ex_Item/z_en_ex_item.c | 2 +- soh/src/overlays/actors/ovl_En_Ge1/z_en_ge1.c | 8 +- soh/src/overlays/actors/ovl_En_Ge2/z_en_ge2.c | 12 +- .../overlays/actors/ovl_En_GeldB/z_en_geldb.c | 6 +- .../actors/ovl_En_Heishi1/z_en_heishi1.c | 2 +- .../actors/ovl_En_Heishi3/z_en_heishi3.c | 2 +- .../actors/ovl_En_Heishi4/z_en_heishi4.c | 4 +- .../overlays/actors/ovl_En_Holl/z_en_holl.c | 2 +- .../overlays/actors/ovl_En_Horse/z_en_horse.c | 4 +- .../z_en_horse_game_check.c | 10 +- .../z_en_horse_link_child.c | 2 +- soh/src/overlays/actors/ovl_En_In/z_en_in.c | 4 +- .../overlays/actors/ovl_En_Ishi/z_en_ishi.c | 2 +- .../actors/ovl_En_Jsjutan/z_en_jsjutan.c | 2 +- soh/src/overlays/actors/ovl_En_Ma1/z_en_ma1.c | 2 +- soh/src/overlays/actors/ovl_En_Ma3/z_en_ma3.c | 2 +- soh/src/overlays/actors/ovl_En_Ms/z_en_ms.c | 2 +- .../overlays/actors/ovl_En_Ossan/z_en_ossan.c | 4 +- soh/src/overlays/actors/ovl_En_Owl/z_en_owl.c | 8 +- soh/src/overlays/actors/ovl_En_Ta/z_en_ta.c | 2 +- .../ovl_En_Wonder_Talk/z_en_wonder_talk.c | 2 +- .../ovl_En_Wonder_Talk2/z_en_wonder_talk2.c | 6 +- soh/src/overlays/actors/ovl_En_Zl4/z_en_zl4.c | 4 +- .../ovl_Item_Etcetera/z_item_etcetera.c | 2 +- .../actors/ovl_Item_Ocarina/z_item_ocarina.c | 2 +- .../ovl_Object_Kankyo/z_object_kankyo.c | 14 +- .../actors/ovl_player_actor/z_player.c | 99 +- .../ovl_file_choose/z_file_choose.c | 4 +- .../overlays/gamestates/ovl_select/z_select.c | 854 ++++---- .../ovl_kaleido_scope/z_kaleido_scope_PAL.c | 66 +- 67 files changed, 3455 insertions(+), 2134 deletions(-) create mode 100644 soh/include/tables/entrance_table.h diff --git a/soh/include/functions.h b/soh/include/functions.h index 40a49cead..037ba9d08 100644 --- a/soh/include/functions.h +++ b/soh/include/functions.h @@ -1250,7 +1250,7 @@ s32 Object_IsLoaded(ObjectContext* objectCtx, s32 bankIndex); void func_800981B8(ObjectContext* objectCtx); s32 Scene_ExecuteCommands(PlayState* play, SceneCmd* sceneCmd); void TransitionActor_InitContext(GameState* state, TransitionActorContext* transiActorCtx); -void func_800994A0(PlayState* play); +void Scene_SetTransitionForNextEntrance(PlayState* play); void Scene_Draw(PlayState* play); void SkelAnime_DrawLod(PlayState* play, void** skeleton, Vec3s* jointTable, OverrideLimbDrawOpa overrideLimbDraw, PostLimbDrawOpa postLimbDraw, void* arg, s32 dListIndex); diff --git a/soh/include/tables/entrance_table.h b/soh/include/tables/entrance_table.h new file mode 100644 index 000000000..fc7cc00b2 --- /dev/null +++ b/soh/include/tables/entrance_table.h @@ -0,0 +1,1934 @@ +/** + * Entrance Table + * + * DEFINE_ENTRANCE should be used for entrances + * - Argument 1: Enum value for this entrance + * - Argument 2: Scene this entrance belongs to + * - Argument 3: Spawn number for this entrance + * - Argument 4: Toggle if bgm should continue during the transition using this entrance (true or false) + * NOTE: For non-cutscene layers, this field is only read from the `SCENE_LAYER_CHILD_DAY` layer. + * Meaning, the setting only matters for the first entry within a group of layers and that + * setting will apply to the other 3 non-cutscene layers. + * - Argument 5: Toggle if a title card should display when using this entrance (true or false) + * - Argument 6: Transition type when entering using this entrance (second half of a scene transition) + * - Argument 7: Transition type when exiting using this entrance (first half of a scene transition) + * + * WARNING: Due to how the entrance system is implemented, entries within the same group of scene layers are NOT shiftable. + * Groups of scene layers are indicated by line breaks. + * + * Only the first entrance within a group of layers is expected to be referenced in code. + * The entrance system will apply the offset on its own to access the correct entrance for a given layer. + */ +/* 0x000 */ DEFINE_ENTRANCE(ENTR_DEKU_TREE_0, SCENE_DEKU_TREE, 0, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x001 */ DEFINE_ENTRANCE(ENTR_DEKU_TREE_0_1, SCENE_DEKU_TREE, 0, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x002 */ DEFINE_ENTRANCE(ENTR_DEKU_TREE_0_2, SCENE_DEKU_TREE, 0, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x003 */ DEFINE_ENTRANCE(ENTR_DEKU_TREE_0_3, SCENE_DEKU_TREE, 0, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) + +/* 0x004 */ DEFINE_ENTRANCE(ENTR_DODONGOS_CAVERN_0, SCENE_DODONGOS_CAVERN, 0, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x005 */ DEFINE_ENTRANCE(ENTR_DODONGOS_CAVERN_0_1, SCENE_DODONGOS_CAVERN, 0, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x006 */ DEFINE_ENTRANCE(ENTR_DODONGOS_CAVERN_0_2, SCENE_DODONGOS_CAVERN, 0, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x007 */ DEFINE_ENTRANCE(ENTR_DODONGOS_CAVERN_0_3, SCENE_DODONGOS_CAVERN, 0, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) + +/* 0x008 */ DEFINE_ENTRANCE(ENTR_GERUDO_TRAINING_GROUND_0, SCENE_GERUDO_TRAINING_GROUND, 0, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x009 */ DEFINE_ENTRANCE(ENTR_GERUDO_TRAINING_GROUND_0_1, SCENE_GERUDO_TRAINING_GROUND, 0, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x00A */ DEFINE_ENTRANCE(ENTR_GERUDO_TRAINING_GROUND_0_2, SCENE_GERUDO_TRAINING_GROUND, 0, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x00B */ DEFINE_ENTRANCE(ENTR_GERUDO_TRAINING_GROUND_0_3, SCENE_GERUDO_TRAINING_GROUND, 0, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) + +/* 0x00C */ DEFINE_ENTRANCE(ENTR_FOREST_TEMPLE_BOSS_0, SCENE_FOREST_TEMPLE_BOSS, 0, true, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x00D */ DEFINE_ENTRANCE(ENTR_FOREST_TEMPLE_BOSS_0_1, SCENE_FOREST_TEMPLE_BOSS, 0, true, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x00E */ DEFINE_ENTRANCE(ENTR_FOREST_TEMPLE_BOSS_0_2, SCENE_FOREST_TEMPLE_BOSS, 0, true, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x00F */ DEFINE_ENTRANCE(ENTR_FOREST_TEMPLE_BOSS_0_3, SCENE_FOREST_TEMPLE_BOSS, 0, true, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) + +/* 0x010 */ DEFINE_ENTRANCE(ENTR_WATER_TEMPLE_0, SCENE_WATER_TEMPLE, 0, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x011 */ DEFINE_ENTRANCE(ENTR_WATER_TEMPLE_0_1, SCENE_WATER_TEMPLE, 0, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x012 */ DEFINE_ENTRANCE(ENTR_WATER_TEMPLE_0_2, SCENE_WATER_TEMPLE, 0, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x013 */ DEFINE_ENTRANCE(ENTR_WATER_TEMPLE_0_3, SCENE_WATER_TEMPLE, 0, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) + +/* 0x014 */ DEFINE_ENTRANCE(ENTR_UNUSED_6E, SCENE_UNUSED_6E, 0, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x015 */ DEFINE_ENTRANCE(ENTR_UNUSED_6E_1, SCENE_UNUSED_6E, 0, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x016 */ DEFINE_ENTRANCE(ENTR_UNUSED_6E_2, SCENE_UNUSED_6E, 0, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x017 */ DEFINE_ENTRANCE(ENTR_UNUSED_6E_3, SCENE_UNUSED_6E, 0, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) + +/* 0x018 */ DEFINE_ENTRANCE(ENTR_SASATEST_0, SCENE_SASATEST, 0, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x019 */ DEFINE_ENTRANCE(ENTR_SASATEST_0_1, SCENE_SASATEST, 0, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x01A */ DEFINE_ENTRANCE(ENTR_SASATEST_0_2, SCENE_SASATEST, 0, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x01B */ DEFINE_ENTRANCE(ENTR_SASATEST_0_3, SCENE_SASATEST, 0, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) + +/* 0x01C */ DEFINE_ENTRANCE(ENTR_SYOTES_0, SCENE_SYOTES, 0, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x01D */ DEFINE_ENTRANCE(ENTR_SYOTES_0_1, SCENE_SYOTES, 0, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x01E */ DEFINE_ENTRANCE(ENTR_SYOTES_0_2, SCENE_SYOTES, 0, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x01F */ DEFINE_ENTRANCE(ENTR_SYOTES_0_3, SCENE_SYOTES, 0, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) + +/* 0x020 */ DEFINE_ENTRANCE(ENTR_SYOTES2_0, SCENE_SYOTES2, 0, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x021 */ DEFINE_ENTRANCE(ENTR_SYOTES2_0_1, SCENE_SYOTES2, 0, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x022 */ DEFINE_ENTRANCE(ENTR_SYOTES2_0_2, SCENE_SYOTES2, 0, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x023 */ DEFINE_ENTRANCE(ENTR_SYOTES2_0_3, SCENE_SYOTES2, 0, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) + +/* 0x024 */ DEFINE_ENTRANCE(ENTR_TESTROOM_0, SCENE_TESTROOM, 0, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x025 */ DEFINE_ENTRANCE(ENTR_TESTROOM_0_1, SCENE_TESTROOM, 0, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x026 */ DEFINE_ENTRANCE(ENTR_TESTROOM_0_2, SCENE_TESTROOM, 0, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x027 */ DEFINE_ENTRANCE(ENTR_TESTROOM_0_3, SCENE_TESTROOM, 0, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) + +/* 0x028 */ DEFINE_ENTRANCE(ENTR_JABU_JABU_0, SCENE_JABU_JABU, 0, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x029 */ DEFINE_ENTRANCE(ENTR_JABU_JABU_0_1, SCENE_JABU_JABU, 0, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x02A */ DEFINE_ENTRANCE(ENTR_JABU_JABU_0_2, SCENE_JABU_JABU, 0, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x02B */ DEFINE_ENTRANCE(ENTR_JABU_JABU_0_3, SCENE_JABU_JABU, 0, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x02C */ DEFINE_ENTRANCE(ENTR_JABU_JABU_0_4, SCENE_JABU_JABU, 0, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) + +/* 0x02D */ DEFINE_ENTRANCE(ENTR_ROYAL_FAMILYS_TOMB_0, SCENE_ROYAL_FAMILYS_TOMB, 0, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_CIRCLE(TCA_STARBURST,TCC_BLACK, TCS_FAST)) +/* 0x02E */ DEFINE_ENTRANCE(ENTR_ROYAL_FAMILYS_TOMB_0_1, SCENE_ROYAL_FAMILYS_TOMB, 0, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_CIRCLE(TCA_STARBURST,TCC_BLACK, TCS_FAST)) +/* 0x02F */ DEFINE_ENTRANCE(ENTR_ROYAL_FAMILYS_TOMB_0_2, SCENE_ROYAL_FAMILYS_TOMB, 0, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_CIRCLE(TCA_STARBURST,TCC_BLACK, TCS_FAST)) +/* 0x030 */ DEFINE_ENTRANCE(ENTR_ROYAL_FAMILYS_TOMB_0_3, SCENE_ROYAL_FAMILYS_TOMB, 0, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_CIRCLE(TCA_STARBURST,TCC_BLACK, TCS_FAST)) +/* 0x031 */ DEFINE_ENTRANCE(ENTR_ROYAL_FAMILYS_TOMB_0_4, SCENE_ROYAL_FAMILYS_TOMB, 0, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x032 */ DEFINE_ENTRANCE(ENTR_ROYAL_FAMILYS_TOMB_0_5, SCENE_ROYAL_FAMILYS_TOMB, 0, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) + +/* 0x033 */ DEFINE_ENTRANCE(ENTR_MARKET_ENTRANCE_DAY_0, SCENE_MARKET_ENTRANCE_DAY, 0, true, true, TRANS_TYPE_FADE_WHITE, TRANS_TYPE_FADE_WHITE) +/* 0x034 */ DEFINE_ENTRANCE(ENTR_MARKET_ENTRANCE_NIGHT_0_1, SCENE_MARKET_ENTRANCE_NIGHT, 0, true, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x035 */ DEFINE_ENTRANCE(ENTR_MARKET_ENTRANCE_RUINS_0_2, SCENE_MARKET_ENTRANCE_RUINS, 0, true, true, TRANS_TYPE_FADE_WHITE, TRANS_TYPE_FADE_WHITE) +/* 0x036 */ DEFINE_ENTRANCE(ENTR_MARKET_ENTRANCE_RUINS_0_3, SCENE_MARKET_ENTRANCE_RUINS, 0, true, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) + +/* 0x037 */ DEFINE_ENTRANCE(ENTR_SHADOW_TEMPLE_0, SCENE_SHADOW_TEMPLE, 0, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x038 */ DEFINE_ENTRANCE(ENTR_SHADOW_TEMPLE_0_1, SCENE_SHADOW_TEMPLE, 0, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x039 */ DEFINE_ENTRANCE(ENTR_SHADOW_TEMPLE_0_2, SCENE_SHADOW_TEMPLE, 0, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x03A */ DEFINE_ENTRANCE(ENTR_SHADOW_TEMPLE_0_3, SCENE_SHADOW_TEMPLE, 0, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) + +/* 0x03B */ DEFINE_ENTRANCE(ENTR_SHOOTING_GALLERY_0, SCENE_SHOOTING_GALLERY, 0, false, true, TRANS_TYPE_FADE_BLACK_FAST, TRANS_TYPE_CIRCLE(TCA_NORMAL, TCC_BLACK, TCS_FAST)) +/* 0x03C */ DEFINE_ENTRANCE(ENTR_SHOOTING_GALLERY_0_1, SCENE_SHOOTING_GALLERY, 0, false, true, TRANS_TYPE_FADE_BLACK_FAST, TRANS_TYPE_CIRCLE(TCA_NORMAL, TCC_BLACK, TCS_FAST)) +/* 0x03D */ DEFINE_ENTRANCE(ENTR_SHOOTING_GALLERY_0_2, SCENE_SHOOTING_GALLERY, 0, false, true, TRANS_TYPE_FADE_BLACK_FAST, TRANS_TYPE_CIRCLE(TCA_NORMAL, TCC_BLACK, TCS_FAST)) +/* 0x03E */ DEFINE_ENTRANCE(ENTR_SHOOTING_GALLERY_0_3, SCENE_SHOOTING_GALLERY, 0, false, true, TRANS_TYPE_FADE_BLACK_FAST, TRANS_TYPE_CIRCLE(TCA_NORMAL, TCC_BLACK, TCS_FAST)) + +/* 0x03F */ DEFINE_ENTRANCE(ENTR_GROTTOS_0, SCENE_GROTTOS, 0, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x040 */ DEFINE_ENTRANCE(ENTR_GROTTOS_0_1, SCENE_GROTTOS, 0, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x041 */ DEFINE_ENTRANCE(ENTR_GROTTOS_0_2, SCENE_GROTTOS, 0, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x042 */ DEFINE_ENTRANCE(ENTR_GROTTOS_0_3, SCENE_GROTTOS, 0, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) + +/* 0x043 */ DEFINE_ENTRANCE(ENTR_LAKESIDE_LABORATORY_0, SCENE_LAKESIDE_LABORATORY, 0, false, true, TRANS_TYPE_FADE_BLACK_FAST, TRANS_TYPE_CIRCLE(TCA_NORMAL, TCC_BLACK, TCS_FAST)) +/* 0x044 */ DEFINE_ENTRANCE(ENTR_LAKESIDE_LABORATORY_0_1, SCENE_LAKESIDE_LABORATORY, 0, false, true, TRANS_TYPE_FADE_BLACK_FAST, TRANS_TYPE_CIRCLE(TCA_NORMAL, TCC_BLACK, TCS_FAST)) +/* 0x045 */ DEFINE_ENTRANCE(ENTR_LAKESIDE_LABORATORY_0_2, SCENE_LAKESIDE_LABORATORY, 0, false, true, TRANS_TYPE_FADE_BLACK_FAST, TRANS_TYPE_CIRCLE(TCA_NORMAL, TCC_BLACK, TCS_FAST)) +/* 0x046 */ DEFINE_ENTRANCE(ENTR_LAKESIDE_LABORATORY_0_3, SCENE_LAKESIDE_LABORATORY, 0, false, true, TRANS_TYPE_FADE_BLACK_FAST, TRANS_TYPE_CIRCLE(TCA_NORMAL, TCC_BLACK, TCS_FAST)) + +/* 0x047 */ DEFINE_ENTRANCE(ENTR_SUTARU_0, SCENE_SUTARU, 0, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x048 */ DEFINE_ENTRANCE(ENTR_SUTARU_0_1, SCENE_SUTARU, 0, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x049 */ DEFINE_ENTRANCE(ENTR_SUTARU_0_2, SCENE_SUTARU, 0, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x04A */ DEFINE_ENTRANCE(ENTR_SUTARU_0_3, SCENE_SUTARU, 0, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) + +/* 0x04B */ DEFINE_ENTRANCE(ENTR_GRAVE_WITH_FAIRYS_FOUNTAIN_0, SCENE_GRAVE_WITH_FAIRYS_FOUNTAIN, 0, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_CIRCLE(TCA_STARBURST,TCC_BLACK, TCS_FAST)) +/* 0x04C */ DEFINE_ENTRANCE(ENTR_GRAVE_WITH_FAIRYS_FOUNTAIN_0_1, SCENE_GRAVE_WITH_FAIRYS_FOUNTAIN, 0, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_CIRCLE(TCA_STARBURST,TCC_BLACK, TCS_FAST)) +/* 0x04D */ DEFINE_ENTRANCE(ENTR_GRAVE_WITH_FAIRYS_FOUNTAIN_0_2, SCENE_GRAVE_WITH_FAIRYS_FOUNTAIN, 0, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_CIRCLE(TCA_STARBURST,TCC_BLACK, TCS_FAST)) +/* 0x04E */ DEFINE_ENTRANCE(ENTR_GRAVE_WITH_FAIRYS_FOUNTAIN_0_3, SCENE_GRAVE_WITH_FAIRYS_FOUNTAIN, 0, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_CIRCLE(TCA_STARBURST,TCC_BLACK, TCS_FAST)) + +/* 0x04F */ DEFINE_ENTRANCE(ENTR_LON_LON_BUILDINGS_0, SCENE_LON_LON_BUILDINGS, 0, false, true, TRANS_TYPE_FADE_BLACK_FAST, TRANS_TYPE_CIRCLE(TCA_NORMAL, TCC_BLACK, TCS_FAST)) +/* 0x050 */ DEFINE_ENTRANCE(ENTR_LON_LON_BUILDINGS_0_1, SCENE_LON_LON_BUILDINGS, 0, false, true, TRANS_TYPE_FADE_BLACK_FAST, TRANS_TYPE_CIRCLE(TCA_NORMAL, TCC_BLACK, TCS_FAST)) +/* 0x051 */ DEFINE_ENTRANCE(ENTR_LON_LON_BUILDINGS_0_2, SCENE_LON_LON_BUILDINGS, 0, false, true, TRANS_TYPE_FADE_BLACK_FAST, TRANS_TYPE_CIRCLE(TCA_NORMAL, TCC_BLACK, TCS_FAST)) +/* 0x052 */ DEFINE_ENTRANCE(ENTR_LON_LON_BUILDINGS_0_3, SCENE_LON_LON_BUILDINGS, 0, false, true, TRANS_TYPE_FADE_BLACK_FAST, TRANS_TYPE_CIRCLE(TCA_NORMAL, TCC_BLACK, TCS_FAST)) + +/* 0x053 */ DEFINE_ENTRANCE(ENTR_TEMPLE_OF_TIME_0, SCENE_TEMPLE_OF_TIME, 0, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x054 */ DEFINE_ENTRANCE(ENTR_TEMPLE_OF_TIME_0_1, SCENE_TEMPLE_OF_TIME, 0, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x055 */ DEFINE_ENTRANCE(ENTR_TEMPLE_OF_TIME_0_2, SCENE_TEMPLE_OF_TIME, 0, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x056 */ DEFINE_ENTRANCE(ENTR_TEMPLE_OF_TIME_0_3, SCENE_TEMPLE_OF_TIME, 0, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x057 */ DEFINE_ENTRANCE(ENTR_TEMPLE_OF_TIME_0_4, SCENE_TEMPLE_OF_TIME, 0, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x058 */ DEFINE_ENTRANCE(ENTR_TEMPLE_OF_TIME_0_5, SCENE_TEMPLE_OF_TIME, 0, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x059 */ DEFINE_ENTRANCE(ENTR_TEMPLE_OF_TIME_0_6, SCENE_TEMPLE_OF_TIME, 0, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x05A */ DEFINE_ENTRANCE(ENTR_TEMPLE_OF_TIME_0_7, SCENE_TEMPLE_OF_TIME, 0, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x05B */ DEFINE_ENTRANCE(ENTR_TEMPLE_OF_TIME_0_8, SCENE_TEMPLE_OF_TIME, 0, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x05C */ DEFINE_ENTRANCE(ENTR_TEMPLE_OF_TIME_0_9, SCENE_TEMPLE_OF_TIME, 0, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x05D */ DEFINE_ENTRANCE(ENTR_TEMPLE_OF_TIME_0_10, SCENE_TEMPLE_OF_TIME, 0, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x05E */ DEFINE_ENTRANCE(ENTR_TEMPLE_OF_TIME_0_11, SCENE_TEMPLE_OF_TIME, 0, false, true, TRANS_TYPE_INSTANT, TRANS_TYPE_INSTANT) +/* 0x05F */ DEFINE_ENTRANCE(ENTR_TEMPLE_OF_TIME_0_12, SCENE_TEMPLE_OF_TIME, 0, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x060 */ DEFINE_ENTRANCE(ENTR_TEMPLE_OF_TIME_0_13, SCENE_TEMPLE_OF_TIME, 0, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x061 */ DEFINE_ENTRANCE(ENTR_TEMPLE_OF_TIME_0_14, SCENE_TEMPLE_OF_TIME, 0, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x062 */ DEFINE_ENTRANCE(ENTR_TEMPLE_OF_TIME_0_15, SCENE_TEMPLE_OF_TIME, 0, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) + +/* 0x063 */ DEFINE_ENTRANCE(ENTR_TREASURE_BOX_SHOP_0, SCENE_TREASURE_BOX_SHOP, 0, false, true, TRANS_TYPE_FADE_BLACK_FAST, TRANS_TYPE_CIRCLE(TCA_NORMAL, TCC_BLACK, TCS_FAST)) +/* 0x064 */ DEFINE_ENTRANCE(ENTR_TREASURE_BOX_SHOP_0_1, SCENE_TREASURE_BOX_SHOP, 0, false, true, TRANS_TYPE_FADE_BLACK_FAST, TRANS_TYPE_CIRCLE(TCA_NORMAL, TCC_BLACK, TCS_FAST)) +/* 0x065 */ DEFINE_ENTRANCE(ENTR_TREASURE_BOX_SHOP_0_2, SCENE_TREASURE_BOX_SHOP, 0, false, true, TRANS_TYPE_FADE_BLACK_FAST, TRANS_TYPE_CIRCLE(TCA_NORMAL, TCC_BLACK, TCS_FAST)) +/* 0x066 */ DEFINE_ENTRANCE(ENTR_TREASURE_BOX_SHOP_0_3, SCENE_TREASURE_BOX_SHOP, 0, false, true, TRANS_TYPE_FADE_BLACK_FAST, TRANS_TYPE_CIRCLE(TCA_NORMAL, TCC_BLACK, TCS_FAST)) + +/* 0x067 */ DEFINE_ENTRANCE(ENTR_BACK_ALLEY_DAY_3, SCENE_BACK_ALLEY_DAY, 3, true, true, TRANS_TYPE_FADE_WHITE, TRANS_TYPE_FADE_WHITE) +/* 0x068 */ DEFINE_ENTRANCE(ENTR_BACK_ALLEY_NIGHT_3_1, SCENE_BACK_ALLEY_NIGHT, 3, true, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x069 */ DEFINE_ENTRANCE(ENTR_BACK_ALLEY_DAY_3_2, SCENE_BACK_ALLEY_DAY, 3, true, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x06A */ DEFINE_ENTRANCE(ENTR_BACK_ALLEY_NIGHT_3_3, SCENE_BACK_ALLEY_NIGHT, 3, true, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) + +/* 0x06B */ DEFINE_ENTRANCE(ENTR_CHAMBER_OF_THE_SAGES_0, SCENE_CHAMBER_OF_THE_SAGES, 0, false, true, TRANS_TYPE_FADE_WHITE_SLOW, TRANS_TYPE_FADE_WHITE_SLOW) +/* 0x06C */ DEFINE_ENTRANCE(ENTR_CHAMBER_OF_THE_SAGES_0_1, SCENE_CHAMBER_OF_THE_SAGES, 0, false, true, TRANS_TYPE_FADE_WHITE_SLOW, TRANS_TYPE_FADE_WHITE_SLOW) +/* 0x06D */ DEFINE_ENTRANCE(ENTR_CHAMBER_OF_THE_SAGES_0_2, SCENE_CHAMBER_OF_THE_SAGES, 0, false, true, TRANS_TYPE_FADE_WHITE_SLOW, TRANS_TYPE_FADE_WHITE_SLOW) +/* 0x06E */ DEFINE_ENTRANCE(ENTR_CHAMBER_OF_THE_SAGES_0_3, SCENE_CHAMBER_OF_THE_SAGES, 0, false, true, TRANS_TYPE_FADE_WHITE_SLOW, TRANS_TYPE_FADE_WHITE_SLOW) +/* 0x06F */ DEFINE_ENTRANCE(ENTR_CHAMBER_OF_THE_SAGES_0_4, SCENE_CHAMBER_OF_THE_SAGES, 0, false, true, TRANS_TYPE_FADE_WHITE_CS_DELAYED, TRANS_TYPE_FADE_BLACK) +/* 0x070 */ DEFINE_ENTRANCE(ENTR_CHAMBER_OF_THE_SAGES_0_5, SCENE_CHAMBER_OF_THE_SAGES, 0, false, true, TRANS_TYPE_FADE_WHITE_CS_DELAYED, TRANS_TYPE_FADE_BLACK) +/* 0x071 */ DEFINE_ENTRANCE(ENTR_CHAMBER_OF_THE_SAGES_0_6, SCENE_CHAMBER_OF_THE_SAGES, 0, false, true, TRANS_TYPE_FADE_WHITE, TRANS_TYPE_FADE_WHITE) + +/* 0x072 */ DEFINE_ENTRANCE(ENTR_POTION_SHOP_GRANNY_0, SCENE_POTION_SHOP_GRANNY, 0, false, true, TRANS_TYPE_FADE_BLACK_FAST, TRANS_TYPE_CIRCLE(TCA_NORMAL, TCC_BLACK, TCS_FAST)) +/* 0x073 */ DEFINE_ENTRANCE(ENTR_POTION_SHOP_GRANNY_0_1, SCENE_POTION_SHOP_GRANNY, 0, false, true, TRANS_TYPE_FADE_BLACK_FAST, TRANS_TYPE_CIRCLE(TCA_NORMAL, TCC_BLACK, TCS_FAST)) +/* 0x074 */ DEFINE_ENTRANCE(ENTR_POTION_SHOP_GRANNY_0_2, SCENE_POTION_SHOP_GRANNY, 0, false, true, TRANS_TYPE_FADE_BLACK_FAST, TRANS_TYPE_CIRCLE(TCA_NORMAL, TCC_BLACK, TCS_FAST)) +/* 0x075 */ DEFINE_ENTRANCE(ENTR_POTION_SHOP_GRANNY_0_3, SCENE_POTION_SHOP_GRANNY, 0, false, true, TRANS_TYPE_FADE_BLACK_FAST, TRANS_TYPE_CIRCLE(TCA_NORMAL, TCC_BLACK, TCS_FAST)) + +/* 0x076 */ DEFINE_ENTRANCE(ENTR_HAIRAL_NIWA2_0, SCENE_HAIRAL_NIWA2, 0, false, true, TRANS_TYPE_CIRCLE(TCA_WAVE, TCC_BLACK, TCS_FAST), TRANS_TYPE_CIRCLE(TCA_WAVE, TCC_BLACK, TCS_FAST)) +/* 0x077 */ DEFINE_ENTRANCE(ENTR_HAIRAL_NIWA2_0_1, SCENE_HAIRAL_NIWA2, 0, false, true, TRANS_TYPE_CIRCLE(TCA_WAVE, TCC_BLACK, TCS_FAST), TRANS_TYPE_CIRCLE(TCA_WAVE, TCC_BLACK, TCS_FAST)) +/* 0x078 */ DEFINE_ENTRANCE(ENTR_HAIRAL_NIWA2_0_2, SCENE_HAIRAL_NIWA2, 0, false, true, TRANS_TYPE_CIRCLE(TCA_WAVE, TCC_BLACK, TCS_FAST), TRANS_TYPE_CIRCLE(TCA_WAVE, TCC_BLACK, TCS_FAST)) +/* 0x079 */ DEFINE_ENTRANCE(ENTR_HAIRAL_NIWA2_0_3, SCENE_HAIRAL_NIWA2, 0, false, true, TRANS_TYPE_CIRCLE(TCA_WAVE, TCC_BLACK, TCS_FAST), TRANS_TYPE_CIRCLE(TCA_WAVE, TCC_BLACK, TCS_FAST)) + +/* 0x07A */ DEFINE_ENTRANCE(ENTR_CASTLE_COURTYARD_GUARDS_DAY_0, SCENE_CASTLE_COURTYARD_GUARDS_DAY, 0, false, true, TRANS_TYPE_CIRCLE(TCA_WAVE, TCC_BLACK, TCS_FAST), TRANS_TYPE_FADE_BLACK_FAST) +/* 0x07B */ DEFINE_ENTRANCE(ENTR_CASTLE_COURTYARD_GUARDS_NIGHT_0_1, SCENE_CASTLE_COURTYARD_GUARDS_NIGHT, 0, false, true, TRANS_TYPE_CIRCLE(TCA_WAVE, TCC_BLACK, TCS_FAST), TRANS_TYPE_FADE_BLACK_FAST) +/* 0x07C */ DEFINE_ENTRANCE(ENTR_CASTLE_COURTYARD_GUARDS_DAY_0_2, SCENE_CASTLE_COURTYARD_GUARDS_DAY, 0, false, true, TRANS_TYPE_CIRCLE(TCA_WAVE, TCC_BLACK, TCS_FAST), TRANS_TYPE_FADE_BLACK_FAST) +/* 0x07D */ DEFINE_ENTRANCE(ENTR_CASTLE_COURTYARD_GUARDS_NIGHT_0_3, SCENE_CASTLE_COURTYARD_GUARDS_NIGHT, 0, false, true, TRANS_TYPE_CIRCLE(TCA_WAVE, TCC_BLACK, TCS_FAST), TRANS_TYPE_FADE_BLACK_FAST) + +/* 0x07E */ DEFINE_ENTRANCE(ENTR_MARKET_GUARD_HOUSE_0, SCENE_MARKET_GUARD_HOUSE, 0, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x07F */ DEFINE_ENTRANCE(ENTR_MARKET_GUARD_HOUSE_0_1, SCENE_MARKET_GUARD_HOUSE, 0, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x080 */ DEFINE_ENTRANCE(ENTR_MARKET_GUARD_HOUSE_0_2, SCENE_MARKET_GUARD_HOUSE, 0, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x081 */ DEFINE_ENTRANCE(ENTR_MARKET_GUARD_HOUSE_0_3, SCENE_MARKET_GUARD_HOUSE, 0, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) + +/* 0x082 */ DEFINE_ENTRANCE(ENTR_SPIRIT_TEMPLE_0, SCENE_SPIRIT_TEMPLE, 0, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x083 */ DEFINE_ENTRANCE(ENTR_SPIRIT_TEMPLE_0_1, SCENE_SPIRIT_TEMPLE, 0, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x084 */ DEFINE_ENTRANCE(ENTR_SPIRIT_TEMPLE_0_2, SCENE_SPIRIT_TEMPLE, 0, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x085 */ DEFINE_ENTRANCE(ENTR_SPIRIT_TEMPLE_0_3, SCENE_SPIRIT_TEMPLE, 0, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x086 */ DEFINE_ENTRANCE(ENTR_SPIRIT_TEMPLE_0_4, SCENE_SPIRIT_TEMPLE, 0, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x087 */ DEFINE_ENTRANCE(ENTR_SPIRIT_TEMPLE_0_5, SCENE_SPIRIT_TEMPLE, 0, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) + +/* 0x088 */ DEFINE_ENTRANCE(ENTR_ICE_CAVERN_0, SCENE_ICE_CAVERN, 0, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x089 */ DEFINE_ENTRANCE(ENTR_ICE_CAVERN_0_1, SCENE_ICE_CAVERN, 0, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x08A */ DEFINE_ENTRANCE(ENTR_ICE_CAVERN_0_2, SCENE_ICE_CAVERN, 0, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x08B */ DEFINE_ENTRANCE(ENTR_ICE_CAVERN_0_3, SCENE_ICE_CAVERN, 0, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x08C */ DEFINE_ENTRANCE(ENTR_ICE_CAVERN_0_4, SCENE_ICE_CAVERN, 0, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) + +/* 0x08D */ DEFINE_ENTRANCE(ENTR_SPIRIT_TEMPLE_BOSS_0, SCENE_SPIRIT_TEMPLE_BOSS, 0, true, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x08E */ DEFINE_ENTRANCE(ENTR_SPIRIT_TEMPLE_BOSS_0_1, SCENE_SPIRIT_TEMPLE_BOSS, 0, true, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x08F */ DEFINE_ENTRANCE(ENTR_SPIRIT_TEMPLE_BOSS_0_2, SCENE_SPIRIT_TEMPLE_BOSS, 0, true, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x090 */ DEFINE_ENTRANCE(ENTR_SPIRIT_TEMPLE_BOSS_0_3, SCENE_SPIRIT_TEMPLE_BOSS, 0, true, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x091 */ DEFINE_ENTRANCE(ENTR_SPIRIT_TEMPLE_BOSS_0_4, SCENE_SPIRIT_TEMPLE_BOSS, 0, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x092 */ DEFINE_ENTRANCE(ENTR_SPIRIT_TEMPLE_BOSS_0_5, SCENE_SPIRIT_TEMPLE_BOSS, 0, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x093 */ DEFINE_ENTRANCE(ENTR_SPIRIT_TEMPLE_BOSS_0_6, SCENE_SPIRIT_TEMPLE_BOSS, 0, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) + +/* 0x094 */ DEFINE_ENTRANCE(ENTR_TEST01_0, SCENE_TEST01, 0, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x095 */ DEFINE_ENTRANCE(ENTR_TEST01_0_1, SCENE_TEST01, 0, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x096 */ DEFINE_ENTRANCE(ENTR_TEST01_0_2, SCENE_TEST01, 0, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x097 */ DEFINE_ENTRANCE(ENTR_TEST01_0_3, SCENE_TEST01, 0, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) + +/* 0x098 */ DEFINE_ENTRANCE(ENTR_BOTTOM_OF_THE_WELL_0, SCENE_BOTTOM_OF_THE_WELL, 0, false, true, TRANS_TYPE_FADE_BLACK_FAST, TRANS_TYPE_FADE_BLACK_FAST) +/* 0x099 */ DEFINE_ENTRANCE(ENTR_BOTTOM_OF_THE_WELL_0_1, SCENE_BOTTOM_OF_THE_WELL, 0, false, true, TRANS_TYPE_FADE_BLACK_FAST, TRANS_TYPE_FADE_BLACK_FAST) +/* 0x09A */ DEFINE_ENTRANCE(ENTR_BOTTOM_OF_THE_WELL_0_2, SCENE_BOTTOM_OF_THE_WELL, 0, false, true, TRANS_TYPE_FADE_BLACK_FAST, TRANS_TYPE_FADE_BLACK_FAST) +/* 0x09B */ DEFINE_ENTRANCE(ENTR_BOTTOM_OF_THE_WELL_0_3, SCENE_BOTTOM_OF_THE_WELL, 0, false, true, TRANS_TYPE_FADE_BLACK_FAST, TRANS_TYPE_FADE_BLACK_FAST) + +/* 0x09C */ DEFINE_ENTRANCE(ENTR_TWINS_HOUSE_0, SCENE_TWINS_HOUSE, 0, false, true, TRANS_TYPE_FADE_BLACK_FAST, TRANS_TYPE_FADE_BLACK_FAST) +/* 0x09D */ DEFINE_ENTRANCE(ENTR_TWINS_HOUSE_0_1, SCENE_TWINS_HOUSE, 0, false, true, TRANS_TYPE_FADE_BLACK_FAST, TRANS_TYPE_FADE_BLACK_FAST) +/* 0x09E */ DEFINE_ENTRANCE(ENTR_TWINS_HOUSE_0_2, SCENE_TWINS_HOUSE, 0, false, true, TRANS_TYPE_FADE_BLACK_FAST, TRANS_TYPE_FADE_BLACK_FAST) +/* 0x09F */ DEFINE_ENTRANCE(ENTR_TWINS_HOUSE_0_3, SCENE_TWINS_HOUSE, 0, false, true, TRANS_TYPE_FADE_BLACK_FAST, TRANS_TYPE_FADE_BLACK_FAST) + +/* 0x0A0 */ DEFINE_ENTRANCE(ENTR_CUTSCENE_MAP_0, SCENE_CUTSCENE_MAP, 0, false, true, TRANS_TYPE_FADE_WHITE, TRANS_TYPE_FADE_WHITE) +/* 0x0A1 */ DEFINE_ENTRANCE(ENTR_CUTSCENE_MAP_0_1, SCENE_CUTSCENE_MAP, 0, false, true, TRANS_TYPE_FADE_WHITE, TRANS_TYPE_FADE_WHITE) +/* 0x0A2 */ DEFINE_ENTRANCE(ENTR_CUTSCENE_MAP_0_2, SCENE_CUTSCENE_MAP, 0, false, true, TRANS_TYPE_FADE_WHITE, TRANS_TYPE_FADE_WHITE) +/* 0x0A3 */ DEFINE_ENTRANCE(ENTR_CUTSCENE_MAP_0_3, SCENE_CUTSCENE_MAP, 0, false, true, TRANS_TYPE_FADE_WHITE, TRANS_TYPE_FADE_WHITE) +/* 0x0A4 */ DEFINE_ENTRANCE(ENTR_CUTSCENE_MAP_0_4, SCENE_CUTSCENE_MAP, 0, false, true, TRANS_TYPE_FILL_WHITE, TRANS_TYPE_FILL_WHITE) +/* 0x0A5 */ DEFINE_ENTRANCE(ENTR_CUTSCENE_MAP_0_5, SCENE_CUTSCENE_MAP, 0, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FILL_WHITE) +/* 0x0A6 */ DEFINE_ENTRANCE(ENTR_CUTSCENE_MAP_0_6, SCENE_CUTSCENE_MAP, 0, true, true, TRANS_TYPE_FILL_WHITE, TRANS_TYPE_FILL_WHITE) +/* 0x0A7 */ DEFINE_ENTRANCE(ENTR_CUTSCENE_MAP_0_7, SCENE_CUTSCENE_MAP, 0, false, true, TRANS_TYPE_INSTANT, TRANS_TYPE_INSTANT) +/* 0x0A8 */ DEFINE_ENTRANCE(ENTR_CUTSCENE_MAP_0_8, SCENE_CUTSCENE_MAP, 0, false, true, TRANS_TYPE_FADE_WHITE, TRANS_TYPE_FADE_WHITE) +/* 0x0A9 */ DEFINE_ENTRANCE(ENTR_CUTSCENE_MAP_0_9, SCENE_CUTSCENE_MAP, 0, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x0AA */ DEFINE_ENTRANCE(ENTR_CUTSCENE_MAP_0_10, SCENE_CUTSCENE_MAP, 0, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x0AB */ DEFINE_ENTRANCE(ENTR_CUTSCENE_MAP_0_11, SCENE_CUTSCENE_MAP, 0, false, true, TRANS_TYPE_FADE_WHITE, TRANS_TYPE_FADE_WHITE) +/* 0x0AC */ DEFINE_ENTRANCE(ENTR_CUTSCENE_MAP_0_12, SCENE_CUTSCENE_MAP, 0, false, true, TRANS_TYPE_FADE_WHITE, TRANS_TYPE_FADE_WHITE) + +/* 0x0AD */ DEFINE_ENTRANCE(ENTR_BACK_ALLEY_DAY_0, SCENE_BACK_ALLEY_DAY, 0, true, true, TRANS_TYPE_FADE_WHITE, TRANS_TYPE_FADE_WHITE) +/* 0x0AE */ DEFINE_ENTRANCE(ENTR_BACK_ALLEY_NIGHT_0_1, SCENE_BACK_ALLEY_NIGHT, 0, true, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x0AF */ DEFINE_ENTRANCE(ENTR_BACK_ALLEY_DAY_0_2, SCENE_BACK_ALLEY_DAY, 0, true, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x0B0 */ DEFINE_ENTRANCE(ENTR_BACK_ALLEY_NIGHT_0_3, SCENE_BACK_ALLEY_NIGHT, 0, true, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) + +/* 0x0B1 */ DEFINE_ENTRANCE(ENTR_MARKET_DAY_0, SCENE_MARKET_DAY, 0, true, true, TRANS_TYPE_FADE_WHITE, TRANS_TYPE_FADE_WHITE) +/* 0x0B2 */ DEFINE_ENTRANCE(ENTR_MARKET_NIGHT_0_1, SCENE_MARKET_NIGHT, 0, true, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x0B3 */ DEFINE_ENTRANCE(ENTR_MARKET_RUINS_0_2, SCENE_MARKET_RUINS, 0, true, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x0B4 */ DEFINE_ENTRANCE(ENTR_MARKET_RUINS_0_3, SCENE_MARKET_RUINS, 0, true, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x0B5 */ DEFINE_ENTRANCE(ENTR_MARKET_DAY_0_4, SCENE_MARKET_DAY, 0, false, true, TRANS_TYPE_WIPE_FAST, TRANS_TYPE_WIPE_FAST) + +/* 0x0B6 */ DEFINE_ENTRANCE(ENTR_DEPTH_TEST_0, SCENE_DEPTH_TEST, 0, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) + +/* 0x0B7 */ DEFINE_ENTRANCE(ENTR_BAZAAR_0, SCENE_BAZAAR, 0, false, true, TRANS_TYPE_FADE_BLACK_FAST, TRANS_TYPE_CIRCLE(TCA_NORMAL, TCC_BLACK, TCS_FAST)) +/* 0x0B8 */ DEFINE_ENTRANCE(ENTR_BAZAAR_0_1, SCENE_BAZAAR, 0, false, true, TRANS_TYPE_FADE_BLACK_FAST, TRANS_TYPE_CIRCLE(TCA_NORMAL, TCC_BLACK, TCS_FAST)) +/* 0x0B9 */ DEFINE_ENTRANCE(ENTR_BAZAAR_0_2, SCENE_BAZAAR, 0, false, true, TRANS_TYPE_FADE_BLACK_FAST, TRANS_TYPE_CIRCLE(TCA_NORMAL, TCC_BLACK, TCS_FAST)) +/* 0x0BA */ DEFINE_ENTRANCE(ENTR_BAZAAR_0_3, SCENE_BAZAAR, 0, false, true, TRANS_TYPE_FADE_BLACK_FAST, TRANS_TYPE_CIRCLE(TCA_NORMAL, TCC_BLACK, TCS_FAST)) + +/* 0x0BB */ DEFINE_ENTRANCE(ENTR_LINKS_HOUSE_0, SCENE_LINKS_HOUSE, 0, false, true, TRANS_TYPE_FADE_BLACK_FAST, TRANS_TYPE_FADE_BLACK_FAST) +/* 0x0BC */ DEFINE_ENTRANCE(ENTR_LINKS_HOUSE_0_1, SCENE_LINKS_HOUSE, 0, false, true, TRANS_TYPE_FADE_BLACK_FAST, TRANS_TYPE_FADE_BLACK_FAST) +/* 0x0BD */ DEFINE_ENTRANCE(ENTR_LINKS_HOUSE_0_2, SCENE_LINKS_HOUSE, 0, false, true, TRANS_TYPE_FADE_BLACK_FAST, TRANS_TYPE_FADE_BLACK_FAST) +/* 0x0BE */ DEFINE_ENTRANCE(ENTR_LINKS_HOUSE_0_3, SCENE_LINKS_HOUSE, 0, false, true, TRANS_TYPE_FADE_BLACK_FAST, TRANS_TYPE_FADE_BLACK_FAST) +/* 0x0BF */ DEFINE_ENTRANCE(ENTR_LINKS_HOUSE_0_4, SCENE_LINKS_HOUSE, 0, false, true, TRANS_TYPE_FADE_BLACK_FAST, TRANS_TYPE_FADE_BLACK) +/* 0x0C0 */ DEFINE_ENTRANCE(ENTR_LINKS_HOUSE_0_5, SCENE_LINKS_HOUSE, 0, false, true, TRANS_TYPE_CS_BLACK_FILL, TRANS_TYPE_CS_BLACK_FILL) + +/* 0x0C1 */ DEFINE_ENTRANCE(ENTR_KOKIRI_SHOP_0, SCENE_KOKIRI_SHOP, 0, false, true, TRANS_TYPE_FADE_BLACK_FAST, TRANS_TYPE_FADE_BLACK_FAST) +/* 0x0C2 */ DEFINE_ENTRANCE(ENTR_KOKIRI_SHOP_0_1, SCENE_KOKIRI_SHOP, 0, false, true, TRANS_TYPE_FADE_BLACK_FAST, TRANS_TYPE_FADE_BLACK_FAST) +/* 0x0C3 */ DEFINE_ENTRANCE(ENTR_KOKIRI_SHOP_0_2, SCENE_KOKIRI_SHOP, 0, false, true, TRANS_TYPE_FADE_BLACK_FAST, TRANS_TYPE_FADE_BLACK_FAST) +/* 0x0C4 */ DEFINE_ENTRANCE(ENTR_KOKIRI_SHOP_0_3, SCENE_KOKIRI_SHOP, 0, false, true, TRANS_TYPE_FADE_BLACK_FAST, TRANS_TYPE_FADE_BLACK_FAST) + +/* 0x0C5 */ DEFINE_ENTRANCE(ENTR_DODONGOS_CAVERN_1, SCENE_DODONGOS_CAVERN, 1, true, false, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x0C6 */ DEFINE_ENTRANCE(ENTR_DODONGOS_CAVERN_1_1, SCENE_DODONGOS_CAVERN, 1, true, false, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x0C7 */ DEFINE_ENTRANCE(ENTR_DODONGOS_CAVERN_1_2, SCENE_DODONGOS_CAVERN, 1, true, false, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x0C8 */ DEFINE_ENTRANCE(ENTR_DODONGOS_CAVERN_1_3, SCENE_DODONGOS_CAVERN, 1, true, false, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) + +/* 0x0C9 */ DEFINE_ENTRANCE(ENTR_KNOW_IT_ALL_BROS_HOUSE_0, SCENE_KNOW_IT_ALL_BROS_HOUSE, 0, false, true, TRANS_TYPE_FADE_BLACK_FAST, TRANS_TYPE_FADE_BLACK_FAST) +/* 0x0CA */ DEFINE_ENTRANCE(ENTR_KNOW_IT_ALL_BROS_HOUSE_0_1, SCENE_KNOW_IT_ALL_BROS_HOUSE, 0, false, true, TRANS_TYPE_FADE_BLACK_FAST, TRANS_TYPE_FADE_BLACK_FAST) +/* 0x0CB */ DEFINE_ENTRANCE(ENTR_KNOW_IT_ALL_BROS_HOUSE_0_2, SCENE_KNOW_IT_ALL_BROS_HOUSE, 0, false, true, TRANS_TYPE_FADE_BLACK_FAST, TRANS_TYPE_FADE_BLACK_FAST) +/* 0x0CC */ DEFINE_ENTRANCE(ENTR_KNOW_IT_ALL_BROS_HOUSE_0_3, SCENE_KNOW_IT_ALL_BROS_HOUSE, 0, false, true, TRANS_TYPE_FADE_BLACK_FAST, TRANS_TYPE_FADE_BLACK_FAST) + +/* 0x0CD */ DEFINE_ENTRANCE(ENTR_HYRULE_FIELD_0, SCENE_HYRULE_FIELD, 0, false, true, TRANS_TYPE_FADE_WHITE, TRANS_TYPE_FADE_WHITE) +/* 0x0CE */ DEFINE_ENTRANCE(ENTR_HYRULE_FIELD_0_1, SCENE_HYRULE_FIELD, 0, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x0CF */ DEFINE_ENTRANCE(ENTR_HYRULE_FIELD_0_2, SCENE_HYRULE_FIELD, 0, false, true, TRANS_TYPE_FADE_WHITE, TRANS_TYPE_FADE_WHITE) +/* 0x0D0 */ DEFINE_ENTRANCE(ENTR_HYRULE_FIELD_0_3, SCENE_HYRULE_FIELD, 0, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x0D1 */ DEFINE_ENTRANCE(ENTR_HYRULE_FIELD_0_4, SCENE_HYRULE_FIELD, 0, false, true, TRANS_TYPE_FADE_BLACK_FAST, TRANS_TYPE_FADE_BLACK) +/* 0x0D2 */ DEFINE_ENTRANCE(ENTR_HYRULE_FIELD_0_5, SCENE_HYRULE_FIELD, 0, false, true, TRANS_TYPE_CIRCLE(TCA_NORMAL, TCC_BLACK, TCS_SLOW), TRANS_TYPE_CIRCLE(TCA_NORMAL, TCC_BLACK, TCS_SLOW)) +/* 0x0D3 */ DEFINE_ENTRANCE(ENTR_HYRULE_FIELD_0_6, SCENE_HYRULE_FIELD, 0, false, true, TRANS_TYPE_CIRCLE(TCA_NORMAL, TCC_BLACK, TCS_SLOW), TRANS_TYPE_CIRCLE(TCA_NORMAL, TCC_BLACK, TCS_SLOW)) +/* 0x0D4 */ DEFINE_ENTRANCE(ENTR_HYRULE_FIELD_0_7, SCENE_HYRULE_FIELD, 0, false, true, TRANS_TYPE_CIRCLE(TCA_WAVE, TCC_BLACK, TCS_SLOW), TRANS_TYPE_CIRCLE(TCA_WAVE, TCC_BLACK, TCS_SLOW)) +/* 0x0D5 */ DEFINE_ENTRANCE(ENTR_HYRULE_FIELD_0_8, SCENE_HYRULE_FIELD, 0, false, true, TRANS_TYPE_FADE_WHITE, TRANS_TYPE_FADE_WHITE) +/* 0x0D6 */ DEFINE_ENTRANCE(ENTR_HYRULE_FIELD_0_9, SCENE_HYRULE_FIELD, 0, true, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x0D7 */ DEFINE_ENTRANCE(ENTR_HYRULE_FIELD_0_10, SCENE_HYRULE_FIELD, 0, false, true, TRANS_TYPE_CIRCLE(TCA_WAVE, TCC_BLACK, TCS_SLOW), TRANS_TYPE_CIRCLE(TCA_WAVE, TCC_BLACK, TCS_SLOW)) +/* 0x0D8 */ DEFINE_ENTRANCE(ENTR_HYRULE_FIELD_0_11, SCENE_HYRULE_FIELD, 0, false, true, TRANS_TYPE_FADE_WHITE, TRANS_TYPE_FADE_WHITE) +/* 0x0D9 */ DEFINE_ENTRANCE(ENTR_HYRULE_FIELD_0_12, SCENE_HYRULE_FIELD, 0, false, true, TRANS_TYPE_CIRCLE(TCA_NORMAL, TCC_WHITE, TCS_SLOW), TRANS_TYPE_CIRCLE(TCA_NORMAL, TCC_WHITE, TCS_SLOW)) +/* 0x0DA */ DEFINE_ENTRANCE(ENTR_HYRULE_FIELD_0_13, SCENE_HYRULE_FIELD, 0, true, true, TRANS_TYPE_FADE_WHITE, TRANS_TYPE_FADE_WHITE) + +/* 0x0DB */ DEFINE_ENTRANCE(ENTR_KAKARIKO_VILLAGE_0, SCENE_KAKARIKO_VILLAGE, 0, false, true, TRANS_TYPE_FADE_WHITE, TRANS_TYPE_FADE_WHITE) +/* 0x0DC */ DEFINE_ENTRANCE(ENTR_KAKARIKO_VILLAGE_0_1, SCENE_KAKARIKO_VILLAGE, 0, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x0DD */ DEFINE_ENTRANCE(ENTR_KAKARIKO_VILLAGE_0_2, SCENE_KAKARIKO_VILLAGE, 0, false, true, TRANS_TYPE_FADE_WHITE, TRANS_TYPE_FADE_WHITE) +/* 0x0DE */ DEFINE_ENTRANCE(ENTR_KAKARIKO_VILLAGE_0_3, SCENE_KAKARIKO_VILLAGE, 0, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x0DF */ DEFINE_ENTRANCE(ENTR_KAKARIKO_VILLAGE_0_4, SCENE_KAKARIKO_VILLAGE, 0, false, true, TRANS_TYPE_CIRCLE(TCA_STARBURST,TCC_BLACK, TCS_FAST), TRANS_TYPE_CIRCLE(TCA_STARBURST,TCC_BLACK, TCS_FAST)) +/* 0x0E0 */ DEFINE_ENTRANCE(ENTR_KAKARIKO_VILLAGE_0_5, SCENE_KAKARIKO_VILLAGE, 0, false, true, TRANS_TYPE_CIRCLE(TCA_NORMAL, TCC_BLACK, TCS_SLOW), TRANS_TYPE_CIRCLE(TCA_NORMAL, TCC_BLACK, TCS_SLOW)) +/* 0x0E1 */ DEFINE_ENTRANCE(ENTR_KAKARIKO_VILLAGE_0_6, SCENE_KAKARIKO_VILLAGE, 0, true, true, TRANS_TYPE_CIRCLE(TCA_NORMAL, TCC_BLACK, TCS_SLOW), TRANS_TYPE_CIRCLE(TCA_NORMAL, TCC_BLACK, TCS_SLOW)) +/* 0x0E2 */ DEFINE_ENTRANCE(ENTR_KAKARIKO_VILLAGE_0_7, SCENE_KAKARIKO_VILLAGE, 0, false, true, TRANS_TYPE_CIRCLE(TCA_NORMAL, TCC_BLACK, TCS_SLOW), TRANS_TYPE_CIRCLE(TCA_NORMAL, TCC_BLACK, TCS_SLOW)) +/* 0x0E3 */ DEFINE_ENTRANCE(ENTR_KAKARIKO_VILLAGE_0_8, SCENE_KAKARIKO_VILLAGE, 0, true, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) + +/* 0x0E4 */ DEFINE_ENTRANCE(ENTR_GRAVEYARD_0, SCENE_GRAVEYARD, 0, false, true, TRANS_TYPE_FADE_WHITE, TRANS_TYPE_FADE_WHITE) +/* 0x0E5 */ DEFINE_ENTRANCE(ENTR_GRAVEYARD_0_1, SCENE_GRAVEYARD, 0, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x0E6 */ DEFINE_ENTRANCE(ENTR_GRAVEYARD_0_2, SCENE_GRAVEYARD, 0, false, true, TRANS_TYPE_FADE_WHITE, TRANS_TYPE_FADE_WHITE) +/* 0x0E7 */ DEFINE_ENTRANCE(ENTR_GRAVEYARD_0_3, SCENE_GRAVEYARD, 0, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x0E8 */ DEFINE_ENTRANCE(ENTR_GRAVEYARD_0_4, SCENE_GRAVEYARD, 0, false, true, TRANS_TYPE_FADE_BLACK_FAST, TRANS_TYPE_FADE_BLACK) +/* 0x0E9 */ DEFINE_ENTRANCE(ENTR_GRAVEYARD_0_5, SCENE_GRAVEYARD, 0, true, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) + +/* 0x0EA */ DEFINE_ENTRANCE(ENTR_ZORAS_RIVER_0, SCENE_ZORAS_RIVER, 0, true, true, TRANS_TYPE_FADE_WHITE, TRANS_TYPE_FADE_WHITE) +/* 0x0EB */ DEFINE_ENTRANCE(ENTR_ZORAS_RIVER_0_1, SCENE_ZORAS_RIVER, 0, true, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x0EC */ DEFINE_ENTRANCE(ENTR_ZORAS_RIVER_0_2, SCENE_ZORAS_RIVER, 0, true, true, TRANS_TYPE_FADE_WHITE, TRANS_TYPE_FADE_WHITE) +/* 0x0ED */ DEFINE_ENTRANCE(ENTR_ZORAS_RIVER_0_3, SCENE_ZORAS_RIVER, 0, true, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) + +/* 0x0EE */ DEFINE_ENTRANCE(ENTR_KOKIRI_FOREST_0, SCENE_KOKIRI_FOREST, 0, false, true, TRANS_TYPE_FADE_WHITE, TRANS_TYPE_FADE_WHITE) +/* 0x0EF */ DEFINE_ENTRANCE(ENTR_KOKIRI_FOREST_0_1, SCENE_KOKIRI_FOREST, 0, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x0F0 */ DEFINE_ENTRANCE(ENTR_KOKIRI_FOREST_0_2, SCENE_KOKIRI_FOREST, 0, false, true, TRANS_TYPE_FADE_WHITE, TRANS_TYPE_FADE_WHITE) +/* 0x0F1 */ DEFINE_ENTRANCE(ENTR_KOKIRI_FOREST_0_3, SCENE_KOKIRI_FOREST, 0, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x0F2 */ DEFINE_ENTRANCE(ENTR_KOKIRI_FOREST_0_4, SCENE_KOKIRI_FOREST, 0, true, true, TRANS_TYPE_FILL_WHITE, TRANS_TYPE_FILL_WHITE) +/* 0x0F3 */ DEFINE_ENTRANCE(ENTR_KOKIRI_FOREST_0_5, SCENE_KOKIRI_FOREST, 0, false, true, TRANS_TYPE_FILL_WHITE, TRANS_TYPE_FILL_WHITE) +/* 0x0F4 */ DEFINE_ENTRANCE(ENTR_KOKIRI_FOREST_0_6, SCENE_KOKIRI_FOREST, 0, true, true, TRANS_TYPE_FILL_WHITE, TRANS_TYPE_FILL_WHITE) +/* 0x0F5 */ DEFINE_ENTRANCE(ENTR_KOKIRI_FOREST_0_7, SCENE_KOKIRI_FOREST, 0, false, true, TRANS_TYPE_FADE_WHITE_CS_DELAYED, TRANS_TYPE_FILL_WHITE) +/* 0x0F6 */ DEFINE_ENTRANCE(ENTR_KOKIRI_FOREST_0_8, SCENE_KOKIRI_FOREST, 0, false, true, TRANS_TYPE_FILL_WHITE, TRANS_TYPE_FILL_WHITE) +/* 0x0F7 */ DEFINE_ENTRANCE(ENTR_KOKIRI_FOREST_0_9, SCENE_KOKIRI_FOREST, 0, false, true, TRANS_TYPE_FILL_WHITE, TRANS_TYPE_FILL_WHITE) +/* 0x0F8 */ DEFINE_ENTRANCE(ENTR_KOKIRI_FOREST_0_10, SCENE_KOKIRI_FOREST, 0, true, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x0F9 */ DEFINE_ENTRANCE(ENTR_KOKIRI_FOREST_0_11, SCENE_KOKIRI_FOREST, 0, true, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x0FA */ DEFINE_ENTRANCE(ENTR_KOKIRI_FOREST_0_12, SCENE_KOKIRI_FOREST, 0, true, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x0FB */ DEFINE_ENTRANCE(ENTR_KOKIRI_FOREST_0_13, SCENE_KOKIRI_FOREST, 0, true, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) + +/* 0x0FC */ DEFINE_ENTRANCE(ENTR_SACRED_FOREST_MEADOW_0, SCENE_SACRED_FOREST_MEADOW, 0, true, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x0FD */ DEFINE_ENTRANCE(ENTR_SACRED_FOREST_MEADOW_0_1, SCENE_SACRED_FOREST_MEADOW, 0, true, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x0FE */ DEFINE_ENTRANCE(ENTR_SACRED_FOREST_MEADOW_0_2, SCENE_SACRED_FOREST_MEADOW, 0, true, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x0FF */ DEFINE_ENTRANCE(ENTR_SACRED_FOREST_MEADOW_0_3, SCENE_SACRED_FOREST_MEADOW, 0, true, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x100 */ DEFINE_ENTRANCE(ENTR_SACRED_FOREST_MEADOW_0_4, SCENE_SACRED_FOREST_MEADOW, 0, false, true, TRANS_TYPE_FADE_WHITE, TRANS_TYPE_FADE_WHITE) +/* 0x101 */ DEFINE_ENTRANCE(ENTR_SACRED_FOREST_MEADOW_0_5, SCENE_SACRED_FOREST_MEADOW, 0, false, true, TRANS_TYPE_WIPE, TRANS_TYPE_WIPE) + +/* 0x102 */ DEFINE_ENTRANCE(ENTR_LAKE_HYLIA_0, SCENE_LAKE_HYLIA, 0, true, true, TRANS_TYPE_FADE_WHITE, TRANS_TYPE_FADE_WHITE) +/* 0x103 */ DEFINE_ENTRANCE(ENTR_LAKE_HYLIA_0_1, SCENE_LAKE_HYLIA, 0, true, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x104 */ DEFINE_ENTRANCE(ENTR_LAKE_HYLIA_0_2, SCENE_LAKE_HYLIA, 0, true, true, TRANS_TYPE_FADE_WHITE, TRANS_TYPE_FADE_WHITE) +/* 0x105 */ DEFINE_ENTRANCE(ENTR_LAKE_HYLIA_0_3, SCENE_LAKE_HYLIA, 0, true, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x106 */ DEFINE_ENTRANCE(ENTR_LAKE_HYLIA_0_4, SCENE_LAKE_HYLIA, 0, false, true, TRANS_TYPE_FADE_WHITE, TRANS_TYPE_FADE_WHITE) +/* 0x107 */ DEFINE_ENTRANCE(ENTR_LAKE_HYLIA_0_5, SCENE_LAKE_HYLIA, 0, true, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) + +/* 0x108 */ DEFINE_ENTRANCE(ENTR_ZORAS_DOMAIN_0, SCENE_ZORAS_DOMAIN, 0, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x109 */ DEFINE_ENTRANCE(ENTR_ZORAS_DOMAIN_0_1, SCENE_ZORAS_DOMAIN, 0, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x10A */ DEFINE_ENTRANCE(ENTR_ZORAS_DOMAIN_0_2, SCENE_ZORAS_DOMAIN, 0, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x10B */ DEFINE_ENTRANCE(ENTR_ZORAS_DOMAIN_0_3, SCENE_ZORAS_DOMAIN, 0, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x10C */ DEFINE_ENTRANCE(ENTR_ZORAS_DOMAIN_0_4, SCENE_ZORAS_DOMAIN, 0, true, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x10D */ DEFINE_ENTRANCE(ENTR_ZORAS_DOMAIN_0_5, SCENE_ZORAS_DOMAIN, 0, true, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) + +/* 0x10E */ DEFINE_ENTRANCE(ENTR_ZORAS_FOUNTAIN_0, SCENE_ZORAS_FOUNTAIN, 0, false, true, TRANS_TYPE_FADE_WHITE, TRANS_TYPE_FADE_WHITE) +/* 0x10F */ DEFINE_ENTRANCE(ENTR_ZORAS_FOUNTAIN_0_1, SCENE_ZORAS_FOUNTAIN, 0, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x110 */ DEFINE_ENTRANCE(ENTR_ZORAS_FOUNTAIN_0_2, SCENE_ZORAS_FOUNTAIN, 0, false, true, TRANS_TYPE_FADE_WHITE, TRANS_TYPE_FADE_WHITE) +/* 0x111 */ DEFINE_ENTRANCE(ENTR_ZORAS_FOUNTAIN_0_3, SCENE_ZORAS_FOUNTAIN, 0, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x112 */ DEFINE_ENTRANCE(ENTR_ZORAS_FOUNTAIN_0_4, SCENE_ZORAS_FOUNTAIN, 0, false, true, TRANS_TYPE_FADE_WHITE_CS_DELAYED, TRANS_TYPE_WIPE) +/* 0x113 */ DEFINE_ENTRANCE(ENTR_ZORAS_FOUNTAIN_0_5, SCENE_ZORAS_FOUNTAIN, 0, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x114 */ DEFINE_ENTRANCE(ENTR_ZORAS_FOUNTAIN_0_6, SCENE_ZORAS_FOUNTAIN, 0, true, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x115 */ DEFINE_ENTRANCE(ENTR_ZORAS_FOUNTAIN_0_7, SCENE_ZORAS_FOUNTAIN, 0, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x116 */ DEFINE_ENTRANCE(ENTR_ZORAS_FOUNTAIN_0_8, SCENE_ZORAS_FOUNTAIN, 0, true, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) + +/* 0x117 */ DEFINE_ENTRANCE(ENTR_GERUDO_VALLEY_0, SCENE_GERUDO_VALLEY, 0, false, true, TRANS_TYPE_FADE_WHITE, TRANS_TYPE_FADE_WHITE) +/* 0x118 */ DEFINE_ENTRANCE(ENTR_GERUDO_VALLEY_0_1, SCENE_GERUDO_VALLEY, 0, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x119 */ DEFINE_ENTRANCE(ENTR_GERUDO_VALLEY_0_2, SCENE_GERUDO_VALLEY, 0, false, true, TRANS_TYPE_FADE_WHITE, TRANS_TYPE_FADE_WHITE) +/* 0x11A */ DEFINE_ENTRANCE(ENTR_GERUDO_VALLEY_0_3, SCENE_GERUDO_VALLEY, 0, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x11B */ DEFINE_ENTRANCE(ENTR_GERUDO_VALLEY_0_4, SCENE_GERUDO_VALLEY, 0, true, true, TRANS_TYPE_FILL_BROWN, TRANS_TYPE_FILL_WHITE) +/* 0x11C */ DEFINE_ENTRANCE(ENTR_GERUDO_VALLEY_0_5, SCENE_GERUDO_VALLEY, 0, true, true, TRANS_TYPE_FILL_WHITE, TRANS_TYPE_FILL_WHITE) +/* 0x11D */ DEFINE_ENTRANCE(ENTR_GERUDO_VALLEY_0_6, SCENE_GERUDO_VALLEY, 0, true, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) + +/* 0x11E */ DEFINE_ENTRANCE(ENTR_LOST_WOODS_0, SCENE_LOST_WOODS, 0, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x11F */ DEFINE_ENTRANCE(ENTR_LOST_WOODS_0_1, SCENE_LOST_WOODS, 0, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x120 */ DEFINE_ENTRANCE(ENTR_LOST_WOODS_0_2, SCENE_LOST_WOODS, 0, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x121 */ DEFINE_ENTRANCE(ENTR_LOST_WOODS_0_3, SCENE_LOST_WOODS, 0, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x122 */ DEFINE_ENTRANCE(ENTR_LOST_WOODS_0_4, SCENE_LOST_WOODS, 0, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) + +/* 0x123 */ DEFINE_ENTRANCE(ENTR_DESERT_COLOSSUS_0, SCENE_DESERT_COLOSSUS, 0, true, true, TRANS_TYPE_SANDSTORM_END, TRANS_TYPE_SANDSTORM_END) +/* 0x124 */ DEFINE_ENTRANCE(ENTR_DESERT_COLOSSUS_0_1, SCENE_DESERT_COLOSSUS, 0, true, true, TRANS_TYPE_SANDSTORM_END, TRANS_TYPE_SANDSTORM_END) +/* 0x125 */ DEFINE_ENTRANCE(ENTR_DESERT_COLOSSUS_0_2, SCENE_DESERT_COLOSSUS, 0, true, true, TRANS_TYPE_SANDSTORM_END, TRANS_TYPE_SANDSTORM_END) +/* 0x126 */ DEFINE_ENTRANCE(ENTR_DESERT_COLOSSUS_0_3, SCENE_DESERT_COLOSSUS, 0, true, true, TRANS_TYPE_SANDSTORM_END, TRANS_TYPE_SANDSTORM_END) +/* 0x127 */ DEFINE_ENTRANCE(ENTR_DESERT_COLOSSUS_0_4, SCENE_DESERT_COLOSSUS, 0, true, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x128 */ DEFINE_ENTRANCE(ENTR_DESERT_COLOSSUS_0_5, SCENE_DESERT_COLOSSUS, 0, true, true, TRANS_TYPE_SANDSTORM_END, TRANS_TYPE_SANDSTORM_END) + +/* 0x129 */ DEFINE_ENTRANCE(ENTR_GERUDOS_FORTRESS_0, SCENE_GERUDOS_FORTRESS, 0, true, true, TRANS_TYPE_FADE_WHITE, TRANS_TYPE_FADE_WHITE) +/* 0x12A */ DEFINE_ENTRANCE(ENTR_GERUDOS_FORTRESS_0_1, SCENE_GERUDOS_FORTRESS, 0, true, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x12B */ DEFINE_ENTRANCE(ENTR_GERUDOS_FORTRESS_0_2, SCENE_GERUDOS_FORTRESS, 0, true, true, TRANS_TYPE_FADE_WHITE, TRANS_TYPE_FADE_WHITE) +/* 0x12C */ DEFINE_ENTRANCE(ENTR_GERUDOS_FORTRESS_0_3, SCENE_GERUDOS_FORTRESS, 0, true, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x12D */ DEFINE_ENTRANCE(ENTR_GERUDOS_FORTRESS_0_4, SCENE_GERUDOS_FORTRESS, 0, true, true, TRANS_TYPE_CIRCLE(TCA_NORMAL, TCC_BLACK, TCS_SLOW), TRANS_TYPE_CIRCLE(TCA_NORMAL, TCC_BLACK, TCS_SLOW)) +/* 0x12E */ DEFINE_ENTRANCE(ENTR_GERUDOS_FORTRESS_0_5, SCENE_GERUDOS_FORTRESS, 0, true, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x12F */ DEFINE_ENTRANCE(ENTR_GERUDOS_FORTRESS_0_6, SCENE_GERUDOS_FORTRESS, 0, true, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) + +/* 0x130 */ DEFINE_ENTRANCE(ENTR_HAUNTED_WASTELAND_0, SCENE_HAUNTED_WASTELAND, 0, true, true, TRANS_TYPE_SANDSTORM_PERSIST, TRANS_TYPE_SANDSTORM_PERSIST) +/* 0x131 */ DEFINE_ENTRANCE(ENTR_HAUNTED_WASTELAND_0_1, SCENE_HAUNTED_WASTELAND, 0, true, true, TRANS_TYPE_SANDSTORM_PERSIST, TRANS_TYPE_SANDSTORM_PERSIST) +/* 0x132 */ DEFINE_ENTRANCE(ENTR_HAUNTED_WASTELAND_0_2, SCENE_HAUNTED_WASTELAND, 0, true, true, TRANS_TYPE_SANDSTORM_PERSIST, TRANS_TYPE_SANDSTORM_PERSIST) +/* 0x133 */ DEFINE_ENTRANCE(ENTR_HAUNTED_WASTELAND_0_3, SCENE_HAUNTED_WASTELAND, 0, true, true, TRANS_TYPE_SANDSTORM_PERSIST, TRANS_TYPE_SANDSTORM_PERSIST) + +/* 0x134 */ DEFINE_ENTRANCE(ENTR_GANONS_TOWER_COLLAPSE_INTERIOR_1, SCENE_GANONS_TOWER_COLLAPSE_INTERIOR, 1, true, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x135 */ DEFINE_ENTRANCE(ENTR_GANONS_TOWER_COLLAPSE_INTERIOR_1_1, SCENE_GANONS_TOWER_COLLAPSE_INTERIOR, 1, true, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x136 */ DEFINE_ENTRANCE(ENTR_GANONS_TOWER_COLLAPSE_INTERIOR_1_2, SCENE_GANONS_TOWER_COLLAPSE_INTERIOR, 1, true, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x137 */ DEFINE_ENTRANCE(ENTR_GANONS_TOWER_COLLAPSE_INTERIOR_1_3, SCENE_GANONS_TOWER_COLLAPSE_INTERIOR, 1, true, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) + +/* 0x138 */ DEFINE_ENTRANCE(ENTR_HYRULE_CASTLE_0, SCENE_HYRULE_CASTLE, 0, false, true, TRANS_TYPE_FADE_WHITE, TRANS_TYPE_FADE_WHITE) +/* 0x139 */ DEFINE_ENTRANCE(ENTR_HYRULE_CASTLE_0_1, SCENE_HYRULE_CASTLE, 0, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x13A */ DEFINE_ENTRANCE(ENTR_OUTSIDE_GANONS_CASTLE_0_2, SCENE_OUTSIDE_GANONS_CASTLE, 0, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x13B */ DEFINE_ENTRANCE(ENTR_OUTSIDE_GANONS_CASTLE_0_3, SCENE_OUTSIDE_GANONS_CASTLE, 0, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x13C */ DEFINE_ENTRANCE(ENTR_OUTSIDE_GANONS_CASTLE_0_4, SCENE_OUTSIDE_GANONS_CASTLE, 0, false, true, TRANS_TYPE_FADE_BLACK_FAST, TRANS_TYPE_FADE_BLACK) + +/* 0x13D */ DEFINE_ENTRANCE(ENTR_DEATH_MOUNTAIN_TRAIL_0, SCENE_DEATH_MOUNTAIN_TRAIL, 0, false, true, TRANS_TYPE_FADE_WHITE, TRANS_TYPE_FADE_WHITE) +/* 0x13E */ DEFINE_ENTRANCE(ENTR_DEATH_MOUNTAIN_TRAIL_0_1, SCENE_DEATH_MOUNTAIN_TRAIL, 0, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x13F */ DEFINE_ENTRANCE(ENTR_DEATH_MOUNTAIN_TRAIL_0_2, SCENE_DEATH_MOUNTAIN_TRAIL, 0, false, true, TRANS_TYPE_FADE_WHITE, TRANS_TYPE_FADE_WHITE) +/* 0x140 */ DEFINE_ENTRANCE(ENTR_DEATH_MOUNTAIN_TRAIL_0_3, SCENE_DEATH_MOUNTAIN_TRAIL, 0, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x141 */ DEFINE_ENTRANCE(ENTR_DEATH_MOUNTAIN_TRAIL_0_4, SCENE_DEATH_MOUNTAIN_TRAIL, 0, true, true, TRANS_TYPE_FILL_WHITE, TRANS_TYPE_FILL_WHITE) +/* 0x142 */ DEFINE_ENTRANCE(ENTR_DEATH_MOUNTAIN_TRAIL_0_5, SCENE_DEATH_MOUNTAIN_TRAIL, 0, false, true, TRANS_TYPE_FADE_WHITE, TRANS_TYPE_FADE_WHITE) +/* 0x143 */ DEFINE_ENTRANCE(ENTR_DEATH_MOUNTAIN_TRAIL_0_6, SCENE_DEATH_MOUNTAIN_TRAIL, 0, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x144 */ DEFINE_ENTRANCE(ENTR_DEATH_MOUNTAIN_TRAIL_0_7, SCENE_DEATH_MOUNTAIN_TRAIL, 0, true, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x145 */ DEFINE_ENTRANCE(ENTR_DEATH_MOUNTAIN_TRAIL_0_8, SCENE_DEATH_MOUNTAIN_TRAIL, 0, true, true, TRANS_TYPE_FADE_WHITE, TRANS_TYPE_FADE_WHITE) +/* 0x146 */ DEFINE_ENTRANCE(ENTR_DEATH_MOUNTAIN_TRAIL_0_9, SCENE_DEATH_MOUNTAIN_TRAIL, 0, true, true, TRANS_TYPE_FADE_WHITE, TRANS_TYPE_FADE_WHITE) + +/* 0x147 */ DEFINE_ENTRANCE(ENTR_DEATH_MOUNTAIN_CRATER_0, SCENE_DEATH_MOUNTAIN_CRATER, 0, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x148 */ DEFINE_ENTRANCE(ENTR_DEATH_MOUNTAIN_CRATER_0_1, SCENE_DEATH_MOUNTAIN_CRATER, 0, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x149 */ DEFINE_ENTRANCE(ENTR_DEATH_MOUNTAIN_CRATER_0_2, SCENE_DEATH_MOUNTAIN_CRATER, 0, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x14A */ DEFINE_ENTRANCE(ENTR_DEATH_MOUNTAIN_CRATER_0_3, SCENE_DEATH_MOUNTAIN_CRATER, 0, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x14B */ DEFINE_ENTRANCE(ENTR_DEATH_MOUNTAIN_CRATER_0_4, SCENE_DEATH_MOUNTAIN_CRATER, 0, false, true, TRANS_TYPE_FADE_WHITE, TRANS_TYPE_FADE_WHITE) +/* 0x14C */ DEFINE_ENTRANCE(ENTR_DEATH_MOUNTAIN_CRATER_0_5, SCENE_DEATH_MOUNTAIN_CRATER, 0, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) + +/* 0x14D */ DEFINE_ENTRANCE(ENTR_GORON_CITY_0, SCENE_GORON_CITY, 0, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x14E */ DEFINE_ENTRANCE(ENTR_GORON_CITY_0_1, SCENE_GORON_CITY, 0, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x14F */ DEFINE_ENTRANCE(ENTR_GORON_CITY_0_2, SCENE_GORON_CITY, 0, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x150 */ DEFINE_ENTRANCE(ENTR_GORON_CITY_0_3, SCENE_GORON_CITY, 0, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x151 */ DEFINE_ENTRANCE(ENTR_GORON_CITY_0_4, SCENE_GORON_CITY, 0, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x152 */ DEFINE_ENTRANCE(ENTR_GORON_CITY_0_5, SCENE_GORON_CITY, 0, true, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) + +/* 0x153 */ DEFINE_ENTRANCE(ENTR_ZORAS_DOMAIN_3, SCENE_ZORAS_DOMAIN, 3, false, true, TRANS_TYPE_WIPE, TRANS_TYPE_WIPE) +/* 0x154 */ DEFINE_ENTRANCE(ENTR_ZORAS_DOMAIN_3_1, SCENE_ZORAS_DOMAIN, 3, false, true, TRANS_TYPE_WIPE, TRANS_TYPE_WIPE) +/* 0x155 */ DEFINE_ENTRANCE(ENTR_ZORAS_DOMAIN_3_2, SCENE_ZORAS_DOMAIN, 3, false, true, TRANS_TYPE_WIPE, TRANS_TYPE_WIPE) +/* 0x156 */ DEFINE_ENTRANCE(ENTR_ZORAS_DOMAIN_3_3, SCENE_ZORAS_DOMAIN, 3, false, true, TRANS_TYPE_WIPE, TRANS_TYPE_WIPE) + +/* 0x157 */ DEFINE_ENTRANCE(ENTR_LON_LON_RANCH_0, SCENE_LON_LON_RANCH, 0, false, true, TRANS_TYPE_FADE_WHITE, TRANS_TYPE_FADE_WHITE) +/* 0x158 */ DEFINE_ENTRANCE(ENTR_LON_LON_RANCH_0_1, SCENE_LON_LON_RANCH, 0, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x159 */ DEFINE_ENTRANCE(ENTR_LON_LON_RANCH_0_2, SCENE_LON_LON_RANCH, 0, false, true, TRANS_TYPE_FADE_WHITE, TRANS_TYPE_FADE_WHITE) +/* 0x15A */ DEFINE_ENTRANCE(ENTR_LON_LON_RANCH_0_3, SCENE_LON_LON_RANCH, 0, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x15B */ DEFINE_ENTRANCE(ENTR_LON_LON_RANCH_0_4, SCENE_LON_LON_RANCH, 0, false, true, TRANS_TYPE_CIRCLE(TCA_NORMAL, TCC_BLACK, TCS_FAST), TRANS_TYPE_CIRCLE(TCA_NORMAL, TCC_BLACK, TCS_FAST)) +/* 0x15C */ DEFINE_ENTRANCE(ENTR_LON_LON_RANCH_0_5, SCENE_LON_LON_RANCH, 0, false, true, TRANS_TYPE_CIRCLE(TCA_WAVE, TCC_WHITE, TCS_FAST), TRANS_TYPE_CIRCLE(TCA_WAVE, TCC_WHITE, TCS_FAST)) +/* 0x15D */ DEFINE_ENTRANCE(ENTR_LON_LON_RANCH_0_6, SCENE_LON_LON_RANCH, 0, true, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x15E */ DEFINE_ENTRANCE(ENTR_LON_LON_RANCH_0_7, SCENE_LON_LON_RANCH, 0, true, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x15F */ DEFINE_ENTRANCE(ENTR_LON_LON_RANCH_0_8, SCENE_LON_LON_RANCH, 0, true, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x160 */ DEFINE_ENTRANCE(ENTR_LON_LON_RANCH_0_9, SCENE_LON_LON_RANCH, 0, true, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x161 */ DEFINE_ENTRANCE(ENTR_LON_LON_RANCH_0_10, SCENE_LON_LON_RANCH, 0, true, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x162 */ DEFINE_ENTRANCE(ENTR_LON_LON_RANCH_0_11, SCENE_LON_LON_RANCH, 0, true, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x163 */ DEFINE_ENTRANCE(ENTR_LON_LON_RANCH_0_12, SCENE_LON_LON_RANCH, 0, true, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x164 */ DEFINE_ENTRANCE(ENTR_LON_LON_RANCH_0_13, SCENE_LON_LON_RANCH, 0, true, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) + +/* 0x165 */ DEFINE_ENTRANCE(ENTR_FIRE_TEMPLE_0, SCENE_FIRE_TEMPLE, 0, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x166 */ DEFINE_ENTRANCE(ENTR_FIRE_TEMPLE_0_1, SCENE_FIRE_TEMPLE, 0, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x167 */ DEFINE_ENTRANCE(ENTR_FIRE_TEMPLE_0_2, SCENE_FIRE_TEMPLE, 0, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x168 */ DEFINE_ENTRANCE(ENTR_FIRE_TEMPLE_0_3, SCENE_FIRE_TEMPLE, 0, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) + +/* 0x169 */ DEFINE_ENTRANCE(ENTR_FOREST_TEMPLE_0, SCENE_FOREST_TEMPLE, 0, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x16A */ DEFINE_ENTRANCE(ENTR_FOREST_TEMPLE_0_1, SCENE_FOREST_TEMPLE, 0, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x16B */ DEFINE_ENTRANCE(ENTR_FOREST_TEMPLE_0_2, SCENE_FOREST_TEMPLE, 0, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x16C */ DEFINE_ENTRANCE(ENTR_FOREST_TEMPLE_0_3, SCENE_FOREST_TEMPLE, 0, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) + +/* 0x16D */ DEFINE_ENTRANCE(ENTR_SHOOTING_GALLERY_1, SCENE_SHOOTING_GALLERY, 1, false, true, TRANS_TYPE_FADE_BLACK_FAST, TRANS_TYPE_CIRCLE(TCA_NORMAL, TCC_BLACK, TCS_FAST)) +/* 0x16E */ DEFINE_ENTRANCE(ENTR_SHOOTING_GALLERY_1_1, SCENE_SHOOTING_GALLERY, 1, false, true, TRANS_TYPE_FADE_BLACK_FAST, TRANS_TYPE_CIRCLE(TCA_NORMAL, TCC_BLACK, TCS_FAST)) +/* 0x16F */ DEFINE_ENTRANCE(ENTR_SHOOTING_GALLERY_1_2, SCENE_SHOOTING_GALLERY, 1, false, true, TRANS_TYPE_FADE_BLACK_FAST, TRANS_TYPE_CIRCLE(TCA_NORMAL, TCC_BLACK, TCS_FAST)) +/* 0x170 */ DEFINE_ENTRANCE(ENTR_SHOOTING_GALLERY_1_3, SCENE_SHOOTING_GALLERY, 1, false, true, TRANS_TYPE_FADE_BLACK_FAST, TRANS_TYPE_CIRCLE(TCA_NORMAL, TCC_BLACK, TCS_FAST)) + +/* 0x171 */ DEFINE_ENTRANCE(ENTR_TEMPLE_OF_TIME_EXTERIOR_DAY_0, SCENE_TEMPLE_OF_TIME_EXTERIOR_DAY, 0, false, true, TRANS_TYPE_FADE_WHITE, TRANS_TYPE_FADE_WHITE) +/* 0x172 */ DEFINE_ENTRANCE(ENTR_TEMPLE_OF_TIME_EXTERIOR_NIGHT_0_1, SCENE_TEMPLE_OF_TIME_EXTERIOR_NIGHT, 0, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x173 */ DEFINE_ENTRANCE(ENTR_TEMPLE_OF_TIME_EXTERIOR_RUINS_0_2, SCENE_TEMPLE_OF_TIME_EXTERIOR_RUINS, 0, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x174 */ DEFINE_ENTRANCE(ENTR_TEMPLE_OF_TIME_EXTERIOR_RUINS_0_3, SCENE_TEMPLE_OF_TIME_EXTERIOR_RUINS, 0, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) + +/* 0x175 */ DEFINE_ENTRANCE(ENTR_FIRE_TEMPLE_1, SCENE_FIRE_TEMPLE, 1, true, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x176 */ DEFINE_ENTRANCE(ENTR_FIRE_TEMPLE_1_1, SCENE_FIRE_TEMPLE, 1, true, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x177 */ DEFINE_ENTRANCE(ENTR_FIRE_TEMPLE_1_2, SCENE_FIRE_TEMPLE, 1, true, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x178 */ DEFINE_ENTRANCE(ENTR_FIRE_TEMPLE_1_3, SCENE_FIRE_TEMPLE, 1, true, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) + +/* 0x179 */ DEFINE_ENTRANCE(ENTR_GANONS_TOWER_COLLAPSE_INTERIOR_0, SCENE_GANONS_TOWER_COLLAPSE_INTERIOR, 0, true, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x17A */ DEFINE_ENTRANCE(ENTR_GANONS_TOWER_COLLAPSE_INTERIOR_0_1, SCENE_GANONS_TOWER_COLLAPSE_INTERIOR, 0, true, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x17B */ DEFINE_ENTRANCE(ENTR_GANONS_TOWER_COLLAPSE_INTERIOR_0_2, SCENE_GANONS_TOWER_COLLAPSE_INTERIOR, 0, true, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x17C */ DEFINE_ENTRANCE(ENTR_GANONS_TOWER_COLLAPSE_INTERIOR_0_3, SCENE_GANONS_TOWER_COLLAPSE_INTERIOR, 0, true, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) + +/* 0x17D */ DEFINE_ENTRANCE(ENTR_HYRULE_FIELD_1, SCENE_HYRULE_FIELD, 1, false, true, TRANS_TYPE_FADE_WHITE, TRANS_TYPE_FADE_WHITE) +/* 0x17E */ DEFINE_ENTRANCE(ENTR_HYRULE_FIELD_1_1, SCENE_HYRULE_FIELD, 1, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x17F */ DEFINE_ENTRANCE(ENTR_HYRULE_FIELD_1_2, SCENE_HYRULE_FIELD, 1, false, true, TRANS_TYPE_FADE_WHITE, TRANS_TYPE_FADE_WHITE) +/* 0x180 */ DEFINE_ENTRANCE(ENTR_HYRULE_FIELD_1_3, SCENE_HYRULE_FIELD, 1, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) + +/* 0x181 */ DEFINE_ENTRANCE(ENTR_HYRULE_FIELD_2, SCENE_HYRULE_FIELD, 2, true, true, TRANS_TYPE_FADE_WHITE, TRANS_TYPE_FADE_WHITE) +/* 0x182 */ DEFINE_ENTRANCE(ENTR_HYRULE_FIELD_2_1, SCENE_HYRULE_FIELD, 2, true, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x183 */ DEFINE_ENTRANCE(ENTR_HYRULE_FIELD_2_2, SCENE_HYRULE_FIELD, 2, true, true, TRANS_TYPE_FADE_WHITE, TRANS_TYPE_FADE_WHITE) +/* 0x184 */ DEFINE_ENTRANCE(ENTR_HYRULE_FIELD_2_3, SCENE_HYRULE_FIELD, 2, true, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) + +/* 0x185 */ DEFINE_ENTRANCE(ENTR_HYRULE_FIELD_3, SCENE_HYRULE_FIELD, 3, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x186 */ DEFINE_ENTRANCE(ENTR_HYRULE_FIELD_3_1, SCENE_HYRULE_FIELD, 3, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x187 */ DEFINE_ENTRANCE(ENTR_HYRULE_FIELD_3_2, SCENE_HYRULE_FIELD, 3, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x188 */ DEFINE_ENTRANCE(ENTR_HYRULE_FIELD_3_3, SCENE_HYRULE_FIELD, 3, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) + +/* 0x189 */ DEFINE_ENTRANCE(ENTR_HYRULE_FIELD_4, SCENE_HYRULE_FIELD, 4, true, true, TRANS_TYPE_FADE_WHITE, TRANS_TYPE_FADE_WHITE) +/* 0x18A */ DEFINE_ENTRANCE(ENTR_HYRULE_FIELD_4_1, SCENE_HYRULE_FIELD, 4, true, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x18B */ DEFINE_ENTRANCE(ENTR_HYRULE_FIELD_4_2, SCENE_HYRULE_FIELD, 4, true, true, TRANS_TYPE_FADE_WHITE, TRANS_TYPE_FADE_WHITE) +/* 0x18C */ DEFINE_ENTRANCE(ENTR_HYRULE_FIELD_4_3, SCENE_HYRULE_FIELD, 4, true, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) + +/* 0x18D */ DEFINE_ENTRANCE(ENTR_HYRULE_FIELD_5, SCENE_HYRULE_FIELD, 5, false, true, TRANS_TYPE_FADE_WHITE, TRANS_TYPE_FADE_WHITE) +/* 0x18E */ DEFINE_ENTRANCE(ENTR_HYRULE_FIELD_5_1, SCENE_HYRULE_FIELD, 5, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x18F */ DEFINE_ENTRANCE(ENTR_HYRULE_FIELD_5_2, SCENE_HYRULE_FIELD, 5, false, true, TRANS_TYPE_FADE_WHITE, TRANS_TYPE_FADE_WHITE) +/* 0x190 */ DEFINE_ENTRANCE(ENTR_HYRULE_FIELD_5_3, SCENE_HYRULE_FIELD, 5, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) + +/* 0x191 */ DEFINE_ENTRANCE(ENTR_KAKARIKO_VILLAGE_1, SCENE_KAKARIKO_VILLAGE, 1, false, true, TRANS_TYPE_FADE_WHITE, TRANS_TYPE_FADE_WHITE) +/* 0x192 */ DEFINE_ENTRANCE(ENTR_KAKARIKO_VILLAGE_1_1, SCENE_KAKARIKO_VILLAGE, 1, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x193 */ DEFINE_ENTRANCE(ENTR_KAKARIKO_VILLAGE_1_2, SCENE_KAKARIKO_VILLAGE, 1, false, true, TRANS_TYPE_FADE_WHITE, TRANS_TYPE_FADE_WHITE) +/* 0x194 */ DEFINE_ENTRANCE(ENTR_KAKARIKO_VILLAGE_1_3, SCENE_KAKARIKO_VILLAGE, 1, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) + +/* 0x195 */ DEFINE_ENTRANCE(ENTR_KAKARIKO_VILLAGE_2, SCENE_KAKARIKO_VILLAGE, 2, false, true, TRANS_TYPE_FADE_WHITE, TRANS_TYPE_FADE_WHITE) +/* 0x196 */ DEFINE_ENTRANCE(ENTR_KAKARIKO_VILLAGE_2_1, SCENE_KAKARIKO_VILLAGE, 2, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x197 */ DEFINE_ENTRANCE(ENTR_KAKARIKO_VILLAGE_2_2, SCENE_KAKARIKO_VILLAGE, 2, false, true, TRANS_TYPE_FADE_WHITE, TRANS_TYPE_FADE_WHITE) +/* 0x198 */ DEFINE_ENTRANCE(ENTR_KAKARIKO_VILLAGE_2_3, SCENE_KAKARIKO_VILLAGE, 2, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) + +/* 0x199 */ DEFINE_ENTRANCE(ENTR_ZORAS_RIVER_1, SCENE_ZORAS_RIVER, 1, true, true, TRANS_TYPE_FADE_WHITE, TRANS_TYPE_FADE_WHITE) +/* 0x19A */ DEFINE_ENTRANCE(ENTR_ZORAS_RIVER_1_1, SCENE_ZORAS_RIVER, 1, true, true, TRANS_TYPE_FADE_WHITE, TRANS_TYPE_FADE_WHITE) +/* 0x19B */ DEFINE_ENTRANCE(ENTR_ZORAS_RIVER_1_2, SCENE_ZORAS_RIVER, 1, true, true, TRANS_TYPE_FADE_WHITE, TRANS_TYPE_FADE_WHITE) +/* 0x19C */ DEFINE_ENTRANCE(ENTR_ZORAS_RIVER_1_3, SCENE_ZORAS_RIVER, 1, true, true, TRANS_TYPE_FADE_WHITE, TRANS_TYPE_FADE_WHITE) + +/* 0x19D */ DEFINE_ENTRANCE(ENTR_ZORAS_RIVER_2, SCENE_ZORAS_RIVER, 2, false, true, TRANS_TYPE_FADE_WHITE, TRANS_TYPE_FADE_WHITE) +/* 0x19E */ DEFINE_ENTRANCE(ENTR_ZORAS_RIVER_2_1, SCENE_ZORAS_RIVER, 2, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x19F */ DEFINE_ENTRANCE(ENTR_ZORAS_RIVER_2_2, SCENE_ZORAS_RIVER, 2, false, true, TRANS_TYPE_FADE_WHITE, TRANS_TYPE_FADE_WHITE) +/* 0x1A0 */ DEFINE_ENTRANCE(ENTR_ZORAS_RIVER_2_3, SCENE_ZORAS_RIVER, 2, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) + +/* 0x1A1 */ DEFINE_ENTRANCE(ENTR_ZORAS_DOMAIN_1, SCENE_ZORAS_DOMAIN, 1, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x1A2 */ DEFINE_ENTRANCE(ENTR_ZORAS_DOMAIN_1_1, SCENE_ZORAS_DOMAIN, 1, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x1A3 */ DEFINE_ENTRANCE(ENTR_ZORAS_DOMAIN_1_2, SCENE_ZORAS_DOMAIN, 1, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x1A4 */ DEFINE_ENTRANCE(ENTR_ZORAS_DOMAIN_1_3, SCENE_ZORAS_DOMAIN, 1, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) + +/* 0x1A5 */ DEFINE_ENTRANCE(ENTR_GERUDO_VALLEY_1, SCENE_GERUDO_VALLEY, 1, false, true, TRANS_TYPE_FADE_WHITE, TRANS_TYPE_FADE_WHITE) +/* 0x1A6 */ DEFINE_ENTRANCE(ENTR_GERUDO_VALLEY_1_1, SCENE_GERUDO_VALLEY, 1, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x1A7 */ DEFINE_ENTRANCE(ENTR_GERUDO_VALLEY_1_2, SCENE_GERUDO_VALLEY, 1, false, true, TRANS_TYPE_FADE_WHITE, TRANS_TYPE_FADE_WHITE) +/* 0x1A8 */ DEFINE_ENTRANCE(ENTR_GERUDO_VALLEY_1_3, SCENE_GERUDO_VALLEY, 1, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) + +/* 0x1A9 */ DEFINE_ENTRANCE(ENTR_LOST_WOODS_1, SCENE_LOST_WOODS, 1, true, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x1AA */ DEFINE_ENTRANCE(ENTR_LOST_WOODS_1_1, SCENE_LOST_WOODS, 1, true, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x1AB */ DEFINE_ENTRANCE(ENTR_LOST_WOODS_1_2, SCENE_LOST_WOODS, 1, true, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x1AC */ DEFINE_ENTRANCE(ENTR_LOST_WOODS_1_3, SCENE_LOST_WOODS, 1, true, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) + +/* 0x1AD */ DEFINE_ENTRANCE(ENTR_LOST_WOODS_2, SCENE_LOST_WOODS, 2, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x1AE */ DEFINE_ENTRANCE(ENTR_LOST_WOODS_2_1, SCENE_LOST_WOODS, 2, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x1AF */ DEFINE_ENTRANCE(ENTR_LOST_WOODS_2_2, SCENE_LOST_WOODS, 2, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x1B0 */ DEFINE_ENTRANCE(ENTR_LOST_WOODS_2_3, SCENE_LOST_WOODS, 2, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) + +/* 0x1B1 */ DEFINE_ENTRANCE(ENTR_LOST_WOODS_3, SCENE_LOST_WOODS, 3, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x1B2 */ DEFINE_ENTRANCE(ENTR_LOST_WOODS_3_1, SCENE_LOST_WOODS, 3, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x1B3 */ DEFINE_ENTRANCE(ENTR_LOST_WOODS_3_2, SCENE_LOST_WOODS, 3, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x1B4 */ DEFINE_ENTRANCE(ENTR_LOST_WOODS_3_3, SCENE_LOST_WOODS, 3, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) + +/* 0x1B5 */ DEFINE_ENTRANCE(ENTR_GANONS_TOWER_COLLAPSE_INTERIOR_2, SCENE_GANONS_TOWER_COLLAPSE_INTERIOR, 2, true, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x1B6 */ DEFINE_ENTRANCE(ENTR_GANONS_TOWER_COLLAPSE_INTERIOR_2_1, SCENE_GANONS_TOWER_COLLAPSE_INTERIOR, 2, true, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x1B7 */ DEFINE_ENTRANCE(ENTR_GANONS_TOWER_COLLAPSE_INTERIOR_2_2, SCENE_GANONS_TOWER_COLLAPSE_INTERIOR, 2, true, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x1B8 */ DEFINE_ENTRANCE(ENTR_GANONS_TOWER_COLLAPSE_INTERIOR_2_3, SCENE_GANONS_TOWER_COLLAPSE_INTERIOR, 2, true, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) + +/* 0x1B9 */ DEFINE_ENTRANCE(ENTR_DEATH_MOUNTAIN_TRAIL_1, SCENE_DEATH_MOUNTAIN_TRAIL, 1, false, true, TRANS_TYPE_FADE_WHITE, TRANS_TYPE_FADE_WHITE) +/* 0x1BA */ DEFINE_ENTRANCE(ENTR_DEATH_MOUNTAIN_TRAIL_1_1, SCENE_DEATH_MOUNTAIN_TRAIL, 1, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x1BB */ DEFINE_ENTRANCE(ENTR_DEATH_MOUNTAIN_TRAIL_1_2, SCENE_DEATH_MOUNTAIN_TRAIL, 1, false, true, TRANS_TYPE_FADE_WHITE, TRANS_TYPE_FADE_WHITE) +/* 0x1BC */ DEFINE_ENTRANCE(ENTR_DEATH_MOUNTAIN_TRAIL_1_3, SCENE_DEATH_MOUNTAIN_TRAIL, 1, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) + +/* 0x1BD */ DEFINE_ENTRANCE(ENTR_DEATH_MOUNTAIN_TRAIL_2, SCENE_DEATH_MOUNTAIN_TRAIL, 2, false, true, TRANS_TYPE_FADE_WHITE, TRANS_TYPE_FADE_WHITE) +/* 0x1BE */ DEFINE_ENTRANCE(ENTR_DEATH_MOUNTAIN_TRAIL_2_1, SCENE_DEATH_MOUNTAIN_TRAIL, 2, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x1BF */ DEFINE_ENTRANCE(ENTR_DEATH_MOUNTAIN_TRAIL_2_2, SCENE_DEATH_MOUNTAIN_TRAIL, 2, false, true, TRANS_TYPE_FADE_WHITE, TRANS_TYPE_FADE_WHITE) +/* 0x1C0 */ DEFINE_ENTRANCE(ENTR_DEATH_MOUNTAIN_TRAIL_2_3, SCENE_DEATH_MOUNTAIN_TRAIL, 2, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) + +/* 0x1C1 */ DEFINE_ENTRANCE(ENTR_GORON_CITY_1, SCENE_GORON_CITY, 1, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x1C2 */ DEFINE_ENTRANCE(ENTR_GORON_CITY_1_1, SCENE_GORON_CITY, 1, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x1C3 */ DEFINE_ENTRANCE(ENTR_GORON_CITY_1_2, SCENE_GORON_CITY, 1, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x1C4 */ DEFINE_ENTRANCE(ENTR_GORON_CITY_1_3, SCENE_GORON_CITY, 1, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) + +/* 0x1C5 */ DEFINE_ENTRANCE(ENTR_LAKESIDE_LABORATORY_1, SCENE_LAKESIDE_LABORATORY, 1, false, true, TRANS_TYPE_FADE_BLACK_FAST, TRANS_TYPE_CIRCLE(TCA_NORMAL, TCC_BLACK, TCS_FAST)) +/* 0x1C6 */ DEFINE_ENTRANCE(ENTR_LAKESIDE_LABORATORY_1_1, SCENE_LAKESIDE_LABORATORY, 1, false, true, TRANS_TYPE_FADE_BLACK_FAST, TRANS_TYPE_CIRCLE(TCA_NORMAL, TCC_BLACK, TCS_FAST)) +/* 0x1C7 */ DEFINE_ENTRANCE(ENTR_LAKESIDE_LABORATORY_1_2, SCENE_LAKESIDE_LABORATORY, 1, false, true, TRANS_TYPE_FADE_BLACK_FAST, TRANS_TYPE_CIRCLE(TCA_NORMAL, TCC_BLACK, TCS_FAST)) +/* 0x1C8 */ DEFINE_ENTRANCE(ENTR_LAKESIDE_LABORATORY_1_3, SCENE_LAKESIDE_LABORATORY, 1, false, true, TRANS_TYPE_FADE_BLACK_FAST, TRANS_TYPE_CIRCLE(TCA_NORMAL, TCC_BLACK, TCS_FAST)) + +/* 0x1C9 */ DEFINE_ENTRANCE(ENTR_GANONS_TOWER_COLLAPSE_EXTERIOR_5, SCENE_GANONS_TOWER_COLLAPSE_EXTERIOR, 5, true, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x1CA */ DEFINE_ENTRANCE(ENTR_GANONS_TOWER_COLLAPSE_EXTERIOR_5_1, SCENE_GANONS_TOWER_COLLAPSE_EXTERIOR, 5, true, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x1CB */ DEFINE_ENTRANCE(ENTR_GANONS_TOWER_COLLAPSE_EXTERIOR_5_2, SCENE_GANONS_TOWER_COLLAPSE_EXTERIOR, 5, true, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x1CC */ DEFINE_ENTRANCE(ENTR_GANONS_TOWER_COLLAPSE_EXTERIOR_5_3, SCENE_GANONS_TOWER_COLLAPSE_EXTERIOR, 5, true, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) + +/* 0x1CD */ DEFINE_ENTRANCE(ENTR_MARKET_DAY_8, SCENE_MARKET_DAY, 8, false, true, TRANS_TYPE_FADE_BLACK_FAST, TRANS_TYPE_FADE_BLACK) +/* 0x1CE */ DEFINE_ENTRANCE(ENTR_MARKET_NIGHT_8_1, SCENE_MARKET_NIGHT, 8, false, true, TRANS_TYPE_FADE_BLACK_FAST, TRANS_TYPE_FADE_BLACK) +/* 0x1CF */ DEFINE_ENTRANCE(ENTR_MARKET_RUINS_8_2, SCENE_MARKET_RUINS, 8, false, true, TRANS_TYPE_FADE_BLACK_FAST, TRANS_TYPE_FADE_BLACK) +/* 0x1D0 */ DEFINE_ENTRANCE(ENTR_MARKET_RUINS_8_3, SCENE_MARKET_RUINS, 8, false, true, TRANS_TYPE_FADE_BLACK_FAST, TRANS_TYPE_FADE_BLACK) + +/* 0x1D1 */ DEFINE_ENTRANCE(ENTR_MARKET_DAY_9, SCENE_MARKET_DAY, 9, false, true, TRANS_TYPE_FADE_BLACK_FAST, TRANS_TYPE_FADE_BLACK) +/* 0x1D2 */ DEFINE_ENTRANCE(ENTR_MARKET_NIGHT_9_1, SCENE_MARKET_NIGHT, 9, false, true, TRANS_TYPE_FADE_BLACK_FAST, TRANS_TYPE_FADE_BLACK) +/* 0x1D3 */ DEFINE_ENTRANCE(ENTR_MARKET_RUINS_9_2, SCENE_MARKET_RUINS, 9, false, true, TRANS_TYPE_FADE_BLACK_FAST, TRANS_TYPE_FADE_BLACK) +/* 0x1D4 */ DEFINE_ENTRANCE(ENTR_MARKET_RUINS_9_3, SCENE_MARKET_RUINS, 9, false, true, TRANS_TYPE_FADE_BLACK_FAST, TRANS_TYPE_FADE_BLACK) + +/* 0x1D5 */ DEFINE_ENTRANCE(ENTR_MARKET_DAY_10, SCENE_MARKET_DAY, 10, false, true, TRANS_TYPE_FADE_BLACK_FAST, TRANS_TYPE_FADE_BLACK) +/* 0x1D6 */ DEFINE_ENTRANCE(ENTR_MARKET_NIGHT_10_1, SCENE_MARKET_NIGHT, 10, false, true, TRANS_TYPE_FADE_BLACK_FAST, TRANS_TYPE_FADE_BLACK) +/* 0x1D7 */ DEFINE_ENTRANCE(ENTR_MARKET_RUINS_10_2, SCENE_MARKET_RUINS, 10, false, true, TRANS_TYPE_FADE_BLACK_FAST, TRANS_TYPE_FADE_BLACK) +/* 0x1D8 */ DEFINE_ENTRANCE(ENTR_MARKET_RUINS_10_3, SCENE_MARKET_RUINS, 10, false, true, TRANS_TYPE_FADE_BLACK_FAST, TRANS_TYPE_FADE_BLACK) + +/* 0x1D9 */ DEFINE_ENTRANCE(ENTR_ZORAS_RIVER_3, SCENE_ZORAS_RIVER, 3, true, true, TRANS_TYPE_FADE_WHITE, TRANS_TYPE_FADE_WHITE) +/* 0x1DA */ DEFINE_ENTRANCE(ENTR_ZORAS_RIVER_3_1, SCENE_ZORAS_RIVER, 3, true, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x1DB */ DEFINE_ENTRANCE(ENTR_ZORAS_RIVER_3_2, SCENE_ZORAS_RIVER, 3, true, true, TRANS_TYPE_FADE_WHITE, TRANS_TYPE_FADE_WHITE) +/* 0x1DC */ DEFINE_ENTRANCE(ENTR_ZORAS_RIVER_3_3, SCENE_ZORAS_RIVER, 3, true, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) + +/* 0x1DD */ DEFINE_ENTRANCE(ENTR_ZORAS_RIVER_4, SCENE_ZORAS_RIVER, 4, false, true, TRANS_TYPE_CIRCLE(TCA_RIPPLE, TCC_WHITE, TCS_FAST), TRANS_TYPE_CIRCLE(TCA_RIPPLE, TCC_WHITE, TCS_FAST)) +/* 0x1DE */ DEFINE_ENTRANCE(ENTR_ZORAS_RIVER_4_1, SCENE_ZORAS_RIVER, 4, false, true, TRANS_TYPE_CIRCLE(TCA_RIPPLE, TCC_WHITE, TCS_FAST), TRANS_TYPE_CIRCLE(TCA_RIPPLE, TCC_WHITE, TCS_FAST)) +/* 0x1DF */ DEFINE_ENTRANCE(ENTR_ZORAS_RIVER_4_2, SCENE_ZORAS_RIVER, 4, false, true, TRANS_TYPE_CIRCLE(TCA_RIPPLE, TCC_WHITE, TCS_FAST), TRANS_TYPE_CIRCLE(TCA_RIPPLE, TCC_WHITE, TCS_FAST)) +/* 0x1E0 */ DEFINE_ENTRANCE(ENTR_ZORAS_RIVER_4_3, SCENE_ZORAS_RIVER, 4, false, true, TRANS_TYPE_CIRCLE(TCA_RIPPLE, TCC_WHITE, TCS_FAST), TRANS_TYPE_CIRCLE(TCA_RIPPLE, TCC_WHITE, TCS_FAST)) + +/* 0x1E1 */ DEFINE_ENTRANCE(ENTR_DESERT_COLOSSUS_1, SCENE_DESERT_COLOSSUS, 1, false, true, TRANS_TYPE_FADE_WHITE, TRANS_TYPE_FADE_WHITE) +/* 0x1E2 */ DEFINE_ENTRANCE(ENTR_DESERT_COLOSSUS_1_1, SCENE_DESERT_COLOSSUS, 1, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x1E3 */ DEFINE_ENTRANCE(ENTR_DESERT_COLOSSUS_1_2, SCENE_DESERT_COLOSSUS, 1, false, true, TRANS_TYPE_FADE_WHITE, TRANS_TYPE_FADE_WHITE) +/* 0x1E4 */ DEFINE_ENTRANCE(ENTR_DESERT_COLOSSUS_1_3, SCENE_DESERT_COLOSSUS, 1, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) + +/* 0x1E5 */ DEFINE_ENTRANCE(ENTR_DESERT_COLOSSUS_2, SCENE_DESERT_COLOSSUS, 2, false, false, TRANS_TYPE_FADE_WHITE, TRANS_TYPE_FADE_WHITE) +/* 0x1E6 */ DEFINE_ENTRANCE(ENTR_DESERT_COLOSSUS_2_1, SCENE_DESERT_COLOSSUS, 2, false, false, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x1E7 */ DEFINE_ENTRANCE(ENTR_DESERT_COLOSSUS_2_2, SCENE_DESERT_COLOSSUS, 2, false, false, TRANS_TYPE_FADE_WHITE, TRANS_TYPE_FADE_WHITE) +/* 0x1E8 */ DEFINE_ENTRANCE(ENTR_DESERT_COLOSSUS_2_3, SCENE_DESERT_COLOSSUS, 2, false, false, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) + +/* 0x1E9 */ DEFINE_ENTRANCE(ENTR_DESERT_COLOSSUS_3, SCENE_DESERT_COLOSSUS, 3, false, false, TRANS_TYPE_FADE_WHITE, TRANS_TYPE_FADE_WHITE) +/* 0x1EA */ DEFINE_ENTRANCE(ENTR_DESERT_COLOSSUS_3_1, SCENE_DESERT_COLOSSUS, 3, false, false, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x1EB */ DEFINE_ENTRANCE(ENTR_DESERT_COLOSSUS_3_2, SCENE_DESERT_COLOSSUS, 3, false, false, TRANS_TYPE_FADE_WHITE, TRANS_TYPE_FADE_WHITE) +/* 0x1EC */ DEFINE_ENTRANCE(ENTR_DESERT_COLOSSUS_3_3, SCENE_DESERT_COLOSSUS, 3, false, false, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) + +/* 0x1ED */ DEFINE_ENTRANCE(ENTR_DESERT_COLOSSUS_4, SCENE_DESERT_COLOSSUS, 4, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x1EE */ DEFINE_ENTRANCE(ENTR_DESERT_COLOSSUS_4_1, SCENE_DESERT_COLOSSUS, 4, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x1EF */ DEFINE_ENTRANCE(ENTR_DESERT_COLOSSUS_4_2, SCENE_DESERT_COLOSSUS, 4, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x1F0 */ DEFINE_ENTRANCE(ENTR_DESERT_COLOSSUS_4_3, SCENE_DESERT_COLOSSUS, 4, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) + +/* 0x1F1 */ DEFINE_ENTRANCE(ENTR_DESERT_COLOSSUS_5, SCENE_DESERT_COLOSSUS, 5, false, true, TRANS_TYPE_FADE_WHITE, TRANS_TYPE_FADE_WHITE) +/* 0x1F2 */ DEFINE_ENTRANCE(ENTR_DESERT_COLOSSUS_5_1, SCENE_DESERT_COLOSSUS, 5, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x1F3 */ DEFINE_ENTRANCE(ENTR_DESERT_COLOSSUS_5_2, SCENE_DESERT_COLOSSUS, 5, false, true, TRANS_TYPE_FADE_WHITE, TRANS_TYPE_FADE_WHITE) +/* 0x1F4 */ DEFINE_ENTRANCE(ENTR_DESERT_COLOSSUS_5_3, SCENE_DESERT_COLOSSUS, 5, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) + +/* 0x1F5 */ DEFINE_ENTRANCE(ENTR_DESERT_COLOSSUS_6, SCENE_DESERT_COLOSSUS, 6, true, false, TRANS_TYPE_SANDSTORM_END, TRANS_TYPE_SANDSTORM_END) +/* 0x1F6 */ DEFINE_ENTRANCE(ENTR_DESERT_COLOSSUS_6_1, SCENE_DESERT_COLOSSUS, 6, true, false, TRANS_TYPE_SANDSTORM_END, TRANS_TYPE_SANDSTORM_END) +/* 0x1F7 */ DEFINE_ENTRANCE(ENTR_DESERT_COLOSSUS_6_2, SCENE_DESERT_COLOSSUS, 6, true, false, TRANS_TYPE_SANDSTORM_END, TRANS_TYPE_SANDSTORM_END) +/* 0x1F8 */ DEFINE_ENTRANCE(ENTR_DESERT_COLOSSUS_6_3, SCENE_DESERT_COLOSSUS, 6, true, false, TRANS_TYPE_SANDSTORM_END, TRANS_TYPE_SANDSTORM_END) + +/* 0x1F9 */ DEFINE_ENTRANCE(ENTR_HYRULE_FIELD_6, SCENE_HYRULE_FIELD, 6, false, true, TRANS_TYPE_FADE_WHITE, TRANS_TYPE_FADE_WHITE) +/* 0x1FA */ DEFINE_ENTRANCE(ENTR_HYRULE_FIELD_6_1, SCENE_HYRULE_FIELD, 6, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x1FB */ DEFINE_ENTRANCE(ENTR_HYRULE_FIELD_6_2, SCENE_HYRULE_FIELD, 6, false, true, TRANS_TYPE_FADE_WHITE, TRANS_TYPE_FADE_WHITE) +/* 0x1FC */ DEFINE_ENTRANCE(ENTR_HYRULE_FIELD_6_3, SCENE_HYRULE_FIELD, 6, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) + +/* 0x1FD */ DEFINE_ENTRANCE(ENTR_HYRULE_FIELD_7, SCENE_HYRULE_FIELD, 7, false, true, TRANS_TYPE_FADE_WHITE, TRANS_TYPE_FADE_WHITE) +/* 0x1FE */ DEFINE_ENTRANCE(ENTR_HYRULE_FIELD_7_1, SCENE_HYRULE_FIELD, 7, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x1FF */ DEFINE_ENTRANCE(ENTR_HYRULE_FIELD_7_2, SCENE_HYRULE_FIELD, 7, false, true, TRANS_TYPE_FADE_WHITE, TRANS_TYPE_FADE_WHITE) +/* 0x200 */ DEFINE_ENTRANCE(ENTR_HYRULE_FIELD_7_3, SCENE_HYRULE_FIELD, 7, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) + +/* 0x201 */ DEFINE_ENTRANCE(ENTR_KAKARIKO_VILLAGE_3, SCENE_KAKARIKO_VILLAGE, 3, false, true, TRANS_TYPE_FADE_BLACK_FAST, TRANS_TYPE_FADE_BLACK) +/* 0x202 */ DEFINE_ENTRANCE(ENTR_KAKARIKO_VILLAGE_3_1, SCENE_KAKARIKO_VILLAGE, 3, false, true, TRANS_TYPE_FADE_BLACK_FAST, TRANS_TYPE_FADE_BLACK) +/* 0x203 */ DEFINE_ENTRANCE(ENTR_KAKARIKO_VILLAGE_3_2, SCENE_KAKARIKO_VILLAGE, 3, false, true, TRANS_TYPE_FADE_BLACK_FAST, TRANS_TYPE_FADE_BLACK) +/* 0x204 */ DEFINE_ENTRANCE(ENTR_KAKARIKO_VILLAGE_3_3, SCENE_KAKARIKO_VILLAGE, 3, false, true, TRANS_TYPE_FADE_BLACK_FAST, TRANS_TYPE_FADE_BLACK) + +/* 0x205 */ DEFINE_ENTRANCE(ENTR_GRAVEYARD_1, SCENE_GRAVEYARD, 1, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x206 */ DEFINE_ENTRANCE(ENTR_GRAVEYARD_1_1, SCENE_GRAVEYARD, 1, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x207 */ DEFINE_ENTRANCE(ENTR_GRAVEYARD_1_2, SCENE_GRAVEYARD, 1, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x208 */ DEFINE_ENTRANCE(ENTR_GRAVEYARD_1_3, SCENE_GRAVEYARD, 1, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) + +/* 0x209 */ DEFINE_ENTRANCE(ENTR_KOKIRI_FOREST_1, SCENE_KOKIRI_FOREST, 1, false, true, TRANS_TYPE_FADE_WHITE, TRANS_TYPE_FADE_WHITE) +/* 0x20A */ DEFINE_ENTRANCE(ENTR_KOKIRI_FOREST_1_1, SCENE_KOKIRI_FOREST, 1, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x20B */ DEFINE_ENTRANCE(ENTR_KOKIRI_FOREST_1_2, SCENE_KOKIRI_FOREST, 1, false, true, TRANS_TYPE_FADE_WHITE, TRANS_TYPE_FADE_WHITE) +/* 0x20C */ DEFINE_ENTRANCE(ENTR_KOKIRI_FOREST_1_3, SCENE_KOKIRI_FOREST, 1, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) + +/* 0x20D */ DEFINE_ENTRANCE(ENTR_KOKIRI_FOREST_2, SCENE_KOKIRI_FOREST, 2, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x20E */ DEFINE_ENTRANCE(ENTR_KOKIRI_FOREST_2_1, SCENE_KOKIRI_FOREST, 2, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x20F */ DEFINE_ENTRANCE(ENTR_KOKIRI_FOREST_2_2, SCENE_KOKIRI_FOREST, 2, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x210 */ DEFINE_ENTRANCE(ENTR_KOKIRI_FOREST_2_3, SCENE_KOKIRI_FOREST, 2, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) + +/* 0x211 */ DEFINE_ENTRANCE(ENTR_KOKIRI_FOREST_3, SCENE_KOKIRI_FOREST, 3, false, true, TRANS_TYPE_FADE_BLACK_FAST, TRANS_TYPE_FADE_BLACK_FAST) +/* 0x212 */ DEFINE_ENTRANCE(ENTR_KOKIRI_FOREST_3_1, SCENE_KOKIRI_FOREST, 3, false, true, TRANS_TYPE_FADE_BLACK_FAST, TRANS_TYPE_FADE_BLACK_FAST) +/* 0x213 */ DEFINE_ENTRANCE(ENTR_KOKIRI_FOREST_3_2, SCENE_KOKIRI_FOREST, 3, false, true, TRANS_TYPE_FADE_BLACK_FAST, TRANS_TYPE_FADE_BLACK_FAST) +/* 0x214 */ DEFINE_ENTRANCE(ENTR_KOKIRI_FOREST_3_3, SCENE_KOKIRI_FOREST, 3, false, true, TRANS_TYPE_FADE_BLACK_FAST, TRANS_TYPE_FADE_BLACK_FAST) + +/* 0x215 */ DEFINE_ENTRANCE(ENTR_SACRED_FOREST_MEADOW_1, SCENE_SACRED_FOREST_MEADOW, 1, false, true, TRANS_TYPE_FADE_GREEN, TRANS_TYPE_FADE_GREEN) +/* 0x216 */ DEFINE_ENTRANCE(ENTR_SACRED_FOREST_MEADOW_1_1, SCENE_SACRED_FOREST_MEADOW, 1, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x217 */ DEFINE_ENTRANCE(ENTR_SACRED_FOREST_MEADOW_1_2, SCENE_SACRED_FOREST_MEADOW, 1, false, true, TRANS_TYPE_FADE_GREEN, TRANS_TYPE_FADE_GREEN) +/* 0x218 */ DEFINE_ENTRANCE(ENTR_SACRED_FOREST_MEADOW_1_3, SCENE_SACRED_FOREST_MEADOW, 1, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) + +/* 0x219 */ DEFINE_ENTRANCE(ENTR_LAKE_HYLIA_1, SCENE_LAKE_HYLIA, 1, false, true, TRANS_TYPE_FADE_WHITE, TRANS_TYPE_FADE_WHITE) +/* 0x21A */ DEFINE_ENTRANCE(ENTR_LAKE_HYLIA_1_1, SCENE_LAKE_HYLIA, 1, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x21B */ DEFINE_ENTRANCE(ENTR_LAKE_HYLIA_1_2, SCENE_LAKE_HYLIA, 1, false, true, TRANS_TYPE_FADE_WHITE, TRANS_TYPE_FADE_WHITE) +/* 0x21C */ DEFINE_ENTRANCE(ENTR_LAKE_HYLIA_1_3, SCENE_LAKE_HYLIA, 1, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) + +/* 0x21D */ DEFINE_ENTRANCE(ENTR_LAKE_HYLIA_2, SCENE_LAKE_HYLIA, 2, false, true, TRANS_TYPE_FADE_BLUE, TRANS_TYPE_FADE_BLUE) +/* 0x21E */ DEFINE_ENTRANCE(ENTR_LAKE_HYLIA_2_1, SCENE_LAKE_HYLIA, 2, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x21F */ DEFINE_ENTRANCE(ENTR_LAKE_HYLIA_2_2, SCENE_LAKE_HYLIA, 2, false, true, TRANS_TYPE_FADE_BLUE, TRANS_TYPE_FADE_BLUE) +/* 0x220 */ DEFINE_ENTRANCE(ENTR_LAKE_HYLIA_2_3, SCENE_LAKE_HYLIA, 2, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) + +/* 0x221 */ DEFINE_ENTRANCE(ENTR_ZORAS_FOUNTAIN_1, SCENE_ZORAS_FOUNTAIN, 1, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x222 */ DEFINE_ENTRANCE(ENTR_ZORAS_FOUNTAIN_1_1, SCENE_ZORAS_FOUNTAIN, 1, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x223 */ DEFINE_ENTRANCE(ENTR_ZORAS_FOUNTAIN_1_2, SCENE_ZORAS_FOUNTAIN, 1, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x224 */ DEFINE_ENTRANCE(ENTR_ZORAS_FOUNTAIN_1_3, SCENE_ZORAS_FOUNTAIN, 1, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) + +/* 0x225 */ DEFINE_ENTRANCE(ENTR_ZORAS_FOUNTAIN_2, SCENE_ZORAS_FOUNTAIN, 2, false, true, TRANS_TYPE_FADE_WHITE, TRANS_TYPE_FADE_WHITE) +/* 0x226 */ DEFINE_ENTRANCE(ENTR_ZORAS_FOUNTAIN_2_1, SCENE_ZORAS_FOUNTAIN, 2, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x227 */ DEFINE_ENTRANCE(ENTR_ZORAS_FOUNTAIN_2_2, SCENE_ZORAS_FOUNTAIN, 2, false, true, TRANS_TYPE_FADE_WHITE, TRANS_TYPE_FADE_WHITE) +/* 0x228 */ DEFINE_ENTRANCE(ENTR_ZORAS_FOUNTAIN_2_3, SCENE_ZORAS_FOUNTAIN, 2, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) + +/* 0x229 */ DEFINE_ENTRANCE(ENTR_GERUDO_VALLEY_2, SCENE_GERUDO_VALLEY, 2, true, true, TRANS_TYPE_FADE_WHITE, TRANS_TYPE_FADE_WHITE) +/* 0x22A */ DEFINE_ENTRANCE(ENTR_GERUDO_VALLEY_2_1, SCENE_GERUDO_VALLEY, 2, true, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x22B */ DEFINE_ENTRANCE(ENTR_GERUDO_VALLEY_2_2, SCENE_GERUDO_VALLEY, 2, true, true, TRANS_TYPE_FADE_WHITE, TRANS_TYPE_FADE_WHITE) +/* 0x22C */ DEFINE_ENTRANCE(ENTR_GERUDO_VALLEY_2_3, SCENE_GERUDO_VALLEY, 2, true, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) + +/* 0x22D */ DEFINE_ENTRANCE(ENTR_GERUDO_VALLEY_3, SCENE_GERUDO_VALLEY, 3, true, true, TRANS_TYPE_FADE_WHITE, TRANS_TYPE_FADE_WHITE) +/* 0x22E */ DEFINE_ENTRANCE(ENTR_GERUDO_VALLEY_3_1, SCENE_GERUDO_VALLEY, 3, true, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x22F */ DEFINE_ENTRANCE(ENTR_GERUDO_VALLEY_3_2, SCENE_GERUDO_VALLEY, 3, true, true, TRANS_TYPE_FADE_WHITE, TRANS_TYPE_FADE_WHITE) +/* 0x230 */ DEFINE_ENTRANCE(ENTR_GERUDO_VALLEY_3_3, SCENE_GERUDO_VALLEY, 3, true, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) + +/* 0x231 */ DEFINE_ENTRANCE(ENTR_GERUDOS_FORTRESS_1, SCENE_GERUDOS_FORTRESS, 1, false, true, TRANS_TYPE_FADE_WHITE, TRANS_TYPE_FADE_WHITE) +/* 0x232 */ DEFINE_ENTRANCE(ENTR_GERUDOS_FORTRESS_1_1, SCENE_GERUDOS_FORTRESS, 1, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x233 */ DEFINE_ENTRANCE(ENTR_GERUDOS_FORTRESS_1_2, SCENE_GERUDOS_FORTRESS, 1, false, true, TRANS_TYPE_FADE_WHITE, TRANS_TYPE_FADE_WHITE) +/* 0x234 */ DEFINE_ENTRANCE(ENTR_GERUDOS_FORTRESS_1_3, SCENE_GERUDOS_FORTRESS, 1, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) + +/* 0x235 */ DEFINE_ENTRANCE(ENTR_GERUDOS_FORTRESS_2, SCENE_GERUDOS_FORTRESS, 2, false, true, TRANS_TYPE_FADE_WHITE, TRANS_TYPE_FADE_WHITE) +/* 0x236 */ DEFINE_ENTRANCE(ENTR_GERUDOS_FORTRESS_2_1, SCENE_GERUDOS_FORTRESS, 2, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x237 */ DEFINE_ENTRANCE(ENTR_GERUDOS_FORTRESS_2_2, SCENE_GERUDOS_FORTRESS, 2, false, true, TRANS_TYPE_FADE_WHITE, TRANS_TYPE_FADE_WHITE) +/* 0x238 */ DEFINE_ENTRANCE(ENTR_GERUDOS_FORTRESS_2_3, SCENE_GERUDOS_FORTRESS, 2, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) + +/* 0x239 */ DEFINE_ENTRANCE(ENTR_GERUDOS_FORTRESS_3, SCENE_GERUDOS_FORTRESS, 3, false, true, TRANS_TYPE_FADE_WHITE, TRANS_TYPE_FADE_WHITE) +/* 0x23A */ DEFINE_ENTRANCE(ENTR_GERUDOS_FORTRESS_3_1, SCENE_GERUDOS_FORTRESS, 3, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x23B */ DEFINE_ENTRANCE(ENTR_GERUDOS_FORTRESS_3_2, SCENE_GERUDOS_FORTRESS, 3, false, true, TRANS_TYPE_FADE_WHITE, TRANS_TYPE_FADE_WHITE) +/* 0x23C */ DEFINE_ENTRANCE(ENTR_GERUDOS_FORTRESS_3_3, SCENE_GERUDOS_FORTRESS, 3, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) + +/* 0x23D */ DEFINE_ENTRANCE(ENTR_HYRULE_CASTLE_1, SCENE_HYRULE_CASTLE, 1, false, true, TRANS_TYPE_FADE_WHITE, TRANS_TYPE_FADE_WHITE) +/* 0x23E */ DEFINE_ENTRANCE(ENTR_HYRULE_CASTLE_1_1, SCENE_HYRULE_CASTLE, 1, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x23F */ DEFINE_ENTRANCE(ENTR_OUTSIDE_GANONS_CASTLE_1_2, SCENE_OUTSIDE_GANONS_CASTLE, 1, false, true, TRANS_TYPE_FADE_WHITE_FAST, TRANS_TYPE_FADE_WHITE_FAST) +/* 0x240 */ DEFINE_ENTRANCE(ENTR_OUTSIDE_GANONS_CASTLE_1_3, SCENE_OUTSIDE_GANONS_CASTLE, 1, false, true, TRANS_TYPE_FADE_WHITE_FAST, TRANS_TYPE_FADE_WHITE_FAST) +/* 0x241 */ DEFINE_ENTRANCE(ENTR_HYRULE_CASTLE_1_4, SCENE_HYRULE_CASTLE, 1, false, true, TRANS_TYPE_WIPE, TRANS_TYPE_WIPE) + +/* 0x242 */ DEFINE_ENTRANCE(ENTR_DEATH_MOUNTAIN_TRAIL_3, SCENE_DEATH_MOUNTAIN_TRAIL, 3, false, true, TRANS_TYPE_FADE_WHITE, TRANS_TYPE_FADE_WHITE) +/* 0x243 */ DEFINE_ENTRANCE(ENTR_DEATH_MOUNTAIN_TRAIL_3_1, SCENE_DEATH_MOUNTAIN_TRAIL, 3, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x244 */ DEFINE_ENTRANCE(ENTR_DEATH_MOUNTAIN_TRAIL_3_2, SCENE_DEATH_MOUNTAIN_TRAIL, 3, false, true, TRANS_TYPE_FADE_WHITE, TRANS_TYPE_FADE_WHITE) +/* 0x245 */ DEFINE_ENTRANCE(ENTR_DEATH_MOUNTAIN_TRAIL_3_3, SCENE_DEATH_MOUNTAIN_TRAIL, 3, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) + +/* 0x246 */ DEFINE_ENTRANCE(ENTR_DEATH_MOUNTAIN_CRATER_1, SCENE_DEATH_MOUNTAIN_CRATER, 1, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x247 */ DEFINE_ENTRANCE(ENTR_DEATH_MOUNTAIN_CRATER_1_1, SCENE_DEATH_MOUNTAIN_CRATER, 1, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x248 */ DEFINE_ENTRANCE(ENTR_DEATH_MOUNTAIN_CRATER_1_2, SCENE_DEATH_MOUNTAIN_CRATER, 1, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x249 */ DEFINE_ENTRANCE(ENTR_DEATH_MOUNTAIN_CRATER_1_3, SCENE_DEATH_MOUNTAIN_CRATER, 1, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) + +/* 0x24A */ DEFINE_ENTRANCE(ENTR_DEATH_MOUNTAIN_CRATER_2, SCENE_DEATH_MOUNTAIN_CRATER, 2, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x24B */ DEFINE_ENTRANCE(ENTR_DEATH_MOUNTAIN_CRATER_2_1, SCENE_DEATH_MOUNTAIN_CRATER, 2, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x24C */ DEFINE_ENTRANCE(ENTR_DEATH_MOUNTAIN_CRATER_2_2, SCENE_DEATH_MOUNTAIN_CRATER, 2, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x24D */ DEFINE_ENTRANCE(ENTR_DEATH_MOUNTAIN_CRATER_2_3, SCENE_DEATH_MOUNTAIN_CRATER, 2, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) + +/* 0x24E */ DEFINE_ENTRANCE(ENTR_FOREST_TEMPLE_1, SCENE_FOREST_TEMPLE, 1, true, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x24F */ DEFINE_ENTRANCE(ENTR_FOREST_TEMPLE_1_1, SCENE_FOREST_TEMPLE, 1, true, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x250 */ DEFINE_ENTRANCE(ENTR_FOREST_TEMPLE_1_2, SCENE_FOREST_TEMPLE, 1, true, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x251 */ DEFINE_ENTRANCE(ENTR_FOREST_TEMPLE_1_3, SCENE_FOREST_TEMPLE, 1, true, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) + +/* 0x252 */ DEFINE_ENTRANCE(ENTR_DEKU_TREE_1, SCENE_DEKU_TREE, 1, true, false, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x253 */ DEFINE_ENTRANCE(ENTR_DEKU_TREE_1_1, SCENE_DEKU_TREE, 1, true, false, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x254 */ DEFINE_ENTRANCE(ENTR_DEKU_TREE_1_2, SCENE_DEKU_TREE, 1, true, false, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x255 */ DEFINE_ENTRANCE(ENTR_DEKU_TREE_1_3, SCENE_DEKU_TREE, 1, true, false, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) + +/* 0x256 */ DEFINE_ENTRANCE(ENTR_GANONS_TOWER_COLLAPSE_INTERIOR_3, SCENE_GANONS_TOWER_COLLAPSE_INTERIOR, 3, true, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x257 */ DEFINE_ENTRANCE(ENTR_GANONS_TOWER_COLLAPSE_INTERIOR_3_1, SCENE_GANONS_TOWER_COLLAPSE_INTERIOR, 3, true, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x258 */ DEFINE_ENTRANCE(ENTR_GANONS_TOWER_COLLAPSE_INTERIOR_3_2, SCENE_GANONS_TOWER_COLLAPSE_INTERIOR, 3, true, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x259 */ DEFINE_ENTRANCE(ENTR_GANONS_TOWER_COLLAPSE_INTERIOR_3_3, SCENE_GANONS_TOWER_COLLAPSE_INTERIOR, 3, true, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) + +/* 0x25A */ DEFINE_ENTRANCE(ENTR_MARKET_DAY_1, SCENE_MARKET_DAY, 1, false, true, TRANS_TYPE_FADE_WHITE, TRANS_TYPE_FADE_WHITE) +/* 0x25B */ DEFINE_ENTRANCE(ENTR_MARKET_NIGHT_1_1, SCENE_MARKET_NIGHT, 1, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x25C */ DEFINE_ENTRANCE(ENTR_MARKET_RUINS_1_2, SCENE_MARKET_RUINS, 1, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x25D */ DEFINE_ENTRANCE(ENTR_MARKET_RUINS_1_3, SCENE_MARKET_RUINS, 1, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) + +/* 0x25E */ DEFINE_ENTRANCE(ENTR_MARKET_DAY_2, SCENE_MARKET_DAY, 2, false, true, TRANS_TYPE_FADE_WHITE, TRANS_TYPE_FADE_WHITE) +/* 0x25F */ DEFINE_ENTRANCE(ENTR_MARKET_NIGHT_2_1, SCENE_MARKET_NIGHT, 2, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x260 */ DEFINE_ENTRANCE(ENTR_MARKET_RUINS_2_2, SCENE_MARKET_RUINS, 2, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x261 */ DEFINE_ENTRANCE(ENTR_MARKET_RUINS_2_3, SCENE_MARKET_RUINS, 2, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) + +/* 0x262 */ DEFINE_ENTRANCE(ENTR_MARKET_DAY_3, SCENE_MARKET_DAY, 3, true, true, TRANS_TYPE_FADE_WHITE, TRANS_TYPE_FADE_WHITE) +/* 0x263 */ DEFINE_ENTRANCE(ENTR_MARKET_NIGHT_3_1, SCENE_MARKET_NIGHT, 3, true, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x264 */ DEFINE_ENTRANCE(ENTR_MARKET_RUINS_3_2, SCENE_MARKET_RUINS, 3, true, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x265 */ DEFINE_ENTRANCE(ENTR_MARKET_RUINS_3_3, SCENE_MARKET_RUINS, 3, true, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) + +/* 0x266 */ DEFINE_ENTRANCE(ENTR_KOKIRI_FOREST_4, SCENE_KOKIRI_FOREST, 4, false, false, TRANS_TYPE_FADE_BLACK_FAST, TRANS_TYPE_FADE_BLACK_FAST) +/* 0x267 */ DEFINE_ENTRANCE(ENTR_KOKIRI_FOREST_4_1, SCENE_KOKIRI_FOREST, 4, false, false, TRANS_TYPE_FADE_BLACK_FAST, TRANS_TYPE_FADE_BLACK_FAST) +/* 0x268 */ DEFINE_ENTRANCE(ENTR_KOKIRI_FOREST_4_2, SCENE_KOKIRI_FOREST, 4, false, false, TRANS_TYPE_FADE_BLACK_FAST, TRANS_TYPE_FADE_BLACK_FAST) +/* 0x269 */ DEFINE_ENTRANCE(ENTR_KOKIRI_FOREST_4_3, SCENE_KOKIRI_FOREST, 4, false, false, TRANS_TYPE_FADE_BLACK_FAST, TRANS_TYPE_FADE_BLACK_FAST) + +/* 0x26A */ DEFINE_ENTRANCE(ENTR_KOKIRI_FOREST_5, SCENE_KOKIRI_FOREST, 5, false, false, TRANS_TYPE_FADE_BLACK_FAST, TRANS_TYPE_FADE_BLACK_FAST) +/* 0x26B */ DEFINE_ENTRANCE(ENTR_KOKIRI_FOREST_5_1, SCENE_KOKIRI_FOREST, 5, false, false, TRANS_TYPE_FADE_BLACK_FAST, TRANS_TYPE_FADE_BLACK_FAST) +/* 0x26C */ DEFINE_ENTRANCE(ENTR_KOKIRI_FOREST_5_2, SCENE_KOKIRI_FOREST, 5, false, false, TRANS_TYPE_FADE_BLACK_FAST, TRANS_TYPE_FADE_BLACK_FAST) +/* 0x26D */ DEFINE_ENTRANCE(ENTR_KOKIRI_FOREST_5_3, SCENE_KOKIRI_FOREST, 5, false, false, TRANS_TYPE_FADE_BLACK_FAST, TRANS_TYPE_FADE_BLACK_FAST) + +/* 0x26E */ DEFINE_ENTRANCE(ENTR_MARKET_ENTRANCE_DAY_2, SCENE_MARKET_ENTRANCE_DAY, 2, false, false, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x26F */ DEFINE_ENTRANCE(ENTR_MARKET_ENTRANCE_NIGHT_2_1, SCENE_MARKET_ENTRANCE_NIGHT, 2, false, false, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x270 */ DEFINE_ENTRANCE(ENTR_MARKET_ENTRANCE_RUINS_2_2, SCENE_MARKET_ENTRANCE_RUINS, 2, false, false, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x271 */ DEFINE_ENTRANCE(ENTR_MARKET_ENTRANCE_RUINS_2_3, SCENE_MARKET_ENTRANCE_RUINS, 2, false, false, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) + +/* 0x272 */ DEFINE_ENTRANCE(ENTR_LINKS_HOUSE_1, SCENE_LINKS_HOUSE, 1, false, true, TRANS_TYPE_FADE_BLACK_FAST, TRANS_TYPE_FADE_BLACK_FAST) +/* 0x273 */ DEFINE_ENTRANCE(ENTR_LINKS_HOUSE_1_1, SCENE_LINKS_HOUSE, 1, false, true, TRANS_TYPE_FADE_BLACK_FAST, TRANS_TYPE_FADE_BLACK_FAST) +/* 0x274 */ DEFINE_ENTRANCE(ENTR_LINKS_HOUSE_1_2, SCENE_LINKS_HOUSE, 1, false, true, TRANS_TYPE_FADE_BLACK_FAST, TRANS_TYPE_FADE_BLACK_FAST) +/* 0x275 */ DEFINE_ENTRANCE(ENTR_LINKS_HOUSE_1_3, SCENE_LINKS_HOUSE, 1, false, true, TRANS_TYPE_FADE_BLACK_FAST, TRANS_TYPE_FADE_BLACK_FAST) + +/* 0x276 */ DEFINE_ENTRANCE(ENTR_MARKET_ENTRANCE_DAY_1, SCENE_MARKET_ENTRANCE_DAY, 1, false, true, TRANS_TYPE_FADE_WHITE, TRANS_TYPE_FADE_WHITE) +/* 0x277 */ DEFINE_ENTRANCE(ENTR_MARKET_ENTRANCE_NIGHT_1_1, SCENE_MARKET_ENTRANCE_NIGHT, 1, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x278 */ DEFINE_ENTRANCE(ENTR_MARKET_ENTRANCE_RUINS_1_2, SCENE_MARKET_ENTRANCE_RUINS, 1, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x279 */ DEFINE_ENTRANCE(ENTR_MARKET_ENTRANCE_RUINS_1_3, SCENE_MARKET_ENTRANCE_RUINS, 1, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) + +/* 0x27A */ DEFINE_ENTRANCE(ENTR_HYRULE_FIELD_8, SCENE_HYRULE_FIELD, 8, true, true, TRANS_TYPE_FADE_WHITE, TRANS_TYPE_FADE_WHITE) +/* 0x27B */ DEFINE_ENTRANCE(ENTR_HYRULE_FIELD_8_1, SCENE_HYRULE_FIELD, 8, true, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x27C */ DEFINE_ENTRANCE(ENTR_HYRULE_FIELD_8_2, SCENE_HYRULE_FIELD, 8, true, true, TRANS_TYPE_FADE_WHITE, TRANS_TYPE_FADE_WHITE) +/* 0x27D */ DEFINE_ENTRANCE(ENTR_HYRULE_FIELD_8_3, SCENE_HYRULE_FIELD, 8, true, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) + +/* 0x27E */ DEFINE_ENTRANCE(ENTR_HYRULE_FIELD_9, SCENE_HYRULE_FIELD, 9, false, true, TRANS_TYPE_FADE_WHITE, TRANS_TYPE_FADE_WHITE) +/* 0x27F */ DEFINE_ENTRANCE(ENTR_HYRULE_FIELD_9_1, SCENE_HYRULE_FIELD, 9, false, true, TRANS_TYPE_FADE_WHITE, TRANS_TYPE_FADE_WHITE) +/* 0x280 */ DEFINE_ENTRANCE(ENTR_HYRULE_FIELD_9_2, SCENE_HYRULE_FIELD, 9, false, true, TRANS_TYPE_FADE_WHITE, TRANS_TYPE_FADE_WHITE) +/* 0x281 */ DEFINE_ENTRANCE(ENTR_HYRULE_FIELD_9_3, SCENE_HYRULE_FIELD, 9, false, true, TRANS_TYPE_FADE_WHITE, TRANS_TYPE_FADE_WHITE) + +/* 0x282 */ DEFINE_ENTRANCE(ENTR_HYRULE_FIELD_10, SCENE_HYRULE_FIELD, 10, false, true, TRANS_TYPE_FADE_WHITE, TRANS_TYPE_FADE_WHITE) +/* 0x283 */ DEFINE_ENTRANCE(ENTR_HYRULE_FIELD_10_1, SCENE_HYRULE_FIELD, 10, false, true, TRANS_TYPE_FADE_WHITE, TRANS_TYPE_FADE_WHITE) +/* 0x284 */ DEFINE_ENTRANCE(ENTR_HYRULE_FIELD_10_2, SCENE_HYRULE_FIELD, 10, false, true, TRANS_TYPE_FADE_WHITE, TRANS_TYPE_FADE_WHITE) +/* 0x285 */ DEFINE_ENTRANCE(ENTR_HYRULE_FIELD_10_3, SCENE_HYRULE_FIELD, 10, false, true, TRANS_TYPE_FADE_WHITE, TRANS_TYPE_FADE_WHITE) + +/* 0x286 */ DEFINE_ENTRANCE(ENTR_KOKIRI_FOREST_6, SCENE_KOKIRI_FOREST, 6, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x287 */ DEFINE_ENTRANCE(ENTR_KOKIRI_FOREST_6_1, SCENE_KOKIRI_FOREST, 6, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x288 */ DEFINE_ENTRANCE(ENTR_KOKIRI_FOREST_6_2, SCENE_KOKIRI_FOREST, 6, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x289 */ DEFINE_ENTRANCE(ENTR_KOKIRI_FOREST_6_3, SCENE_KOKIRI_FOREST, 6, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) + +/* 0x28A */ DEFINE_ENTRANCE(ENTR_HYRULE_FIELD_11, SCENE_HYRULE_FIELD, 11, false, true, TRANS_TYPE_FADE_WHITE_FAST, TRANS_TYPE_FADE_WHITE_FAST) +/* 0x28B */ DEFINE_ENTRANCE(ENTR_HYRULE_FIELD_11_1, SCENE_HYRULE_FIELD, 11, false, true, TRANS_TYPE_FADE_BLACK_FAST, TRANS_TYPE_FADE_BLACK) +/* 0x28C */ DEFINE_ENTRANCE(ENTR_HYRULE_FIELD_11_2, SCENE_HYRULE_FIELD, 11, false, true, TRANS_TYPE_FADE_WHITE_FAST, TRANS_TYPE_FADE_WHITE_FAST) +/* 0x28D */ DEFINE_ENTRANCE(ENTR_HYRULE_FIELD_11_3, SCENE_HYRULE_FIELD, 11, false, true, TRANS_TYPE_FADE_BLACK_FAST, TRANS_TYPE_FADE_BLACK) + +/* 0x28E */ DEFINE_ENTRANCE(ENTR_HYRULE_FIELD_12, SCENE_HYRULE_FIELD, 12, false, true, TRANS_TYPE_FADE_WHITE_FAST, TRANS_TYPE_FADE_WHITE_FAST) +/* 0x28F */ DEFINE_ENTRANCE(ENTR_HYRULE_FIELD_12_1, SCENE_HYRULE_FIELD, 12, false, true, TRANS_TYPE_FADE_BLACK_FAST, TRANS_TYPE_FADE_BLACK) +/* 0x290 */ DEFINE_ENTRANCE(ENTR_HYRULE_FIELD_12_2, SCENE_HYRULE_FIELD, 12, false, true, TRANS_TYPE_FADE_WHITE_FAST, TRANS_TYPE_FADE_WHITE_FAST) +/* 0x291 */ DEFINE_ENTRANCE(ENTR_HYRULE_FIELD_12_3, SCENE_HYRULE_FIELD, 12, false, true, TRANS_TYPE_FADE_BLACK_FAST, TRANS_TYPE_FADE_BLACK) + +/* 0x292 */ DEFINE_ENTRANCE(ENTR_HYRULE_FIELD_13, SCENE_HYRULE_FIELD, 13, false, true, TRANS_TYPE_FADE_WHITE_FAST, TRANS_TYPE_FADE_WHITE_FAST) +/* 0x293 */ DEFINE_ENTRANCE(ENTR_HYRULE_FIELD_13_1, SCENE_HYRULE_FIELD, 13, false, true, TRANS_TYPE_FADE_BLACK_FAST, TRANS_TYPE_FADE_BLACK) +/* 0x294 */ DEFINE_ENTRANCE(ENTR_HYRULE_FIELD_13_2, SCENE_HYRULE_FIELD, 13, false, true, TRANS_TYPE_FADE_WHITE_FAST, TRANS_TYPE_FADE_WHITE_FAST) +/* 0x295 */ DEFINE_ENTRANCE(ENTR_HYRULE_FIELD_13_3, SCENE_HYRULE_FIELD, 13, false, true, TRANS_TYPE_FADE_BLACK_FAST, TRANS_TYPE_FADE_BLACK) + +/* 0x296 */ DEFINE_ENTRANCE(ENTR_CASTLE_COURTYARD_GUARDS_DAY_1, SCENE_CASTLE_COURTYARD_GUARDS_DAY, 1, false, true, TRANS_TYPE_FADE_WHITE, TRANS_TYPE_FADE_WHITE) +/* 0x297 */ DEFINE_ENTRANCE(ENTR_CASTLE_COURTYARD_GUARDS_NIGHT_1_1, SCENE_CASTLE_COURTYARD_GUARDS_NIGHT, 1, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x298 */ DEFINE_ENTRANCE(ENTR_CASTLE_COURTYARD_GUARDS_DAY_1_2, SCENE_CASTLE_COURTYARD_GUARDS_DAY, 1, false, true, TRANS_TYPE_FADE_WHITE, TRANS_TYPE_FADE_WHITE) +/* 0x299 */ DEFINE_ENTRANCE(ENTR_CASTLE_COURTYARD_GUARDS_NIGHT_1_3, SCENE_CASTLE_COURTYARD_GUARDS_NIGHT, 1, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) + +/* 0x29A */ DEFINE_ENTRANCE(ENTR_BACK_ALLEY_DAY_1, SCENE_BACK_ALLEY_DAY, 1, true, true, TRANS_TYPE_FADE_WHITE, TRANS_TYPE_FADE_WHITE) +/* 0x29B */ DEFINE_ENTRANCE(ENTR_BACK_ALLEY_NIGHT_1_1, SCENE_BACK_ALLEY_NIGHT, 1, true, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x29C */ DEFINE_ENTRANCE(ENTR_BACK_ALLEY_DAY_1_2, SCENE_BACK_ALLEY_DAY, 1, true, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x29D */ DEFINE_ENTRANCE(ENTR_BACK_ALLEY_NIGHT_1_3, SCENE_BACK_ALLEY_NIGHT, 1, true, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) + +/* 0x29E */ DEFINE_ENTRANCE(ENTR_MARKET_DAY_4, SCENE_MARKET_DAY, 4, true, true, TRANS_TYPE_FADE_WHITE, TRANS_TYPE_FADE_WHITE) +/* 0x29F */ DEFINE_ENTRANCE(ENTR_MARKET_NIGHT_4_1, SCENE_MARKET_NIGHT, 4, true, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x2A0 */ DEFINE_ENTRANCE(ENTR_MARKET_RUINS_4_2, SCENE_MARKET_RUINS, 4, true, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x2A1 */ DEFINE_ENTRANCE(ENTR_MARKET_RUINS_4_3, SCENE_MARKET_RUINS, 4, true, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) + +/* 0x2A2 */ DEFINE_ENTRANCE(ENTR_MARKET_DAY_5, SCENE_MARKET_DAY, 5, false, true, TRANS_TYPE_FADE_BLACK_FAST, TRANS_TYPE_FADE_BLACK) +/* 0x2A3 */ DEFINE_ENTRANCE(ENTR_MARKET_NIGHT_5_1, SCENE_MARKET_NIGHT, 5, false, true, TRANS_TYPE_FADE_BLACK_FAST, TRANS_TYPE_FADE_BLACK) +/* 0x2A4 */ DEFINE_ENTRANCE(ENTR_MARKET_RUINS_5_2, SCENE_MARKET_RUINS, 5, false, true, TRANS_TYPE_FADE_BLACK_FAST, TRANS_TYPE_FADE_BLACK) +/* 0x2A5 */ DEFINE_ENTRANCE(ENTR_MARKET_RUINS_5_3, SCENE_MARKET_RUINS, 5, false, true, TRANS_TYPE_FADE_BLACK_FAST, TRANS_TYPE_FADE_BLACK) + +/* 0x2A6 */ DEFINE_ENTRANCE(ENTR_KAKARIKO_VILLAGE_4, SCENE_KAKARIKO_VILLAGE, 4, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x2A7 */ DEFINE_ENTRANCE(ENTR_KAKARIKO_VILLAGE_4_1, SCENE_KAKARIKO_VILLAGE, 4, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x2A8 */ DEFINE_ENTRANCE(ENTR_KAKARIKO_VILLAGE_4_2, SCENE_KAKARIKO_VILLAGE, 4, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x2A9 */ DEFINE_ENTRANCE(ENTR_KAKARIKO_VILLAGE_4_3, SCENE_KAKARIKO_VILLAGE, 4, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) + +/* 0x2AA */ DEFINE_ENTRANCE(ENTR_GERUDOS_FORTRESS_4, SCENE_GERUDOS_FORTRESS, 4, false, true, TRANS_TYPE_FADE_WHITE, TRANS_TYPE_FADE_WHITE) +/* 0x2AB */ DEFINE_ENTRANCE(ENTR_GERUDOS_FORTRESS_4_1, SCENE_GERUDOS_FORTRESS, 4, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x2AC */ DEFINE_ENTRANCE(ENTR_GERUDOS_FORTRESS_4_2, SCENE_GERUDOS_FORTRESS, 4, false, true, TRANS_TYPE_FADE_WHITE, TRANS_TYPE_FADE_WHITE) +/* 0x2AD */ DEFINE_ENTRANCE(ENTR_GERUDOS_FORTRESS_4_3, SCENE_GERUDOS_FORTRESS, 4, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) + +/* 0x2AE */ DEFINE_ENTRANCE(ENTR_LON_LON_RANCH_1, SCENE_LON_LON_RANCH, 1, false, false, TRANS_TYPE_FADE_WHITE, TRANS_TYPE_FADE_WHITE) +/* 0x2AF */ DEFINE_ENTRANCE(ENTR_LON_LON_RANCH_1_1, SCENE_LON_LON_RANCH, 1, false, false, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x2B0 */ DEFINE_ENTRANCE(ENTR_LON_LON_RANCH_1_2, SCENE_LON_LON_RANCH, 1, false, false, TRANS_TYPE_FADE_WHITE, TRANS_TYPE_FADE_WHITE) +/* 0x2B1 */ DEFINE_ENTRANCE(ENTR_LON_LON_RANCH_1_3, SCENE_LON_LON_RANCH, 1, false, false, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) + +/* 0x2B2 */ DEFINE_ENTRANCE(ENTR_SHADOW_TEMPLE_1, SCENE_SHADOW_TEMPLE, 1, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x2B3 */ DEFINE_ENTRANCE(ENTR_SHADOW_TEMPLE_1_1, SCENE_SHADOW_TEMPLE, 1, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x2B4 */ DEFINE_ENTRANCE(ENTR_SHADOW_TEMPLE_1_2, SCENE_SHADOW_TEMPLE, 1, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x2B5 */ DEFINE_ENTRANCE(ENTR_SHADOW_TEMPLE_1_3, SCENE_SHADOW_TEMPLE, 1, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) + +/* 0x2B6 */ DEFINE_ENTRANCE(ENTR_SHADOW_TEMPLE_2, SCENE_SHADOW_TEMPLE, 2, true, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x2B7 */ DEFINE_ENTRANCE(ENTR_SHADOW_TEMPLE_2_1, SCENE_SHADOW_TEMPLE, 2, true, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x2B8 */ DEFINE_ENTRANCE(ENTR_SHADOW_TEMPLE_2_2, SCENE_SHADOW_TEMPLE, 2, true, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x2B9 */ DEFINE_ENTRANCE(ENTR_SHADOW_TEMPLE_2_3, SCENE_SHADOW_TEMPLE, 2, true, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) + +/* 0x2BA */ DEFINE_ENTRANCE(ENTR_GERUDOS_FORTRESS_5, SCENE_GERUDOS_FORTRESS, 5, false, true, TRANS_TYPE_FADE_WHITE, TRANS_TYPE_FADE_WHITE) +/* 0x2BB */ DEFINE_ENTRANCE(ENTR_GERUDOS_FORTRESS_5_1, SCENE_GERUDOS_FORTRESS, 5, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x2BC */ DEFINE_ENTRANCE(ENTR_GERUDOS_FORTRESS_5_2, SCENE_GERUDOS_FORTRESS, 5, false, true, TRANS_TYPE_FADE_WHITE, TRANS_TYPE_FADE_WHITE) +/* 0x2BD */ DEFINE_ENTRANCE(ENTR_GERUDOS_FORTRESS_5_3, SCENE_GERUDOS_FORTRESS, 5, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) + +/* 0x2BE */ DEFINE_ENTRANCE(ENTR_GERUDOS_FORTRESS_6, SCENE_GERUDOS_FORTRESS, 6, false, true, TRANS_TYPE_FADE_WHITE, TRANS_TYPE_FADE_WHITE) +/* 0x2BF */ DEFINE_ENTRANCE(ENTR_GERUDOS_FORTRESS_6_1, SCENE_GERUDOS_FORTRESS, 6, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x2C0 */ DEFINE_ENTRANCE(ENTR_GERUDOS_FORTRESS_6_2, SCENE_GERUDOS_FORTRESS, 6, false, true, TRANS_TYPE_FADE_WHITE, TRANS_TYPE_FADE_WHITE) +/* 0x2C1 */ DEFINE_ENTRANCE(ENTR_GERUDOS_FORTRESS_6_3, SCENE_GERUDOS_FORTRESS, 6, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) + +/* 0x2C2 */ DEFINE_ENTRANCE(ENTR_GERUDOS_FORTRESS_7, SCENE_GERUDOS_FORTRESS, 7, false, true, TRANS_TYPE_FADE_WHITE, TRANS_TYPE_FADE_WHITE) +/* 0x2C3 */ DEFINE_ENTRANCE(ENTR_GERUDOS_FORTRESS_7_1, SCENE_GERUDOS_FORTRESS, 7, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x2C4 */ DEFINE_ENTRANCE(ENTR_GERUDOS_FORTRESS_7_2, SCENE_GERUDOS_FORTRESS, 7, false, true, TRANS_TYPE_FADE_WHITE, TRANS_TYPE_FADE_WHITE) +/* 0x2C5 */ DEFINE_ENTRANCE(ENTR_GERUDOS_FORTRESS_7_3, SCENE_GERUDOS_FORTRESS, 7, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) + +/* 0x2C6 */ DEFINE_ENTRANCE(ENTR_GERUDOS_FORTRESS_8, SCENE_GERUDOS_FORTRESS, 8, false, true, TRANS_TYPE_FADE_WHITE, TRANS_TYPE_FADE_WHITE) +/* 0x2C7 */ DEFINE_ENTRANCE(ENTR_GERUDOS_FORTRESS_8_1, SCENE_GERUDOS_FORTRESS, 8, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x2C8 */ DEFINE_ENTRANCE(ENTR_GERUDOS_FORTRESS_8_2, SCENE_GERUDOS_FORTRESS, 8, false, true, TRANS_TYPE_FADE_WHITE, TRANS_TYPE_FADE_WHITE) +/* 0x2C9 */ DEFINE_ENTRANCE(ENTR_GERUDOS_FORTRESS_8_3, SCENE_GERUDOS_FORTRESS, 8, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) + +/* 0x2CA */ DEFINE_ENTRANCE(ENTR_TEMPLE_OF_TIME_2, SCENE_TEMPLE_OF_TIME, 2, false, true, TRANS_TYPE_FILL_WHITE, TRANS_TYPE_FILL_WHITE) +/* 0x2CB */ DEFINE_ENTRANCE(ENTR_TEMPLE_OF_TIME_2_1, SCENE_TEMPLE_OF_TIME, 2, false, true, TRANS_TYPE_FILL_WHITE, TRANS_TYPE_FILL_WHITE) +/* 0x2CC */ DEFINE_ENTRANCE(ENTR_TEMPLE_OF_TIME_2_2, SCENE_TEMPLE_OF_TIME, 2, false, true, TRANS_TYPE_FILL_WHITE, TRANS_TYPE_FILL_WHITE) +/* 0x2CD */ DEFINE_ENTRANCE(ENTR_TEMPLE_OF_TIME_2_3, SCENE_TEMPLE_OF_TIME, 2, false, true, TRANS_TYPE_FILL_WHITE, TRANS_TYPE_FILL_WHITE) + +/* 0x2CE */ DEFINE_ENTRANCE(ENTR_CHAMBER_OF_THE_SAGES_1, SCENE_CHAMBER_OF_THE_SAGES, 1, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x2CF */ DEFINE_ENTRANCE(ENTR_CHAMBER_OF_THE_SAGES_1_1, SCENE_CHAMBER_OF_THE_SAGES, 1, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x2D0 */ DEFINE_ENTRANCE(ENTR_CHAMBER_OF_THE_SAGES_1_2, SCENE_CHAMBER_OF_THE_SAGES, 1, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x2D1 */ DEFINE_ENTRANCE(ENTR_CHAMBER_OF_THE_SAGES_1_3, SCENE_CHAMBER_OF_THE_SAGES, 1, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) + +/* 0x2D2 */ DEFINE_ENTRANCE(ENTR_GERUDOS_FORTRESS_9, SCENE_GERUDOS_FORTRESS, 9, false, true, TRANS_TYPE_FADE_WHITE, TRANS_TYPE_FADE_WHITE) +/* 0x2D3 */ DEFINE_ENTRANCE(ENTR_GERUDOS_FORTRESS_9_1, SCENE_GERUDOS_FORTRESS, 9, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x2D4 */ DEFINE_ENTRANCE(ENTR_GERUDOS_FORTRESS_9_2, SCENE_GERUDOS_FORTRESS, 9, false, true, TRANS_TYPE_FADE_WHITE, TRANS_TYPE_FADE_WHITE) +/* 0x2D5 */ DEFINE_ENTRANCE(ENTR_GERUDOS_FORTRESS_9_3, SCENE_GERUDOS_FORTRESS, 9, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) + +/* 0x2D6 */ DEFINE_ENTRANCE(ENTR_GERUDOS_FORTRESS_10, SCENE_GERUDOS_FORTRESS, 10, false, true, TRANS_TYPE_FADE_WHITE, TRANS_TYPE_FADE_WHITE) +/* 0x2D7 */ DEFINE_ENTRANCE(ENTR_GERUDOS_FORTRESS_10_1, SCENE_GERUDOS_FORTRESS, 10, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x2D8 */ DEFINE_ENTRANCE(ENTR_GERUDOS_FORTRESS_10_2, SCENE_GERUDOS_FORTRESS, 10, false, true, TRANS_TYPE_FADE_WHITE, TRANS_TYPE_FADE_WHITE) +/* 0x2D9 */ DEFINE_ENTRANCE(ENTR_GERUDOS_FORTRESS_10_3, SCENE_GERUDOS_FORTRESS, 10, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) + +/* 0x2DA */ DEFINE_ENTRANCE(ENTR_GERUDOS_FORTRESS_11, SCENE_GERUDOS_FORTRESS, 11, false, true, TRANS_TYPE_FADE_WHITE, TRANS_TYPE_FADE_WHITE) +/* 0x2DB */ DEFINE_ENTRANCE(ENTR_GERUDOS_FORTRESS_11_1, SCENE_GERUDOS_FORTRESS, 11, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x2DC */ DEFINE_ENTRANCE(ENTR_GERUDOS_FORTRESS_11_2, SCENE_GERUDOS_FORTRESS, 11, false, true, TRANS_TYPE_FADE_WHITE, TRANS_TYPE_FADE_WHITE) +/* 0x2DD */ DEFINE_ENTRANCE(ENTR_GERUDOS_FORTRESS_11_3, SCENE_GERUDOS_FORTRESS, 11, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) + +/* 0x2DE */ DEFINE_ENTRANCE(ENTR_GERUDOS_FORTRESS_12, SCENE_GERUDOS_FORTRESS, 12, false, true, TRANS_TYPE_FADE_WHITE, TRANS_TYPE_FADE_WHITE) +/* 0x2DF */ DEFINE_ENTRANCE(ENTR_GERUDOS_FORTRESS_12_1, SCENE_GERUDOS_FORTRESS, 12, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x2E0 */ DEFINE_ENTRANCE(ENTR_GERUDOS_FORTRESS_12_2, SCENE_GERUDOS_FORTRESS, 12, false, true, TRANS_TYPE_FADE_WHITE, TRANS_TYPE_FADE_WHITE) +/* 0x2E1 */ DEFINE_ENTRANCE(ENTR_GERUDOS_FORTRESS_12_3, SCENE_GERUDOS_FORTRESS, 12, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) + +/* 0x2E2 */ DEFINE_ENTRANCE(ENTR_LON_LON_RANCH_2, SCENE_LON_LON_RANCH, 2, false, true, TRANS_TYPE_FADE_WHITE, TRANS_TYPE_FADE_WHITE) +/* 0x2E3 */ DEFINE_ENTRANCE(ENTR_LON_LON_RANCH_2_1, SCENE_LON_LON_RANCH, 2, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x2E4 */ DEFINE_ENTRANCE(ENTR_LON_LON_RANCH_2_2, SCENE_LON_LON_RANCH, 2, false, true, TRANS_TYPE_FADE_WHITE, TRANS_TYPE_FADE_WHITE) +/* 0x2E5 */ DEFINE_ENTRANCE(ENTR_LON_LON_RANCH_2_3, SCENE_LON_LON_RANCH, 2, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) + +/* 0x2E6 */ DEFINE_ENTRANCE(ENTR_LON_LON_RANCH_3, SCENE_LON_LON_RANCH, 3, false, true, TRANS_TYPE_FADE_WHITE, TRANS_TYPE_FADE_WHITE) +/* 0x2E7 */ DEFINE_ENTRANCE(ENTR_LON_LON_RANCH_3_1, SCENE_LON_LON_RANCH, 3, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x2E8 */ DEFINE_ENTRANCE(ENTR_LON_LON_RANCH_3_2, SCENE_LON_LON_RANCH, 3, false, true, TRANS_TYPE_FADE_WHITE, TRANS_TYPE_FADE_WHITE) +/* 0x2E9 */ DEFINE_ENTRANCE(ENTR_LON_LON_RANCH_3_3, SCENE_LON_LON_RANCH, 3, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) + +// Labeled as "Test Area" in Map Select +/* 0x2EA */ DEFINE_ENTRANCE(ENTR_TEST_SHOOTING_GALLERY_0, SCENE_SHOOTING_GALLERY, 0, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x2EB */ DEFINE_ENTRANCE(ENTR_TEST_SHOOTING_GALLERY_0_1, SCENE_SHOOTING_GALLERY, 0, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x2EC */ DEFINE_ENTRANCE(ENTR_TEST_SHOOTING_GALLERY_0_2, SCENE_SHOOTING_GALLERY, 0, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x2ED */ DEFINE_ENTRANCE(ENTR_TEST_SHOOTING_GALLERY_0_3, SCENE_SHOOTING_GALLERY, 0, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x2EE */ DEFINE_ENTRANCE(ENTR_TEST_SACRED_FOREST_MEADOW_0_4, SCENE_SACRED_FOREST_MEADOW, 0, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x2EF */ DEFINE_ENTRANCE(ENTR_TEST_CUTSCENE_MAP_0_5, SCENE_CUTSCENE_MAP, 0, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x2F0 */ DEFINE_ENTRANCE(ENTR_TEST_SHOOTING_GALLERY_0_6, SCENE_SHOOTING_GALLERY, 0, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x2F1 */ DEFINE_ENTRANCE(ENTR_TEST_SHOOTING_GALLERY_0_7, SCENE_SHOOTING_GALLERY, 0, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x2F2 */ DEFINE_ENTRANCE(ENTR_TEST_SHOOTING_GALLERY_0_8, SCENE_SHOOTING_GALLERY, 0, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x2F3 */ DEFINE_ENTRANCE(ENTR_TEST_SHOOTING_GALLERY_0_9, SCENE_SHOOTING_GALLERY, 0, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x2F4 */ DEFINE_ENTRANCE(ENTR_TEST_SHOOTING_GALLERY_0_10, SCENE_SHOOTING_GALLERY, 0, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) + +/* 0x2F5 */ DEFINE_ENTRANCE(ENTR_SPIRIT_TEMPLE_1, SCENE_SPIRIT_TEMPLE, 1, true, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x2F6 */ DEFINE_ENTRANCE(ENTR_SPIRIT_TEMPLE_1_1, SCENE_SPIRIT_TEMPLE, 1, true, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x2F7 */ DEFINE_ENTRANCE(ENTR_SPIRIT_TEMPLE_1_2, SCENE_SPIRIT_TEMPLE, 1, true, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x2F8 */ DEFINE_ENTRANCE(ENTR_SPIRIT_TEMPLE_1_3, SCENE_SPIRIT_TEMPLE, 1, true, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) + +/* 0x2F9 */ DEFINE_ENTRANCE(ENTR_STABLE_0, SCENE_STABLE, 0, false, true, TRANS_TYPE_FADE_BLACK_FAST, TRANS_TYPE_CIRCLE(TCA_NORMAL, TCC_BLACK, TCS_FAST)) +/* 0x2FA */ DEFINE_ENTRANCE(ENTR_STABLE_0_1, SCENE_STABLE, 0, false, true, TRANS_TYPE_FADE_BLACK_FAST, TRANS_TYPE_CIRCLE(TCA_NORMAL, TCC_BLACK, TCS_FAST)) +/* 0x2FB */ DEFINE_ENTRANCE(ENTR_STABLE_0_2, SCENE_STABLE, 0, false, true, TRANS_TYPE_FADE_BLACK_FAST, TRANS_TYPE_CIRCLE(TCA_NORMAL, TCC_BLACK, TCS_FAST)) +/* 0x2FC */ DEFINE_ENTRANCE(ENTR_STABLE_0_3, SCENE_STABLE, 0, false, true, TRANS_TYPE_FADE_BLACK_FAST, TRANS_TYPE_CIRCLE(TCA_NORMAL, TCC_BLACK, TCS_FAST)) + +/* 0x2FD */ DEFINE_ENTRANCE(ENTR_KAKARIKO_CENTER_GUEST_HOUSE_0, SCENE_KAKARIKO_CENTER_GUEST_HOUSE, 0, false, true, TRANS_TYPE_FADE_BLACK_FAST, TRANS_TYPE_CIRCLE(TCA_NORMAL, TCC_BLACK, TCS_FAST)) +/* 0x2FE */ DEFINE_ENTRANCE(ENTR_KAKARIKO_CENTER_GUEST_HOUSE_0_1, SCENE_KAKARIKO_CENTER_GUEST_HOUSE, 0, false, true, TRANS_TYPE_FADE_BLACK_FAST, TRANS_TYPE_CIRCLE(TCA_NORMAL, TCC_BLACK, TCS_FAST)) +/* 0x2FF */ DEFINE_ENTRANCE(ENTR_KAKARIKO_CENTER_GUEST_HOUSE_0_2, SCENE_KAKARIKO_CENTER_GUEST_HOUSE, 0, false, true, TRANS_TYPE_FADE_BLACK_FAST, TRANS_TYPE_CIRCLE(TCA_NORMAL, TCC_BLACK, TCS_FAST)) +/* 0x300 */ DEFINE_ENTRANCE(ENTR_KAKARIKO_CENTER_GUEST_HOUSE_0_3, SCENE_KAKARIKO_CENTER_GUEST_HOUSE, 0, false, true, TRANS_TYPE_FADE_BLACK_FAST, TRANS_TYPE_CIRCLE(TCA_NORMAL, TCC_BLACK, TCS_FAST)) + +/* 0x301 */ DEFINE_ENTRANCE(ENTR_JABU_JABU_BOSS_0, SCENE_JABU_JABU_BOSS, 0, true, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x302 */ DEFINE_ENTRANCE(ENTR_JABU_JABU_BOSS_0_1, SCENE_JABU_JABU_BOSS, 0, true, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x303 */ DEFINE_ENTRANCE(ENTR_JABU_JABU_BOSS_0_2, SCENE_JABU_JABU_BOSS, 0, true, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x304 */ DEFINE_ENTRANCE(ENTR_JABU_JABU_BOSS_0_3, SCENE_JABU_JABU_BOSS, 0, true, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) + +/* 0x305 */ DEFINE_ENTRANCE(ENTR_FIRE_TEMPLE_BOSS_0, SCENE_FIRE_TEMPLE_BOSS, 0, true, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x306 */ DEFINE_ENTRANCE(ENTR_FIRE_TEMPLE_BOSS_0_1, SCENE_FIRE_TEMPLE_BOSS, 0, true, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x307 */ DEFINE_ENTRANCE(ENTR_FIRE_TEMPLE_BOSS_0_2, SCENE_FIRE_TEMPLE_BOSS, 0, true, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x308 */ DEFINE_ENTRANCE(ENTR_FIRE_TEMPLE_BOSS_0_3, SCENE_FIRE_TEMPLE_BOSS, 0, true, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) + +/* 0x309 */ DEFINE_ENTRANCE(ENTR_LAKE_HYLIA_6, SCENE_LAKE_HYLIA, 6, false, true, TRANS_TYPE_FADE_BLACK_FAST, TRANS_TYPE_FADE_BLACK) +/* 0x30A */ DEFINE_ENTRANCE(ENTR_LAKE_HYLIA_6_1, SCENE_LAKE_HYLIA, 6, false, true, TRANS_TYPE_FADE_BLACK_FAST, TRANS_TYPE_FADE_BLACK) +/* 0x30B */ DEFINE_ENTRANCE(ENTR_LAKE_HYLIA_6_2, SCENE_LAKE_HYLIA, 6, false, true, TRANS_TYPE_FADE_BLACK_FAST, TRANS_TYPE_FADE_BLACK) +/* 0x30C */ DEFINE_ENTRANCE(ENTR_LAKE_HYLIA_6_3, SCENE_LAKE_HYLIA, 6, false, true, TRANS_TYPE_FADE_BLACK_FAST, TRANS_TYPE_FADE_BLACK) + +/* 0x30D */ DEFINE_ENTRANCE(ENTR_GRAVEKEEPERS_HUT_0, SCENE_GRAVEKEEPERS_HUT, 0, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_CIRCLE(TCA_NORMAL, TCC_BLACK, TCS_FAST)) +/* 0x30E */ DEFINE_ENTRANCE(ENTR_GRAVEKEEPERS_HUT_0_1, SCENE_GRAVEKEEPERS_HUT, 0, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_CIRCLE(TCA_NORMAL, TCC_BLACK, TCS_FAST)) +/* 0x30F */ DEFINE_ENTRANCE(ENTR_GRAVEKEEPERS_HUT_0_2, SCENE_GRAVEKEEPERS_HUT, 0, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_CIRCLE(TCA_NORMAL, TCC_BLACK, TCS_FAST)) +/* 0x310 */ DEFINE_ENTRANCE(ENTR_GRAVEKEEPERS_HUT_0_3, SCENE_GRAVEKEEPERS_HUT, 0, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_CIRCLE(TCA_NORMAL, TCC_BLACK, TCS_FAST)) + +/* 0x311 */ DEFINE_ENTRANCE(ENTR_HYRULE_FIELD_14, SCENE_HYRULE_FIELD, 14, true, true, TRANS_TYPE_FADE_WHITE, TRANS_TYPE_FADE_WHITE) +/* 0x312 */ DEFINE_ENTRANCE(ENTR_HYRULE_FIELD_14_1, SCENE_HYRULE_FIELD, 14, true, true, TRANS_TYPE_FADE_WHITE, TRANS_TYPE_FADE_WHITE) +/* 0x313 */ DEFINE_ENTRANCE(ENTR_HYRULE_FIELD_14_2, SCENE_HYRULE_FIELD, 14, true, true, TRANS_TYPE_FADE_WHITE, TRANS_TYPE_FADE_WHITE) +/* 0x314 */ DEFINE_ENTRANCE(ENTR_HYRULE_FIELD_14_3, SCENE_HYRULE_FIELD, 14, true, true, TRANS_TYPE_FADE_WHITE, TRANS_TYPE_FADE_WHITE) + +/* 0x315 */ DEFINE_ENTRANCE(ENTR_GREAT_FAIRYS_FOUNTAIN_MAGIC_0, SCENE_GREAT_FAIRYS_FOUNTAIN_MAGIC, 0, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x316 */ DEFINE_ENTRANCE(ENTR_GREAT_FAIRYS_FOUNTAIN_MAGIC_0_1, SCENE_GREAT_FAIRYS_FOUNTAIN_MAGIC, 0, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x317 */ DEFINE_ENTRANCE(ENTR_GREAT_FAIRYS_FOUNTAIN_MAGIC_0_2, SCENE_GREAT_FAIRYS_FOUNTAIN_MAGIC, 0, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x318 */ DEFINE_ENTRANCE(ENTR_GREAT_FAIRYS_FOUNTAIN_MAGIC_0_3, SCENE_GREAT_FAIRYS_FOUNTAIN_MAGIC, 0, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x319 */ DEFINE_ENTRANCE(ENTR_GREAT_FAIRYS_FOUNTAIN_MAGIC_0_4, SCENE_GREAT_FAIRYS_FOUNTAIN_MAGIC, 0, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x31A */ DEFINE_ENTRANCE(ENTR_GREAT_FAIRYS_FOUNTAIN_MAGIC_0_5, SCENE_GREAT_FAIRYS_FOUNTAIN_MAGIC, 0, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x31B */ DEFINE_ENTRANCE(ENTR_GREAT_FAIRYS_FOUNTAIN_MAGIC_0_6, SCENE_GREAT_FAIRYS_FOUNTAIN_MAGIC, 0, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) + +/* 0x31C */ DEFINE_ENTRANCE(ENTR_REDEAD_GRAVE_0, SCENE_REDEAD_GRAVE, 0, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_CIRCLE(TCA_STARBURST,TCC_BLACK, TCS_FAST)) +/* 0x31D */ DEFINE_ENTRANCE(ENTR_REDEAD_GRAVE_0_1, SCENE_REDEAD_GRAVE, 0, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_CIRCLE(TCA_STARBURST,TCC_BLACK, TCS_FAST)) +/* 0x31E */ DEFINE_ENTRANCE(ENTR_REDEAD_GRAVE_0_2, SCENE_REDEAD_GRAVE, 0, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_CIRCLE(TCA_STARBURST,TCC_BLACK, TCS_FAST)) +/* 0x31F */ DEFINE_ENTRANCE(ENTR_REDEAD_GRAVE_0_3, SCENE_REDEAD_GRAVE, 0, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_CIRCLE(TCA_STARBURST,TCC_BLACK, TCS_FAST)) + +/* 0x320 */ DEFINE_ENTRANCE(ENTR_TEMPLE_OF_TIME_3, SCENE_TEMPLE_OF_TIME, 3, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x321 */ DEFINE_ENTRANCE(ENTR_TEMPLE_OF_TIME_3_1, SCENE_TEMPLE_OF_TIME, 3, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x322 */ DEFINE_ENTRANCE(ENTR_TEMPLE_OF_TIME_3_2, SCENE_TEMPLE_OF_TIME, 3, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x323 */ DEFINE_ENTRANCE(ENTR_TEMPLE_OF_TIME_3_3, SCENE_TEMPLE_OF_TIME, 3, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) + +/* 0x324 */ DEFINE_ENTRANCE(ENTR_TEMPLE_OF_TIME_4, SCENE_TEMPLE_OF_TIME, 4, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x325 */ DEFINE_ENTRANCE(ENTR_TEMPLE_OF_TIME_4_1, SCENE_TEMPLE_OF_TIME, 4, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x326 */ DEFINE_ENTRANCE(ENTR_TEMPLE_OF_TIME_4_2, SCENE_TEMPLE_OF_TIME, 4, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x327 */ DEFINE_ENTRANCE(ENTR_TEMPLE_OF_TIME_4_3, SCENE_TEMPLE_OF_TIME, 4, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) + +/* 0x328 */ DEFINE_ENTRANCE(ENTR_ZORAS_DOMAIN_4, SCENE_ZORAS_DOMAIN, 4, false, true, TRANS_TYPE_CIRCLE(TCA_RIPPLE, TCC_WHITE, TCS_FAST), TRANS_TYPE_CIRCLE(TCA_RIPPLE, TCC_WHITE, TCS_FAST)) +/* 0x329 */ DEFINE_ENTRANCE(ENTR_ZORAS_DOMAIN_4_1, SCENE_ZORAS_DOMAIN, 4, false, true, TRANS_TYPE_CIRCLE(TCA_RIPPLE, TCC_WHITE, TCS_FAST), TRANS_TYPE_CIRCLE(TCA_RIPPLE, TCC_WHITE, TCS_FAST)) +/* 0x32A */ DEFINE_ENTRANCE(ENTR_ZORAS_DOMAIN_4_2, SCENE_ZORAS_DOMAIN, 4, false, true, TRANS_TYPE_CIRCLE(TCA_RIPPLE, TCC_WHITE, TCS_FAST), TRANS_TYPE_CIRCLE(TCA_RIPPLE, TCC_WHITE, TCS_FAST)) +/* 0x32B */ DEFINE_ENTRANCE(ENTR_ZORAS_DOMAIN_4_3, SCENE_ZORAS_DOMAIN, 4, false, true, TRANS_TYPE_CIRCLE(TCA_RIPPLE, TCC_WHITE, TCS_FAST), TRANS_TYPE_CIRCLE(TCA_RIPPLE, TCC_WHITE, TCS_FAST)) + +/* 0x32C */ DEFINE_ENTRANCE(ENTR_GANONS_TOWER_COLLAPSE_EXTERIOR_2, SCENE_GANONS_TOWER_COLLAPSE_EXTERIOR, 2, true, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x32D */ DEFINE_ENTRANCE(ENTR_GANONS_TOWER_COLLAPSE_EXTERIOR_2_1, SCENE_GANONS_TOWER_COLLAPSE_EXTERIOR, 2, true, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x32E */ DEFINE_ENTRANCE(ENTR_GANONS_TOWER_COLLAPSE_EXTERIOR_2_2, SCENE_GANONS_TOWER_COLLAPSE_EXTERIOR, 2, true, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x32F */ DEFINE_ENTRANCE(ENTR_GANONS_TOWER_COLLAPSE_EXTERIOR_2_3, SCENE_GANONS_TOWER_COLLAPSE_EXTERIOR, 2, true, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) + +/* 0x330 */ DEFINE_ENTRANCE(ENTR_GANONS_TOWER_COLLAPSE_EXTERIOR_3, SCENE_GANONS_TOWER_COLLAPSE_EXTERIOR, 3, true, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x331 */ DEFINE_ENTRANCE(ENTR_GANONS_TOWER_COLLAPSE_EXTERIOR_3_1, SCENE_GANONS_TOWER_COLLAPSE_EXTERIOR, 3, true, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x332 */ DEFINE_ENTRANCE(ENTR_GANONS_TOWER_COLLAPSE_EXTERIOR_3_2, SCENE_GANONS_TOWER_COLLAPSE_EXTERIOR, 3, true, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x333 */ DEFINE_ENTRANCE(ENTR_GANONS_TOWER_COLLAPSE_EXTERIOR_3_3, SCENE_GANONS_TOWER_COLLAPSE_EXTERIOR, 3, true, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) + +/* 0x334 */ DEFINE_ENTRANCE(ENTR_GANONS_TOWER_COLLAPSE_EXTERIOR_4, SCENE_GANONS_TOWER_COLLAPSE_EXTERIOR, 4, true, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x335 */ DEFINE_ENTRANCE(ENTR_GANONS_TOWER_COLLAPSE_EXTERIOR_4_1, SCENE_GANONS_TOWER_COLLAPSE_EXTERIOR, 4, true, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x336 */ DEFINE_ENTRANCE(ENTR_GANONS_TOWER_COLLAPSE_EXTERIOR_4_2, SCENE_GANONS_TOWER_COLLAPSE_EXTERIOR, 4, true, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x337 */ DEFINE_ENTRANCE(ENTR_GANONS_TOWER_COLLAPSE_EXTERIOR_4_3, SCENE_GANONS_TOWER_COLLAPSE_EXTERIOR, 4, true, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) + +/* 0x338 */ DEFINE_ENTRANCE(ENTR_KOKIRI_FOREST_7, SCENE_KOKIRI_FOREST, 7, false, false, TRANS_TYPE_FADE_BLACK_FAST, TRANS_TYPE_FADE_BLACK_FAST) +/* 0x339 */ DEFINE_ENTRANCE(ENTR_KOKIRI_FOREST_7_1, SCENE_KOKIRI_FOREST, 7, false, false, TRANS_TYPE_FADE_BLACK_FAST, TRANS_TYPE_FADE_BLACK_FAST) +/* 0x33A */ DEFINE_ENTRANCE(ENTR_KOKIRI_FOREST_7_2, SCENE_KOKIRI_FOREST, 7, false, false, TRANS_TYPE_FADE_BLACK_FAST, TRANS_TYPE_FADE_BLACK_FAST) +/* 0x33B */ DEFINE_ENTRANCE(ENTR_KOKIRI_FOREST_7_3, SCENE_KOKIRI_FOREST, 7, false, false, TRANS_TYPE_FADE_BLACK_FAST, TRANS_TYPE_FADE_BLACK_FAST) + +/* 0x33C */ DEFINE_ENTRANCE(ENTR_KOKIRI_FOREST_8, SCENE_KOKIRI_FOREST, 8, false, false, TRANS_TYPE_FADE_BLACK_FAST, TRANS_TYPE_FADE_BLACK_FAST) +/* 0x33D */ DEFINE_ENTRANCE(ENTR_KOKIRI_FOREST_8_1, SCENE_KOKIRI_FOREST, 8, false, false, TRANS_TYPE_FADE_BLACK_FAST, TRANS_TYPE_FADE_BLACK_FAST) +/* 0x33E */ DEFINE_ENTRANCE(ENTR_KOKIRI_FOREST_8_2, SCENE_KOKIRI_FOREST, 8, false, false, TRANS_TYPE_FADE_BLACK_FAST, TRANS_TYPE_FADE_BLACK_FAST) +/* 0x33F */ DEFINE_ENTRANCE(ENTR_KOKIRI_FOREST_8_3, SCENE_KOKIRI_FOREST, 8, false, false, TRANS_TYPE_FADE_BLACK_FAST, TRANS_TYPE_FADE_BLACK_FAST) + +/* 0x340 */ DEFINE_ENTRANCE(ENTR_HYRULE_CASTLE_2, SCENE_HYRULE_CASTLE, 2, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x341 */ DEFINE_ENTRANCE(ENTR_HYRULE_CASTLE_2_1, SCENE_HYRULE_CASTLE, 2, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x342 */ DEFINE_ENTRANCE(ENTR_OUTSIDE_GANONS_CASTLE_2_2, SCENE_OUTSIDE_GANONS_CASTLE, 2, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x343 */ DEFINE_ENTRANCE(ENTR_OUTSIDE_GANONS_CASTLE_2_3, SCENE_OUTSIDE_GANONS_CASTLE, 2, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x344 */ DEFINE_ENTRANCE(ENTR_HYRULE_CASTLE_2_4, SCENE_HYRULE_CASTLE, 2, false, true, TRANS_TYPE_WIPE, TRANS_TYPE_WIPE) + +/* 0x345 */ DEFINE_ENTRANCE(ENTR_KAKARIKO_VILLAGE_5, SCENE_KAKARIKO_VILLAGE, 5, false, true, TRANS_TYPE_FADE_BLACK_FAST, TRANS_TYPE_FADE_BLACK) +/* 0x346 */ DEFINE_ENTRANCE(ENTR_KAKARIKO_VILLAGE_5_1, SCENE_KAKARIKO_VILLAGE, 5, false, true, TRANS_TYPE_FADE_BLACK_FAST, TRANS_TYPE_FADE_BLACK) +/* 0x347 */ DEFINE_ENTRANCE(ENTR_KAKARIKO_VILLAGE_5_2, SCENE_KAKARIKO_VILLAGE, 5, false, true, TRANS_TYPE_FADE_BLACK_FAST, TRANS_TYPE_FADE_BLACK) +/* 0x348 */ DEFINE_ENTRANCE(ENTR_KAKARIKO_VILLAGE_5_3, SCENE_KAKARIKO_VILLAGE, 5, false, true, TRANS_TYPE_FADE_BLACK_FAST, TRANS_TYPE_FADE_BLACK) + +/* 0x349 */ DEFINE_ENTRANCE(ENTR_KAKARIKO_VILLAGE_6, SCENE_KAKARIKO_VILLAGE, 6, false, true, TRANS_TYPE_FADE_BLACK_FAST, TRANS_TYPE_FADE_BLACK) +/* 0x34A */ DEFINE_ENTRANCE(ENTR_KAKARIKO_VILLAGE_6_1, SCENE_KAKARIKO_VILLAGE, 6, false, true, TRANS_TYPE_FADE_BLACK_FAST, TRANS_TYPE_FADE_BLACK) +/* 0x34B */ DEFINE_ENTRANCE(ENTR_KAKARIKO_VILLAGE_6_2, SCENE_KAKARIKO_VILLAGE, 6, false, true, TRANS_TYPE_FADE_BLACK_FAST, TRANS_TYPE_FADE_BLACK) +/* 0x34C */ DEFINE_ENTRANCE(ENTR_KAKARIKO_VILLAGE_6_3, SCENE_KAKARIKO_VILLAGE, 6, false, true, TRANS_TYPE_FADE_BLACK_FAST, TRANS_TYPE_FADE_BLACK) + +/* 0x34D */ DEFINE_ENTRANCE(ENTR_KAKARIKO_VILLAGE_7, SCENE_KAKARIKO_VILLAGE, 7, false, true, TRANS_TYPE_FADE_BLACK_FAST, TRANS_TYPE_FADE_BLACK) +/* 0x34E */ DEFINE_ENTRANCE(ENTR_KAKARIKO_VILLAGE_7_1, SCENE_KAKARIKO_VILLAGE, 7, false, true, TRANS_TYPE_FADE_BLACK_FAST, TRANS_TYPE_FADE_BLACK) +/* 0x34F */ DEFINE_ENTRANCE(ENTR_KAKARIKO_VILLAGE_7_2, SCENE_KAKARIKO_VILLAGE, 7, false, true, TRANS_TYPE_FADE_BLACK_FAST, TRANS_TYPE_FADE_BLACK) +/* 0x350 */ DEFINE_ENTRANCE(ENTR_KAKARIKO_VILLAGE_7_3, SCENE_KAKARIKO_VILLAGE, 7, false, true, TRANS_TYPE_FADE_BLACK_FAST, TRANS_TYPE_FADE_BLACK) + +/* 0x351 */ DEFINE_ENTRANCE(ENTR_KAKARIKO_VILLAGE_8, SCENE_KAKARIKO_VILLAGE, 8, false, true, TRANS_TYPE_FADE_BLACK_FAST, TRANS_TYPE_FADE_BLACK) +/* 0x352 */ DEFINE_ENTRANCE(ENTR_KAKARIKO_VILLAGE_8_1, SCENE_KAKARIKO_VILLAGE, 8, false, true, TRANS_TYPE_FADE_BLACK_FAST, TRANS_TYPE_FADE_BLACK) +/* 0x353 */ DEFINE_ENTRANCE(ENTR_KAKARIKO_VILLAGE_8_2, SCENE_KAKARIKO_VILLAGE, 8, false, true, TRANS_TYPE_FADE_BLACK_FAST, TRANS_TYPE_FADE_BLACK) +/* 0x354 */ DEFINE_ENTRANCE(ENTR_KAKARIKO_VILLAGE_8_3, SCENE_KAKARIKO_VILLAGE, 8, false, true, TRANS_TYPE_FADE_BLACK_FAST, TRANS_TYPE_FADE_BLACK) + +/* 0x355 */ DEFINE_ENTRANCE(ENTR_GRAVEYARD_2, SCENE_GRAVEYARD, 2, false, true, TRANS_TYPE_FADE_BLACK_FAST, TRANS_TYPE_FADE_BLACK) +/* 0x356 */ DEFINE_ENTRANCE(ENTR_GRAVEYARD_2_1, SCENE_GRAVEYARD, 2, false, true, TRANS_TYPE_FADE_BLACK_FAST, TRANS_TYPE_FADE_BLACK) +/* 0x357 */ DEFINE_ENTRANCE(ENTR_GRAVEYARD_2_2, SCENE_GRAVEYARD, 2, false, true, TRANS_TYPE_FADE_BLACK_FAST, TRANS_TYPE_FADE_BLACK) +/* 0x358 */ DEFINE_ENTRANCE(ENTR_GRAVEYARD_2_3, SCENE_GRAVEYARD, 2, false, true, TRANS_TYPE_FADE_BLACK_FAST, TRANS_TYPE_FADE_BLACK) + +/* 0x359 */ DEFINE_ENTRANCE(ENTR_GRAVEYARD_3, SCENE_GRAVEYARD, 3, false, true, TRANS_TYPE_FADE_WHITE, TRANS_TYPE_FADE_WHITE) +/* 0x35A */ DEFINE_ENTRANCE(ENTR_GRAVEYARD_3_1, SCENE_GRAVEYARD, 3, false, true, TRANS_TYPE_FADE_WHITE, TRANS_TYPE_FADE_WHITE) +/* 0x35B */ DEFINE_ENTRANCE(ENTR_GRAVEYARD_3_2, SCENE_GRAVEYARD, 3, false, true, TRANS_TYPE_FADE_WHITE, TRANS_TYPE_FADE_WHITE) +/* 0x35C */ DEFINE_ENTRANCE(ENTR_GRAVEYARD_3_3, SCENE_GRAVEYARD, 3, false, true, TRANS_TYPE_FADE_WHITE, TRANS_TYPE_FADE_WHITE) + +/* 0x35D */ DEFINE_ENTRANCE(ENTR_GRAVEYARD_4, SCENE_GRAVEYARD, 4, false, true, TRANS_TYPE_FADE_WHITE, TRANS_TYPE_FADE_WHITE) +/* 0x35E */ DEFINE_ENTRANCE(ENTR_GRAVEYARD_4_1, SCENE_GRAVEYARD, 4, false, true, TRANS_TYPE_FADE_WHITE, TRANS_TYPE_FADE_WHITE) +/* 0x35F */ DEFINE_ENTRANCE(ENTR_GRAVEYARD_4_2, SCENE_GRAVEYARD, 4, false, true, TRANS_TYPE_FADE_WHITE, TRANS_TYPE_FADE_WHITE) +/* 0x360 */ DEFINE_ENTRANCE(ENTR_GRAVEYARD_4_3, SCENE_GRAVEYARD, 4, false, true, TRANS_TYPE_FADE_WHITE, TRANS_TYPE_FADE_WHITE) + +/* 0x361 */ DEFINE_ENTRANCE(ENTR_GRAVEYARD_5, SCENE_GRAVEYARD, 5, false, true, TRANS_TYPE_FADE_WHITE, TRANS_TYPE_FADE_WHITE) +/* 0x362 */ DEFINE_ENTRANCE(ENTR_GRAVEYARD_5_1, SCENE_GRAVEYARD, 5, false, true, TRANS_TYPE_FADE_WHITE, TRANS_TYPE_FADE_WHITE) +/* 0x363 */ DEFINE_ENTRANCE(ENTR_GRAVEYARD_5_2, SCENE_GRAVEYARD, 5, false, true, TRANS_TYPE_FADE_WHITE, TRANS_TYPE_FADE_WHITE) +/* 0x364 */ DEFINE_ENTRANCE(ENTR_GRAVEYARD_5_3, SCENE_GRAVEYARD, 5, false, true, TRANS_TYPE_FADE_WHITE, TRANS_TYPE_FADE_WHITE) + +/* 0x365 */ DEFINE_ENTRANCE(ENTR_HAUNTED_WASTELAND_1, SCENE_HAUNTED_WASTELAND, 1, true, true, TRANS_TYPE_SANDSTORM_PERSIST, TRANS_TYPE_SANDSTORM_PERSIST) +/* 0x366 */ DEFINE_ENTRANCE(ENTR_HAUNTED_WASTELAND_1_1, SCENE_HAUNTED_WASTELAND, 1, true, true, TRANS_TYPE_SANDSTORM_PERSIST, TRANS_TYPE_SANDSTORM_PERSIST) +/* 0x367 */ DEFINE_ENTRANCE(ENTR_HAUNTED_WASTELAND_1_2, SCENE_HAUNTED_WASTELAND, 1, true, true, TRANS_TYPE_SANDSTORM_PERSIST, TRANS_TYPE_SANDSTORM_PERSIST) +/* 0x368 */ DEFINE_ENTRANCE(ENTR_HAUNTED_WASTELAND_1_3, SCENE_HAUNTED_WASTELAND, 1, true, true, TRANS_TYPE_SANDSTORM_PERSIST, TRANS_TYPE_SANDSTORM_PERSIST) + +/* 0x369 */ DEFINE_ENTRANCE(ENTR_HAUNTED_WASTELAND_2, SCENE_HAUNTED_WASTELAND, 2, false, true, TRANS_TYPE_SANDSTORM_PERSIST, TRANS_TYPE_SANDSTORM_PERSIST) +/* 0x36A */ DEFINE_ENTRANCE(ENTR_HAUNTED_WASTELAND_2_1, SCENE_HAUNTED_WASTELAND, 2, false, true, TRANS_TYPE_SANDSTORM_PERSIST, TRANS_TYPE_SANDSTORM_PERSIST) +/* 0x36B */ DEFINE_ENTRANCE(ENTR_HAUNTED_WASTELAND_2_2, SCENE_HAUNTED_WASTELAND, 2, false, true, TRANS_TYPE_SANDSTORM_PERSIST, TRANS_TYPE_SANDSTORM_PERSIST) +/* 0x36C */ DEFINE_ENTRANCE(ENTR_HAUNTED_WASTELAND_2_3, SCENE_HAUNTED_WASTELAND, 2, false, true, TRANS_TYPE_SANDSTORM_PERSIST, TRANS_TYPE_SANDSTORM_PERSIST) + +/* 0x36D */ DEFINE_ENTRANCE(ENTR_FAIRYS_FOUNTAIN_0, SCENE_FAIRYS_FOUNTAIN, 0, false, true, TRANS_TYPE_FADE_WHITE, TRANS_TYPE_FADE_WHITE) +/* 0x36E */ DEFINE_ENTRANCE(ENTR_FAIRYS_FOUNTAIN_0_1, SCENE_FAIRYS_FOUNTAIN, 0, false, true, TRANS_TYPE_FADE_WHITE, TRANS_TYPE_FADE_WHITE) +/* 0x36F */ DEFINE_ENTRANCE(ENTR_FAIRYS_FOUNTAIN_0_2, SCENE_FAIRYS_FOUNTAIN, 0, false, true, TRANS_TYPE_FADE_WHITE, TRANS_TYPE_FADE_WHITE) +/* 0x370 */ DEFINE_ENTRANCE(ENTR_FAIRYS_FOUNTAIN_0_3, SCENE_FAIRYS_FOUNTAIN, 0, false, true, TRANS_TYPE_FADE_WHITE, TRANS_TYPE_FADE_WHITE) + +/* 0x371 */ DEFINE_ENTRANCE(ENTR_GREAT_FAIRYS_FOUNTAIN_SPELLS_0, SCENE_GREAT_FAIRYS_FOUNTAIN_SPELLS, 0, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x372 */ DEFINE_ENTRANCE(ENTR_GREAT_FAIRYS_FOUNTAIN_SPELLS_0_1, SCENE_GREAT_FAIRYS_FOUNTAIN_SPELLS, 0, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x373 */ DEFINE_ENTRANCE(ENTR_GREAT_FAIRYS_FOUNTAIN_SPELLS_0_2, SCENE_GREAT_FAIRYS_FOUNTAIN_SPELLS, 0, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x374 */ DEFINE_ENTRANCE(ENTR_GREAT_FAIRYS_FOUNTAIN_SPELLS_0_3, SCENE_GREAT_FAIRYS_FOUNTAIN_SPELLS, 0, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x375 */ DEFINE_ENTRANCE(ENTR_GREAT_FAIRYS_FOUNTAIN_SPELLS_0_4, SCENE_GREAT_FAIRYS_FOUNTAIN_SPELLS, 0, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x376 */ DEFINE_ENTRANCE(ENTR_GREAT_FAIRYS_FOUNTAIN_SPELLS_0_5, SCENE_GREAT_FAIRYS_FOUNTAIN_SPELLS, 0, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x377 */ DEFINE_ENTRANCE(ENTR_GREAT_FAIRYS_FOUNTAIN_SPELLS_0_6, SCENE_GREAT_FAIRYS_FOUNTAIN_SPELLS, 0, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) + +/* 0x378 */ DEFINE_ENTRANCE(ENTR_LON_LON_RANCH_4, SCENE_LON_LON_RANCH, 4, false, true, TRANS_TYPE_FADE_BLACK_FAST, TRANS_TYPE_FADE_BLACK) +/* 0x379 */ DEFINE_ENTRANCE(ENTR_LON_LON_RANCH_4_1, SCENE_LON_LON_RANCH, 4, false, true, TRANS_TYPE_FADE_BLACK_FAST, TRANS_TYPE_FADE_BLACK) +/* 0x37A */ DEFINE_ENTRANCE(ENTR_LON_LON_RANCH_4_2, SCENE_LON_LON_RANCH, 4, false, true, TRANS_TYPE_FADE_BLACK_FAST, TRANS_TYPE_FADE_BLACK) +/* 0x37B */ DEFINE_ENTRANCE(ENTR_LON_LON_RANCH_4_3, SCENE_LON_LON_RANCH, 4, false, true, TRANS_TYPE_FADE_BLACK_FAST, TRANS_TYPE_FADE_BLACK) + +/* 0x37C */ DEFINE_ENTRANCE(ENTR_GORON_SHOP_0, SCENE_GORON_SHOP, 0, false, true, TRANS_TYPE_FADE_BLACK_FAST, TRANS_TYPE_CIRCLE(TCA_NORMAL, TCC_BLACK, TCS_FAST)) +/* 0x37D */ DEFINE_ENTRANCE(ENTR_GORON_SHOP_0_1, SCENE_GORON_SHOP, 0, false, true, TRANS_TYPE_FADE_BLACK_FAST, TRANS_TYPE_CIRCLE(TCA_NORMAL, TCC_BLACK, TCS_FAST)) +/* 0x37E */ DEFINE_ENTRANCE(ENTR_GORON_SHOP_0_2, SCENE_GORON_SHOP, 0, false, true, TRANS_TYPE_FADE_BLACK_FAST, TRANS_TYPE_CIRCLE(TCA_NORMAL, TCC_BLACK, TCS_FAST)) +/* 0x37F */ DEFINE_ENTRANCE(ENTR_GORON_SHOP_0_3, SCENE_GORON_SHOP, 0, false, true, TRANS_TYPE_FADE_BLACK_FAST, TRANS_TYPE_CIRCLE(TCA_NORMAL, TCC_BLACK, TCS_FAST)) + +/* 0x380 */ DEFINE_ENTRANCE(ENTR_ZORA_SHOP_0, SCENE_ZORA_SHOP, 0, false, true, TRANS_TYPE_FADE_BLACK_FAST, TRANS_TYPE_FADE_BLACK_FAST) +/* 0x381 */ DEFINE_ENTRANCE(ENTR_ZORA_SHOP_0_1, SCENE_ZORA_SHOP, 0, false, true, TRANS_TYPE_FADE_BLACK_FAST, TRANS_TYPE_FADE_BLACK_FAST) +/* 0x382 */ DEFINE_ENTRANCE(ENTR_ZORA_SHOP_0_2, SCENE_ZORA_SHOP, 0, false, true, TRANS_TYPE_FADE_BLACK_FAST, TRANS_TYPE_FADE_BLACK_FAST) +/* 0x383 */ DEFINE_ENTRANCE(ENTR_ZORA_SHOP_0_3, SCENE_ZORA_SHOP, 0, false, true, TRANS_TYPE_FADE_BLACK_FAST, TRANS_TYPE_FADE_BLACK_FAST) + +/* 0x384 */ DEFINE_ENTRANCE(ENTR_POTION_SHOP_KAKARIKO_0, SCENE_POTION_SHOP_KAKARIKO, 0, false, false, TRANS_TYPE_FADE_BLACK_FAST, TRANS_TYPE_CIRCLE(TCA_NORMAL, TCC_BLACK, TCS_FAST)) +/* 0x385 */ DEFINE_ENTRANCE(ENTR_POTION_SHOP_KAKARIKO_0_1, SCENE_POTION_SHOP_KAKARIKO, 0, false, false, TRANS_TYPE_FADE_BLACK_FAST, TRANS_TYPE_CIRCLE(TCA_NORMAL, TCC_BLACK, TCS_FAST)) +/* 0x386 */ DEFINE_ENTRANCE(ENTR_POTION_SHOP_KAKARIKO_0_2, SCENE_POTION_SHOP_KAKARIKO, 0, false, true, TRANS_TYPE_FADE_BLACK_FAST, TRANS_TYPE_CIRCLE(TCA_NORMAL, TCC_BLACK, TCS_FAST)) +/* 0x387 */ DEFINE_ENTRANCE(ENTR_POTION_SHOP_KAKARIKO_0_3, SCENE_POTION_SHOP_KAKARIKO, 0, false, true, TRANS_TYPE_FADE_BLACK_FAST, TRANS_TYPE_CIRCLE(TCA_NORMAL, TCC_BLACK, TCS_FAST)) + +/* 0x388 */ DEFINE_ENTRANCE(ENTR_POTION_SHOP_MARKET_0, SCENE_POTION_SHOP_MARKET, 0, false, true, TRANS_TYPE_FADE_BLACK_FAST, TRANS_TYPE_CIRCLE(TCA_NORMAL, TCC_BLACK, TCS_FAST)) +/* 0x389 */ DEFINE_ENTRANCE(ENTR_POTION_SHOP_MARKET_0_1, SCENE_POTION_SHOP_MARKET, 0, false, true, TRANS_TYPE_FADE_BLACK_FAST, TRANS_TYPE_CIRCLE(TCA_NORMAL, TCC_BLACK, TCS_FAST)) +/* 0x38A */ DEFINE_ENTRANCE(ENTR_POTION_SHOP_MARKET_0_2, SCENE_POTION_SHOP_MARKET, 0, false, true, TRANS_TYPE_FADE_BLACK_FAST, TRANS_TYPE_CIRCLE(TCA_NORMAL, TCC_BLACK, TCS_FAST)) +/* 0x38B */ DEFINE_ENTRANCE(ENTR_POTION_SHOP_MARKET_0_3, SCENE_POTION_SHOP_MARKET, 0, false, true, TRANS_TYPE_FADE_BLACK_FAST, TRANS_TYPE_CIRCLE(TCA_NORMAL, TCC_BLACK, TCS_FAST)) + +/* 0x38C */ DEFINE_ENTRANCE(ENTR_BACK_ALLEY_DAY_4, SCENE_BACK_ALLEY_DAY, 4, false, true, TRANS_TYPE_FADE_BLACK_FAST, TRANS_TYPE_FADE_BLACK) +/* 0x38D */ DEFINE_ENTRANCE(ENTR_BACK_ALLEY_NIGHT_4_1, SCENE_BACK_ALLEY_NIGHT, 4, false, true, TRANS_TYPE_FADE_BLACK_FAST, TRANS_TYPE_FADE_BLACK) +/* 0x38E */ DEFINE_ENTRANCE(ENTR_BACK_ALLEY_DAY_4_2, SCENE_BACK_ALLEY_DAY, 4, false, true, TRANS_TYPE_FADE_BLACK_FAST, TRANS_TYPE_FADE_BLACK) +/* 0x38F */ DEFINE_ENTRANCE(ENTR_BACK_ALLEY_NIGHT_4_3, SCENE_BACK_ALLEY_NIGHT, 4, false, true, TRANS_TYPE_FADE_BLACK_FAST, TRANS_TYPE_FADE_BLACK) + +/* 0x390 */ DEFINE_ENTRANCE(ENTR_BOMBCHU_SHOP_0, SCENE_BOMBCHU_SHOP, 0, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x391 */ DEFINE_ENTRANCE(ENTR_BOMBCHU_SHOP_0_1, SCENE_BOMBCHU_SHOP, 0, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x392 */ DEFINE_ENTRANCE(ENTR_BOMBCHU_SHOP_0_2, SCENE_BOMBCHU_SHOP, 0, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x393 */ DEFINE_ENTRANCE(ENTR_BOMBCHU_SHOP_0_3, SCENE_BOMBCHU_SHOP, 0, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) + +/* 0x394 */ DEFINE_ENTRANCE(ENTR_ZORAS_FOUNTAIN_5, SCENE_ZORAS_FOUNTAIN, 5, false, true, TRANS_TYPE_FADE_WHITE, TRANS_TYPE_FADE_WHITE) +/* 0x395 */ DEFINE_ENTRANCE(ENTR_ZORAS_FOUNTAIN_5_1, SCENE_ZORAS_FOUNTAIN, 5, false, true, TRANS_TYPE_FADE_WHITE, TRANS_TYPE_FADE_WHITE) +/* 0x396 */ DEFINE_ENTRANCE(ENTR_ZORAS_FOUNTAIN_5_2, SCENE_ZORAS_FOUNTAIN, 5, false, true, TRANS_TYPE_FADE_WHITE, TRANS_TYPE_FADE_WHITE) +/* 0x397 */ DEFINE_ENTRANCE(ENTR_ZORAS_FOUNTAIN_5_3, SCENE_ZORAS_FOUNTAIN, 5, false, true, TRANS_TYPE_FADE_WHITE, TRANS_TYPE_FADE_WHITE) + +/* 0x398 */ DEFINE_ENTRANCE(ENTR_DOG_LADY_HOUSE_0, SCENE_DOG_LADY_HOUSE, 0, false, true, TRANS_TYPE_FADE_BLACK_FAST, TRANS_TYPE_FADE_BLACK) +/* 0x399 */ DEFINE_ENTRANCE(ENTR_DOG_LADY_HOUSE_0_1, SCENE_DOG_LADY_HOUSE, 0, false, true, TRANS_TYPE_FADE_BLACK_FAST, TRANS_TYPE_FADE_BLACK) +/* 0x39A */ DEFINE_ENTRANCE(ENTR_DOG_LADY_HOUSE_0_2, SCENE_DOG_LADY_HOUSE, 0, false, true, TRANS_TYPE_FADE_BLACK_FAST, TRANS_TYPE_FADE_BLACK) +/* 0x39B */ DEFINE_ENTRANCE(ENTR_DOG_LADY_HOUSE_0_3, SCENE_DOG_LADY_HOUSE, 0, false, true, TRANS_TYPE_FADE_BLACK_FAST, TRANS_TYPE_FADE_BLACK) + +/* 0x39C */ DEFINE_ENTRANCE(ENTR_IMPAS_HOUSE_0, SCENE_IMPAS_HOUSE, 0, false, true, TRANS_TYPE_FADE_BLACK_FAST, TRANS_TYPE_CIRCLE(TCA_NORMAL, TCC_BLACK, TCS_FAST)) +/* 0x39D */ DEFINE_ENTRANCE(ENTR_IMPAS_HOUSE_0_1, SCENE_IMPAS_HOUSE, 0, false, true, TRANS_TYPE_FADE_BLACK_FAST, TRANS_TYPE_CIRCLE(TCA_NORMAL, TCC_BLACK, TCS_FAST)) +/* 0x39E */ DEFINE_ENTRANCE(ENTR_IMPAS_HOUSE_0_2, SCENE_IMPAS_HOUSE, 0, false, true, TRANS_TYPE_FADE_BLACK_FAST, TRANS_TYPE_CIRCLE(TCA_NORMAL, TCC_BLACK, TCS_FAST)) +/* 0x39F */ DEFINE_ENTRANCE(ENTR_IMPAS_HOUSE_0_3, SCENE_IMPAS_HOUSE, 0, false, true, TRANS_TYPE_FADE_BLACK_FAST, TRANS_TYPE_CIRCLE(TCA_NORMAL, TCC_BLACK, TCS_FAST)) + +/* 0x3A0 */ DEFINE_ENTRANCE(ENTR_CARPENTERS_TENT_0, SCENE_CARPENTERS_TENT, 0, false, true, TRANS_TYPE_FADE_BLACK_FAST, TRANS_TYPE_FADE_BLACK_FAST) +/* 0x3A1 */ DEFINE_ENTRANCE(ENTR_CARPENTERS_TENT_0_1, SCENE_CARPENTERS_TENT, 0, false, true, TRANS_TYPE_FADE_BLACK_FAST, TRANS_TYPE_FADE_BLACK_FAST) +/* 0x3A2 */ DEFINE_ENTRANCE(ENTR_CARPENTERS_TENT_0_2, SCENE_CARPENTERS_TENT, 0, false, true, TRANS_TYPE_FADE_BLACK_FAST, TRANS_TYPE_FADE_BLACK_FAST) +/* 0x3A3 */ DEFINE_ENTRANCE(ENTR_CARPENTERS_TENT_0_3, SCENE_CARPENTERS_TENT, 0, false, true, TRANS_TYPE_FADE_BLACK_FAST, TRANS_TYPE_FADE_BLACK_FAST) + +/* 0x3A4 */ DEFINE_ENTRANCE(ENTR_GERUDOS_FORTRESS_13, SCENE_GERUDOS_FORTRESS, 13, false, true, TRANS_TYPE_FADE_WHITE, TRANS_TYPE_FADE_WHITE) +/* 0x3A5 */ DEFINE_ENTRANCE(ENTR_GERUDOS_FORTRESS_13_1, SCENE_GERUDOS_FORTRESS, 13, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x3A6 */ DEFINE_ENTRANCE(ENTR_GERUDOS_FORTRESS_13_2, SCENE_GERUDOS_FORTRESS, 13, false, true, TRANS_TYPE_FADE_WHITE, TRANS_TYPE_FADE_WHITE) +/* 0x3A7 */ DEFINE_ENTRANCE(ENTR_GERUDOS_FORTRESS_13_3, SCENE_GERUDOS_FORTRESS, 13, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) + +/* 0x3A8 */ DEFINE_ENTRANCE(ENTR_GERUDOS_FORTRESS_14, SCENE_GERUDOS_FORTRESS, 14, false, true, TRANS_TYPE_FADE_WHITE, TRANS_TYPE_FADE_WHITE_FAST) +/* 0x3A9 */ DEFINE_ENTRANCE(ENTR_GERUDOS_FORTRESS_14_1, SCENE_GERUDOS_FORTRESS, 14, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK_FAST) +/* 0x3AA */ DEFINE_ENTRANCE(ENTR_GERUDOS_FORTRESS_14_2, SCENE_GERUDOS_FORTRESS, 14, false, true, TRANS_TYPE_FADE_WHITE, TRANS_TYPE_FADE_WHITE_FAST) +/* 0x3AB */ DEFINE_ENTRANCE(ENTR_GERUDOS_FORTRESS_14_3, SCENE_GERUDOS_FORTRESS, 14, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK_FAST) + +/* 0x3AC */ DEFINE_ENTRANCE(ENTR_GERUDOS_FORTRESS_15, SCENE_GERUDOS_FORTRESS, 15, true, true, TRANS_TYPE_SANDSTORM_END, TRANS_TYPE_SANDSTORM_END) +/* 0x3AD */ DEFINE_ENTRANCE(ENTR_GERUDOS_FORTRESS_15_1, SCENE_GERUDOS_FORTRESS, 15, true, true, TRANS_TYPE_SANDSTORM_END, TRANS_TYPE_SANDSTORM_END) +/* 0x3AE */ DEFINE_ENTRANCE(ENTR_GERUDOS_FORTRESS_15_2, SCENE_GERUDOS_FORTRESS, 15, true, true, TRANS_TYPE_SANDSTORM_END, TRANS_TYPE_SANDSTORM_END) +/* 0x3AF */ DEFINE_ENTRANCE(ENTR_GERUDOS_FORTRESS_15_3, SCENE_GERUDOS_FORTRESS, 15, true, true, TRANS_TYPE_SANDSTORM_END, TRANS_TYPE_SANDSTORM_END) + +/* 0x3B0 */ DEFINE_ENTRANCE(ENTR_GERUDOS_FORTRESS_16, SCENE_GERUDOS_FORTRESS, 16, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x3B1 */ DEFINE_ENTRANCE(ENTR_GERUDOS_FORTRESS_16_1, SCENE_GERUDOS_FORTRESS, 16, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x3B2 */ DEFINE_ENTRANCE(ENTR_GERUDOS_FORTRESS_16_2, SCENE_GERUDOS_FORTRESS, 16, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x3B3 */ DEFINE_ENTRANCE(ENTR_GERUDOS_FORTRESS_16_3, SCENE_GERUDOS_FORTRESS, 16, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) + +/* 0x3B4 */ DEFINE_ENTRANCE(ENTR_GERUDOS_FORTRESS_17, SCENE_GERUDOS_FORTRESS, 17, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x3B5 */ DEFINE_ENTRANCE(ENTR_GERUDOS_FORTRESS_17_1, SCENE_GERUDOS_FORTRESS, 17, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x3B6 */ DEFINE_ENTRANCE(ENTR_GERUDOS_FORTRESS_17_2, SCENE_GERUDOS_FORTRESS, 17, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x3B7 */ DEFINE_ENTRANCE(ENTR_GERUDOS_FORTRESS_17_3, SCENE_GERUDOS_FORTRESS, 17, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) + +/* 0x3B8 */ DEFINE_ENTRANCE(ENTR_MARKET_DAY_6, SCENE_MARKET_DAY, 6, false, true, TRANS_TYPE_FADE_BLACK_FAST, TRANS_TYPE_FADE_BLACK) +/* 0x3B9 */ DEFINE_ENTRANCE(ENTR_MARKET_NIGHT_6_1, SCENE_MARKET_NIGHT, 6, false, true, TRANS_TYPE_FADE_BLACK_FAST, TRANS_TYPE_FADE_BLACK) +/* 0x3BA */ DEFINE_ENTRANCE(ENTR_MARKET_RUINS_6_2, SCENE_MARKET_RUINS, 6, false, true, TRANS_TYPE_FADE_BLACK_FAST, TRANS_TYPE_FADE_BLACK) +/* 0x3BB */ DEFINE_ENTRANCE(ENTR_MARKET_RUINS_6_3, SCENE_MARKET_RUINS, 6, false, true, TRANS_TYPE_FADE_BLACK_FAST, TRANS_TYPE_FADE_BLACK) + +/* 0x3BC */ DEFINE_ENTRANCE(ENTR_MARKET_DAY_7, SCENE_MARKET_DAY, 7, false, true, TRANS_TYPE_FADE_BLACK_FAST, TRANS_TYPE_FADE_BLACK) +/* 0x3BD */ DEFINE_ENTRANCE(ENTR_MARKET_NIGHT_7_1, SCENE_MARKET_NIGHT, 7, false, true, TRANS_TYPE_FADE_BLACK_FAST, TRANS_TYPE_FADE_BLACK) +/* 0x3BE */ DEFINE_ENTRANCE(ENTR_MARKET_RUINS_7_2, SCENE_MARKET_RUINS, 7, false, true, TRANS_TYPE_FADE_BLACK_FAST, TRANS_TYPE_FADE_BLACK) +/* 0x3BF */ DEFINE_ENTRANCE(ENTR_MARKET_RUINS_7_3, SCENE_MARKET_RUINS, 7, false, true, TRANS_TYPE_FADE_BLACK_FAST, TRANS_TYPE_FADE_BLACK) + +/* 0x3C0 */ DEFINE_ENTRANCE(ENTR_BACK_ALLEY_DAY_2, SCENE_BACK_ALLEY_DAY, 2, false, true, TRANS_TYPE_FADE_BLACK_FAST, TRANS_TYPE_FADE_BLACK) +/* 0x3C1 */ DEFINE_ENTRANCE(ENTR_BACK_ALLEY_NIGHT_2_1, SCENE_BACK_ALLEY_NIGHT, 2, false, true, TRANS_TYPE_FADE_BLACK_FAST, TRANS_TYPE_FADE_BLACK) +/* 0x3C2 */ DEFINE_ENTRANCE(ENTR_BACK_ALLEY_DAY_2_2, SCENE_BACK_ALLEY_DAY, 2, false, true, TRANS_TYPE_FADE_WHITE, TRANS_TYPE_FADE_WHITE) +/* 0x3C3 */ DEFINE_ENTRANCE(ENTR_BACK_ALLEY_NIGHT_2_3, SCENE_BACK_ALLEY_NIGHT, 2, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) + +/* 0x3C4 */ DEFINE_ENTRANCE(ENTR_ZORAS_DOMAIN_2, SCENE_ZORAS_DOMAIN, 2, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x3C5 */ DEFINE_ENTRANCE(ENTR_ZORAS_DOMAIN_2_1, SCENE_ZORAS_DOMAIN, 2, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x3C6 */ DEFINE_ENTRANCE(ENTR_ZORAS_DOMAIN_2_2, SCENE_ZORAS_DOMAIN, 2, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x3C7 */ DEFINE_ENTRANCE(ENTR_ZORAS_DOMAIN_2_3, SCENE_ZORAS_DOMAIN, 2, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) + +/* 0x3C8 */ DEFINE_ENTRANCE(ENTR_LAKE_HYLIA_3, SCENE_LAKE_HYLIA, 3, false, true, TRANS_TYPE_FADE_WHITE, TRANS_TYPE_FADE_WHITE) +/* 0x3C9 */ DEFINE_ENTRANCE(ENTR_LAKE_HYLIA_3_1, SCENE_LAKE_HYLIA, 3, false, true, TRANS_TYPE_FADE_WHITE, TRANS_TYPE_FADE_WHITE) +/* 0x3CA */ DEFINE_ENTRANCE(ENTR_LAKE_HYLIA_3_2, SCENE_LAKE_HYLIA, 3, false, true, TRANS_TYPE_FADE_WHITE, TRANS_TYPE_FADE_WHITE) +/* 0x3CB */ DEFINE_ENTRANCE(ENTR_LAKE_HYLIA_3_3, SCENE_LAKE_HYLIA, 3, false, true, TRANS_TYPE_FADE_WHITE, TRANS_TYPE_FADE_WHITE) + +/* 0x3CC */ DEFINE_ENTRANCE(ENTR_LAKE_HYLIA_4, SCENE_LAKE_HYLIA, 4, false, true, TRANS_TYPE_FADE_BLACK_FAST, TRANS_TYPE_FADE_BLACK) +/* 0x3CD */ DEFINE_ENTRANCE(ENTR_LAKE_HYLIA_4_1, SCENE_LAKE_HYLIA, 4, false, true, TRANS_TYPE_FADE_BLACK_FAST, TRANS_TYPE_FADE_BLACK) +/* 0x3CE */ DEFINE_ENTRANCE(ENTR_LAKE_HYLIA_4_2, SCENE_LAKE_HYLIA, 4, false, true, TRANS_TYPE_FADE_BLACK_FAST, TRANS_TYPE_FADE_BLACK) +/* 0x3CF */ DEFINE_ENTRANCE(ENTR_LAKE_HYLIA_4_3, SCENE_LAKE_HYLIA, 4, false, true, TRANS_TYPE_FADE_BLACK_FAST, TRANS_TYPE_FADE_BLACK) + +/* 0x3D0 */ DEFINE_ENTRANCE(ENTR_GERUDO_VALLEY_4, SCENE_GERUDO_VALLEY, 4, false, true, TRANS_TYPE_FADE_BLACK_FAST, TRANS_TYPE_FADE_BLACK) +/* 0x3D1 */ DEFINE_ENTRANCE(ENTR_GERUDO_VALLEY_4_1, SCENE_GERUDO_VALLEY, 4, false, true, TRANS_TYPE_FADE_BLACK_FAST, TRANS_TYPE_FADE_BLACK) +/* 0x3D2 */ DEFINE_ENTRANCE(ENTR_GERUDO_VALLEY_4_2, SCENE_GERUDO_VALLEY, 4, false, true, TRANS_TYPE_FADE_BLACK_FAST, TRANS_TYPE_FADE_BLACK) +/* 0x3D3 */ DEFINE_ENTRANCE(ENTR_GERUDO_VALLEY_4_3, SCENE_GERUDO_VALLEY, 4, false, true, TRANS_TYPE_FADE_BLACK_FAST, TRANS_TYPE_FADE_BLACK) + +/* 0x3D4 */ DEFINE_ENTRANCE(ENTR_ZORAS_FOUNTAIN_3, SCENE_ZORAS_FOUNTAIN, 3, false, true, TRANS_TYPE_FADE_WHITE, TRANS_TYPE_FADE_WHITE) +/* 0x3D5 */ DEFINE_ENTRANCE(ENTR_ZORAS_FOUNTAIN_3_1, SCENE_ZORAS_FOUNTAIN, 3, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x3D6 */ DEFINE_ENTRANCE(ENTR_ZORAS_FOUNTAIN_3_2, SCENE_ZORAS_FOUNTAIN, 3, false, true, TRANS_TYPE_FADE_WHITE, TRANS_TYPE_FADE_WHITE) +/* 0x3D7 */ DEFINE_ENTRANCE(ENTR_ZORAS_FOUNTAIN_3_3, SCENE_ZORAS_FOUNTAIN, 3, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) + +/* 0x3D8 */ DEFINE_ENTRANCE(ENTR_ZORAS_FOUNTAIN_4, SCENE_ZORAS_FOUNTAIN, 4, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x3D9 */ DEFINE_ENTRANCE(ENTR_ZORAS_FOUNTAIN_4_1, SCENE_ZORAS_FOUNTAIN, 4, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x3DA */ DEFINE_ENTRANCE(ENTR_ZORAS_FOUNTAIN_4_2, SCENE_ZORAS_FOUNTAIN, 4, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x3DB */ DEFINE_ENTRANCE(ENTR_ZORAS_FOUNTAIN_4_3, SCENE_ZORAS_FOUNTAIN, 4, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) + +/* 0x3DC */ DEFINE_ENTRANCE(ENTR_GANONS_TOWER_COLLAPSE_INTERIOR_4, SCENE_GANONS_TOWER_COLLAPSE_INTERIOR, 4, true, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x3DD */ DEFINE_ENTRANCE(ENTR_GANONS_TOWER_COLLAPSE_INTERIOR_4_1, SCENE_GANONS_TOWER_COLLAPSE_INTERIOR, 4, true, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x3DE */ DEFINE_ENTRANCE(ENTR_GANONS_TOWER_COLLAPSE_INTERIOR_4_2, SCENE_GANONS_TOWER_COLLAPSE_INTERIOR, 4, true, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x3DF */ DEFINE_ENTRANCE(ENTR_GANONS_TOWER_COLLAPSE_INTERIOR_4_3, SCENE_GANONS_TOWER_COLLAPSE_INTERIOR, 4, true, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) + +/* 0x3E0 */ DEFINE_ENTRANCE(ENTR_GANONS_TOWER_COLLAPSE_INTERIOR_5, SCENE_GANONS_TOWER_COLLAPSE_INTERIOR, 5, true, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x3E1 */ DEFINE_ENTRANCE(ENTR_GANONS_TOWER_COLLAPSE_INTERIOR_5_1, SCENE_GANONS_TOWER_COLLAPSE_INTERIOR, 5, true, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x3E2 */ DEFINE_ENTRANCE(ENTR_GANONS_TOWER_COLLAPSE_INTERIOR_5_2, SCENE_GANONS_TOWER_COLLAPSE_INTERIOR, 5, true, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x3E3 */ DEFINE_ENTRANCE(ENTR_GANONS_TOWER_COLLAPSE_INTERIOR_5_3, SCENE_GANONS_TOWER_COLLAPSE_INTERIOR, 5, true, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) + +/* 0x3E4 */ DEFINE_ENTRANCE(ENTR_GANONS_TOWER_COLLAPSE_INTERIOR_6, SCENE_GANONS_TOWER_COLLAPSE_INTERIOR, 6, true, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x3E5 */ DEFINE_ENTRANCE(ENTR_GANONS_TOWER_COLLAPSE_INTERIOR_6_1, SCENE_GANONS_TOWER_COLLAPSE_INTERIOR, 6, true, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x3E6 */ DEFINE_ENTRANCE(ENTR_GANONS_TOWER_COLLAPSE_INTERIOR_6_2, SCENE_GANONS_TOWER_COLLAPSE_INTERIOR, 6, true, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x3E7 */ DEFINE_ENTRANCE(ENTR_GANONS_TOWER_COLLAPSE_INTERIOR_6_3, SCENE_GANONS_TOWER_COLLAPSE_INTERIOR, 6, true, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) + +/* 0x3E8 */ DEFINE_ENTRANCE(ENTR_POTION_SHOP_KAKARIKO_1, SCENE_POTION_SHOP_KAKARIKO, 1, false, false, TRANS_TYPE_FADE_BLACK_FAST, TRANS_TYPE_CIRCLE(TCA_NORMAL, TCC_BLACK, TCS_FAST)) +/* 0x3E9 */ DEFINE_ENTRANCE(ENTR_POTION_SHOP_KAKARIKO_1_1, SCENE_POTION_SHOP_KAKARIKO, 1, false, false, TRANS_TYPE_FADE_BLACK_FAST, TRANS_TYPE_CIRCLE(TCA_NORMAL, TCC_BLACK, TCS_FAST)) +/* 0x3EA */ DEFINE_ENTRANCE(ENTR_POTION_SHOP_KAKARIKO_1_2, SCENE_POTION_SHOP_KAKARIKO, 1, false, true, TRANS_TYPE_FADE_BLACK_FAST, TRANS_TYPE_CIRCLE(TCA_NORMAL, TCC_BLACK, TCS_FAST)) +/* 0x3EB */ DEFINE_ENTRANCE(ENTR_POTION_SHOP_KAKARIKO_1_3, SCENE_POTION_SHOP_KAKARIKO, 1, false, true, TRANS_TYPE_FADE_BLACK_FAST, TRANS_TYPE_CIRCLE(TCA_NORMAL, TCC_BLACK, TCS_FAST)) + +/* 0x3EC */ DEFINE_ENTRANCE(ENTR_POTION_SHOP_KAKARIKO_2, SCENE_POTION_SHOP_KAKARIKO, 2, false, false, TRANS_TYPE_FADE_BLACK_FAST, TRANS_TYPE_CIRCLE(TCA_NORMAL, TCC_BLACK, TCS_FAST)) +/* 0x3ED */ DEFINE_ENTRANCE(ENTR_POTION_SHOP_KAKARIKO_2_1, SCENE_POTION_SHOP_KAKARIKO, 2, false, false, TRANS_TYPE_FADE_BLACK_FAST, TRANS_TYPE_CIRCLE(TCA_NORMAL, TCC_BLACK, TCS_FAST)) +/* 0x3EE */ DEFINE_ENTRANCE(ENTR_POTION_SHOP_KAKARIKO_2_2, SCENE_POTION_SHOP_KAKARIKO, 2, false, true, TRANS_TYPE_FADE_BLACK_FAST, TRANS_TYPE_CIRCLE(TCA_NORMAL, TCC_BLACK, TCS_FAST)) +/* 0x3EF */ DEFINE_ENTRANCE(ENTR_POTION_SHOP_KAKARIKO_2_3, SCENE_POTION_SHOP_KAKARIKO, 2, false, true, TRANS_TYPE_FADE_BLACK_FAST, TRANS_TYPE_CIRCLE(TCA_NORMAL, TCC_BLACK, TCS_FAST)) + +/* 0x3F0 */ DEFINE_ENTRANCE(ENTR_SPIRIT_TEMPLE_2, SCENE_SPIRIT_TEMPLE, 2, false, false, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x3F1 */ DEFINE_ENTRANCE(ENTR_SPIRIT_TEMPLE_2_1, SCENE_SPIRIT_TEMPLE, 2, false, false, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x3F2 */ DEFINE_ENTRANCE(ENTR_SPIRIT_TEMPLE_2_2, SCENE_SPIRIT_TEMPLE, 2, false, false, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x3F3 */ DEFINE_ENTRANCE(ENTR_SPIRIT_TEMPLE_2_3, SCENE_SPIRIT_TEMPLE, 2, false, false, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) + +/* 0x3F4 */ DEFINE_ENTRANCE(ENTR_SPIRIT_TEMPLE_3, SCENE_SPIRIT_TEMPLE, 3, false, false, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x3F5 */ DEFINE_ENTRANCE(ENTR_SPIRIT_TEMPLE_3_1, SCENE_SPIRIT_TEMPLE, 3, false, false, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x3F6 */ DEFINE_ENTRANCE(ENTR_SPIRIT_TEMPLE_3_2, SCENE_SPIRIT_TEMPLE, 3, false, false, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x3F7 */ DEFINE_ENTRANCE(ENTR_SPIRIT_TEMPLE_3_3, SCENE_SPIRIT_TEMPLE, 3, false, false, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) + +/* 0x3F8 */ DEFINE_ENTRANCE(ENTR_SPIRIT_TEMPLE_4, SCENE_SPIRIT_TEMPLE, 4, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x3F9 */ DEFINE_ENTRANCE(ENTR_SPIRIT_TEMPLE_4_1, SCENE_SPIRIT_TEMPLE, 4, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x3FA */ DEFINE_ENTRANCE(ENTR_SPIRIT_TEMPLE_4_2, SCENE_SPIRIT_TEMPLE, 4, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x3FB */ DEFINE_ENTRANCE(ENTR_SPIRIT_TEMPLE_4_3, SCENE_SPIRIT_TEMPLE, 4, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) + +/* 0x3FC */ DEFINE_ENTRANCE(ENTR_GORON_CITY_2, SCENE_GORON_CITY, 2, false, true, TRANS_TYPE_FADE_BLACK_FAST, TRANS_TYPE_FADE_BLACK) +/* 0x3FD */ DEFINE_ENTRANCE(ENTR_GORON_CITY_2_1, SCENE_GORON_CITY, 2, false, true, TRANS_TYPE_FADE_BLACK_FAST, TRANS_TYPE_FADE_BLACK) +/* 0x3FE */ DEFINE_ENTRANCE(ENTR_GORON_CITY_2_2, SCENE_GORON_CITY, 2, false, true, TRANS_TYPE_FADE_BLACK_FAST, TRANS_TYPE_FADE_BLACK) +/* 0x3FF */ DEFINE_ENTRANCE(ENTR_GORON_CITY_2_3, SCENE_GORON_CITY, 2, false, true, TRANS_TYPE_FADE_BLACK_FAST, TRANS_TYPE_FADE_BLACK) + +/* 0x400 */ DEFINE_ENTRANCE(ENTR_CASTLE_COURTYARD_ZELDA_0, SCENE_CASTLE_COURTYARD_ZELDA, 0, false, true, TRANS_TYPE_FADE_WHITE, TRANS_TYPE_FADE_WHITE) +/* 0x401 */ DEFINE_ENTRANCE(ENTR_CASTLE_COURTYARD_ZELDA_0_1, SCENE_CASTLE_COURTYARD_ZELDA, 0, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x402 */ DEFINE_ENTRANCE(ENTR_CASTLE_COURTYARD_ZELDA_0_2, SCENE_CASTLE_COURTYARD_ZELDA, 0, false, true, TRANS_TYPE_FADE_WHITE, TRANS_TYPE_FADE_WHITE) +/* 0x403 */ DEFINE_ENTRANCE(ENTR_CASTLE_COURTYARD_ZELDA_0_3, SCENE_CASTLE_COURTYARD_ZELDA, 0, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x404 */ DEFINE_ENTRANCE(ENTR_CASTLE_COURTYARD_ZELDA_0_4, SCENE_CASTLE_COURTYARD_ZELDA, 0, false, true, TRANS_TYPE_FADE_WHITE, TRANS_TYPE_FADE_WHITE) +/* 0x405 */ DEFINE_ENTRANCE(ENTR_CASTLE_COURTYARD_ZELDA_0_5, SCENE_CASTLE_COURTYARD_ZELDA, 0, false, true, TRANS_TYPE_FADE_WHITE, TRANS_TYPE_FADE_WHITE) +/* 0x406 */ DEFINE_ENTRANCE(ENTR_CASTLE_COURTYARD_ZELDA_0_6, SCENE_CASTLE_COURTYARD_ZELDA, 0, false, true, TRANS_TYPE_FADE_WHITE, TRANS_TYPE_FADE_WHITE) + +/* 0x407 */ DEFINE_ENTRANCE(ENTR_JABU_JABU_1, SCENE_JABU_JABU, 1, true, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x408 */ DEFINE_ENTRANCE(ENTR_JABU_JABU_1_1, SCENE_JABU_JABU, 1, true, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x409 */ DEFINE_ENTRANCE(ENTR_JABU_JABU_1_2, SCENE_JABU_JABU, 1, true, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x40A */ DEFINE_ENTRANCE(ENTR_JABU_JABU_1_3, SCENE_JABU_JABU, 1, true, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) + +/* 0x40B */ DEFINE_ENTRANCE(ENTR_DODONGOS_CAVERN_BOSS_0, SCENE_DODONGOS_CAVERN_BOSS, 0, true, false, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x40C */ DEFINE_ENTRANCE(ENTR_DODONGOS_CAVERN_BOSS_0_1, SCENE_DODONGOS_CAVERN_BOSS, 0, true, false, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x40D */ DEFINE_ENTRANCE(ENTR_DODONGOS_CAVERN_BOSS_0_2, SCENE_DODONGOS_CAVERN_BOSS, 0, true, false, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x40E */ DEFINE_ENTRANCE(ENTR_DODONGOS_CAVERN_BOSS_0_3, SCENE_DODONGOS_CAVERN_BOSS, 0, true, false, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) + +/* 0x40F */ DEFINE_ENTRANCE(ENTR_DEKU_TREE_BOSS_0, SCENE_DEKU_TREE_BOSS, 0, true, false, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x410 */ DEFINE_ENTRANCE(ENTR_DEKU_TREE_BOSS_0_1, SCENE_DEKU_TREE_BOSS, 0, true, false, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x411 */ DEFINE_ENTRANCE(ENTR_DEKU_TREE_BOSS_0_2, SCENE_DEKU_TREE_BOSS, 0, true, false, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x412 */ DEFINE_ENTRANCE(ENTR_DEKU_TREE_BOSS_0_3, SCENE_DEKU_TREE_BOSS, 0, true, false, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) + +/* 0x413 */ DEFINE_ENTRANCE(ENTR_SHADOW_TEMPLE_BOSS_0, SCENE_SHADOW_TEMPLE_BOSS, 0, true, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x414 */ DEFINE_ENTRANCE(ENTR_SHADOW_TEMPLE_BOSS_0_1, SCENE_SHADOW_TEMPLE_BOSS, 0, true, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x415 */ DEFINE_ENTRANCE(ENTR_SHADOW_TEMPLE_BOSS_0_2, SCENE_SHADOW_TEMPLE_BOSS, 0, true, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x416 */ DEFINE_ENTRANCE(ENTR_SHADOW_TEMPLE_BOSS_0_3, SCENE_SHADOW_TEMPLE_BOSS, 0, true, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) + +/* 0x417 */ DEFINE_ENTRANCE(ENTR_WATER_TEMPLE_BOSS_0, SCENE_WATER_TEMPLE_BOSS, 0, true, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x418 */ DEFINE_ENTRANCE(ENTR_WATER_TEMPLE_BOSS_0_1, SCENE_WATER_TEMPLE_BOSS, 0, true, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x419 */ DEFINE_ENTRANCE(ENTR_WATER_TEMPLE_BOSS_0_2, SCENE_WATER_TEMPLE_BOSS, 0, true, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x41A */ DEFINE_ENTRANCE(ENTR_WATER_TEMPLE_BOSS_0_3, SCENE_WATER_TEMPLE_BOSS, 0, true, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) + +/* 0x41B */ DEFINE_ENTRANCE(ENTR_GANONS_TOWER_0, SCENE_GANONS_TOWER, 0, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x41C */ DEFINE_ENTRANCE(ENTR_GANONS_TOWER_0_1, SCENE_GANONS_TOWER, 0, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x41D */ DEFINE_ENTRANCE(ENTR_GANONS_TOWER_0_2, SCENE_GANONS_TOWER, 0, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x41E */ DEFINE_ENTRANCE(ENTR_GANONS_TOWER_0_3, SCENE_GANONS_TOWER, 0, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) + +/* 0x41F */ DEFINE_ENTRANCE(ENTR_GANONDORF_BOSS_0, SCENE_GANONDORF_BOSS, 0, true, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x420 */ DEFINE_ENTRANCE(ENTR_GANONDORF_BOSS_0_1, SCENE_GANONDORF_BOSS, 0, true, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x421 */ DEFINE_ENTRANCE(ENTR_GANONDORF_BOSS_0_2, SCENE_GANONDORF_BOSS, 0, true, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x422 */ DEFINE_ENTRANCE(ENTR_GANONDORF_BOSS_0_3, SCENE_GANONDORF_BOSS, 0, true, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) + +/* 0x423 */ DEFINE_ENTRANCE(ENTR_WATER_TEMPLE_1, SCENE_WATER_TEMPLE, 1, true, true, TRANS_TYPE_FADE_WHITE, TRANS_TYPE_FADE_BLACK) +/* 0x424 */ DEFINE_ENTRANCE(ENTR_WATER_TEMPLE_1_1, SCENE_WATER_TEMPLE, 1, true, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x425 */ DEFINE_ENTRANCE(ENTR_WATER_TEMPLE_1_2, SCENE_WATER_TEMPLE, 1, true, true, TRANS_TYPE_FADE_WHITE, TRANS_TYPE_FADE_BLACK) +/* 0x426 */ DEFINE_ENTRANCE(ENTR_WATER_TEMPLE_1_3, SCENE_WATER_TEMPLE, 1, true, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) + +/* 0x427 */ DEFINE_ENTRANCE(ENTR_GANONS_TOWER_1, SCENE_GANONS_TOWER, 1, true, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x428 */ DEFINE_ENTRANCE(ENTR_GANONS_TOWER_1_1, SCENE_GANONS_TOWER, 1, true, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x429 */ DEFINE_ENTRANCE(ENTR_GANONS_TOWER_1_2, SCENE_GANONS_TOWER, 1, true, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x42A */ DEFINE_ENTRANCE(ENTR_GANONS_TOWER_1_3, SCENE_GANONS_TOWER, 1, true, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) + +/* 0x42B */ DEFINE_ENTRANCE(ENTR_GANONS_TOWER_2, SCENE_GANONS_TOWER, 2, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x42C */ DEFINE_ENTRANCE(ENTR_GANONS_TOWER_2_1, SCENE_GANONS_TOWER, 2, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x42D */ DEFINE_ENTRANCE(ENTR_GANONS_TOWER_2_2, SCENE_GANONS_TOWER, 2, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x42E */ DEFINE_ENTRANCE(ENTR_GANONS_TOWER_2_3, SCENE_GANONS_TOWER, 2, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) + +/* 0x42F */ DEFINE_ENTRANCE(ENTR_LON_LON_RANCH_5, SCENE_LON_LON_RANCH, 5, false, true, TRANS_TYPE_FADE_BLACK_FAST, TRANS_TYPE_FADE_BLACK) +/* 0x430 */ DEFINE_ENTRANCE(ENTR_LON_LON_RANCH_5_1, SCENE_LON_LON_RANCH, 5, false, true, TRANS_TYPE_FADE_BLACK_FAST, TRANS_TYPE_FADE_BLACK) +/* 0x431 */ DEFINE_ENTRANCE(ENTR_LON_LON_RANCH_5_2, SCENE_LON_LON_RANCH, 5, false, true, TRANS_TYPE_FADE_BLACK_FAST, TRANS_TYPE_FADE_BLACK) +/* 0x432 */ DEFINE_ENTRANCE(ENTR_LON_LON_RANCH_5_3, SCENE_LON_LON_RANCH, 5, false, true, TRANS_TYPE_FADE_BLACK_FAST, TRANS_TYPE_FADE_BLACK) + +/* 0x433 */ DEFINE_ENTRANCE(ENTR_MIDOS_HOUSE_0, SCENE_MIDOS_HOUSE, 0, false, true, TRANS_TYPE_FADE_BLACK_FAST, TRANS_TYPE_FADE_BLACK_FAST) +/* 0x434 */ DEFINE_ENTRANCE(ENTR_MIDOS_HOUSE_0_1, SCENE_MIDOS_HOUSE, 0, false, true, TRANS_TYPE_FADE_BLACK_FAST, TRANS_TYPE_FADE_BLACK_FAST) +/* 0x435 */ DEFINE_ENTRANCE(ENTR_MIDOS_HOUSE_0_2, SCENE_MIDOS_HOUSE, 0, false, true, TRANS_TYPE_FADE_BLACK_FAST, TRANS_TYPE_FADE_BLACK_FAST) +/* 0x436 */ DEFINE_ENTRANCE(ENTR_MIDOS_HOUSE_0_3, SCENE_MIDOS_HOUSE, 0, false, true, TRANS_TYPE_FADE_BLACK_FAST, TRANS_TYPE_FADE_BLACK_FAST) + +/* 0x437 */ DEFINE_ENTRANCE(ENTR_SARIAS_HOUSE_0, SCENE_SARIAS_HOUSE, 0, false, true, TRANS_TYPE_FADE_BLACK_FAST, TRANS_TYPE_FADE_BLACK_FAST) +/* 0x438 */ DEFINE_ENTRANCE(ENTR_SARIAS_HOUSE_0_1, SCENE_SARIAS_HOUSE, 0, false, true, TRANS_TYPE_FADE_BLACK_FAST, TRANS_TYPE_FADE_BLACK_FAST) +/* 0x439 */ DEFINE_ENTRANCE(ENTR_SARIAS_HOUSE_0_2, SCENE_SARIAS_HOUSE, 0, false, true, TRANS_TYPE_FADE_BLACK_FAST, TRANS_TYPE_FADE_BLACK_FAST) +/* 0x43A */ DEFINE_ENTRANCE(ENTR_SARIAS_HOUSE_0_3, SCENE_SARIAS_HOUSE, 0, false, true, TRANS_TYPE_FADE_BLACK_FAST, TRANS_TYPE_FADE_BLACK_FAST) + +/* 0x43B */ DEFINE_ENTRANCE(ENTR_BACK_ALLEY_HOUSE_0, SCENE_BACK_ALLEY_HOUSE, 0, false, true, TRANS_TYPE_FADE_BLACK_FAST, TRANS_TYPE_CIRCLE(TCA_NORMAL, TCC_BLACK, TCS_FAST)) +/* 0x43C */ DEFINE_ENTRANCE(ENTR_BACK_ALLEY_HOUSE_0_1, SCENE_BACK_ALLEY_HOUSE, 0, false, true, TRANS_TYPE_FADE_BLACK_FAST, TRANS_TYPE_CIRCLE(TCA_NORMAL, TCC_BLACK, TCS_FAST)) +/* 0x43D */ DEFINE_ENTRANCE(ENTR_BACK_ALLEY_HOUSE_0_2, SCENE_BACK_ALLEY_HOUSE, 0, false, true, TRANS_TYPE_FADE_BLACK_FAST, TRANS_TYPE_CIRCLE(TCA_NORMAL, TCC_BLACK, TCS_FAST)) +/* 0x43E */ DEFINE_ENTRANCE(ENTR_BACK_ALLEY_HOUSE_0_3, SCENE_BACK_ALLEY_HOUSE, 0, false, true, TRANS_TYPE_FADE_BLACK_FAST, TRANS_TYPE_CIRCLE(TCA_NORMAL, TCC_BLACK, TCS_FAST)) + +/* 0x43F */ DEFINE_ENTRANCE(ENTR_GANONS_TOWER_COLLAPSE_EXTERIOR_0, SCENE_GANONS_TOWER_COLLAPSE_EXTERIOR, 0, true, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x440 */ DEFINE_ENTRANCE(ENTR_GANONS_TOWER_COLLAPSE_EXTERIOR_0_1, SCENE_GANONS_TOWER_COLLAPSE_EXTERIOR, 0, true, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x441 */ DEFINE_ENTRANCE(ENTR_GANONS_TOWER_COLLAPSE_EXTERIOR_0_2, SCENE_GANONS_TOWER_COLLAPSE_EXTERIOR, 0, true, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x442 */ DEFINE_ENTRANCE(ENTR_GANONS_TOWER_COLLAPSE_EXTERIOR_0_3, SCENE_GANONS_TOWER_COLLAPSE_EXTERIOR, 0, true, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) + +/* 0x443 */ DEFINE_ENTRANCE(ENTR_KOKIRI_FOREST_9, SCENE_KOKIRI_FOREST, 9, false, false, TRANS_TYPE_FADE_BLACK_FAST, TRANS_TYPE_FADE_BLACK_FAST) +/* 0x444 */ DEFINE_ENTRANCE(ENTR_KOKIRI_FOREST_9_1, SCENE_KOKIRI_FOREST, 9, false, false, TRANS_TYPE_FADE_BLACK_FAST, TRANS_TYPE_FADE_BLACK_FAST) +/* 0x445 */ DEFINE_ENTRANCE(ENTR_KOKIRI_FOREST_9_2, SCENE_KOKIRI_FOREST, 9, false, false, TRANS_TYPE_FADE_BLACK_FAST, TRANS_TYPE_FADE_BLACK_FAST) +/* 0x446 */ DEFINE_ENTRANCE(ENTR_KOKIRI_FOREST_9_3, SCENE_KOKIRI_FOREST, 9, false, false, TRANS_TYPE_FADE_BLACK_FAST, TRANS_TYPE_FADE_BLACK_FAST) + +/* 0x447 */ DEFINE_ENTRANCE(ENTR_KOKIRI_FOREST_10, SCENE_KOKIRI_FOREST, 10, false, false, TRANS_TYPE_FADE_BLACK_FAST, TRANS_TYPE_FADE_BLACK_FAST) +/* 0x448 */ DEFINE_ENTRANCE(ENTR_KOKIRI_FOREST_10_1, SCENE_KOKIRI_FOREST, 10, false, false, TRANS_TYPE_FADE_BLACK_FAST, TRANS_TYPE_FADE_BLACK_FAST) +/* 0x449 */ DEFINE_ENTRANCE(ENTR_KOKIRI_FOREST_10_2, SCENE_KOKIRI_FOREST, 10, false, false, TRANS_TYPE_FADE_BLACK_FAST, TRANS_TYPE_FADE_BLACK_FAST) +/* 0x44A */ DEFINE_ENTRANCE(ENTR_KOKIRI_FOREST_10_3, SCENE_KOKIRI_FOREST, 10, false, false, TRANS_TYPE_FADE_BLACK_FAST, TRANS_TYPE_FADE_BLACK_FAST) + +/* 0x44B */ DEFINE_ENTRANCE(ENTR_KAKARIKO_VILLAGE_9, SCENE_KAKARIKO_VILLAGE, 9, false, true, TRANS_TYPE_FADE_BLACK_FAST, TRANS_TYPE_FADE_BLACK_FAST) +/* 0x44C */ DEFINE_ENTRANCE(ENTR_KAKARIKO_VILLAGE_9_1, SCENE_KAKARIKO_VILLAGE, 9, false, true, TRANS_TYPE_FADE_BLACK_FAST, TRANS_TYPE_FADE_BLACK_FAST) +/* 0x44D */ DEFINE_ENTRANCE(ENTR_KAKARIKO_VILLAGE_9_2, SCENE_KAKARIKO_VILLAGE, 9, false, true, TRANS_TYPE_FADE_BLACK_FAST, TRANS_TYPE_FADE_BLACK_FAST) +/* 0x44E */ DEFINE_ENTRANCE(ENTR_KAKARIKO_VILLAGE_9_3, SCENE_KAKARIKO_VILLAGE, 9, false, true, TRANS_TYPE_FADE_BLACK_FAST, TRANS_TYPE_FADE_BLACK_FAST) + +/* 0x44F */ DEFINE_ENTRANCE(ENTR_WINDMILL_AND_DAMPES_GRAVE_0, SCENE_WINDMILL_AND_DAMPES_GRAVE, 0, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_CIRCLE(TCA_STARBURST,TCC_BLACK, TCS_FAST)) +/* 0x450 */ DEFINE_ENTRANCE(ENTR_WINDMILL_AND_DAMPES_GRAVE_0_1, SCENE_WINDMILL_AND_DAMPES_GRAVE, 0, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_CIRCLE(TCA_STARBURST,TCC_BLACK, TCS_FAST)) +/* 0x451 */ DEFINE_ENTRANCE(ENTR_WINDMILL_AND_DAMPES_GRAVE_0_2, SCENE_WINDMILL_AND_DAMPES_GRAVE, 0, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_CIRCLE(TCA_STARBURST,TCC_BLACK, TCS_FAST)) +/* 0x452 */ DEFINE_ENTRANCE(ENTR_WINDMILL_AND_DAMPES_GRAVE_0_3, SCENE_WINDMILL_AND_DAMPES_GRAVE, 0, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_CIRCLE(TCA_STARBURST,TCC_BLACK, TCS_FAST)) + +/* 0x453 */ DEFINE_ENTRANCE(ENTR_WINDMILL_AND_DAMPES_GRAVE_1, SCENE_WINDMILL_AND_DAMPES_GRAVE, 1, false, true, TRANS_TYPE_FADE_BLACK_FAST, TRANS_TYPE_CIRCLE(TCA_NORMAL, TCC_BLACK, TCS_FAST)) +/* 0x454 */ DEFINE_ENTRANCE(ENTR_WINDMILL_AND_DAMPES_GRAVE_1_1, SCENE_WINDMILL_AND_DAMPES_GRAVE, 1, false, true, TRANS_TYPE_FADE_BLACK_FAST, TRANS_TYPE_CIRCLE(TCA_NORMAL, TCC_BLACK, TCS_FAST)) +/* 0x455 */ DEFINE_ENTRANCE(ENTR_WINDMILL_AND_DAMPES_GRAVE_1_2, SCENE_WINDMILL_AND_DAMPES_GRAVE, 1, false, true, TRANS_TYPE_FADE_BLACK_FAST, TRANS_TYPE_CIRCLE(TCA_NORMAL, TCC_BLACK, TCS_FAST)) +/* 0x456 */ DEFINE_ENTRANCE(ENTR_WINDMILL_AND_DAMPES_GRAVE_1_3, SCENE_WINDMILL_AND_DAMPES_GRAVE, 1, false, true, TRANS_TYPE_FADE_BLACK_FAST, TRANS_TYPE_CIRCLE(TCA_NORMAL, TCC_BLACK, TCS_FAST)) + +/* 0x457 */ DEFINE_ENTRANCE(ENTR_KOKIRI_FOREST_11, SCENE_KOKIRI_FOREST, 11, false, true, TRANS_TYPE_FADE_BLACK_FAST, TRANS_TYPE_FADE_BLACK) +/* 0x458 */ DEFINE_ENTRANCE(ENTR_KOKIRI_FOREST_11_1, SCENE_KOKIRI_FOREST, 11, false, true, TRANS_TYPE_FADE_BLACK_FAST, TRANS_TYPE_FADE_BLACK) +/* 0x459 */ DEFINE_ENTRANCE(ENTR_KOKIRI_FOREST_11_2, SCENE_KOKIRI_FOREST, 11, false, true, TRANS_TYPE_FADE_BLACK_FAST, TRANS_TYPE_FADE_BLACK) +/* 0x45A */ DEFINE_ENTRANCE(ENTR_KOKIRI_FOREST_11_3, SCENE_KOKIRI_FOREST, 11, false, true, TRANS_TYPE_FADE_BLACK_FAST, TRANS_TYPE_FADE_BLACK) + +/* 0x45B */ DEFINE_ENTRANCE(ENTR_DEATH_MOUNTAIN_TRAIL_4, SCENE_DEATH_MOUNTAIN_TRAIL, 4, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x45C */ DEFINE_ENTRANCE(ENTR_DEATH_MOUNTAIN_TRAIL_4_1, SCENE_DEATH_MOUNTAIN_TRAIL, 4, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x45D */ DEFINE_ENTRANCE(ENTR_DEATH_MOUNTAIN_TRAIL_4_2, SCENE_DEATH_MOUNTAIN_TRAIL, 4, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x45E */ DEFINE_ENTRANCE(ENTR_DEATH_MOUNTAIN_TRAIL_4_3, SCENE_DEATH_MOUNTAIN_TRAIL, 4, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) + +/* 0x45F */ DEFINE_ENTRANCE(ENTR_FISHING_POND_0, SCENE_FISHING_POND, 0, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_CIRCLE(TCA_NORMAL, TCC_BLACK, TCS_FAST)) +/* 0x460 */ DEFINE_ENTRANCE(ENTR_FISHING_POND_0_1, SCENE_FISHING_POND, 0, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_CIRCLE(TCA_NORMAL, TCC_BLACK, TCS_FAST)) +/* 0x461 */ DEFINE_ENTRANCE(ENTR_FISHING_POND_0_2, SCENE_FISHING_POND, 0, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_CIRCLE(TCA_NORMAL, TCC_BLACK, TCS_FAST)) +/* 0x462 */ DEFINE_ENTRANCE(ENTR_FISHING_POND_0_3, SCENE_FISHING_POND, 0, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_CIRCLE(TCA_NORMAL, TCC_BLACK, TCS_FAST)) + +/* 0x463 */ DEFINE_ENTRANCE(ENTR_KAKARIKO_VILLAGE_10, SCENE_KAKARIKO_VILLAGE, 10, false, true, TRANS_TYPE_FADE_BLACK_FAST, TRANS_TYPE_FADE_BLACK) +/* 0x464 */ DEFINE_ENTRANCE(ENTR_KAKARIKO_VILLAGE_10_1, SCENE_KAKARIKO_VILLAGE, 10, false, true, TRANS_TYPE_FADE_BLACK_FAST, TRANS_TYPE_FADE_BLACK) +/* 0x465 */ DEFINE_ENTRANCE(ENTR_KAKARIKO_VILLAGE_10_2, SCENE_KAKARIKO_VILLAGE, 10, false, true, TRANS_TYPE_FADE_BLACK_FAST, TRANS_TYPE_FADE_BLACK) +/* 0x466 */ DEFINE_ENTRANCE(ENTR_KAKARIKO_VILLAGE_10_3, SCENE_KAKARIKO_VILLAGE, 10, false, true, TRANS_TYPE_FADE_BLACK_FAST, TRANS_TYPE_FADE_BLACK) + +/* 0x467 */ DEFINE_ENTRANCE(ENTR_INSIDE_GANONS_CASTLE_0, SCENE_INSIDE_GANONS_CASTLE, 0, false, true, TRANS_TYPE_FADE_BLACK_FAST, TRANS_TYPE_FADE_BLACK) +/* 0x468 */ DEFINE_ENTRANCE(ENTR_INSIDE_GANONS_CASTLE_0_1, SCENE_INSIDE_GANONS_CASTLE, 0, false, true, TRANS_TYPE_FADE_BLACK_FAST, TRANS_TYPE_FADE_BLACK) +/* 0x469 */ DEFINE_ENTRANCE(ENTR_INSIDE_GANONS_CASTLE_0_2, SCENE_INSIDE_GANONS_CASTLE, 0, false, true, TRANS_TYPE_FADE_BLACK_FAST, TRANS_TYPE_FADE_BLACK) +/* 0x46A */ DEFINE_ENTRANCE(ENTR_INSIDE_GANONS_CASTLE_0_3, SCENE_INSIDE_GANONS_CASTLE, 0, false, true, TRANS_TYPE_FADE_BLACK_FAST, TRANS_TYPE_FADE_BLACK) +/* 0x46B */ DEFINE_ENTRANCE(ENTR_INSIDE_GANONS_CASTLE_0_4, SCENE_INSIDE_GANONS_CASTLE, 0, false, true, TRANS_TYPE_FADE_BLACK_FAST, TRANS_TYPE_FADE_BLACK) +/* 0x46C */ DEFINE_ENTRANCE(ENTR_INSIDE_GANONS_CASTLE_0_5, SCENE_INSIDE_GANONS_CASTLE, 0, false, true, TRANS_TYPE_FADE_BLACK_FAST, TRANS_TYPE_FADE_BLACK) +/* 0x46D */ DEFINE_ENTRANCE(ENTR_INSIDE_GANONS_CASTLE_0_6, SCENE_INSIDE_GANONS_CASTLE, 0, false, true, TRANS_TYPE_FADE_BLACK_FAST, TRANS_TYPE_FADE_BLACK) +/* 0x46E */ DEFINE_ENTRANCE(ENTR_INSIDE_GANONS_CASTLE_0_7, SCENE_INSIDE_GANONS_CASTLE, 0, false, true, TRANS_TYPE_FADE_BLACK_FAST, TRANS_TYPE_FADE_BLACK) +/* 0x46F */ DEFINE_ENTRANCE(ENTR_INSIDE_GANONS_CASTLE_0_8, SCENE_INSIDE_GANONS_CASTLE, 0, false, true, TRANS_TYPE_FADE_BLACK_FAST, TRANS_TYPE_FADE_BLACK) +/* 0x470 */ DEFINE_ENTRANCE(ENTR_INSIDE_GANONS_CASTLE_0_9, SCENE_INSIDE_GANONS_CASTLE, 0, false, true, TRANS_TYPE_FADE_BLACK_FAST, TRANS_TYPE_FADE_BLACK) +/* 0x471 */ DEFINE_ENTRANCE(ENTR_INSIDE_GANONS_CASTLE_0_10, SCENE_INSIDE_GANONS_CASTLE, 0, false, true, TRANS_TYPE_FADE_BLACK_FAST, TRANS_TYPE_FADE_BLACK) + +/* 0x472 */ DEFINE_ENTRANCE(ENTR_TEMPLE_OF_TIME_EXTERIOR_DAY_1, SCENE_TEMPLE_OF_TIME_EXTERIOR_DAY, 1, false, true, TRANS_TYPE_FADE_BLACK_FAST, TRANS_TYPE_FADE_BLACK) +/* 0x473 */ DEFINE_ENTRANCE(ENTR_TEMPLE_OF_TIME_EXTERIOR_NIGHT_1_1, SCENE_TEMPLE_OF_TIME_EXTERIOR_NIGHT, 1, false, true, TRANS_TYPE_FADE_BLACK_FAST, TRANS_TYPE_FADE_BLACK) +/* 0x474 */ DEFINE_ENTRANCE(ENTR_TEMPLE_OF_TIME_EXTERIOR_RUINS_1_2, SCENE_TEMPLE_OF_TIME_EXTERIOR_RUINS, 1, false, true, TRANS_TYPE_FADE_BLACK_FAST, TRANS_TYPE_FADE_BLACK) +/* 0x475 */ DEFINE_ENTRANCE(ENTR_TEMPLE_OF_TIME_EXTERIOR_RUINS_1_3, SCENE_TEMPLE_OF_TIME_EXTERIOR_RUINS, 1, false, true, TRANS_TYPE_FADE_BLACK_FAST, TRANS_TYPE_FADE_BLACK) + +/* 0x476 */ DEFINE_ENTRANCE(ENTR_HYRULE_FIELD_15, SCENE_HYRULE_FIELD, 15, false, true, TRANS_TYPE_FADE_WHITE_FAST, TRANS_TYPE_FADE_WHITE_FAST) +/* 0x477 */ DEFINE_ENTRANCE(ENTR_HYRULE_FIELD_15_1, SCENE_HYRULE_FIELD, 15, false, true, TRANS_TYPE_FADE_BLACK_FAST, TRANS_TYPE_FADE_BLACK) +/* 0x478 */ DEFINE_ENTRANCE(ENTR_HYRULE_FIELD_15_2, SCENE_HYRULE_FIELD, 15, false, true, TRANS_TYPE_FADE_WHITE_FAST, TRANS_TYPE_FADE_WHITE_FAST) +/* 0x479 */ DEFINE_ENTRANCE(ENTR_HYRULE_FIELD_15_3, SCENE_HYRULE_FIELD, 15, false, true, TRANS_TYPE_FADE_BLACK_FAST, TRANS_TYPE_FADE_BLACK) + +/* 0x47A */ DEFINE_ENTRANCE(ENTR_DEATH_MOUNTAIN_TRAIL_5, SCENE_DEATH_MOUNTAIN_TRAIL, 5, false, true, TRANS_TYPE_FADE_BLACK_FAST, TRANS_TYPE_FADE_BLACK) +/* 0x47B */ DEFINE_ENTRANCE(ENTR_DEATH_MOUNTAIN_TRAIL_5_1, SCENE_DEATH_MOUNTAIN_TRAIL, 5, false, true, TRANS_TYPE_FADE_BLACK_FAST, TRANS_TYPE_FADE_BLACK) +/* 0x47C */ DEFINE_ENTRANCE(ENTR_DEATH_MOUNTAIN_TRAIL_5_2, SCENE_DEATH_MOUNTAIN_TRAIL, 5, false, true, TRANS_TYPE_FADE_BLACK_FAST, TRANS_TYPE_FADE_BLACK) +/* 0x47D */ DEFINE_ENTRANCE(ENTR_DEATH_MOUNTAIN_TRAIL_5_3, SCENE_DEATH_MOUNTAIN_TRAIL, 5, false, true, TRANS_TYPE_FADE_BLACK_FAST, TRANS_TYPE_FADE_BLACK) + +/* 0x47E */ DEFINE_ENTRANCE(ENTR_HYRULE_CASTLE_4, SCENE_HYRULE_CASTLE, 4, false, true, TRANS_TYPE_FADE_WHITE, TRANS_TYPE_FADE_WHITE) +/* 0x47F */ DEFINE_ENTRANCE(ENTR_HYRULE_CASTLE_4_1, SCENE_HYRULE_CASTLE, 4, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x480 */ DEFINE_ENTRANCE(ENTR_OUTSIDE_GANONS_CASTLE_4_2, SCENE_OUTSIDE_GANONS_CASTLE, 4, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x481 */ DEFINE_ENTRANCE(ENTR_OUTSIDE_GANONS_CASTLE_4_3, SCENE_OUTSIDE_GANONS_CASTLE, 4, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) + +/* 0x482 */ DEFINE_ENTRANCE(ENTR_DEATH_MOUNTAIN_CRATER_3, SCENE_DEATH_MOUNTAIN_CRATER, 3, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x483 */ DEFINE_ENTRANCE(ENTR_DEATH_MOUNTAIN_CRATER_3_1, SCENE_DEATH_MOUNTAIN_CRATER, 3, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x484 */ DEFINE_ENTRANCE(ENTR_DEATH_MOUNTAIN_CRATER_3_2, SCENE_DEATH_MOUNTAIN_CRATER, 3, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x485 */ DEFINE_ENTRANCE(ENTR_DEATH_MOUNTAIN_CRATER_3_3, SCENE_DEATH_MOUNTAIN_CRATER, 3, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) + +/* 0x486 */ DEFINE_ENTRANCE(ENTR_THIEVES_HIDEOUT_0, SCENE_THIEVES_HIDEOUT, 0, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x487 */ DEFINE_ENTRANCE(ENTR_THIEVES_HIDEOUT_0_1, SCENE_THIEVES_HIDEOUT, 0, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x488 */ DEFINE_ENTRANCE(ENTR_THIEVES_HIDEOUT_0_2, SCENE_THIEVES_HIDEOUT, 0, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x489 */ DEFINE_ENTRANCE(ENTR_THIEVES_HIDEOUT_0_3, SCENE_THIEVES_HIDEOUT, 0, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) + +/* 0x48A */ DEFINE_ENTRANCE(ENTR_THIEVES_HIDEOUT_1, SCENE_THIEVES_HIDEOUT, 1, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x48B */ DEFINE_ENTRANCE(ENTR_THIEVES_HIDEOUT_1_1, SCENE_THIEVES_HIDEOUT, 1, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x48C */ DEFINE_ENTRANCE(ENTR_THIEVES_HIDEOUT_1_2, SCENE_THIEVES_HIDEOUT, 1, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x48D */ DEFINE_ENTRANCE(ENTR_THIEVES_HIDEOUT_1_3, SCENE_THIEVES_HIDEOUT, 1, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) + +/* 0x48E */ DEFINE_ENTRANCE(ENTR_THIEVES_HIDEOUT_2, SCENE_THIEVES_HIDEOUT, 2, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x48F */ DEFINE_ENTRANCE(ENTR_THIEVES_HIDEOUT_2_1, SCENE_THIEVES_HIDEOUT, 2, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x490 */ DEFINE_ENTRANCE(ENTR_THIEVES_HIDEOUT_2_2, SCENE_THIEVES_HIDEOUT, 2, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x491 */ DEFINE_ENTRANCE(ENTR_THIEVES_HIDEOUT_2_3, SCENE_THIEVES_HIDEOUT, 2, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) + +/* 0x492 */ DEFINE_ENTRANCE(ENTR_THIEVES_HIDEOUT_3, SCENE_THIEVES_HIDEOUT, 3, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x493 */ DEFINE_ENTRANCE(ENTR_THIEVES_HIDEOUT_3_1, SCENE_THIEVES_HIDEOUT, 3, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x494 */ DEFINE_ENTRANCE(ENTR_THIEVES_HIDEOUT_3_2, SCENE_THIEVES_HIDEOUT, 3, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x495 */ DEFINE_ENTRANCE(ENTR_THIEVES_HIDEOUT_3_3, SCENE_THIEVES_HIDEOUT, 3, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) + +/* 0x496 */ DEFINE_ENTRANCE(ENTR_THIEVES_HIDEOUT_4, SCENE_THIEVES_HIDEOUT, 4, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x497 */ DEFINE_ENTRANCE(ENTR_THIEVES_HIDEOUT_4_1, SCENE_THIEVES_HIDEOUT, 4, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x498 */ DEFINE_ENTRANCE(ENTR_THIEVES_HIDEOUT_4_2, SCENE_THIEVES_HIDEOUT, 4, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x499 */ DEFINE_ENTRANCE(ENTR_THIEVES_HIDEOUT_4_3, SCENE_THIEVES_HIDEOUT, 4, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) + +/* 0x49A */ DEFINE_ENTRANCE(ENTR_THIEVES_HIDEOUT_5, SCENE_THIEVES_HIDEOUT, 5, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x49B */ DEFINE_ENTRANCE(ENTR_THIEVES_HIDEOUT_5_1, SCENE_THIEVES_HIDEOUT, 5, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x49C */ DEFINE_ENTRANCE(ENTR_THIEVES_HIDEOUT_5_2, SCENE_THIEVES_HIDEOUT, 5, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x49D */ DEFINE_ENTRANCE(ENTR_THIEVES_HIDEOUT_5_3, SCENE_THIEVES_HIDEOUT, 5, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) + +/* 0x49E */ DEFINE_ENTRANCE(ENTR_THIEVES_HIDEOUT_6, SCENE_THIEVES_HIDEOUT, 6, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x49F */ DEFINE_ENTRANCE(ENTR_THIEVES_HIDEOUT_6_1, SCENE_THIEVES_HIDEOUT, 6, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x4A0 */ DEFINE_ENTRANCE(ENTR_THIEVES_HIDEOUT_6_2, SCENE_THIEVES_HIDEOUT, 6, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x4A1 */ DEFINE_ENTRANCE(ENTR_THIEVES_HIDEOUT_6_3, SCENE_THIEVES_HIDEOUT, 6, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) + +/* 0x4A2 */ DEFINE_ENTRANCE(ENTR_THIEVES_HIDEOUT_7, SCENE_THIEVES_HIDEOUT, 7, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x4A3 */ DEFINE_ENTRANCE(ENTR_THIEVES_HIDEOUT_7_1, SCENE_THIEVES_HIDEOUT, 7, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x4A4 */ DEFINE_ENTRANCE(ENTR_THIEVES_HIDEOUT_7_2, SCENE_THIEVES_HIDEOUT, 7, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x4A5 */ DEFINE_ENTRANCE(ENTR_THIEVES_HIDEOUT_7_3, SCENE_THIEVES_HIDEOUT, 7, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) + +/* 0x4A6 */ DEFINE_ENTRANCE(ENTR_THIEVES_HIDEOUT_8, SCENE_THIEVES_HIDEOUT, 8, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x4A7 */ DEFINE_ENTRANCE(ENTR_THIEVES_HIDEOUT_8_1, SCENE_THIEVES_HIDEOUT, 8, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x4A8 */ DEFINE_ENTRANCE(ENTR_THIEVES_HIDEOUT_8_2, SCENE_THIEVES_HIDEOUT, 8, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x4A9 */ DEFINE_ENTRANCE(ENTR_THIEVES_HIDEOUT_8_3, SCENE_THIEVES_HIDEOUT, 8, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) + +/* 0x4AA */ DEFINE_ENTRANCE(ENTR_THIEVES_HIDEOUT_9, SCENE_THIEVES_HIDEOUT, 9, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x4AB */ DEFINE_ENTRANCE(ENTR_THIEVES_HIDEOUT_9_1, SCENE_THIEVES_HIDEOUT, 9, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x4AC */ DEFINE_ENTRANCE(ENTR_THIEVES_HIDEOUT_9_2, SCENE_THIEVES_HIDEOUT, 9, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x4AD */ DEFINE_ENTRANCE(ENTR_THIEVES_HIDEOUT_9_3, SCENE_THIEVES_HIDEOUT, 9, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) + +/* 0x4AE */ DEFINE_ENTRANCE(ENTR_THIEVES_HIDEOUT_10, SCENE_THIEVES_HIDEOUT, 10, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x4AF */ DEFINE_ENTRANCE(ENTR_THIEVES_HIDEOUT_10_1, SCENE_THIEVES_HIDEOUT, 10, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x4B0 */ DEFINE_ENTRANCE(ENTR_THIEVES_HIDEOUT_10_2, SCENE_THIEVES_HIDEOUT, 10, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x4B1 */ DEFINE_ENTRANCE(ENTR_THIEVES_HIDEOUT_10_3, SCENE_THIEVES_HIDEOUT, 10, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) + +/* 0x4B2 */ DEFINE_ENTRANCE(ENTR_THIEVES_HIDEOUT_11, SCENE_THIEVES_HIDEOUT, 11, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x4B3 */ DEFINE_ENTRANCE(ENTR_THIEVES_HIDEOUT_11_1, SCENE_THIEVES_HIDEOUT, 11, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x4B4 */ DEFINE_ENTRANCE(ENTR_THIEVES_HIDEOUT_11_2, SCENE_THIEVES_HIDEOUT, 11, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x4B5 */ DEFINE_ENTRANCE(ENTR_THIEVES_HIDEOUT_11_3, SCENE_THIEVES_HIDEOUT, 11, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) + +/* 0x4B6 */ DEFINE_ENTRANCE(ENTR_GANONS_TOWER_COLLAPSE_INTERIOR_7, SCENE_GANONS_TOWER_COLLAPSE_INTERIOR, 7, true, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x4B7 */ DEFINE_ENTRANCE(ENTR_GANONS_TOWER_COLLAPSE_INTERIOR_7_1, SCENE_GANONS_TOWER_COLLAPSE_INTERIOR, 7, true, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x4B8 */ DEFINE_ENTRANCE(ENTR_GANONS_TOWER_COLLAPSE_INTERIOR_7_2, SCENE_GANONS_TOWER_COLLAPSE_INTERIOR, 7, true, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x4B9 */ DEFINE_ENTRANCE(ENTR_GANONS_TOWER_COLLAPSE_INTERIOR_7_3, SCENE_GANONS_TOWER_COLLAPSE_INTERIOR, 7, true, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) + +/* 0x4BA */ DEFINE_ENTRANCE(ENTR_GANONS_TOWER_COLLAPSE_EXTERIOR_1, SCENE_GANONS_TOWER_COLLAPSE_EXTERIOR, 1, true, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x4BB */ DEFINE_ENTRANCE(ENTR_GANONS_TOWER_COLLAPSE_EXTERIOR_1_1, SCENE_GANONS_TOWER_COLLAPSE_EXTERIOR, 1, true, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x4BC */ DEFINE_ENTRANCE(ENTR_GANONS_TOWER_COLLAPSE_EXTERIOR_1_2, SCENE_GANONS_TOWER_COLLAPSE_EXTERIOR, 1, true, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x4BD */ DEFINE_ENTRANCE(ENTR_GANONS_TOWER_COLLAPSE_EXTERIOR_1_3, SCENE_GANONS_TOWER_COLLAPSE_EXTERIOR, 1, true, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) + +/* 0x4BE */ DEFINE_ENTRANCE(ENTR_GREAT_FAIRYS_FOUNTAIN_MAGIC_1, SCENE_GREAT_FAIRYS_FOUNTAIN_MAGIC, 1, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x4BF */ DEFINE_ENTRANCE(ENTR_GREAT_FAIRYS_FOUNTAIN_MAGIC_1_1, SCENE_GREAT_FAIRYS_FOUNTAIN_MAGIC, 1, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x4C0 */ DEFINE_ENTRANCE(ENTR_GREAT_FAIRYS_FOUNTAIN_MAGIC_1_2, SCENE_GREAT_FAIRYS_FOUNTAIN_MAGIC, 1, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x4C1 */ DEFINE_ENTRANCE(ENTR_GREAT_FAIRYS_FOUNTAIN_MAGIC_1_3, SCENE_GREAT_FAIRYS_FOUNTAIN_MAGIC, 1, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) + +/* 0x4C2 */ DEFINE_ENTRANCE(ENTR_GREAT_FAIRYS_FOUNTAIN_MAGIC_2, SCENE_GREAT_FAIRYS_FOUNTAIN_MAGIC, 2, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x4C3 */ DEFINE_ENTRANCE(ENTR_GREAT_FAIRYS_FOUNTAIN_MAGIC_2_1, SCENE_GREAT_FAIRYS_FOUNTAIN_MAGIC, 2, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x4C4 */ DEFINE_ENTRANCE(ENTR_GREAT_FAIRYS_FOUNTAIN_MAGIC_2_2, SCENE_GREAT_FAIRYS_FOUNTAIN_MAGIC, 2, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x4C5 */ DEFINE_ENTRANCE(ENTR_GREAT_FAIRYS_FOUNTAIN_MAGIC_2_3, SCENE_GREAT_FAIRYS_FOUNTAIN_MAGIC, 2, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) + +/* 0x4C6 */ DEFINE_ENTRANCE(ENTR_LOST_WOODS_4, SCENE_LOST_WOODS, 4, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x4C7 */ DEFINE_ENTRANCE(ENTR_LOST_WOODS_4_1, SCENE_LOST_WOODS, 4, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x4C8 */ DEFINE_ENTRANCE(ENTR_LOST_WOODS_4_2, SCENE_LOST_WOODS, 4, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x4C9 */ DEFINE_ENTRANCE(ENTR_LOST_WOODS_4_3, SCENE_LOST_WOODS, 4, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) + +/* 0x4CA */ DEFINE_ENTRANCE(ENTR_LON_LON_RANCH_6, SCENE_LON_LON_RANCH, 6, false, false, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_CIRCLE(TCA_STARBURST,TCC_BLACK, TCS_FAST)) +/* 0x4CB */ DEFINE_ENTRANCE(ENTR_LON_LON_RANCH_6_1, SCENE_LON_LON_RANCH, 6, false, false, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_CIRCLE(TCA_STARBURST,TCC_BLACK, TCS_FAST)) +/* 0x4CC */ DEFINE_ENTRANCE(ENTR_LON_LON_RANCH_6_2, SCENE_LON_LON_RANCH, 6, false, false, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_CIRCLE(TCA_STARBURST,TCC_BLACK, TCS_FAST)) +/* 0x4CD */ DEFINE_ENTRANCE(ENTR_LON_LON_RANCH_6_3, SCENE_LON_LON_RANCH, 6, false, false, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_CIRCLE(TCA_STARBURST,TCC_BLACK, TCS_FAST)) + +/* 0x4CE */ DEFINE_ENTRANCE(ENTR_LON_LON_RANCH_7, SCENE_LON_LON_RANCH, 7, false, false, TRANS_TYPE_CIRCLE(TCA_STARBURST,TCC_WHITE, TCS_FAST), TRANS_TYPE_CIRCLE(TCA_STARBURST,TCC_WHITE, TCS_FAST)) +/* 0x4CF */ DEFINE_ENTRANCE(ENTR_LON_LON_RANCH_7_1, SCENE_LON_LON_RANCH, 7, false, false, TRANS_TYPE_CIRCLE(TCA_STARBURST,TCC_WHITE, TCS_FAST), TRANS_TYPE_CIRCLE(TCA_STARBURST,TCC_WHITE, TCS_FAST)) +/* 0x4D0 */ DEFINE_ENTRANCE(ENTR_LON_LON_RANCH_7_2, SCENE_LON_LON_RANCH, 7, false, false, TRANS_TYPE_CIRCLE(TCA_STARBURST,TCC_WHITE, TCS_FAST), TRANS_TYPE_CIRCLE(TCA_STARBURST,TCC_WHITE, TCS_FAST)) +/* 0x4D1 */ DEFINE_ENTRANCE(ENTR_LON_LON_RANCH_7_3, SCENE_LON_LON_RANCH, 7, false, false, TRANS_TYPE_CIRCLE(TCA_STARBURST,TCC_WHITE, TCS_FAST), TRANS_TYPE_CIRCLE(TCA_STARBURST,TCC_WHITE, TCS_FAST)) + +/* 0x4D2 */ DEFINE_ENTRANCE(ENTR_LOST_WOODS_5, SCENE_LOST_WOODS, 5, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x4D3 */ DEFINE_ENTRANCE(ENTR_LOST_WOODS_5_1, SCENE_LOST_WOODS, 5, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x4D4 */ DEFINE_ENTRANCE(ENTR_LOST_WOODS_5_2, SCENE_LOST_WOODS, 5, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x4D5 */ DEFINE_ENTRANCE(ENTR_LOST_WOODS_5_3, SCENE_LOST_WOODS, 5, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) + +/* 0x4D6 */ DEFINE_ENTRANCE(ENTR_LOST_WOODS_6, SCENE_LOST_WOODS, 6, false, true, TRANS_TYPE_CIRCLE(TCA_RIPPLE, TCC_WHITE, TCS_FAST), TRANS_TYPE_CIRCLE(TCA_RIPPLE, TCC_WHITE, TCS_FAST)) +/* 0x4D7 */ DEFINE_ENTRANCE(ENTR_LOST_WOODS_6_1, SCENE_LOST_WOODS, 6, false, true, TRANS_TYPE_CIRCLE(TCA_RIPPLE, TCC_WHITE, TCS_FAST), TRANS_TYPE_CIRCLE(TCA_RIPPLE, TCC_WHITE, TCS_FAST)) +/* 0x4D8 */ DEFINE_ENTRANCE(ENTR_LOST_WOODS_6_2, SCENE_LOST_WOODS, 6, false, true, TRANS_TYPE_CIRCLE(TCA_RIPPLE, TCC_WHITE, TCS_FAST), TRANS_TYPE_CIRCLE(TCA_RIPPLE, TCC_WHITE, TCS_FAST)) +/* 0x4D9 */ DEFINE_ENTRANCE(ENTR_LOST_WOODS_6_3, SCENE_LOST_WOODS, 6, false, true, TRANS_TYPE_CIRCLE(TCA_RIPPLE, TCC_WHITE, TCS_FAST), TRANS_TYPE_CIRCLE(TCA_RIPPLE, TCC_WHITE, TCS_FAST)) + +/* 0x4DA */ DEFINE_ENTRANCE(ENTR_LOST_WOODS_7, SCENE_LOST_WOODS, 7, false, true, TRANS_TYPE_CIRCLE(TCA_RIPPLE, TCC_WHITE, TCS_FAST), TRANS_TYPE_CIRCLE(TCA_RIPPLE, TCC_WHITE, TCS_FAST)) +/* 0x4DB */ DEFINE_ENTRANCE(ENTR_LOST_WOODS_7_1, SCENE_LOST_WOODS, 7, false, true, TRANS_TYPE_CIRCLE(TCA_RIPPLE, TCC_WHITE, TCS_FAST), TRANS_TYPE_CIRCLE(TCA_RIPPLE, TCC_WHITE, TCS_FAST)) +/* 0x4DC */ DEFINE_ENTRANCE(ENTR_LOST_WOODS_7_2, SCENE_LOST_WOODS, 7, false, true, TRANS_TYPE_CIRCLE(TCA_RIPPLE, TCC_WHITE, TCS_FAST), TRANS_TYPE_CIRCLE(TCA_RIPPLE, TCC_WHITE, TCS_FAST)) +/* 0x4DD */ DEFINE_ENTRANCE(ENTR_LOST_WOODS_7_3, SCENE_LOST_WOODS, 7, false, true, TRANS_TYPE_CIRCLE(TCA_RIPPLE, TCC_WHITE, TCS_FAST), TRANS_TYPE_CIRCLE(TCA_RIPPLE, TCC_WHITE, TCS_FAST)) + +/* 0x4DE */ DEFINE_ENTRANCE(ENTR_LOST_WOODS_8, SCENE_LOST_WOODS, 8, false, false, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x4DF */ DEFINE_ENTRANCE(ENTR_LOST_WOODS_8_1, SCENE_LOST_WOODS, 8, false, false, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x4E0 */ DEFINE_ENTRANCE(ENTR_LOST_WOODS_8_2, SCENE_LOST_WOODS, 8, false, false, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x4E1 */ DEFINE_ENTRANCE(ENTR_LOST_WOODS_8_3, SCENE_LOST_WOODS, 8, false, false, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) + +/* 0x4E2 */ DEFINE_ENTRANCE(ENTR_GORON_CITY_3, SCENE_GORON_CITY, 3, false, true, TRANS_TYPE_CIRCLE(TCA_RIPPLE, TCC_WHITE, TCS_FAST), TRANS_TYPE_CIRCLE(TCA_RIPPLE, TCC_WHITE, TCS_FAST)) +/* 0x4E3 */ DEFINE_ENTRANCE(ENTR_GORON_CITY_3_1, SCENE_GORON_CITY, 3, false, true, TRANS_TYPE_CIRCLE(TCA_RIPPLE, TCC_WHITE, TCS_FAST), TRANS_TYPE_CIRCLE(TCA_RIPPLE, TCC_WHITE, TCS_FAST)) +/* 0x4E4 */ DEFINE_ENTRANCE(ENTR_GORON_CITY_3_2, SCENE_GORON_CITY, 3, false, true, TRANS_TYPE_CIRCLE(TCA_RIPPLE, TCC_WHITE, TCS_FAST), TRANS_TYPE_CIRCLE(TCA_RIPPLE, TCC_WHITE, TCS_FAST)) +/* 0x4E5 */ DEFINE_ENTRANCE(ENTR_GORON_CITY_3_3, SCENE_GORON_CITY, 3, false, true, TRANS_TYPE_CIRCLE(TCA_RIPPLE, TCC_WHITE, TCS_FAST), TRANS_TYPE_CIRCLE(TCA_RIPPLE, TCC_WHITE, TCS_FAST)) + +/* 0x4E6 */ DEFINE_ENTRANCE(ENTR_LAKE_HYLIA_5, SCENE_LAKE_HYLIA, 5, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x4E7 */ DEFINE_ENTRANCE(ENTR_LAKE_HYLIA_5_1, SCENE_LAKE_HYLIA, 5, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x4E8 */ DEFINE_ENTRANCE(ENTR_LAKE_HYLIA_5_2, SCENE_LAKE_HYLIA, 5, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x4E9 */ DEFINE_ENTRANCE(ENTR_LAKE_HYLIA_5_3, SCENE_LAKE_HYLIA, 5, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) + +/* 0x4EA */ DEFINE_ENTRANCE(ENTR_SHADOW_TEMPLE_3, SCENE_SHADOW_TEMPLE, 3, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x4EB */ DEFINE_ENTRANCE(ENTR_SHADOW_TEMPLE_3_1, SCENE_SHADOW_TEMPLE, 3, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x4EC */ DEFINE_ENTRANCE(ENTR_SHADOW_TEMPLE_3_2, SCENE_SHADOW_TEMPLE, 3, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x4ED */ DEFINE_ENTRANCE(ENTR_SHADOW_TEMPLE_3_3, SCENE_SHADOW_TEMPLE, 3, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) + +/* 0x4EE */ DEFINE_ENTRANCE(ENTR_KAKARIKO_VILLAGE_11, SCENE_KAKARIKO_VILLAGE, 11, false, true, TRANS_TYPE_FADE_BLACK_FAST, TRANS_TYPE_FADE_BLACK) +/* 0x4EF */ DEFINE_ENTRANCE(ENTR_KAKARIKO_VILLAGE_11_1, SCENE_KAKARIKO_VILLAGE, 11, false, true, TRANS_TYPE_FADE_BLACK_FAST, TRANS_TYPE_FADE_BLACK) +/* 0x4F0 */ DEFINE_ENTRANCE(ENTR_KAKARIKO_VILLAGE_11_2, SCENE_KAKARIKO_VILLAGE, 11, false, true, TRANS_TYPE_FADE_BLACK_FAST, TRANS_TYPE_FADE_BLACK) +/* 0x4F1 */ DEFINE_ENTRANCE(ENTR_KAKARIKO_VILLAGE_11_3, SCENE_KAKARIKO_VILLAGE, 11, false, true, TRANS_TYPE_FADE_BLACK_FAST, TRANS_TYPE_FADE_BLACK) + +/* 0x4F2 */ DEFINE_ENTRANCE(ENTR_GREAT_FAIRYS_FOUNTAIN_MAGIC_3, SCENE_GREAT_FAIRYS_FOUNTAIN_MAGIC, 3, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x4F3 */ DEFINE_ENTRANCE(ENTR_GREAT_FAIRYS_FOUNTAIN_MAGIC_3_1, SCENE_GREAT_FAIRYS_FOUNTAIN_MAGIC, 3, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x4F4 */ DEFINE_ENTRANCE(ENTR_GREAT_FAIRYS_FOUNTAIN_MAGIC_3_2, SCENE_GREAT_FAIRYS_FOUNTAIN_MAGIC, 3, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x4F5 */ DEFINE_ENTRANCE(ENTR_GREAT_FAIRYS_FOUNTAIN_MAGIC_3_3, SCENE_GREAT_FAIRYS_FOUNTAIN_MAGIC, 3, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) + +/* 0x4F6 */ DEFINE_ENTRANCE(ENTR_DEATH_MOUNTAIN_CRATER_4, SCENE_DEATH_MOUNTAIN_CRATER, 4, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x4F7 */ DEFINE_ENTRANCE(ENTR_DEATH_MOUNTAIN_CRATER_4_1, SCENE_DEATH_MOUNTAIN_CRATER, 4, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x4F8 */ DEFINE_ENTRANCE(ENTR_DEATH_MOUNTAIN_CRATER_4_2, SCENE_DEATH_MOUNTAIN_CRATER, 4, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x4F9 */ DEFINE_ENTRANCE(ENTR_DEATH_MOUNTAIN_CRATER_4_3, SCENE_DEATH_MOUNTAIN_CRATER, 4, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) + +/* 0x4FA */ DEFINE_ENTRANCE(ENTR_HYRULE_CASTLE_3, SCENE_HYRULE_CASTLE, 3, false, true, TRANS_TYPE_FADE_WHITE, TRANS_TYPE_FADE_WHITE) +/* 0x4FB */ DEFINE_ENTRANCE(ENTR_HYRULE_CASTLE_3_1, SCENE_HYRULE_CASTLE, 3, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x4FC */ DEFINE_ENTRANCE(ENTR_OUTSIDE_GANONS_CASTLE_3_2, SCENE_OUTSIDE_GANONS_CASTLE, 3, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x4FD */ DEFINE_ENTRANCE(ENTR_OUTSIDE_GANONS_CASTLE_3_3, SCENE_OUTSIDE_GANONS_CASTLE, 3, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x4FE */ DEFINE_ENTRANCE(ENTR_HYRULE_CASTLE_3_4, SCENE_HYRULE_CASTLE, 3, false, true, TRANS_TYPE_WIPE, TRANS_TYPE_WIPE) + +/* 0x4FF */ DEFINE_ENTRANCE(ENTR_KAKARIKO_VILLAGE_12, SCENE_KAKARIKO_VILLAGE, 12, false, true, TRANS_TYPE_FADE_BLACK_FAST, TRANS_TYPE_FADE_BLACK) +/* 0x500 */ DEFINE_ENTRANCE(ENTR_KAKARIKO_VILLAGE_12_1, SCENE_KAKARIKO_VILLAGE, 12, false, true, TRANS_TYPE_FADE_BLACK_FAST, TRANS_TYPE_FADE_BLACK) +/* 0x501 */ DEFINE_ENTRANCE(ENTR_KAKARIKO_VILLAGE_12_2, SCENE_KAKARIKO_VILLAGE, 12, false, true, TRANS_TYPE_FADE_BLACK_FAST, TRANS_TYPE_FADE_BLACK) +/* 0x502 */ DEFINE_ENTRANCE(ENTR_KAKARIKO_VILLAGE_12_3, SCENE_KAKARIKO_VILLAGE, 12, false, true, TRANS_TYPE_FADE_BLACK_FAST, TRANS_TYPE_FADE_BLACK) + +/* 0x503 */ DEFINE_ENTRANCE(ENTR_WINDMILL_AND_DAMPES_GRAVE_2, SCENE_WINDMILL_AND_DAMPES_GRAVE, 2, true, true, TRANS_TYPE_FADE_BLACK_FAST, TRANS_TYPE_CIRCLE(TCA_NORMAL, TCC_BLACK, TCS_FAST)) +/* 0x504 */ DEFINE_ENTRANCE(ENTR_WINDMILL_AND_DAMPES_GRAVE_2_1, SCENE_WINDMILL_AND_DAMPES_GRAVE, 2, true, true, TRANS_TYPE_FADE_BLACK_FAST, TRANS_TYPE_CIRCLE(TCA_NORMAL, TCC_BLACK, TCS_FAST)) +/* 0x505 */ DEFINE_ENTRANCE(ENTR_WINDMILL_AND_DAMPES_GRAVE_2_2, SCENE_WINDMILL_AND_DAMPES_GRAVE, 2, true, true, TRANS_TYPE_FADE_BLACK_FAST, TRANS_TYPE_CIRCLE(TCA_NORMAL, TCC_BLACK, TCS_FAST)) +/* 0x506 */ DEFINE_ENTRANCE(ENTR_WINDMILL_AND_DAMPES_GRAVE_2_3, SCENE_WINDMILL_AND_DAMPES_GRAVE, 2, true, true, TRANS_TYPE_FADE_BLACK_FAST, TRANS_TYPE_CIRCLE(TCA_NORMAL, TCC_BLACK, TCS_FAST)) + +/* 0x507 */ DEFINE_ENTRANCE(ENTR_BOMBCHU_BOWLING_ALLEY_0, SCENE_BOMBCHU_BOWLING_ALLEY, 0, false, true, TRANS_TYPE_FADE_BLACK_FAST, TRANS_TYPE_CIRCLE(TCA_NORMAL, TCC_BLACK, TCS_FAST)) +/* 0x508 */ DEFINE_ENTRANCE(ENTR_BOMBCHU_BOWLING_ALLEY_0_1, SCENE_BOMBCHU_BOWLING_ALLEY, 0, false, true, TRANS_TYPE_FADE_BLACK_FAST, TRANS_TYPE_CIRCLE(TCA_NORMAL, TCC_BLACK, TCS_FAST)) +/* 0x509 */ DEFINE_ENTRANCE(ENTR_BOMBCHU_BOWLING_ALLEY_0_2, SCENE_BOMBCHU_BOWLING_ALLEY, 0, false, true, TRANS_TYPE_FADE_BLACK_FAST, TRANS_TYPE_CIRCLE(TCA_NORMAL, TCC_BLACK, TCS_FAST)) +/* 0x50A */ DEFINE_ENTRANCE(ENTR_BOMBCHU_BOWLING_ALLEY_0_3, SCENE_BOMBCHU_BOWLING_ALLEY, 0, false, true, TRANS_TYPE_FADE_BLACK_FAST, TRANS_TYPE_CIRCLE(TCA_NORMAL, TCC_BLACK, TCS_FAST)) + +/* 0x50B */ DEFINE_ENTRANCE(ENTR_GRAVEYARD_6, SCENE_GRAVEYARD, 6, false, true, TRANS_TYPE_FADE_WHITE, TRANS_TYPE_FADE_WHITE) +/* 0x50C */ DEFINE_ENTRANCE(ENTR_GRAVEYARD_6_1, SCENE_GRAVEYARD, 6, false, true, TRANS_TYPE_FADE_WHITE, TRANS_TYPE_FADE_WHITE) +/* 0x50D */ DEFINE_ENTRANCE(ENTR_GRAVEYARD_6_2, SCENE_GRAVEYARD, 6, false, true, TRANS_TYPE_FADE_WHITE, TRANS_TYPE_FADE_WHITE) +/* 0x50E */ DEFINE_ENTRANCE(ENTR_GRAVEYARD_6_3, SCENE_GRAVEYARD, 6, false, true, TRANS_TYPE_FADE_WHITE, TRANS_TYPE_FADE_WHITE) + +/* 0x50F */ DEFINE_ENTRANCE(ENTR_HYRULE_FIELD_16, SCENE_HYRULE_FIELD, 16, false, true, TRANS_TYPE_INSTANT, TRANS_TYPE_INSTANT) +/* 0x510 */ DEFINE_ENTRANCE(ENTR_HYRULE_FIELD_16_1, SCENE_HYRULE_FIELD, 16, false, true, TRANS_TYPE_INSTANT, TRANS_TYPE_INSTANT) +/* 0x511 */ DEFINE_ENTRANCE(ENTR_HYRULE_FIELD_16_2, SCENE_HYRULE_FIELD, 16, false, true, TRANS_TYPE_INSTANT, TRANS_TYPE_INSTANT) +/* 0x512 */ DEFINE_ENTRANCE(ENTR_HYRULE_FIELD_16_3, SCENE_HYRULE_FIELD, 16, false, true, TRANS_TYPE_INSTANT, TRANS_TYPE_INSTANT) + +/* 0x513 */ DEFINE_ENTRANCE(ENTR_KAKARIKO_VILLAGE_13, SCENE_KAKARIKO_VILLAGE, 13, false, true, TRANS_TYPE_FADE_WHITE, TRANS_TYPE_FADE_WHITE) +/* 0x514 */ DEFINE_ENTRANCE(ENTR_KAKARIKO_VILLAGE_13_1, SCENE_KAKARIKO_VILLAGE, 13, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x515 */ DEFINE_ENTRANCE(ENTR_KAKARIKO_VILLAGE_13_2, SCENE_KAKARIKO_VILLAGE, 13, false, true, TRANS_TYPE_FADE_WHITE, TRANS_TYPE_FADE_WHITE) +/* 0x516 */ DEFINE_ENTRANCE(ENTR_KAKARIKO_VILLAGE_13_3, SCENE_KAKARIKO_VILLAGE, 13, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) + +/* 0x517 */ DEFINE_ENTRANCE(ENTR_GANON_BOSS_0, SCENE_GANON_BOSS, 0, false, true, TRANS_TYPE_FADE_WHITE, TRANS_TYPE_FADE_WHITE) +/* 0x518 */ DEFINE_ENTRANCE(ENTR_GANON_BOSS_0_1, SCENE_GANON_BOSS, 0, false, true, TRANS_TYPE_FADE_WHITE, TRANS_TYPE_FADE_WHITE) +/* 0x519 */ DEFINE_ENTRANCE(ENTR_GANON_BOSS_0_2, SCENE_GANON_BOSS, 0, false, true, TRANS_TYPE_FADE_WHITE, TRANS_TYPE_FADE_WHITE) +/* 0x51A */ DEFINE_ENTRANCE(ENTR_GANON_BOSS_0_3, SCENE_GANON_BOSS, 0, false, true, TRANS_TYPE_FADE_WHITE, TRANS_TYPE_FADE_WHITE) +/* 0x51B */ DEFINE_ENTRANCE(ENTR_GANON_BOSS_0_4, SCENE_GANON_BOSS, 0, false, true, TRANS_TYPE_FADE_WHITE, TRANS_TYPE_FADE_WHITE) + +/* 0x51C */ DEFINE_ENTRANCE(ENTR_GANONS_TOWER_COLLAPSE_EXTERIOR_6, SCENE_GANONS_TOWER_COLLAPSE_EXTERIOR, 6, true, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x51D */ DEFINE_ENTRANCE(ENTR_GANONS_TOWER_COLLAPSE_EXTERIOR_6_1, SCENE_GANONS_TOWER_COLLAPSE_EXTERIOR, 6, true, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x51E */ DEFINE_ENTRANCE(ENTR_GANONS_TOWER_COLLAPSE_EXTERIOR_6_2, SCENE_GANONS_TOWER_COLLAPSE_EXTERIOR, 6, true, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x51F */ DEFINE_ENTRANCE(ENTR_GANONS_TOWER_COLLAPSE_EXTERIOR_6_3, SCENE_GANONS_TOWER_COLLAPSE_EXTERIOR, 6, true, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) + +/* 0x520 */ DEFINE_ENTRANCE(ENTR_BESITU_0, SCENE_BESITU, 0, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x521 */ DEFINE_ENTRANCE(ENTR_BESITU_0_1, SCENE_BESITU, 0, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x522 */ DEFINE_ENTRANCE(ENTR_BESITU_0_2, SCENE_BESITU, 0, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x523 */ DEFINE_ENTRANCE(ENTR_BESITU_0_3, SCENE_BESITU, 0, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) + +/* 0x524 */ DEFINE_ENTRANCE(ENTR_GANONS_TOWER_COLLAPSE_EXTERIOR_7, SCENE_GANONS_TOWER_COLLAPSE_EXTERIOR, 7, true, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x525 */ DEFINE_ENTRANCE(ENTR_GANONS_TOWER_COLLAPSE_EXTERIOR_7_1, SCENE_GANONS_TOWER_COLLAPSE_EXTERIOR, 7, true, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x526 */ DEFINE_ENTRANCE(ENTR_GANONS_TOWER_COLLAPSE_EXTERIOR_7_2, SCENE_GANONS_TOWER_COLLAPSE_EXTERIOR, 7, true, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x527 */ DEFINE_ENTRANCE(ENTR_GANONS_TOWER_COLLAPSE_EXTERIOR_7_3, SCENE_GANONS_TOWER_COLLAPSE_EXTERIOR, 7, true, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) + +/* 0x528 */ DEFINE_ENTRANCE(ENTR_BOMBCHU_SHOP_1, SCENE_BOMBCHU_SHOP, 1, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x529 */ DEFINE_ENTRANCE(ENTR_BOMBCHU_SHOP_1_1, SCENE_BOMBCHU_SHOP, 1, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x52A */ DEFINE_ENTRANCE(ENTR_BOMBCHU_SHOP_1_2, SCENE_BOMBCHU_SHOP, 1, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x52B */ DEFINE_ENTRANCE(ENTR_BOMBCHU_SHOP_1_3, SCENE_BOMBCHU_SHOP, 1, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) + +/* 0x52C */ DEFINE_ENTRANCE(ENTR_BAZAAR_1, SCENE_BAZAAR, 1, false, true, TRANS_TYPE_FADE_BLACK_FAST, TRANS_TYPE_CIRCLE(TCA_NORMAL, TCC_BLACK, TCS_FAST)) +/* 0x52D */ DEFINE_ENTRANCE(ENTR_BAZAAR_1_1, SCENE_BAZAAR, 1, false, true, TRANS_TYPE_FADE_BLACK_FAST, TRANS_TYPE_CIRCLE(TCA_NORMAL, TCC_BLACK, TCS_FAST)) +/* 0x52E */ DEFINE_ENTRANCE(ENTR_BAZAAR_1_2, SCENE_BAZAAR, 1, false, true, TRANS_TYPE_FADE_BLACK_FAST, TRANS_TYPE_CIRCLE(TCA_NORMAL, TCC_BLACK, TCS_FAST)) +/* 0x52F */ DEFINE_ENTRANCE(ENTR_BAZAAR_1_3, SCENE_BAZAAR, 1, false, true, TRANS_TYPE_FADE_BLACK_FAST, TRANS_TYPE_CIRCLE(TCA_NORMAL, TCC_BLACK, TCS_FAST)) + +/* 0x530 */ DEFINE_ENTRANCE(ENTR_HAPPY_MASK_SHOP_0, SCENE_HAPPY_MASK_SHOP, 0, false, true, TRANS_TYPE_FADE_BLACK_FAST, TRANS_TYPE_CIRCLE(TCA_NORMAL, TCC_BLACK, TCS_FAST)) +/* 0x531 */ DEFINE_ENTRANCE(ENTR_HAPPY_MASK_SHOP_0_1, SCENE_HAPPY_MASK_SHOP, 0, false, true, TRANS_TYPE_FADE_BLACK_FAST, TRANS_TYPE_CIRCLE(TCA_NORMAL, TCC_BLACK, TCS_FAST)) +/* 0x532 */ DEFINE_ENTRANCE(ENTR_HAPPY_MASK_SHOP_0_2, SCENE_HAPPY_MASK_SHOP, 0, false, true, TRANS_TYPE_FADE_BLACK_FAST, TRANS_TYPE_CIRCLE(TCA_NORMAL, TCC_BLACK, TCS_FAST)) +/* 0x533 */ DEFINE_ENTRANCE(ENTR_HAPPY_MASK_SHOP_0_3, SCENE_HAPPY_MASK_SHOP, 0, false, true, TRANS_TYPE_FADE_BLACK_FAST, TRANS_TYPE_CIRCLE(TCA_NORMAL, TCC_BLACK, TCS_FAST)) + +/* 0x534 */ DEFINE_ENTRANCE(ENTR_INSIDE_GANONS_CASTLE_1, SCENE_INSIDE_GANONS_CASTLE, 1, false, false, TRANS_TYPE_FADE_BLACK_FAST, TRANS_TYPE_FADE_BLACK) +/* 0x535 */ DEFINE_ENTRANCE(ENTR_INSIDE_GANONS_CASTLE_1_1, SCENE_INSIDE_GANONS_CASTLE, 1, false, false, TRANS_TYPE_FADE_BLACK_FAST, TRANS_TYPE_FADE_BLACK) +/* 0x536 */ DEFINE_ENTRANCE(ENTR_INSIDE_GANONS_CASTLE_1_2, SCENE_INSIDE_GANONS_CASTLE, 1, false, false, TRANS_TYPE_FADE_BLACK_FAST, TRANS_TYPE_FADE_BLACK) +/* 0x537 */ DEFINE_ENTRANCE(ENTR_INSIDE_GANONS_CASTLE_1_3, SCENE_INSIDE_GANONS_CASTLE, 1, false, false, TRANS_TYPE_FADE_BLACK_FAST, TRANS_TYPE_FADE_BLACK) + +/* 0x538 */ DEFINE_ENTRANCE(ENTR_INSIDE_GANONS_CASTLE_2, SCENE_INSIDE_GANONS_CASTLE, 2, false, true, TRANS_TYPE_FADE_BLACK_FAST, TRANS_TYPE_FADE_BLACK) +/* 0x539 */ DEFINE_ENTRANCE(ENTR_INSIDE_GANONS_CASTLE_2_1, SCENE_INSIDE_GANONS_CASTLE, 2, false, true, TRANS_TYPE_FADE_BLACK_FAST, TRANS_TYPE_FADE_BLACK) +/* 0x53A */ DEFINE_ENTRANCE(ENTR_INSIDE_GANONS_CASTLE_2_2, SCENE_INSIDE_GANONS_CASTLE, 2, false, true, TRANS_TYPE_FADE_BLACK_FAST, TRANS_TYPE_FADE_BLACK) +/* 0x53B */ DEFINE_ENTRANCE(ENTR_INSIDE_GANONS_CASTLE_2_3, SCENE_INSIDE_GANONS_CASTLE, 2, false, true, TRANS_TYPE_FADE_BLACK_FAST, TRANS_TYPE_FADE_BLACK) + +/* 0x53C */ DEFINE_ENTRANCE(ENTR_INSIDE_GANONS_CASTLE_3, SCENE_INSIDE_GANONS_CASTLE, 3, false, true, TRANS_TYPE_FADE_BLACK_FAST, TRANS_TYPE_FADE_BLACK) +/* 0x53D */ DEFINE_ENTRANCE(ENTR_INSIDE_GANONS_CASTLE_3_1, SCENE_INSIDE_GANONS_CASTLE, 3, false, true, TRANS_TYPE_FADE_BLACK_FAST, TRANS_TYPE_FADE_BLACK) +/* 0x53E */ DEFINE_ENTRANCE(ENTR_INSIDE_GANONS_CASTLE_3_2, SCENE_INSIDE_GANONS_CASTLE, 3, false, true, TRANS_TYPE_FADE_BLACK_FAST, TRANS_TYPE_FADE_BLACK) +/* 0x53F */ DEFINE_ENTRANCE(ENTR_INSIDE_GANONS_CASTLE_3_3, SCENE_INSIDE_GANONS_CASTLE, 3, false, true, TRANS_TYPE_FADE_BLACK_FAST, TRANS_TYPE_FADE_BLACK) + +/* 0x540 */ DEFINE_ENTRANCE(ENTR_INSIDE_GANONS_CASTLE_4, SCENE_INSIDE_GANONS_CASTLE, 4, false, true, TRANS_TYPE_FADE_BLACK_FAST, TRANS_TYPE_FADE_BLACK) +/* 0x541 */ DEFINE_ENTRANCE(ENTR_INSIDE_GANONS_CASTLE_4_1, SCENE_INSIDE_GANONS_CASTLE, 4, false, true, TRANS_TYPE_FADE_BLACK_FAST, TRANS_TYPE_FADE_BLACK) +/* 0x542 */ DEFINE_ENTRANCE(ENTR_INSIDE_GANONS_CASTLE_4_2, SCENE_INSIDE_GANONS_CASTLE, 4, false, true, TRANS_TYPE_FADE_BLACK_FAST, TRANS_TYPE_FADE_BLACK) +/* 0x543 */ DEFINE_ENTRANCE(ENTR_INSIDE_GANONS_CASTLE_4_3, SCENE_INSIDE_GANONS_CASTLE, 4, false, true, TRANS_TYPE_FADE_BLACK_FAST, TRANS_TYPE_FADE_BLACK) + +/* 0x544 */ DEFINE_ENTRANCE(ENTR_INSIDE_GANONS_CASTLE_5, SCENE_INSIDE_GANONS_CASTLE, 5, false, true, TRANS_TYPE_FADE_BLACK_FAST, TRANS_TYPE_FADE_BLACK) +/* 0x545 */ DEFINE_ENTRANCE(ENTR_INSIDE_GANONS_CASTLE_5_1, SCENE_INSIDE_GANONS_CASTLE, 5, false, true, TRANS_TYPE_FADE_BLACK_FAST, TRANS_TYPE_FADE_BLACK) +/* 0x546 */ DEFINE_ENTRANCE(ENTR_INSIDE_GANONS_CASTLE_5_2, SCENE_INSIDE_GANONS_CASTLE, 5, false, true, TRANS_TYPE_FADE_BLACK_FAST, TRANS_TYPE_FADE_BLACK) +/* 0x547 */ DEFINE_ENTRANCE(ENTR_INSIDE_GANONS_CASTLE_5_3, SCENE_INSIDE_GANONS_CASTLE, 5, false, true, TRANS_TYPE_FADE_BLACK_FAST, TRANS_TYPE_FADE_BLACK) + +/* 0x548 */ DEFINE_ENTRANCE(ENTR_INSIDE_GANONS_CASTLE_6, SCENE_INSIDE_GANONS_CASTLE, 6, false, true, TRANS_TYPE_FADE_BLACK_FAST, TRANS_TYPE_FADE_BLACK) +/* 0x549 */ DEFINE_ENTRANCE(ENTR_INSIDE_GANONS_CASTLE_6_1, SCENE_INSIDE_GANONS_CASTLE, 6, false, true, TRANS_TYPE_FADE_BLACK_FAST, TRANS_TYPE_FADE_BLACK) +/* 0x54A */ DEFINE_ENTRANCE(ENTR_INSIDE_GANONS_CASTLE_6_2, SCENE_INSIDE_GANONS_CASTLE, 6, false, true, TRANS_TYPE_FADE_BLACK_FAST, TRANS_TYPE_FADE_BLACK) +/* 0x54B */ DEFINE_ENTRANCE(ENTR_INSIDE_GANONS_CASTLE_6_3, SCENE_INSIDE_GANONS_CASTLE, 6, false, true, TRANS_TYPE_FADE_BLACK_FAST, TRANS_TYPE_FADE_BLACK) + +/* 0x54C */ DEFINE_ENTRANCE(ENTR_INSIDE_GANONS_CASTLE_7, SCENE_INSIDE_GANONS_CASTLE, 7, false, true, TRANS_TYPE_FADE_BLACK_FAST, TRANS_TYPE_FADE_BLACK) +/* 0x54D */ DEFINE_ENTRANCE(ENTR_INSIDE_GANONS_CASTLE_7_1, SCENE_INSIDE_GANONS_CASTLE, 7, false, true, TRANS_TYPE_FADE_BLACK_FAST, TRANS_TYPE_FADE_BLACK) +/* 0x54E */ DEFINE_ENTRANCE(ENTR_INSIDE_GANONS_CASTLE_7_2, SCENE_INSIDE_GANONS_CASTLE, 7, false, true, TRANS_TYPE_FADE_BLACK_FAST, TRANS_TYPE_FADE_BLACK) +/* 0x54F */ DEFINE_ENTRANCE(ENTR_INSIDE_GANONS_CASTLE_7_3, SCENE_INSIDE_GANONS_CASTLE, 7, false, true, TRANS_TYPE_FADE_BLACK_FAST, TRANS_TYPE_FADE_BLACK) + +/* 0x550 */ DEFINE_ENTRANCE(ENTR_HOUSE_OF_SKULLTULA_0, SCENE_HOUSE_OF_SKULLTULA, 0, false, true, TRANS_TYPE_FADE_BLACK_FAST, TRANS_TYPE_CIRCLE(TCA_NORMAL, TCC_BLACK, TCS_FAST)) +/* 0x551 */ DEFINE_ENTRANCE(ENTR_HOUSE_OF_SKULLTULA_0_1, SCENE_HOUSE_OF_SKULLTULA, 0, false, true, TRANS_TYPE_FADE_BLACK_FAST, TRANS_TYPE_CIRCLE(TCA_NORMAL, TCC_BLACK, TCS_FAST)) +/* 0x552 */ DEFINE_ENTRANCE(ENTR_HOUSE_OF_SKULLTULA_0_2, SCENE_HOUSE_OF_SKULLTULA, 0, false, true, TRANS_TYPE_FADE_BLACK_FAST, TRANS_TYPE_CIRCLE(TCA_NORMAL, TCC_BLACK, TCS_FAST)) +/* 0x553 */ DEFINE_ENTRANCE(ENTR_HOUSE_OF_SKULLTULA_0_3, SCENE_HOUSE_OF_SKULLTULA, 0, false, true, TRANS_TYPE_FADE_BLACK_FAST, TRANS_TYPE_CIRCLE(TCA_NORMAL, TCC_BLACK, TCS_FAST)) + +/* 0x554 */ DEFINE_ENTRANCE(ENTR_KAKARIKO_VILLAGE_14, SCENE_KAKARIKO_VILLAGE, 14, false, true, TRANS_TYPE_FADE_WHITE, TRANS_TYPE_FADE_WHITE) +/* 0x555 */ DEFINE_ENTRANCE(ENTR_KAKARIKO_VILLAGE_14_1, SCENE_KAKARIKO_VILLAGE, 14, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x556 */ DEFINE_ENTRANCE(ENTR_KAKARIKO_VILLAGE_14_2, SCENE_KAKARIKO_VILLAGE, 14, false, true, TRANS_TYPE_FADE_WHITE, TRANS_TYPE_FADE_WHITE) +/* 0x557 */ DEFINE_ENTRANCE(ENTR_KAKARIKO_VILLAGE_14_3, SCENE_KAKARIKO_VILLAGE, 14, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) + +/* 0x558 */ DEFINE_ENTRANCE(ENTR_LON_LON_RANCH_8, SCENE_LON_LON_RANCH, 8, false, false, TRANS_TYPE_CIRCLE(TCA_NORMAL, TCC_BLACK, TCS_FAST), TRANS_TYPE_CIRCLE(TCA_NORMAL, TCC_BLACK, TCS_FAST)) +/* 0x559 */ DEFINE_ENTRANCE(ENTR_LON_LON_RANCH_8_1, SCENE_LON_LON_RANCH, 8, false, false, TRANS_TYPE_CIRCLE(TCA_NORMAL, TCC_BLACK, TCS_FAST), TRANS_TYPE_CIRCLE(TCA_NORMAL, TCC_BLACK, TCS_FAST)) +/* 0x55A */ DEFINE_ENTRANCE(ENTR_LON_LON_RANCH_8_2, SCENE_LON_LON_RANCH, 8, false, false, TRANS_TYPE_CIRCLE(TCA_NORMAL, TCC_BLACK, TCS_FAST), TRANS_TYPE_CIRCLE(TCA_NORMAL, TCC_BLACK, TCS_FAST)) +/* 0x55B */ DEFINE_ENTRANCE(ENTR_LON_LON_RANCH_8_3, SCENE_LON_LON_RANCH, 8, false, false, TRANS_TYPE_CIRCLE(TCA_NORMAL, TCC_BLACK, TCS_FAST), TRANS_TYPE_CIRCLE(TCA_NORMAL, TCC_BLACK, TCS_FAST)) + +/* 0x55C */ DEFINE_ENTRANCE(ENTR_LON_LON_RANCH_9, SCENE_LON_LON_RANCH, 9, false, false, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x55D */ DEFINE_ENTRANCE(ENTR_LON_LON_RANCH_9_1, SCENE_LON_LON_RANCH, 9, false, false, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x55E */ DEFINE_ENTRANCE(ENTR_LON_LON_RANCH_9_2, SCENE_LON_LON_RANCH, 9, false, false, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x55F */ DEFINE_ENTRANCE(ENTR_LON_LON_RANCH_9_3, SCENE_LON_LON_RANCH, 9, false, false, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) + +/* 0x560 */ DEFINE_ENTRANCE(ENTR_LAKE_HYLIA_7, SCENE_LAKE_HYLIA, 7, false, true, TRANS_TYPE_CIRCLE(TCA_RIPPLE, TCC_WHITE, TCS_FAST), TRANS_TYPE_CIRCLE(TCA_RIPPLE, TCC_WHITE, TCS_FAST)) +/* 0x561 */ DEFINE_ENTRANCE(ENTR_LAKE_HYLIA_7_1, SCENE_LAKE_HYLIA, 7, false, true, TRANS_TYPE_CIRCLE(TCA_RIPPLE, TCC_WHITE, TCS_FAST), TRANS_TYPE_CIRCLE(TCA_RIPPLE, TCC_WHITE, TCS_FAST)) +/* 0x562 */ DEFINE_ENTRANCE(ENTR_LAKE_HYLIA_7_2, SCENE_LAKE_HYLIA, 7, false, true, TRANS_TYPE_CIRCLE(TCA_RIPPLE, TCC_WHITE, TCS_FAST), TRANS_TYPE_CIRCLE(TCA_RIPPLE, TCC_WHITE, TCS_FAST)) +/* 0x563 */ DEFINE_ENTRANCE(ENTR_LAKE_HYLIA_7_3, SCENE_LAKE_HYLIA, 7, false, true, TRANS_TYPE_CIRCLE(TCA_RIPPLE, TCC_WHITE, TCS_FAST), TRANS_TYPE_CIRCLE(TCA_RIPPLE, TCC_WHITE, TCS_FAST)) + +/* 0x564 */ DEFINE_ENTRANCE(ENTR_DEATH_MOUNTAIN_CRATER_5, SCENE_DEATH_MOUNTAIN_CRATER, 5, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x565 */ DEFINE_ENTRANCE(ENTR_DEATH_MOUNTAIN_CRATER_5_1, SCENE_DEATH_MOUNTAIN_CRATER, 5, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x566 */ DEFINE_ENTRANCE(ENTR_DEATH_MOUNTAIN_CRATER_5_2, SCENE_DEATH_MOUNTAIN_CRATER, 5, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x567 */ DEFINE_ENTRANCE(ENTR_DEATH_MOUNTAIN_CRATER_5_3, SCENE_DEATH_MOUNTAIN_CRATER, 5, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) + +/* 0x568 */ DEFINE_ENTRANCE(ENTR_GRAVEYARD_7, SCENE_GRAVEYARD, 7, false, true, TRANS_TYPE_FADE_WHITE, TRANS_TYPE_FADE_WHITE) +/* 0x569 */ DEFINE_ENTRANCE(ENTR_GRAVEYARD_7_1, SCENE_GRAVEYARD, 7, false, true, TRANS_TYPE_FADE_WHITE, TRANS_TYPE_FADE_WHITE) +/* 0x56A */ DEFINE_ENTRANCE(ENTR_GRAVEYARD_7_2, SCENE_GRAVEYARD, 7, false, true, TRANS_TYPE_FADE_WHITE, TRANS_TYPE_FADE_WHITE) +/* 0x56B */ DEFINE_ENTRANCE(ENTR_GRAVEYARD_7_3, SCENE_GRAVEYARD, 7, false, true, TRANS_TYPE_FADE_WHITE, TRANS_TYPE_FADE_WHITE) + +/* 0x56C */ DEFINE_ENTRANCE(ENTR_INSIDE_GANONS_CASTLE_COLLAPSE_0, SCENE_INSIDE_GANONS_CASTLE_COLLAPSE, 0, true, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x56D */ DEFINE_ENTRANCE(ENTR_INSIDE_GANONS_CASTLE_COLLAPSE_0_1, SCENE_INSIDE_GANONS_CASTLE_COLLAPSE, 0, true, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x56E */ DEFINE_ENTRANCE(ENTR_INSIDE_GANONS_CASTLE_COLLAPSE_0_2, SCENE_INSIDE_GANONS_CASTLE_COLLAPSE, 0, true, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x56F */ DEFINE_ENTRANCE(ENTR_INSIDE_GANONS_CASTLE_COLLAPSE_0_3, SCENE_INSIDE_GANONS_CASTLE_COLLAPSE, 0, true, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) + +/* 0x570 */ DEFINE_ENTRANCE(ENTR_THIEVES_HIDEOUT_12, SCENE_THIEVES_HIDEOUT, 12, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x571 */ DEFINE_ENTRANCE(ENTR_THIEVES_HIDEOUT_12_1, SCENE_THIEVES_HIDEOUT, 12, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x572 */ DEFINE_ENTRANCE(ENTR_THIEVES_HIDEOUT_12_2, SCENE_THIEVES_HIDEOUT, 12, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x573 */ DEFINE_ENTRANCE(ENTR_THIEVES_HIDEOUT_12_3, SCENE_THIEVES_HIDEOUT, 12, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) + +/* 0x574 */ DEFINE_ENTRANCE(ENTR_ROYAL_FAMILYS_TOMB_1, SCENE_ROYAL_FAMILYS_TOMB, 1, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x575 */ DEFINE_ENTRANCE(ENTR_ROYAL_FAMILYS_TOMB_1_1, SCENE_ROYAL_FAMILYS_TOMB, 1, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x576 */ DEFINE_ENTRANCE(ENTR_ROYAL_FAMILYS_TOMB_1_2, SCENE_ROYAL_FAMILYS_TOMB, 1, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x577 */ DEFINE_ENTRANCE(ENTR_ROYAL_FAMILYS_TOMB_1_3, SCENE_ROYAL_FAMILYS_TOMB, 1, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) + +/* 0x578 */ DEFINE_ENTRANCE(ENTR_GREAT_FAIRYS_FOUNTAIN_SPELLS_1, SCENE_GREAT_FAIRYS_FOUNTAIN_SPELLS, 1, false, true, TRANS_TYPE_FADE_BLACK_FAST, TRANS_TYPE_FADE_BLACK_FAST) +/* 0x579 */ DEFINE_ENTRANCE(ENTR_GREAT_FAIRYS_FOUNTAIN_SPELLS_1_1, SCENE_GREAT_FAIRYS_FOUNTAIN_SPELLS, 1, false, true, TRANS_TYPE_FADE_BLACK_FAST, TRANS_TYPE_FADE_BLACK_FAST) +/* 0x57A */ DEFINE_ENTRANCE(ENTR_GREAT_FAIRYS_FOUNTAIN_SPELLS_1_2, SCENE_GREAT_FAIRYS_FOUNTAIN_SPELLS, 1, false, true, TRANS_TYPE_FADE_BLACK_FAST, TRANS_TYPE_FADE_BLACK_FAST) +/* 0x57B */ DEFINE_ENTRANCE(ENTR_GREAT_FAIRYS_FOUNTAIN_SPELLS_1_3, SCENE_GREAT_FAIRYS_FOUNTAIN_SPELLS, 1, false, true, TRANS_TYPE_FADE_BLACK_FAST, TRANS_TYPE_FADE_BLACK_FAST) + +/* 0x57C */ DEFINE_ENTRANCE(ENTR_DESERT_COLOSSUS_7, SCENE_DESERT_COLOSSUS, 7, false, true, TRANS_TYPE_FADE_WHITE, TRANS_TYPE_FADE_WHITE) +/* 0x57D */ DEFINE_ENTRANCE(ENTR_DESERT_COLOSSUS_7_1, SCENE_DESERT_COLOSSUS, 7, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x57E */ DEFINE_ENTRANCE(ENTR_DESERT_COLOSSUS_7_2, SCENE_DESERT_COLOSSUS, 7, false, true, TRANS_TYPE_FADE_WHITE, TRANS_TYPE_FADE_WHITE) +/* 0x57F */ DEFINE_ENTRANCE(ENTR_DESERT_COLOSSUS_7_3, SCENE_DESERT_COLOSSUS, 7, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) + +/* 0x580 */ DEFINE_ENTRANCE(ENTR_GRAVEYARD_8, SCENE_GRAVEYARD, 8, false, true, TRANS_TYPE_FADE_WHITE, TRANS_TYPE_FADE_WHITE) +/* 0x581 */ DEFINE_ENTRANCE(ENTR_GRAVEYARD_8_1, SCENE_GRAVEYARD, 8, false, true, TRANS_TYPE_FADE_WHITE, TRANS_TYPE_FADE_WHITE) +/* 0x582 */ DEFINE_ENTRANCE(ENTR_GRAVEYARD_8_2, SCENE_GRAVEYARD, 8, false, true, TRANS_TYPE_FADE_WHITE, TRANS_TYPE_FADE_WHITE) +/* 0x583 */ DEFINE_ENTRANCE(ENTR_GRAVEYARD_8_3, SCENE_GRAVEYARD, 8, false, true, TRANS_TYPE_FADE_WHITE, TRANS_TYPE_FADE_WHITE) + +/* 0x584 */ DEFINE_ENTRANCE(ENTR_FOREST_TEMPLE_2, SCENE_FOREST_TEMPLE, 2, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x585 */ DEFINE_ENTRANCE(ENTR_FOREST_TEMPLE_2_1, SCENE_FOREST_TEMPLE, 2, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x586 */ DEFINE_ENTRANCE(ENTR_FOREST_TEMPLE_2_2, SCENE_FOREST_TEMPLE, 2, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x587 */ DEFINE_ENTRANCE(ENTR_FOREST_TEMPLE_2_3, SCENE_FOREST_TEMPLE, 2, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) + +/* 0x588 */ DEFINE_ENTRANCE(ENTR_GREAT_FAIRYS_FOUNTAIN_SPELLS_2, SCENE_GREAT_FAIRYS_FOUNTAIN_SPELLS, 2, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x589 */ DEFINE_ENTRANCE(ENTR_GREAT_FAIRYS_FOUNTAIN_SPELLS_2_1, SCENE_GREAT_FAIRYS_FOUNTAIN_SPELLS, 2, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x58A */ DEFINE_ENTRANCE(ENTR_GREAT_FAIRYS_FOUNTAIN_SPELLS_2_2, SCENE_GREAT_FAIRYS_FOUNTAIN_SPELLS, 2, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x58B */ DEFINE_ENTRANCE(ENTR_GREAT_FAIRYS_FOUNTAIN_SPELLS_2_3, SCENE_GREAT_FAIRYS_FOUNTAIN_SPELLS, 2, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) + +/* 0x58C */ DEFINE_ENTRANCE(ENTR_TEMPLE_OF_TIME_5, SCENE_TEMPLE_OF_TIME, 5, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x58D */ DEFINE_ENTRANCE(ENTR_TEMPLE_OF_TIME_5_1, SCENE_TEMPLE_OF_TIME, 5, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x58E */ DEFINE_ENTRANCE(ENTR_TEMPLE_OF_TIME_5_2, SCENE_TEMPLE_OF_TIME, 5, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x58F */ DEFINE_ENTRANCE(ENTR_TEMPLE_OF_TIME_5_3, SCENE_TEMPLE_OF_TIME, 5, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) + +/* 0x590 */ DEFINE_ENTRANCE(ENTR_TEMPLE_OF_TIME_6, SCENE_TEMPLE_OF_TIME, 6, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x591 */ DEFINE_ENTRANCE(ENTR_TEMPLE_OF_TIME_6_1, SCENE_TEMPLE_OF_TIME, 6, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x592 */ DEFINE_ENTRANCE(ENTR_TEMPLE_OF_TIME_6_2, SCENE_TEMPLE_OF_TIME, 6, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x593 */ DEFINE_ENTRANCE(ENTR_TEMPLE_OF_TIME_6_3, SCENE_TEMPLE_OF_TIME, 6, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) + +/* 0x594 */ DEFINE_ENTRANCE(ENTR_HYRULE_FIELD_17, SCENE_HYRULE_FIELD, 17, false, true, TRANS_TYPE_FADE_WHITE, TRANS_TYPE_FADE_WHITE) +/* 0x595 */ DEFINE_ENTRANCE(ENTR_HYRULE_FIELD_17_1, SCENE_HYRULE_FIELD, 17, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x596 */ DEFINE_ENTRANCE(ENTR_HYRULE_FIELD_17_2, SCENE_HYRULE_FIELD, 17, false, true, TRANS_TYPE_FADE_WHITE, TRANS_TYPE_FADE_WHITE) +/* 0x597 */ DEFINE_ENTRANCE(ENTR_HYRULE_FIELD_17_3, SCENE_HYRULE_FIELD, 17, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) + +/* 0x598 */ DEFINE_ENTRANCE(ENTR_GROTTOS_1, SCENE_GROTTOS, 1, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x599 */ DEFINE_ENTRANCE(ENTR_GROTTOS_1_1, SCENE_GROTTOS, 1, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x59A */ DEFINE_ENTRANCE(ENTR_GROTTOS_1_2, SCENE_GROTTOS, 1, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x59B */ DEFINE_ENTRANCE(ENTR_GROTTOS_1_3, SCENE_GROTTOS, 1, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) + +/* 0x59C */ DEFINE_ENTRANCE(ENTR_GROTTOS_2, SCENE_GROTTOS, 2, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x59D */ DEFINE_ENTRANCE(ENTR_GROTTOS_2_1, SCENE_GROTTOS, 2, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x59E */ DEFINE_ENTRANCE(ENTR_GROTTOS_2_2, SCENE_GROTTOS, 2, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x59F */ DEFINE_ENTRANCE(ENTR_GROTTOS_2_3, SCENE_GROTTOS, 2, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) + +/* 0x5A0 */ DEFINE_ENTRANCE(ENTR_GROTTOS_3, SCENE_GROTTOS, 3, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x5A1 */ DEFINE_ENTRANCE(ENTR_GROTTOS_3_1, SCENE_GROTTOS, 3, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x5A2 */ DEFINE_ENTRANCE(ENTR_GROTTOS_3_2, SCENE_GROTTOS, 3, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x5A3 */ DEFINE_ENTRANCE(ENTR_GROTTOS_3_3, SCENE_GROTTOS, 3, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) + +/* 0x5A4 */ DEFINE_ENTRANCE(ENTR_GROTTOS_4, SCENE_GROTTOS, 4, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x5A5 */ DEFINE_ENTRANCE(ENTR_GROTTOS_4_1, SCENE_GROTTOS, 4, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x5A6 */ DEFINE_ENTRANCE(ENTR_GROTTOS_4_2, SCENE_GROTTOS, 4, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x5A7 */ DEFINE_ENTRANCE(ENTR_GROTTOS_4_3, SCENE_GROTTOS, 4, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) + +/* 0x5A8 */ DEFINE_ENTRANCE(ENTR_GROTTOS_5, SCENE_GROTTOS, 5, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_WHITE) +/* 0x5A9 */ DEFINE_ENTRANCE(ENTR_GROTTOS_5_1, SCENE_GROTTOS, 5, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_WHITE) +/* 0x5AA */ DEFINE_ENTRANCE(ENTR_GROTTOS_5_2, SCENE_GROTTOS, 5, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_WHITE) +/* 0x5AB */ DEFINE_ENTRANCE(ENTR_GROTTOS_5_3, SCENE_GROTTOS, 5, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_WHITE) + +/* 0x5AC */ DEFINE_ENTRANCE(ENTR_GROTTOS_6, SCENE_GROTTOS, 6, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x5AD */ DEFINE_ENTRANCE(ENTR_GROTTOS_6_1, SCENE_GROTTOS, 6, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x5AE */ DEFINE_ENTRANCE(ENTR_GROTTOS_6_2, SCENE_GROTTOS, 6, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x5AF */ DEFINE_ENTRANCE(ENTR_GROTTOS_6_3, SCENE_GROTTOS, 6, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) + +/* 0x5B0 */ DEFINE_ENTRANCE(ENTR_GROTTOS_7, SCENE_GROTTOS, 7, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x5B1 */ DEFINE_ENTRANCE(ENTR_GROTTOS_7_1, SCENE_GROTTOS, 7, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x5B2 */ DEFINE_ENTRANCE(ENTR_GROTTOS_7_2, SCENE_GROTTOS, 7, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x5B3 */ DEFINE_ENTRANCE(ENTR_GROTTOS_7_3, SCENE_GROTTOS, 7, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) + +/* 0x5B4 */ DEFINE_ENTRANCE(ENTR_GROTTOS_8, SCENE_GROTTOS, 8, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x5B5 */ DEFINE_ENTRANCE(ENTR_GROTTOS_8_1, SCENE_GROTTOS, 8, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x5B6 */ DEFINE_ENTRANCE(ENTR_GROTTOS_8_2, SCENE_GROTTOS, 8, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x5B7 */ DEFINE_ENTRANCE(ENTR_GROTTOS_8_3, SCENE_GROTTOS, 8, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) + +/* 0x5B8 */ DEFINE_ENTRANCE(ENTR_GROTTOS_9, SCENE_GROTTOS, 9, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x5B9 */ DEFINE_ENTRANCE(ENTR_GROTTOS_9_1, SCENE_GROTTOS, 9, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x5BA */ DEFINE_ENTRANCE(ENTR_GROTTOS_9_2, SCENE_GROTTOS, 9, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x5BB */ DEFINE_ENTRANCE(ENTR_GROTTOS_9_3, SCENE_GROTTOS, 9, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) + +/* 0x5BC */ DEFINE_ENTRANCE(ENTR_GROTTOS_10, SCENE_GROTTOS, 10, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x5BD */ DEFINE_ENTRANCE(ENTR_GROTTOS_10_1, SCENE_GROTTOS, 10, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x5BE */ DEFINE_ENTRANCE(ENTR_GROTTOS_10_2, SCENE_GROTTOS, 10, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x5BF */ DEFINE_ENTRANCE(ENTR_GROTTOS_10_3, SCENE_GROTTOS, 10, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) + +/* 0x5C0 */ DEFINE_ENTRANCE(ENTR_GROTTOS_11, SCENE_GROTTOS, 11, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x5C1 */ DEFINE_ENTRANCE(ENTR_GROTTOS_11_1, SCENE_GROTTOS, 11, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x5C2 */ DEFINE_ENTRANCE(ENTR_GROTTOS_11_2, SCENE_GROTTOS, 11, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x5C3 */ DEFINE_ENTRANCE(ENTR_GROTTOS_11_3, SCENE_GROTTOS, 11, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) + +/* 0x5C4 */ DEFINE_ENTRANCE(ENTR_GROTTOS_12, SCENE_GROTTOS, 12, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x5C5 */ DEFINE_ENTRANCE(ENTR_GROTTOS_12_1, SCENE_GROTTOS, 12, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x5C6 */ DEFINE_ENTRANCE(ENTR_GROTTOS_12_2, SCENE_GROTTOS, 12, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x5C7 */ DEFINE_ENTRANCE(ENTR_GROTTOS_12_3, SCENE_GROTTOS, 12, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) + +/* 0x5C8 */ DEFINE_ENTRANCE(ENTR_IMPAS_HOUSE_1, SCENE_IMPAS_HOUSE, 1, false, true, TRANS_TYPE_FADE_BLACK_FAST, TRANS_TYPE_CIRCLE(TCA_NORMAL, TCC_BLACK, TCS_FAST)) +/* 0x5C9 */ DEFINE_ENTRANCE(ENTR_IMPAS_HOUSE_1_1, SCENE_IMPAS_HOUSE, 1, false, true, TRANS_TYPE_FADE_BLACK_FAST, TRANS_TYPE_CIRCLE(TCA_NORMAL, TCC_BLACK, TCS_FAST)) +/* 0x5CA */ DEFINE_ENTRANCE(ENTR_IMPAS_HOUSE_1_2, SCENE_IMPAS_HOUSE, 1, false, true, TRANS_TYPE_FADE_BLACK_FAST, TRANS_TYPE_CIRCLE(TCA_NORMAL, TCC_BLACK, TCS_FAST)) +/* 0x5CB */ DEFINE_ENTRANCE(ENTR_IMPAS_HOUSE_1_3, SCENE_IMPAS_HOUSE, 1, false, true, TRANS_TYPE_FADE_BLACK_FAST, TRANS_TYPE_CIRCLE(TCA_NORMAL, TCC_BLACK, TCS_FAST)) + +/* 0x5CC */ DEFINE_ENTRANCE(ENTR_BOTTOM_OF_THE_WELL_1, SCENE_BOTTOM_OF_THE_WELL, 1, false, true, TRANS_TYPE_FADE_BLACK_FAST, TRANS_TYPE_FADE_BLACK_FAST) +/* 0x5CD */ DEFINE_ENTRANCE(ENTR_BOTTOM_OF_THE_WELL_1_1, SCENE_BOTTOM_OF_THE_WELL, 1, false, true, TRANS_TYPE_FADE_BLACK_FAST, TRANS_TYPE_FADE_BLACK_FAST) +/* 0x5CE */ DEFINE_ENTRANCE(ENTR_BOTTOM_OF_THE_WELL_1_2, SCENE_BOTTOM_OF_THE_WELL, 1, false, true, TRANS_TYPE_FADE_BLACK_FAST, TRANS_TYPE_FADE_BLACK_FAST) +/* 0x5CF */ DEFINE_ENTRANCE(ENTR_BOTTOM_OF_THE_WELL_1_3, SCENE_BOTTOM_OF_THE_WELL, 1, false, true, TRANS_TYPE_FADE_BLACK_FAST, TRANS_TYPE_FADE_BLACK_FAST) + +/* 0x5D0 */ DEFINE_ENTRANCE(ENTR_LON_LON_BUILDINGS_1, SCENE_LON_LON_BUILDINGS, 1, false, true, TRANS_TYPE_FADE_BLACK_FAST, TRANS_TYPE_CIRCLE(TCA_NORMAL, TCC_BLACK, TCS_FAST)) +/* 0x5D1 */ DEFINE_ENTRANCE(ENTR_LON_LON_BUILDINGS_1_1, SCENE_LON_LON_BUILDINGS, 1, false, true, TRANS_TYPE_FADE_BLACK_FAST, TRANS_TYPE_CIRCLE(TCA_NORMAL, TCC_BLACK, TCS_FAST)) +/* 0x5D2 */ DEFINE_ENTRANCE(ENTR_LON_LON_BUILDINGS_1_2, SCENE_LON_LON_BUILDINGS, 1, false, true, TRANS_TYPE_FADE_BLACK_FAST, TRANS_TYPE_CIRCLE(TCA_NORMAL, TCC_BLACK, TCS_FAST)) +/* 0x5D3 */ DEFINE_ENTRANCE(ENTR_LON_LON_BUILDINGS_1_3, SCENE_LON_LON_BUILDINGS, 1, false, true, TRANS_TYPE_FADE_BLACK_FAST, TRANS_TYPE_CIRCLE(TCA_NORMAL, TCC_BLACK, TCS_FAST)) + +/* 0x5D4 */ DEFINE_ENTRANCE(ENTR_LON_LON_RANCH_10, SCENE_LON_LON_RANCH, 10, false, true, TRANS_TYPE_FADE_BLACK_FAST, TRANS_TYPE_FADE_BLACK) +/* 0x5D5 */ DEFINE_ENTRANCE(ENTR_LON_LON_RANCH_10_1, SCENE_LON_LON_RANCH, 10, false, true, TRANS_TYPE_FADE_BLACK_FAST, TRANS_TYPE_FADE_BLACK) +/* 0x5D6 */ DEFINE_ENTRANCE(ENTR_LON_LON_RANCH_10_2, SCENE_LON_LON_RANCH, 10, false, true, TRANS_TYPE_FADE_BLACK_FAST, TRANS_TYPE_FADE_BLACK) +/* 0x5D7 */ DEFINE_ENTRANCE(ENTR_LON_LON_RANCH_10_3, SCENE_LON_LON_RANCH, 10, false, true, TRANS_TYPE_FADE_BLACK_FAST, TRANS_TYPE_FADE_BLACK) + +/* 0x5D8 */ DEFINE_ENTRANCE(ENTR_ICE_CAVERN_1, SCENE_ICE_CAVERN, 1, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x5D9 */ DEFINE_ENTRANCE(ENTR_ICE_CAVERN_1_1, SCENE_ICE_CAVERN, 1, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x5DA */ DEFINE_ENTRANCE(ENTR_ICE_CAVERN_1_2, SCENE_ICE_CAVERN, 1, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x5DB */ DEFINE_ENTRANCE(ENTR_ICE_CAVERN_1_3, SCENE_ICE_CAVERN, 1, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) + +/* 0x5DC */ DEFINE_ENTRANCE(ENTR_KAKARIKO_VILLAGE_15, SCENE_KAKARIKO_VILLAGE, 15, false, true, TRANS_TYPE_FADE_WHITE, TRANS_TYPE_FADE_WHITE) +/* 0x5DD */ DEFINE_ENTRANCE(ENTR_KAKARIKO_VILLAGE_15_1, SCENE_KAKARIKO_VILLAGE, 15, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x5DE */ DEFINE_ENTRANCE(ENTR_KAKARIKO_VILLAGE_15_2, SCENE_KAKARIKO_VILLAGE, 15, false, true, TRANS_TYPE_FADE_WHITE, TRANS_TYPE_FADE_WHITE) +/* 0x5DF */ DEFINE_ENTRANCE(ENTR_KAKARIKO_VILLAGE_15_3, SCENE_KAKARIKO_VILLAGE, 15, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) + +/* 0x5E0 */ DEFINE_ENTRANCE(ENTR_LOST_WOODS_9, SCENE_LOST_WOODS, 9, false, false, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x5E1 */ DEFINE_ENTRANCE(ENTR_LOST_WOODS_9_1, SCENE_LOST_WOODS, 9, false, false, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x5E2 */ DEFINE_ENTRANCE(ENTR_LOST_WOODS_9_2, SCENE_LOST_WOODS, 9, false, false, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x5E3 */ DEFINE_ENTRANCE(ENTR_LOST_WOODS_9_3, SCENE_LOST_WOODS, 9, false, false, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) + +/* 0x5E4 */ DEFINE_ENTRANCE(ENTR_LON_LON_BUILDINGS_2, SCENE_LON_LON_BUILDINGS, 2, false, true, TRANS_TYPE_FADE_BLACK_FAST, TRANS_TYPE_CIRCLE(TCA_NORMAL, TCC_BLACK, TCS_FAST)) +/* 0x5E5 */ DEFINE_ENTRANCE(ENTR_LON_LON_BUILDINGS_2_1, SCENE_LON_LON_BUILDINGS, 2, false, true, TRANS_TYPE_FADE_BLACK_FAST, TRANS_TYPE_CIRCLE(TCA_NORMAL, TCC_BLACK, TCS_FAST)) +/* 0x5E6 */ DEFINE_ENTRANCE(ENTR_LON_LON_BUILDINGS_2_2, SCENE_LON_LON_BUILDINGS, 2, false, true, TRANS_TYPE_FADE_BLACK_FAST, TRANS_TYPE_CIRCLE(TCA_NORMAL, TCC_BLACK, TCS_FAST)) +/* 0x5E7 */ DEFINE_ENTRANCE(ENTR_LON_LON_BUILDINGS_2_3, SCENE_LON_LON_BUILDINGS, 2, false, true, TRANS_TYPE_FADE_BLACK_FAST, TRANS_TYPE_CIRCLE(TCA_NORMAL, TCC_BLACK, TCS_FAST)) + +/* 0x5E8 */ DEFINE_ENTRANCE(ENTR_KOKIRI_FOREST_12, SCENE_KOKIRI_FOREST, 12, false, true, TRANS_TYPE_FADE_BLACK_FAST, TRANS_TYPE_FADE_BLACK) +/* 0x5E9 */ DEFINE_ENTRANCE(ENTR_KOKIRI_FOREST_12_1, SCENE_KOKIRI_FOREST, 12, false, true, TRANS_TYPE_FADE_BLACK_FAST, TRANS_TYPE_FADE_BLACK) +/* 0x5EA */ DEFINE_ENTRANCE(ENTR_KOKIRI_FOREST_12_2, SCENE_KOKIRI_FOREST, 12, false, true, TRANS_TYPE_FADE_BLACK_FAST, TRANS_TYPE_FADE_BLACK) +/* 0x5EB */ DEFINE_ENTRANCE(ENTR_KOKIRI_FOREST_12_3, SCENE_KOKIRI_FOREST, 12, false, true, TRANS_TYPE_FADE_BLACK_FAST, TRANS_TYPE_FADE_BLACK) + +/* 0x5EC */ DEFINE_ENTRANCE(ENTR_SPIRIT_TEMPLE_BOSS_2, SCENE_SPIRIT_TEMPLE_BOSS, 2, true, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x5ED */ DEFINE_ENTRANCE(ENTR_SPIRIT_TEMPLE_BOSS_2_1, SCENE_SPIRIT_TEMPLE_BOSS, 2, true, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x5EE */ DEFINE_ENTRANCE(ENTR_SPIRIT_TEMPLE_BOSS_2_2, SCENE_SPIRIT_TEMPLE_BOSS, 2, true, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x5EF */ DEFINE_ENTRANCE(ENTR_SPIRIT_TEMPLE_BOSS_2_3, SCENE_SPIRIT_TEMPLE_BOSS, 2, true, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) + +/* 0x5F0 */ DEFINE_ENTRANCE(ENTR_CASTLE_COURTYARD_ZELDA_1, SCENE_CASTLE_COURTYARD_ZELDA, 1, false, false, TRANS_TYPE_FADE_WHITE, TRANS_TYPE_FADE_WHITE) +/* 0x5F1 */ DEFINE_ENTRANCE(ENTR_CASTLE_COURTYARD_ZELDA_1_1, SCENE_CASTLE_COURTYARD_ZELDA, 1, false, false, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x5F2 */ DEFINE_ENTRANCE(ENTR_CASTLE_COURTYARD_ZELDA_1_2, SCENE_CASTLE_COURTYARD_ZELDA, 1, false, false, TRANS_TYPE_FADE_WHITE, TRANS_TYPE_FADE_WHITE) +/* 0x5F3 */ DEFINE_ENTRANCE(ENTR_CASTLE_COURTYARD_ZELDA_1_3, SCENE_CASTLE_COURTYARD_ZELDA, 1, false, false, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) + +/* 0x5F4 */ DEFINE_ENTRANCE(ENTR_TEMPLE_OF_TIME_7, SCENE_TEMPLE_OF_TIME, 7, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x5F5 */ DEFINE_ENTRANCE(ENTR_TEMPLE_OF_TIME_7_1, SCENE_TEMPLE_OF_TIME, 7, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x5F6 */ DEFINE_ENTRANCE(ENTR_TEMPLE_OF_TIME_7_2, SCENE_TEMPLE_OF_TIME, 7, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x5F7 */ DEFINE_ENTRANCE(ENTR_TEMPLE_OF_TIME_7_3, SCENE_TEMPLE_OF_TIME, 7, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) + +/* 0x5F8 */ DEFINE_ENTRANCE(ENTR_GERUDOS_FORTRESS_18, SCENE_GERUDOS_FORTRESS, 18, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x5F9 */ DEFINE_ENTRANCE(ENTR_GERUDOS_FORTRESS_18_1, SCENE_GERUDOS_FORTRESS, 18, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x5FA */ DEFINE_ENTRANCE(ENTR_GERUDOS_FORTRESS_18_2, SCENE_GERUDOS_FORTRESS, 18, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x5FB */ DEFINE_ENTRANCE(ENTR_GERUDOS_FORTRESS_18_3, SCENE_GERUDOS_FORTRESS, 18, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) + +/* 0x5FC */ DEFINE_ENTRANCE(ENTR_GROTTOS_13, SCENE_GROTTOS, 13, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x5FD */ DEFINE_ENTRANCE(ENTR_GROTTOS_13_1, SCENE_GROTTOS, 13, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x5FE */ DEFINE_ENTRANCE(ENTR_GROTTOS_13_2, SCENE_GROTTOS, 13, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x5FF */ DEFINE_ENTRANCE(ENTR_GROTTOS_13_3, SCENE_GROTTOS, 13, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) + +/* 0x600 */ DEFINE_ENTRANCE(ENTR_SACRED_FOREST_MEADOW_2, SCENE_SACRED_FOREST_MEADOW, 2, false, true, TRANS_TYPE_FADE_GREEN, TRANS_TYPE_FADE_GREEN) +/* 0x601 */ DEFINE_ENTRANCE(ENTR_SACRED_FOREST_MEADOW_2_1, SCENE_SACRED_FOREST_MEADOW, 2, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x602 */ DEFINE_ENTRANCE(ENTR_SACRED_FOREST_MEADOW_2_2, SCENE_SACRED_FOREST_MEADOW, 2, false, true, TRANS_TYPE_FADE_GREEN, TRANS_TYPE_FADE_GREEN) +/* 0x603 */ DEFINE_ENTRANCE(ENTR_SACRED_FOREST_MEADOW_2_3, SCENE_SACRED_FOREST_MEADOW, 2, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) + +/* 0x604 */ DEFINE_ENTRANCE(ENTR_LAKE_HYLIA_8, SCENE_LAKE_HYLIA, 8, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x605 */ DEFINE_ENTRANCE(ENTR_LAKE_HYLIA_8_1, SCENE_LAKE_HYLIA, 8, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x606 */ DEFINE_ENTRANCE(ENTR_LAKE_HYLIA_8_2, SCENE_LAKE_HYLIA, 8, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) +/* 0x607 */ DEFINE_ENTRANCE(ENTR_LAKE_HYLIA_8_3, SCENE_LAKE_HYLIA, 8, false, true, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_FADE_BLACK) + +/* 0x608 */ DEFINE_ENTRANCE(ENTR_SACRED_FOREST_MEADOW_3, SCENE_SACRED_FOREST_MEADOW, 3, false, true, TRANS_TYPE_FADE_WHITE, TRANS_TYPE_FADE_WHITE) +/* 0x609 */ DEFINE_ENTRANCE(ENTR_SACRED_FOREST_MEADOW_3_1, SCENE_SACRED_FOREST_MEADOW, 3, false, true, TRANS_TYPE_FADE_WHITE, TRANS_TYPE_FADE_WHITE) +/* 0x60A */ DEFINE_ENTRANCE(ENTR_SACRED_FOREST_MEADOW_3_2, SCENE_SACRED_FOREST_MEADOW, 3, false, true, TRANS_TYPE_FADE_WHITE, TRANS_TYPE_FADE_WHITE) +/* 0x60B */ DEFINE_ENTRANCE(ENTR_SACRED_FOREST_MEADOW_3_3, SCENE_SACRED_FOREST_MEADOW, 3, false, true, TRANS_TYPE_FADE_WHITE, TRANS_TYPE_FADE_WHITE) + +/* 0x60C */ DEFINE_ENTRANCE(ENTR_LAKE_HYLIA_9, SCENE_LAKE_HYLIA, 9, false, true, TRANS_TYPE_FADE_WHITE, TRANS_TYPE_FADE_WHITE) +/* 0x60D */ DEFINE_ENTRANCE(ENTR_LAKE_HYLIA_9_1, SCENE_LAKE_HYLIA, 9, false, true, TRANS_TYPE_FADE_WHITE, TRANS_TYPE_FADE_WHITE) +/* 0x60E */ DEFINE_ENTRANCE(ENTR_LAKE_HYLIA_9_2, SCENE_LAKE_HYLIA, 9, false, true, TRANS_TYPE_FADE_WHITE, TRANS_TYPE_FADE_WHITE) +/* 0x60F */ DEFINE_ENTRANCE(ENTR_LAKE_HYLIA_9_3, SCENE_LAKE_HYLIA, 9, false, true, TRANS_TYPE_FADE_WHITE, TRANS_TYPE_FADE_WHITE) + +/* 0x610 */ DEFINE_ENTRANCE(ENTR_DESERT_COLOSSUS_8, SCENE_DESERT_COLOSSUS, 8, false, true, TRANS_TYPE_FADE_WHITE, TRANS_TYPE_FADE_WHITE) +/* 0x611 */ DEFINE_ENTRANCE(ENTR_DESERT_COLOSSUS_8_1, SCENE_DESERT_COLOSSUS, 8, false, true, TRANS_TYPE_FADE_WHITE, TRANS_TYPE_FADE_WHITE) +/* 0x612 */ DEFINE_ENTRANCE(ENTR_DESERT_COLOSSUS_8_2, SCENE_DESERT_COLOSSUS, 8, false, true, TRANS_TYPE_FADE_WHITE, TRANS_TYPE_FADE_WHITE) +/* 0x613 */ DEFINE_ENTRANCE(ENTR_DESERT_COLOSSUS_8_3, SCENE_DESERT_COLOSSUS, 8, false, true, TRANS_TYPE_FADE_WHITE, TRANS_TYPE_FADE_WHITE) \ No newline at end of file diff --git a/soh/include/variables.h b/soh/include/variables.h index 2bad8335c..154ef578a 100644 --- a/soh/include/variables.h +++ b/soh/include/variables.h @@ -107,7 +107,7 @@ extern "C" extern s16 gLinkObjectIds[2]; extern u32 gObjectTableSize; extern RomFile gObjectTable[OBJECT_ID_MAX]; - extern EntranceInfo gEntranceTable[1556]; + extern EntranceInfo gEntranceTable[ENTR_MAX]; extern SceneTableEntry gSceneTable[SCENE_ID_MAX]; extern u16 gSramSlotOffsets[]; // 4 16-colors palettes diff --git a/soh/include/z64.h b/soh/include/z64.h index 5fb30004a..e668b2e7a 100644 --- a/soh/include/z64.h +++ b/soh/include/z64.h @@ -1586,6 +1586,20 @@ typedef struct { uint16_t bossRushArrowOffset; } FileChooseContext; // size = 0x1CAE0 +// Macros for `EntranceInfo.field` +#define ENTRANCE_INFO_CONTINUE_BGM_FLAG (1 << 15) +#define ENTRANCE_INFO_DISPLAY_TITLE_CARD_FLAG (1 << 14) +#define ENTRANCE_INFO_END_TRANS_TYPE_MASK 0x3F80 +#define ENTRANCE_INFO_END_TRANS_TYPE_SHIFT 7 +#define ENTRANCE_INFO_END_TRANS_TYPE(field) \ + (((field) >> ENTRANCE_INFO_END_TRANS_TYPE_SHIFT) \ + & (ENTRANCE_INFO_END_TRANS_TYPE_MASK >> ENTRANCE_INFO_END_TRANS_TYPE_SHIFT)) +#define ENTRANCE_INFO_START_TRANS_TYPE_MASK 0x7F +#define ENTRANCE_INFO_START_TRANS_TYPE_SHIFT 0 +#define ENTRANCE_INFO_START_TRANS_TYPE(field) \ + (((field) >> ENTRANCE_INFO_START_TRANS_TYPE_SHIFT) \ + & (ENTRANCE_INFO_START_TRANS_TYPE_MASK >> ENTRANCE_INFO_START_TRANS_TYPE_SHIFT)) + typedef enum { DPM_UNK = 0, DPM_PLAYER = 1, diff --git a/soh/include/z64scene.h b/soh/include/z64scene.h index 361e5f3c8..1c2267a05 100644 --- a/soh/include/z64scene.h +++ b/soh/include/z64scene.h @@ -314,8 +314,34 @@ enum SceneID { /* 0x6E */ SCENE_ID_MAX }; +// this define exists to preserve shiftability for an unused scene that is +// listed in the entrance table +#define SCENE_UNUSED_6E SCENE_ID_MAX + #undef DEFINE_SCENE +// Entrance Index Enum +#define DEFINE_ENTRANCE(enum, _1, _2, _3, _4, _5, _6) enum, + +typedef enum { + #include "tables/entrance_table.h" + /* 0x614 */ ENTR_MAX +} EntranceIndex; + +#define ENTR_LOAD_OPENING -1 + +typedef enum { + /* 0x7FF9 */ ENTR_RETURN_YOUSEI_IZUMI_YOKO = 0x7FF9, // Great Fairy Fountain (spells) + /* 0x7FFA */ ENTR_RETURN_SYATEKIJYOU, // Shooting gallery + /* 0x7FFB */ ENTR_RETURN_2, // unused + /* 0x7FFC */ ENTR_RETURN_SHOP1, // Bazaar + /* 0x7FFD */ ENTR_RETURN_4, // unused + /* 0x7FFE */ ENTR_RETURN_DAIYOUSEI_IZUMI, // Great Fairy Fountain (magic, double magic, double defense) + /* 0x7FFF */ ENTR_RETURN_GROTTO // Grottos and normal Fairy Fountain +} ReturnEntranceIndex; + +#undef DEFINE_ENTRANCE + typedef enum { /* 0 */ SDC_DEFAULT, /* 1 */ SDC_HYRULE_FIELD, diff --git a/soh/soh/Enhancements/boss-rush/BossRush.cpp b/soh/soh/Enhancements/boss-rush/BossRush.cpp index 7a0bbab6d..63414f88c 100644 --- a/soh/soh/Enhancements/boss-rush/BossRush.cpp +++ b/soh/soh/Enhancements/boss-rush/BossRush.cpp @@ -175,33 +175,33 @@ void BossRush_HandleBlueWarp(PlayState* play, f32 warpPosX, f32 warpPosZ) { // Gohma & Phantom Ganon if (warpPosX == -100 && warpPosZ == -170) { if (gSaveContext.linkAge == LINK_AGE_CHILD) { - play->nextEntranceIndex = 0x040F; + play->nextEntranceIndex = ENTR_DEKU_TREE_BOSS_0; } else { - play->nextEntranceIndex = 0x000C; + play->nextEntranceIndex = ENTR_FOREST_TEMPLE_BOSS_0; } // King Dodongo & Volvagia } else if (warpPosX == 100 && warpPosZ == -170) { if (gSaveContext.linkAge == LINK_AGE_CHILD) { - play->nextEntranceIndex = 0x040B; + play->nextEntranceIndex = ENTR_DODONGOS_CAVERN_BOSS_0; } else { - play->nextEntranceIndex = 0x0305; + play->nextEntranceIndex = ENTR_FIRE_TEMPLE_BOSS_0; } // Barinade & Morb } else if (warpPosX == 199 && warpPosZ == 0) { if (gSaveContext.linkAge == LINK_AGE_CHILD) { - play->nextEntranceIndex = 0x0301; + play->nextEntranceIndex = ENTR_JABU_JABU_BOSS_0; } else { - play->nextEntranceIndex = 0x0417; + play->nextEntranceIndex = ENTR_WATER_TEMPLE_BOSS_0; } // Twinrova } else if (warpPosX == 100 && warpPosZ == 170) { - play->nextEntranceIndex = 0x05EC; + play->nextEntranceIndex = ENTR_SPIRIT_TEMPLE_BOSS_2; // Bongo Bongo } else if (warpPosX == -100 && warpPosZ == 170) { - play->nextEntranceIndex = 0x0413; + play->nextEntranceIndex = ENTR_SHADOW_TEMPLE_BOSS_0; // Ganondork } else if (warpPosX == -199 && warpPosZ == 0) { - play->nextEntranceIndex = 0x041F; + play->nextEntranceIndex = ENTR_GANONDORF_BOSS_0; } // If coming from a boss room, teleport back to Chamber of Sages and set flag. } else { @@ -216,7 +216,7 @@ void BossRush_HandleBlueWarp(PlayState* play, f32 warpPosX, f32 warpPosZ) { BossRush_SetEquipment(LINK_AGE_ADULT); // Warp to credits. } else if (gSaveContext.bossRushOptions[BR_OPTIONS_BOSSES] == BR_CHOICE_BOSSES_CHILD) { - play->nextEntranceIndex = 0x6B; + play->nextEntranceIndex = ENTR_CHAMBER_OF_THE_SAGES_0; gSaveContext.nextCutsceneIndex = 0xFFF2; play->transitionTrigger = TRANS_TRIGGER_START; play->transitionType = TRANS_TYPE_FADE_WHITE; @@ -293,7 +293,7 @@ void BossRush_InitSave() { gSaveContext.questId = QUEST_BOSSRUSH; gSaveContext.isBossRushPaused = 1; - gSaveContext.entranceIndex = 107; + gSaveContext.entranceIndex = ENTR_CHAMBER_OF_THE_SAGES_0; gSaveContext.cutsceneIndex = 0x8000; gSaveContext.isMagicAcquired = 1; diff --git a/soh/soh/Enhancements/game-interactor/GameInteractor.h b/soh/soh/Enhancements/game-interactor/GameInteractor.h index ae711c093..1da584eb2 100644 --- a/soh/soh/Enhancements/game-interactor/GameInteractor.h +++ b/soh/soh/Enhancements/game-interactor/GameInteractor.h @@ -5,6 +5,7 @@ #include "GameInteractionEffect.h" #include "soh/Enhancements/item-tables/ItemTableTypes.h" +#include typedef enum { /* 0x00 */ GI_LINK_SIZE_NORMAL, @@ -52,13 +53,13 @@ typedef enum { } GIColors; typedef enum { - /* */ GI_TP_DEST_LINKSHOUSE = 187, - /* */ GI_TP_DEST_MINUET = 1536, - /* */ GI_TP_DEST_BOLERO = 1270, - /* */ GI_TP_DEST_SERENADE = 1540, - /* */ GI_TP_DEST_REQUIEM = 497, - /* */ GI_TP_DEST_NOCTURNE = 1384, - /* */ GI_TP_DEST_PRELUDE = 1524, + /* */ GI_TP_DEST_LINKSHOUSE = ENTR_LINKS_HOUSE_0, + /* */ GI_TP_DEST_MINUET = ENTR_SACRED_FOREST_MEADOW_2, + /* */ GI_TP_DEST_BOLERO = ENTR_DEATH_MOUNTAIN_CRATER_4, + /* */ GI_TP_DEST_SERENADE = ENTR_LAKE_HYLIA_8, + /* */ GI_TP_DEST_REQUIEM = ENTR_DESERT_COLOSSUS_5, + /* */ GI_TP_DEST_NOCTURNE = ENTR_GRAVEYARD_7, + /* */ GI_TP_DEST_PRELUDE = ENTR_TEMPLE_OF_TIME_7, } GITeleportDestinations; #ifdef __cplusplus diff --git a/soh/soh/Enhancements/mods.cpp b/soh/soh/Enhancements/mods.cpp index 8263c6780..45933b9a6 100644 --- a/soh/soh/Enhancements/mods.cpp +++ b/soh/soh/Enhancements/mods.cpp @@ -628,7 +628,7 @@ void RegisterTriforceHunt() { // Warp to credits if (GameInteractor::State::TriforceHuntCreditsWarpActive) { - gPlayState->nextEntranceIndex = 0x6B; + gPlayState->nextEntranceIndex = ENTR_CHAMBER_OF_THE_SAGES_0; gSaveContext.nextCutsceneIndex = 0xFFF2; gPlayState->transitionTrigger = TRANS_TRIGGER_START; gPlayState->transitionType = TRANS_TYPE_FADE_WHITE; diff --git a/soh/soh/Enhancements/randomizer/randomizer.cpp b/soh/soh/Enhancements/randomizer/randomizer.cpp index 8f88a7299..f879be4b8 100644 --- a/soh/soh/Enhancements/randomizer/randomizer.cpp +++ b/soh/soh/Enhancements/randomizer/randomizer.cpp @@ -2715,7 +2715,7 @@ ShopItemIdentity Randomizer::IdentifyShopItem(s32 sceneNum, u8 slotIndex) { RandomizerCheckObject rcObject = GetCheckObjectFromActor(ACTOR_EN_GIRLA, // Bazaar (SHOP1) scene is reused, so if entering from Kak use debug scene to identify - (sceneNum == SCENE_BAZAAR && gSaveContext.entranceIndex == 0xB7) ? SCENE_TEST01 : sceneNum, slotIndex); + (sceneNum == SCENE_BAZAAR && gSaveContext.entranceIndex == ENTR_BAZAAR_0) ? SCENE_TEST01 : sceneNum, slotIndex); if (rcObject.rc != RC_UNKNOWN_CHECK) { shopItemIdentity.randomizerInf = rcToRandomizerInf[rcObject.rc]; diff --git a/soh/soh/Enhancements/randomizer/randomizer_entrance.c b/soh/soh/Enhancements/randomizer/randomizer_entrance.c index 68c8e2e8c..1dd200df3 100644 --- a/soh/soh/Enhancements/randomizer/randomizer_entrance.c +++ b/soh/soh/Enhancements/randomizer/randomizer_entrance.c @@ -17,10 +17,24 @@ extern PlayState* gPlayState; //Overwrite the dynamic exit for the OGC Fairy Fountain to be 0x3E8 instead //of 0x340 (0x340 will stay as the exit for the HC Fairy Fountain -> Castle Grounds) -s16 dynamicExitList[] = { 0x045B, 0x0482, 0x03E8, 0x044B, 0x02A2, 0x0201, 0x03B8, 0x04EE, 0x03C0, 0x0463, 0x01CD, 0x0394, 0x0340, 0x057C }; -// OGC Fairy HC Fairy +s16 dynamicExitList[] = { + ENTR_DEATH_MOUNTAIN_TRAIL_4, + ENTR_DEATH_MOUNTAIN_CRATER_3, + ENTR_POTION_SHOP_KAKARIKO_1, // OGC Fairy -- ENTR_POTION_SHOP_KAKARIKO_1 unused + ENTR_KAKARIKO_VILLAGE_9, + ENTR_MARKET_DAY_5, + ENTR_KAKARIKO_VILLAGE_3, + ENTR_MARKET_DAY_6, + ENTR_KAKARIKO_VILLAGE_11, + ENTR_BACK_ALLEY_DAY_2, + ENTR_KAKARIKO_VILLAGE_10, + ENTR_MARKET_DAY_8, + ENTR_ZORAS_FOUNTAIN_5, + ENTR_HYRULE_CASTLE_2, // HC Fairy + ENTR_DESERT_COLOSSUS_7 +}; -// Warp Song indices array : 0x53C33C = { 0x0600, 0x04F6, 0x0604, 0x01F1, 0x0568, 0x05F4 } +// Warp Song indices array : 0x53C33C = { ENTR_SACRED_FOREST_MEADOW_2, ENTR_DEATH_MOUNTAIN_CRATER_4, ENTR_LAKE_HYLIA_8, ENTR_DESERT_COLOSSUS_5, ENTR_GRAVEYARD_7, ENTR_TEMPLE_OF_TIME_7 } // Owl Flights : 0x492064 and 0x492080 @@ -47,15 +61,15 @@ typedef struct { } DungeonEntranceInfo; static DungeonEntranceInfo dungeons[] = { - //entryway exit, boss, reverse,bluewarp,dungeon scene, boss scene - { DEKU_TREE_ENTRANCE, 0x0209, 0x040F, 0x0252, 0x0457, SCENE_DEKU_TREE, SCENE_DEKU_TREE_BOSS }, - { DODONGOS_CAVERN_ENTRANCE, 0x0242, 0x040B, 0x00C5, 0x047A, SCENE_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN_BOSS }, - { JABU_JABUS_BELLY_ENTRANCE, 0x0221, 0x0301, 0x0407, 0x010E, SCENE_JABU_JABU, SCENE_JABU_JABU_BOSS }, - { FOREST_TEMPLE_ENTRANCE, 0x0215, 0x000C, 0x024E, 0x0608, SCENE_FOREST_TEMPLE, SCENE_FOREST_TEMPLE_BOSS }, - { FIRE_TEMPLE_ENTRANCE, 0x024A, 0x0305, 0x0175, 0x0564, SCENE_FIRE_TEMPLE, SCENE_FIRE_TEMPLE_BOSS }, - { WATER_TEMPLE_ENTRANCE, 0x021D, 0x0417, 0x0423, 0x060C, SCENE_WATER_TEMPLE, SCENE_WATER_TEMPLE_BOSS }, - { SPIRIT_TEMPLE_ENTRANCE, 0x01E1, 0x008D, 0x02F5, 0x0610, SCENE_SPIRIT_TEMPLE, SCENE_SPIRIT_TEMPLE_BOSS }, - { SHADOW_TEMPLE_ENTRANCE, 0x0205, 0x0413, 0x02B2, 0x0580, SCENE_SHADOW_TEMPLE, SCENE_SHADOW_TEMPLE_BOSS }, + //entryway exit, boss, reverse, bluewarp, dungeon scene, boss scene + { DEKU_TREE_ENTRANCE, ENTR_KOKIRI_FOREST_1, ENTR_DEKU_TREE_BOSS_0, ENTR_DEKU_TREE_1, ENTR_KOKIRI_FOREST_11, SCENE_DEKU_TREE, SCENE_DEKU_TREE_BOSS }, + { DODONGOS_CAVERN_ENTRANCE, ENTR_DEATH_MOUNTAIN_TRAIL_3, ENTR_DODONGOS_CAVERN_BOSS_0, ENTR_DODONGOS_CAVERN_1, ENTR_DEATH_MOUNTAIN_TRAIL_5, SCENE_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN_BOSS }, + { JABU_JABUS_BELLY_ENTRANCE, ENTR_ZORAS_FOUNTAIN_1, ENTR_JABU_JABU_BOSS_0, ENTR_JABU_JABU_1, ENTR_ZORAS_FOUNTAIN_0, SCENE_JABU_JABU, SCENE_JABU_JABU_BOSS }, + { FOREST_TEMPLE_ENTRANCE, ENTR_SACRED_FOREST_MEADOW_1, ENTR_FOREST_TEMPLE_BOSS_0, ENTR_FOREST_TEMPLE_1, ENTR_SACRED_FOREST_MEADOW_3, SCENE_FOREST_TEMPLE, SCENE_FOREST_TEMPLE_BOSS }, + { FIRE_TEMPLE_ENTRANCE, ENTR_DEATH_MOUNTAIN_CRATER_2, ENTR_FIRE_TEMPLE_BOSS_0, ENTR_FIRE_TEMPLE_1, ENTR_DEATH_MOUNTAIN_CRATER_5, SCENE_FIRE_TEMPLE, SCENE_FIRE_TEMPLE_BOSS }, + { WATER_TEMPLE_ENTRANCE, ENTR_LAKE_HYLIA_2, ENTR_WATER_TEMPLE_BOSS_0, ENTR_WATER_TEMPLE_1, ENTR_LAKE_HYLIA_9, SCENE_WATER_TEMPLE, SCENE_WATER_TEMPLE_BOSS }, + { SPIRIT_TEMPLE_ENTRANCE, ENTR_DESERT_COLOSSUS_1, ENTR_SPIRIT_TEMPLE_BOSS_0, ENTR_SPIRIT_TEMPLE_1, ENTR_DESERT_COLOSSUS_8, SCENE_SPIRIT_TEMPLE, SCENE_SPIRIT_TEMPLE_BOSS }, + { SHADOW_TEMPLE_ENTRANCE, ENTR_GRAVEYARD_1, ENTR_SHADOW_TEMPLE_BOSS_0, ENTR_SHADOW_TEMPLE_1, ENTR_GRAVEYARD_8, SCENE_SHADOW_TEMPLE, SCENE_SHADOW_TEMPLE_BOSS }, }; //These variables store the new entrance indices for dungeons so that @@ -84,18 +98,18 @@ u8 Entrance_EntranceIsNull(EntranceOverride* entranceOverride) { } static void Entrance_SeparateOGCFairyFountainExit(void) { - //Overwrite unused entrance 0x03E8 with values from 0x0340 to use it as the + //Overwrite unused entrance 0x03E8 (ENTR_POTION_SHOP_KAKARIKO_1) with values from 0x0340 (ENTR_HYRULE_CASTLE_2) to use it as the //exit from OGC Great Fairy Fountain -> Castle Grounds for (size_t i = 0; i < 4; ++i) { - gEntranceTable[0x3E8 + i] = gEntranceTable[0x340 + i]; + gEntranceTable[ENTR_POTION_SHOP_KAKARIKO_1 + i] = gEntranceTable[ENTR_HYRULE_CASTLE_2 + i]; } } static void Entrance_SeparateAdultSpawnAndPrelude() { - // Overwrite unused entrance 0x0282 with values from 0x05F4 to use it as the + // Overwrite unused entrance 0x0282 (ENTR_HYRULE_FIELD_10) with values from 0x05F4 (ENTR_TEMPLE_OF_TIME_7) to use it as the // Adult Spawn index and separate it from Prelude of Light for (size_t i = 0; i < 4; ++i) { - gEntranceTable[0x282 + i] = gEntranceTable[0x5F4 + i]; + gEntranceTable[ENTR_HYRULE_FIELD_10 + i] = gEntranceTable[ENTR_TEMPLE_OF_TIME_7 + i]; } } @@ -123,14 +137,14 @@ void Entrance_Init(void) { // Skip Child Stealth if given by settings if (Randomizer_GetSettingValue(RSK_SKIP_CHILD_STEALTH)) { - gEntranceTable[0x07A].scene = 0x4A; - gEntranceTable[0x07A].spawn = 0x00; - gEntranceTable[0x07A].field = 0x0183; + gEntranceTable[ENTR_CASTLE_COURTYARD_GUARDS_DAY_0].scene = SCENE_CASTLE_COURTYARD_ZELDA; + gEntranceTable[ENTR_CASTLE_COURTYARD_GUARDS_DAY_0].spawn = 0; + gEntranceTable[ENTR_CASTLE_COURTYARD_GUARDS_DAY_0].field = ENTRANCE_INFO_FIELD(false, false, TRANS_TYPE_FADE_WHITE, TRANS_TYPE_FADE_WHITE); } // Delete the title card and add a fade in for Hyrule Field from Ocarina of Time cutscene - for (index = 0x50F; index < 0x513; ++index) { - gEntranceTable[index].field = 0x010B; + for (index = ENTR_HYRULE_FIELD_16; index <= ENTR_HYRULE_FIELD_16_3; ++index) { + gEntranceTable[index].field = ENTRANCE_INFO_FIELD(false, false, TRANS_TYPE_FADE_BLACK, TRANS_TYPE_INSTANT); } Entrance_SeparateOGCFairyFountainExit(); @@ -206,10 +220,10 @@ void Entrance_Init(void) { } //Override both land and water entrances for Hyrule Field -> ZR Front and vice versa - if (originalIndex == 0x00EA) { //Hyrule Field -> ZR Front land entrance - entranceOverrideTable[0x01D9] = overrideIndex; - } else if (originalIndex == 0x0181) { //ZR Front -> Hyrule Field land entrance - entranceOverrideTable[0x0311] = overrideIndex; + if (originalIndex == ENTR_ZORAS_RIVER_0) { //Hyrule Field -> ZR Front land entrance + entranceOverrideTable[ENTR_ZORAS_RIVER_3] = overrideIndex; + } else if (originalIndex == ENTR_HYRULE_FIELD_2) { //ZR Front -> Hyrule Field land entrance + entranceOverrideTable[ENTR_HYRULE_FIELD_14] = overrideIndex; } } @@ -228,11 +242,11 @@ void Entrance_Init(void) { s16 indicesToSilenceBackgroundMusic[2] = { // The lost woods music playing near the GC Woods Warp keeps playing // in the next area if the bvackground music is allowed to keep playing - entranceOverrideTable[0x04D6], // Goron City -> Lost Woods override + entranceOverrideTable[ENTR_LOST_WOODS_6], // Goron City -> Lost Woods override // If Malon is singing at night, then her singing will be transferred // to the next area if it allows the background music to keep playing - entranceOverrideTable[0x025A], // Castle Grounds -> Market override + entranceOverrideTable[ENTR_MARKET_DAY_1], // Castle Grounds -> Market override }; for (size_t j = 0; j < sizeof(indicesToSilenceBackgroundMusic) / sizeof(s16); j++) { @@ -241,7 +255,7 @@ void Entrance_Init(void) { for (s16 i = 0; i < 4; i++) { // Zero out the bit in the field which tells the game to keep playing // background music for all four scene setups at each index - gEntranceTable[override + i].field &= ~0x8000; + gEntranceTable[override + i].field &= ~ENTRANCE_INFO_CONTINUE_BGM_FLAG; } } } @@ -263,7 +277,7 @@ s16 Entrance_GetOverride(s16 index) { s16 Entrance_OverrideNextIndex(s16 nextEntranceIndex) { // When entering Spirit Temple, clear temp flags so they don't carry over to the randomized dungeon - if (nextEntranceIndex == 0x0082 && Entrance_GetOverride(nextEntranceIndex) != nextEntranceIndex && + if (nextEntranceIndex == ENTR_SPIRIT_TEMPLE_0 && Entrance_GetOverride(nextEntranceIndex) != nextEntranceIndex && gPlayState != NULL) { gPlayState->actorCtx.flags.tempSwch = 0; gPlayState->actorCtx.flags.tempCollect = 0; @@ -272,7 +286,7 @@ s16 Entrance_OverrideNextIndex(s16 nextEntranceIndex) { // Exiting through the crawl space from Hyrule Castle courtyard is the same exit as leaving Ganon's castle // Don't override the entrance if we came from the Castle courtyard (day and night scenes) if (gPlayState != NULL && (gPlayState->sceneNum == SCENE_CASTLE_COURTYARD_GUARDS_DAY || gPlayState->sceneNum == SCENE_CASTLE_COURTYARD_GUARDS_NIGHT) && - nextEntranceIndex == 0x023D) { + nextEntranceIndex == ENTR_HYRULE_CASTLE_1) { return nextEntranceIndex; } @@ -288,24 +302,24 @@ s16 Entrance_OverrideDynamicExit(s16 dynamicExitIndex) { } u32 Entrance_SceneAndSpawnAre(u8 scene, u8 spawn) { - s16 computedEntranceIndex; + s16 entranceIndex; // Adjust the entrance to account for the exact scene/spawn combination for child/adult and day/night if (!IS_DAY) { if (!LINK_IS_ADULT) { - computedEntranceIndex = gSaveContext.entranceIndex + 1; + entranceIndex = gSaveContext.entranceIndex + 1; } else { - computedEntranceIndex = gSaveContext.entranceIndex + 3; + entranceIndex = gSaveContext.entranceIndex + 3; } } else { if (!LINK_IS_ADULT) { - computedEntranceIndex = gSaveContext.entranceIndex; + entranceIndex = gSaveContext.entranceIndex; } else { - computedEntranceIndex = gSaveContext.entranceIndex + 2; + entranceIndex = gSaveContext.entranceIndex + 2; } } - EntranceInfo currentEntrance = gEntranceTable[computedEntranceIndex]; + EntranceInfo currentEntrance = gEntranceTable[entranceIndex]; return currentEntrance.scene == scene && currentEntrance.spawn == spawn; } @@ -325,32 +339,32 @@ void Entrance_SetGameOverEntrance(void) { //Set the current entrance depending on which entrance the player last came through switch (gSaveContext.entranceIndex) { - case 0x040F : //Deku Tree Boss Room + case ENTR_DEKU_TREE_BOSS_0 : //Deku Tree Boss Room gSaveContext.entranceIndex = newDekuTreeEntrance; return; - case 0x040B : //Dodongos Cavern Boss Room + case ENTR_DODONGOS_CAVERN_BOSS_0 : //Dodongos Cavern Boss Room gSaveContext.entranceIndex = newDodongosCavernEntrance; return; - case 0x0301 : //Jabu Jabus Belly Boss Room + case ENTR_JABU_JABU_BOSS_0 : //Jabu Jabus Belly Boss Room gSaveContext.entranceIndex = newJabuJabusBellyEntrance; return; - case 0x000C : //Forest Temple Boss Room + case ENTR_FOREST_TEMPLE_BOSS_0 : //Forest Temple Boss Room gSaveContext.entranceIndex = newForestTempleEntrance; return; - case 0x0305 : //Fire Temple Boss Room + case ENTR_FIRE_TEMPLE_BOSS_0 : //Fire Temple Boss Room gSaveContext.entranceIndex = newFireTempleEntrance; return; - case 0x0417 : //Water Temple Boss Room + case ENTR_WATER_TEMPLE_BOSS_0 : //Water Temple Boss Room gSaveContext.entranceIndex = newWaterTempleEntrance; return; - case 0x008D : //Spirit Temple Boss Room + case ENTR_SPIRIT_TEMPLE_BOSS_0 : //Spirit Temple Boss Room gSaveContext.entranceIndex = newSpiritTempleEntrance; return; - case 0x0413 : //Shadow Temple Boss Room + case ENTR_SHADOW_TEMPLE_BOSS_0 : //Shadow Temple Boss Room gSaveContext.entranceIndex = newShadowTempleEntrance; return; - case 0x041F : //Ganondorf Boss Room - gSaveContext.entranceIndex = 0x041B; // Inside Ganon's Castle -> Ganon's Tower Climb + case ENTR_GANONDORF_BOSS_0 : //Ganondorf Boss Room + gSaveContext.entranceIndex = ENTR_GANONS_TOWER_0; // Inside Ganon's Castle -> Ganon's Tower Climb return; } } @@ -393,15 +407,15 @@ void Entrance_SetSavewarpEntrance(void) { } else if (scene == SCENE_INSIDE_GANONS_CASTLE) { gSaveContext.entranceIndex = GANONS_CASTLE_ENTRANCE; } else if (scene == SCENE_GANONS_TOWER || scene == SCENE_INSIDE_GANONS_CASTLE_COLLAPSE || scene == SCENE_GANONS_TOWER_COLLAPSE_INTERIOR || scene == SCENE_GANON_BOSS || scene == SCENE_GANONS_TOWER_COLLAPSE_EXTERIOR) { - gSaveContext.entranceIndex = 0x041B; // Inside Ganon's Castle -> Ganon's Tower Climb + gSaveContext.entranceIndex = ENTR_GANONS_TOWER_0; // Inside Ganon's Castle -> Ganon's Tower Climb } else if (scene == SCENE_THIEVES_HIDEOUT) { // Theives hideout - gSaveContext.entranceIndex = 0x0486; // Gerudo Fortress -> Thieve's Hideout spawn 0 + gSaveContext.entranceIndex = ENTR_THIEVES_HIDEOUT_0; // Gerudo Fortress -> Thieve's Hideout spawn 0 } else if (scene == SCENE_LINKS_HOUSE) { gSaveContext.entranceIndex = Entrance_OverrideNextIndex(LINK_HOUSE_SAVEWARP_ENTRANCE); } else if (LINK_IS_CHILD) { gSaveContext.entranceIndex = Entrance_OverrideNextIndex(LINK_HOUSE_SAVEWARP_ENTRANCE); // Child Overworld Spawn } else { - gSaveContext.entranceIndex = Entrance_OverrideNextIndex(0x0282); // Adult Overworld Spawn (Normally 0x5F4, but 0x282 has been repurposed to differentiate from Prelude which also uses 0x5F4) + gSaveContext.entranceIndex = Entrance_OverrideNextIndex(ENTR_HYRULE_FIELD_10); // Adult Overworld Spawn (Normally 0x5F4 (ENTR_TEMPLE_OF_TIME_7), but 0x282 (ENTR_HYRULE_FIELD_10) has been repurposed to differentiate from Prelude which also uses 0x5F4) } } @@ -409,23 +423,23 @@ void Entrance_SetWarpSongEntrance(void) { gPlayState->transitionTrigger = TRANS_TRIGGER_START; gPlayState->transitionType = TRANS_TYPE_FADE_WHITE_FAST; switch (gPlayState->msgCtx.lastPlayedSong) { - case 0: - gPlayState->nextEntranceIndex = Entrance_OverrideNextIndex(0x0600); // Minuet + case OCARINA_SONG_MINUET: + gPlayState->nextEntranceIndex = Entrance_OverrideNextIndex(ENTR_SACRED_FOREST_MEADOW_2); // Minuet break; - case 1: - gPlayState->nextEntranceIndex = Entrance_OverrideNextIndex(0x04F6); // Bolero + case OCARINA_SONG_BOLERO: + gPlayState->nextEntranceIndex = Entrance_OverrideNextIndex(ENTR_DEATH_MOUNTAIN_CRATER_4); // Bolero break; - case 2: - gPlayState->nextEntranceIndex = Entrance_OverrideNextIndex(0x0604); // Serenade + case OCARINA_SONG_SERENADE: + gPlayState->nextEntranceIndex = Entrance_OverrideNextIndex(ENTR_LAKE_HYLIA_8); // Serenade break; - case 3: - gPlayState->nextEntranceIndex = Entrance_OverrideNextIndex(0x01F1); // Requiem + case OCARINA_SONG_REQUIEM: + gPlayState->nextEntranceIndex = Entrance_OverrideNextIndex(ENTR_DESERT_COLOSSUS_5); // Requiem break; - case 4: - gPlayState->nextEntranceIndex = Entrance_OverrideNextIndex(0x0568); // Nocturne + case OCARINA_SONG_NOCTURNE: + gPlayState->nextEntranceIndex = Entrance_OverrideNextIndex(ENTR_GRAVEYARD_7); // Nocturne break; - case 5: - gPlayState->nextEntranceIndex = Entrance_OverrideNextIndex(0x05F4); // Prelude + case OCARINA_SONG_PRELUDE: + gPlayState->nextEntranceIndex = Entrance_OverrideNextIndex(ENTR_TEMPLE_OF_TIME_7); // Prelude break; default: gPlayState->transitionTrigger = TRANS_TRIGGER_OFF; // if something goes wrong, the animation plays normally @@ -451,28 +465,28 @@ void Entrance_OverrideBlueWarp(void) { switch (gPlayState->sceneNum) { case SCENE_DEKU_TREE_BOSS: // Ghoma boss room - gPlayState->nextEntranceIndex = Entrance_OverrideNextIndex(0x0457); + gPlayState->nextEntranceIndex = Entrance_OverrideNextIndex(ENTR_KOKIRI_FOREST_11); return; case SCENE_DODONGOS_CAVERN_BOSS: // King Dodongo boss room - gPlayState->nextEntranceIndex = Entrance_OverrideNextIndex(0x047A); + gPlayState->nextEntranceIndex = Entrance_OverrideNextIndex(ENTR_DEATH_MOUNTAIN_TRAIL_5); return; case SCENE_JABU_JABU_BOSS: // Barinade boss room - gPlayState->nextEntranceIndex = Entrance_OverrideNextIndex(0x010E); + gPlayState->nextEntranceIndex = Entrance_OverrideNextIndex(ENTR_ZORAS_FOUNTAIN_0); return; case SCENE_FOREST_TEMPLE_BOSS: // Phantom Ganon boss room - gPlayState->nextEntranceIndex = Entrance_OverrideNextIndex(0x0608); + gPlayState->nextEntranceIndex = Entrance_OverrideNextIndex(ENTR_SACRED_FOREST_MEADOW_3); return; case SCENE_FIRE_TEMPLE_BOSS: // Volvagia boss room - gPlayState->nextEntranceIndex = Entrance_OverrideNextIndex(0x0564); + gPlayState->nextEntranceIndex = Entrance_OverrideNextIndex(ENTR_DEATH_MOUNTAIN_CRATER_5); return; case SCENE_WATER_TEMPLE_BOSS: // Morpha boss room - gPlayState->nextEntranceIndex = Entrance_OverrideNextIndex(0x060C); + gPlayState->nextEntranceIndex = Entrance_OverrideNextIndex(ENTR_LAKE_HYLIA_9); return; case SCENE_SPIRIT_TEMPLE_BOSS: // Twinrova boss room - gPlayState->nextEntranceIndex = Entrance_OverrideNextIndex(0x0610); + gPlayState->nextEntranceIndex = Entrance_OverrideNextIndex(ENTR_DESERT_COLOSSUS_8); return; case SCENE_SHADOW_TEMPLE_BOSS: // Bongo-Bongo boss room - gPlayState->nextEntranceIndex = Entrance_OverrideNextIndex(0x0580); + gPlayState->nextEntranceIndex = Entrance_OverrideNextIndex(ENTR_GRAVEYARD_8); return; } } @@ -494,9 +508,10 @@ void Entrance_EnableFW(void) { // Leave restriction in Tower Collapse Interior, Castle Collapse, Treasure Box Shop, Tower Collapse Exterior, // Grottos area, Fishing Pond, Ganon Battle and for states that disable buttons. if (!false /* farores wind anywhere */ || - gPlayState->sceneNum == 14 || gPlayState->sceneNum == 15 || (gPlayState->sceneNum == 16 && !false /* shuffled chest mini game */) || - gPlayState->sceneNum == 26 || gPlayState->sceneNum == 62 || gPlayState->sceneNum == 73 || - gPlayState->sceneNum == 79 || + gPlayState->sceneNum == SCENE_GANONS_TOWER_COLLAPSE_INTERIOR || gPlayState->sceneNum == SCENE_INSIDE_GANONS_CASTLE_COLLAPSE || + (gPlayState->sceneNum == SCENE_TREASURE_BOX_SHOP && !false /* shuffled chest mini game */) || + gPlayState->sceneNum == SCENE_GANONS_TOWER_COLLAPSE_EXTERIOR || gPlayState->sceneNum == SCENE_GROTTOS || + gPlayState->sceneNum == SCENE_FISHING_POND || gPlayState->sceneNum == SCENE_GANON_BOSS || gSaveContext.eventInf[0] & 0x1 || // Ingo's Minigame state player->stateFlags1 & 0x08A02000 || // Swimming, riding horse, Down A, hanging from a ledge player->stateFlags2 & 0x00040000 // Blank A @@ -505,8 +520,8 @@ void Entrance_EnableFW(void) { return; } - for (int i = 1; i < 5; i++) { - if (gSaveContext.equips.buttonItems[i] == 13) { + for (size_t i = 1; i < ARRAY_COUNT(gSaveContext.equips.buttonItems); i++) { + if (gSaveContext.equips.buttonItems[i] == ITEM_FARORES_WIND) { gSaveContext.buttonStatus[i] = BTN_ENABLED; } } @@ -520,38 +535,38 @@ void Entrance_HandleEponaState(void) { //unset the Epona flag to avoid Master glitch, and restore temp B. if (Randomizer_GetSettingValue(RSK_SHUFFLE_OVERWORLD_ENTRANCES) && (player->stateFlags1 & PLAYER_STATE1_ON_HORSE)) { // Allow Master glitch to be performed on the Thieves Hideout entrance - if (entrance == Entrance_GetOverride(0x0496)) { // Gerudo Fortress -> Theives Hideout + if (entrance == Entrance_GetOverride(ENTR_THIEVES_HIDEOUT_4)) { // Gerudo Fortress -> Theives Hideout return; } static const s16 validEponaEntrances[] = { - 0x0102, // Hyrule Field -> Lake Hylia - 0x0189, // Lake Hylia -> Hyrule Field - 0x0309, // LH Fishing Hole -> LH Fishing Island - 0x03CC, // LH Lab -> Lake Hylia - 0x0117, // Hyrule Field -> Gerudo Valley - 0x018D, // Gerudo Valley -> Hyrule Field - 0x0157, // Hyrule Field -> Lon Lon Ranch - 0x01F9, // Lon Lon Ranch -> Hyrule Field - 0x01FD, // Market Entrance -> Hyrule Field - 0x0181, // ZR Front -> Hyrule Field - 0x0185, // LW Bridge -> Hyrule Field - 0x0129, // GV Fortress Side -> Gerudo Fortress - 0x022D, // Gerudo Fortress -> GV Fortress Side - 0x03D0, // GV Carpenter Tent -> GV Fortress Side - 0x042F, // LLR Stables -> Lon Lon Ranch - 0x05D4, // LLR Tower -> Lon Lon Ranch - 0x0378, // LLR Talons House -> Lon Lon Ranch - 0x028A, // LLR Southern Fence Jump - 0x028E, // LLR Western Fence Jump - 0x0292, // LLR Eastern Fence Jump - 0x0476, // LLR Front Gate Jump + ENTR_LAKE_HYLIA_0, // Hyrule Field -> Lake Hylia + ENTR_HYRULE_FIELD_4, // Lake Hylia -> Hyrule Field + ENTR_LAKE_HYLIA_6, // LH Fishing Hole -> LH Fishing Island + ENTR_LAKE_HYLIA_4, // LH Lab -> Lake Hylia + ENTR_GERUDO_VALLEY_0, // Hyrule Field -> Gerudo Valley + ENTR_HYRULE_FIELD_5, // Gerudo Valley -> Hyrule Field + ENTR_LON_LON_RANCH_0, // Hyrule Field -> Lon Lon Ranch + ENTR_HYRULE_FIELD_6, // Lon Lon Ranch -> Hyrule Field + ENTR_HYRULE_FIELD_7, // Market Entrance -> Hyrule Field + ENTR_HYRULE_FIELD_2, // ZR Front -> Hyrule Field + ENTR_HYRULE_FIELD_3, // LW Bridge -> Hyrule Field + ENTR_GERUDOS_FORTRESS_0, // GV Fortress Side -> Gerudo Fortress + ENTR_GERUDO_VALLEY_3, // Gerudo Fortress -> GV Fortress Side + ENTR_GERUDO_VALLEY_4, // GV Carpenter Tent -> GV Fortress Side + ENTR_LON_LON_RANCH_5, // LLR Stables -> Lon Lon Ranch + ENTR_LON_LON_RANCH_10, // LLR Tower -> Lon Lon Ranch + ENTR_LON_LON_RANCH_4, // LLR Talons House -> Lon Lon Ranch + ENTR_HYRULE_FIELD_11, // LLR Southern Fence Jump + ENTR_HYRULE_FIELD_12, // LLR Western Fence Jump + ENTR_HYRULE_FIELD_13, // LLR Eastern Fence Jump + ENTR_HYRULE_FIELD_15, // LLR Front Gate Jump // The following indices currently aren't randomized, but we'll list // them in case they ever are. They're all Theives Hideout -> Gerudo Fortress - 0x231, - 0x235, - 0x239, - 0x2BA, + ENTR_GERUDOS_FORTRESS_1, + ENTR_GERUDOS_FORTRESS_2, + ENTR_GERUDOS_FORTRESS_3, + ENTR_GERUDOS_FORTRESS_5, }; for (size_t i = 0; i < ARRAY_COUNT(validEponaEntrances); i++) { // If the entrance is equal to any of the valid ones, return and @@ -583,15 +598,15 @@ void Entrance_OverrideWeatherState() { } // Hyrule Market - if (gSaveContext.entranceIndex == 0x01FD) { // Hyrule Field by Market Entrance + if (gSaveContext.entranceIndex == ENTR_HYRULE_FIELD_7) { // Hyrule Field by Market Entrance gWeatherMode = 1; return; } // Lon Lon Ranch (No Epona) if (!Flags_GetEventChkInf(EVENTCHKINF_EPONA_OBTAINED)){ // if you don't have Epona switch (gSaveContext.entranceIndex) { - case 0x0157: // Lon Lon Ranch from HF - case 0x01F9: // Hyrule Field from LLR + case ENTR_LON_LON_RANCH_0: // Lon Lon Ranch from HF + case ENTR_HYRULE_FIELD_6: // Hyrule Field from LLR gWeatherMode = 2; return; } @@ -599,15 +614,15 @@ void Entrance_OverrideWeatherState() { // Water Temple if (!Flags_GetEventChkInf(EVENTCHKINF_USED_WATER_TEMPLE_BLUE_WARP)) { // have not beaten Water Temple switch (gSaveContext.entranceIndex) { - case 0x019D: // Zora River from behind waterfall - case 0x01DD: // Zora River from LW water shortcut - case 0x04DA: // Lost Woods water shortcut from ZR + case ENTR_ZORAS_RIVER_2: // Zora River from behind waterfall + case ENTR_ZORAS_RIVER_4: // Zora River from LW water shortcut + case ENTR_LOST_WOODS_7: // Lost Woods water shortcut from ZR gWeatherMode = 3; return; } switch (gPlayState->sceneNum) { - case 88: // Zora's Domain - case 89: // Zora's Fountain + case SCENE_ZORAS_DOMAIN: // Zora's Domain + case SCENE_ZORAS_FOUNTAIN: // Zora's Fountain gWeatherMode = 3; return; } @@ -616,13 +631,13 @@ void Entrance_OverrideWeatherState() { if (((gSaveContext.inventory.questItems & 0x7) == 0x7) && // Have forest, fire, and water medallion !(gSaveContext.sceneFlags[24].clear & 0x02)) { // have not beaten Bongo Bongo switch (gPlayState->sceneNum) { - case 82: // Kakariko - case 83: // Graveyard + case SCENE_KAKARIKO_VILLAGE: // Kakariko + case SCENE_GRAVEYARD: // Graveyard gPlayState->envCtx.gloomySkyMode = 2; switch (gSaveContext.entranceIndex) { - case 0x00DB: // Kakariko from HF - case 0x0191: // Kakariko from Death Mountain Trail - case 0x0205: // Graveyard from Shadow Temple + case ENTR_KAKARIKO_VILLAGE_0: // Kakariko from HF + case ENTR_KAKARIKO_VILLAGE_1: // Kakariko from Death Mountain Trail + case ENTR_GRAVEYARD_1: // Graveyard from Shadow Temple break; default: gWeatherMode = 5; @@ -632,21 +647,21 @@ void Entrance_OverrideWeatherState() { } // Death Mountain Cloudy if (!Flags_GetEventChkInf(EVENTCHKINF_USED_FIRE_TEMPLE_BLUE_WARP)) { // have not beaten Fire Temple - if (gPlayState->nextEntranceIndex == 0x04D6) { // Lost Woods Goron City Shortcut + if (gPlayState->nextEntranceIndex == ENTR_LOST_WOODS_6) { // Lost Woods Goron City Shortcut gWeatherMode = 2; return; } switch (gPlayState->sceneNum) { - case 82: // Kakariko - case 83: // Graveyard - case 96: // Death Mountain Trail - case 97: // Death Mountain Crater + case SCENE_KAKARIKO_VILLAGE: // Kakariko + case SCENE_GRAVEYARD: // Graveyard + case SCENE_DEATH_MOUNTAIN_TRAIL: // Death Mountain Trail + case SCENE_DEATH_MOUNTAIN_CRATER: // Death Mountain Crater if (!gPlayState->envCtx.gloomySkyMode) { gPlayState->envCtx.gloomySkyMode = 1; } switch (gSaveContext.entranceIndex) { - case 0x00DB: // Kakariko from HF - case 0x0195: // Kakariko from Graveyard + case ENTR_KAKARIKO_VILLAGE_0: // Kakariko from HF + case ENTR_KAKARIKO_VILLAGE_2: // Kakariko from Graveyard break; default: gWeatherMode = 2; @@ -661,13 +676,13 @@ void Entrance_OverrideWeatherState() { // Child should always be thrown in the stream when caught in the valley, and placed at the fortress entrance from valley when caught in the fortress void Entrance_OverrideGeurdoGuardCapture(void) { if (LINK_IS_CHILD) { - gPlayState->nextEntranceIndex = 0x1A5; // Geurdo Valley thrown out + gPlayState->nextEntranceIndex = ENTR_GERUDO_VALLEY_1; // Geurdo Valley thrown out } if ((LINK_IS_CHILD || Randomizer_GetSettingValue(RSK_SHUFFLE_OVERWORLD_ENTRANCES)) && - gPlayState->nextEntranceIndex == 0x1A5) { // Geurdo Valley thrown out - if (gPlayState->sceneNum != 0x5A) { // Geurdo Valley - gPlayState->nextEntranceIndex = 0x129; // Gerudo Fortress + gPlayState->nextEntranceIndex == ENTR_GERUDO_VALLEY_1) { // Geurdo Valley thrown out + if (gPlayState->sceneNum != SCENE_GERUDO_VALLEY) { // Geurdo Valley + gPlayState->nextEntranceIndex = ENTR_GERUDOS_FORTRESS_0; // Gerudo Fortress } } } diff --git a/soh/soh/Enhancements/randomizer/randomizer_entrance.h b/soh/soh/Enhancements/randomizer/randomizer_entrance.h index c00f29701..6751bbbad 100644 --- a/soh/soh/Enhancements/randomizer/randomizer_entrance.h +++ b/soh/soh/Enhancements/randomizer/randomizer_entrance.h @@ -6,32 +6,78 @@ //Entrance Table Data: https://wiki.cloudmodding.com/oot/Entrance_Table_(Data) //Accessed June 2021, published content date at the time was 14 March 2020, at 21:47 -#define ENTRANCE_TABLE_SIZE 0x0614 +#define ENTRANCE_TABLE_SIZE ENTR_MAX -#define DEKU_TREE_ENTRANCE 0x0000 -#define DODONGOS_CAVERN_ENTRANCE 0x0004 -#define JABU_JABUS_BELLY_ENTRANCE 0x0028 -#define FOREST_TEMPLE_ENTRANCE 0x169 -#define FIRE_TEMPLE_ENTRANCE 0x165 -#define WATER_TEMPLE_ENTRANCE 0x0010 -#define SPIRIT_TEMPLE_ENTRANCE 0x0082 -#define SHADOW_TEMPLE_ENTRANCE 0x0037 -#define BOTTOM_OF_THE_WELL_ENTRANCE 0x0098 -#define GERUDO_TRAINING_GROUNDS_ENTRANCE 0x0008 -#define ICE_CAVERN_ENTRANCE 0x0088 -#define GANONS_CASTLE_ENTRANCE 0x0467 -#define LINK_HOUSE_SAVEWARP_ENTRANCE 0x00BB +#define DEKU_TREE_ENTRANCE ENTR_DEKU_TREE_0 +#define DODONGOS_CAVERN_ENTRANCE ENTR_DODONGOS_CAVERN_0 +#define JABU_JABUS_BELLY_ENTRANCE ENTR_JABU_JABU_0 +#define FOREST_TEMPLE_ENTRANCE ENTR_FOREST_TEMPLE_0 +#define FIRE_TEMPLE_ENTRANCE ENTR_FIRE_TEMPLE_0 +#define WATER_TEMPLE_ENTRANCE ENTR_WATER_TEMPLE_0 +#define SPIRIT_TEMPLE_ENTRANCE ENTR_SPIRIT_TEMPLE_0 +#define SHADOW_TEMPLE_ENTRANCE ENTR_SHADOW_TEMPLE_0 +#define BOTTOM_OF_THE_WELL_ENTRANCE ENTR_BOTTOM_OF_THE_WELL_0 +#define GERUDO_TRAINING_GROUNDS_ENTRANCE ENTR_GERUDO_TRAINING_GROUND_0 +#define ICE_CAVERN_ENTRANCE ENTR_ICE_CAVERN_0 +#define GANONS_CASTLE_ENTRANCE ENTR_INSIDE_GANONS_CASTLE_0 +#define LINK_HOUSE_SAVEWARP_ENTRANCE ENTR_LINKS_HOUSE_0 #define ENTRANCE_RANDO_GROTTO_LOAD_START 0x0700 #define ENTRANCE_RANDO_GROTTO_EXIT_START 0x0800 #define MAX_ENTRANCE_RANDO_USED_INDEX 0x0820 +typedef enum { + /* 0x00 */ GROTTO_COLOSSUS_OFFSET, + /* 0x01 */ GROTTO_LH_OFFSET, + /* 0x02 */ GROTTO_ZR_STORMS_OFFSET, + /* 0x03 */ GROTTO_ZR_FAIRY_OFFSET, + /* 0x04 */ GROTTO_ZR_OPEN_OFFSET, + /* 0x05 */ GROTTO_DMC_HAMMER_OFFSET, + /* 0x06 */ GROTTO_DMC_UPPER_OFFSET, + /* 0x07 */ GROTTO_GORON_CITY_OFFSET, + /* 0x08 */ GROTTO_DMT_STORMS_OFFSET, + /* 0x09 */ GROTTO_DMT_COW_OFFSET, + /* 0x0A */ GROTTO_KAK_OPEN_OFFSET, + /* 0x0B */ GROTTO_KAK_REDEAD_OFFSET, + /* 0x0C */ GROTTO_HC_STORMS_OFFSET, + /* 0x0D */ GROTTO_HF_TEKTITE_OFFSET, + /* 0x0E */ GROTTO_HF_NEAR_KAK_OFFSET, + /* 0x0F */ GROTTO_HF_FAIRY_OFFSET, + /* 0x10 */ GROTTO_HF_NEAR_MARKET_OFFSET, + /* 0x11 */ GROTTO_HF_COW_OFFSET, + /* 0x12 */ GROTTO_HF_INSIDE_FENCE_OFFSET, + /* 0x13 */ GROTTO_HF_OPEN_OFFSET, + /* 0x14 */ GROTTO_HF_SOUTHEAST_OFFSET, + /* 0x15 */ GROTTO_LLR_OFFSET, + /* 0x16 */ GROTTO_SFM_WOLFOS_OFFSET, + /* 0x17 */ GROTTO_SFM_STORMS_OFFSET, + /* 0x18 */ GROTTO_SFM_FAIRY_OFFSET, + /* 0x19 */ GROTTO_LW_SCRUBS_OFFSET, + /* 0x1A */ GROTTO_LW_NEAR_SHORTCUTS_OFFSET, + /* 0x1B */ GROTTO_KF_STORMS_OFFSET, + /* 0x1C */ GROTTO_ZD_STORMS_OFFSET, + /* 0x1D */ GROTTO_GF_STORMS_OFFSET, + /* 0x1E */ GROTTO_GV_STORMS_OFFSET, + /* 0x1F */ GROTTO_GV_OCTOROK_OFFSET, + /* 0x20 */ GROTTO_LW_DEKU_THEATRE_OFFSET, + /* 0x21 */ GROTTO_OFFSET_MAX, +} GrottoEntranceOffsets; + +#define ENTRANCE_RANDO_GROTTO_LOAD(index) ENTRANCE_RANDO_GROTTO_LOAD_START + index +#define ENTRANCE_RANDO_GROTTO_EXIT(index) ENTRANCE_RANDO_GROTTO_EXIT_START + index + #define ENTRANCE_OVERRIDES_MAX_COUNT 259 // 11 one-way entrances + 124 two-way entrances (x2) #define SHUFFLEABLE_BOSS_COUNT 8 #define SAVEFILE_ENTRANCES_DISCOVERED_IDX_COUNT 66 // Max entrance rando index is 0x0820, (2080 / 32 == 65) + 1 #define SAVEFILE_SCENES_DISCOVERED_IDX_COUNT 4 // Max scene ID is 0x6E, (110 / 32 == 3) + 1 +#define ENTRANCE_INFO_FIELD(continueBgm, displayTitleCard, endTransType, startTransType) \ + (((continueBgm) ? ENTRANCE_INFO_CONTINUE_BGM_FLAG : 0) | \ + ((displayTitleCard) ? ENTRANCE_INFO_DISPLAY_TITLE_CARD_FLAG : 0) | \ + (((endTransType) << ENTRANCE_INFO_END_TRANS_TYPE_SHIFT) & ENTRANCE_INFO_END_TRANS_TYPE_MASK) | \ + (((startTransType) << ENTRANCE_INFO_START_TRANS_TYPE_SHIFT) & ENTRANCE_INFO_START_TRANS_TYPE_MASK)) + typedef struct { int16_t index; int16_t destination; diff --git a/soh/soh/Enhancements/randomizer/randomizer_entrance_tracker.cpp b/soh/soh/Enhancements/randomizer/randomizer_entrance_tracker.cpp index fe335c2b6..82ad8d47d 100644 --- a/soh/soh/Enhancements/randomizer/randomizer_entrance_tracker.cpp +++ b/soh/soh/Enhancements/randomizer/randomizer_entrance_tracker.cpp @@ -67,305 +67,306 @@ static std::string groupTypeNames[] = { }; // Entrance data for the tracker taken from the 3ds rando entrance tracker, and supplemented with scene/spawn info and meta search tags +// ENTR_HYRULE_FIELD_10 and ENTR_POTION_SHOP_KAKARIKO_1 have been repurposed for entrance randomizer const EntranceData entranceData[] = { - //index, reverse, scenes (and spawns), source name, destination name, source group, destination group, type, metaTag, oneExit - { 0x00BB, -1, SINGLE_SCENE_INFO(0x34), "Child Spawn", "Link's House", ENTRANCE_GROUP_ONE_WAY, ENTRANCE_GROUP_ONE_WAY, ENTRANCE_TYPE_ONE_WAY}, - { 0x0282, -1, SINGLE_SCENE_INFO(0x43), "Adult Spawn", "Temple of Time", ENTRANCE_GROUP_ONE_WAY, ENTRANCE_GROUP_ONE_WAY, ENTRANCE_TYPE_ONE_WAY}, + //index, reverse, scenes (and spawns), source name, destination name, source group, destination group, type, metaTag, oneExit + { ENTR_LINKS_HOUSE_0, -1, SINGLE_SCENE_INFO(SCENE_LINKS_HOUSE), "Child Spawn", "Link's House", ENTRANCE_GROUP_ONE_WAY, ENTRANCE_GROUP_ONE_WAY, ENTRANCE_TYPE_ONE_WAY}, + { ENTR_HYRULE_FIELD_10, -1, SINGLE_SCENE_INFO(SCENE_TEMPLE_OF_TIME), "Adult Spawn", "Temple of Time", ENTRANCE_GROUP_ONE_WAY, ENTRANCE_GROUP_ONE_WAY, ENTRANCE_TYPE_ONE_WAY}, - { 0x0600, -1, {{ -1 }}, "Minuet of Forest", "SFM Warp Pad", ENTRANCE_GROUP_ONE_WAY, ENTRANCE_GROUP_ONE_WAY, ENTRANCE_TYPE_ONE_WAY}, - { 0x04F6, -1, {{ -1 }}, "Bolero of Fire", "DMC Warp Pad", ENTRANCE_GROUP_ONE_WAY, ENTRANCE_GROUP_ONE_WAY, ENTRANCE_TYPE_ONE_WAY}, - { 0x0604, -1, {{ -1 }}, "Serenade of Water", "Lake Hylia Warp Pad", ENTRANCE_GROUP_ONE_WAY, ENTRANCE_GROUP_ONE_WAY, ENTRANCE_TYPE_ONE_WAY}, - { 0x01F1, -1, {{ -1 }}, "Requiem of Spirit", "Desert Colossus Warp Pad", ENTRANCE_GROUP_ONE_WAY, ENTRANCE_GROUP_ONE_WAY, ENTRANCE_TYPE_ONE_WAY}, - { 0x0568, -1, {{ -1 }}, "Nocturne of Shadow", "Graveyard Warp Pad", ENTRANCE_GROUP_ONE_WAY, ENTRANCE_GROUP_ONE_WAY, ENTRANCE_TYPE_ONE_WAY}, - { 0x05F4, -1, {{ -1 }}, "Prelude of Light", "Temple of Time Warp Pad", ENTRANCE_GROUP_ONE_WAY, ENTRANCE_GROUP_ONE_WAY, ENTRANCE_TYPE_ONE_WAY}, + { ENTR_SACRED_FOREST_MEADOW_2, -1, {{ -1 }}, "Minuet of Forest", "SFM Warp Pad", ENTRANCE_GROUP_ONE_WAY, ENTRANCE_GROUP_ONE_WAY, ENTRANCE_TYPE_ONE_WAY}, + { ENTR_DEATH_MOUNTAIN_CRATER_4, -1, {{ -1 }}, "Bolero of Fire", "DMC Warp Pad", ENTRANCE_GROUP_ONE_WAY, ENTRANCE_GROUP_ONE_WAY, ENTRANCE_TYPE_ONE_WAY}, + { ENTR_LAKE_HYLIA_8, -1, {{ -1 }}, "Serenade of Water", "Lake Hylia Warp Pad", ENTRANCE_GROUP_ONE_WAY, ENTRANCE_GROUP_ONE_WAY, ENTRANCE_TYPE_ONE_WAY}, + { ENTR_DESERT_COLOSSUS_5, -1, {{ -1 }}, "Requiem of Spirit", "Desert Colossus Warp Pad", ENTRANCE_GROUP_ONE_WAY, ENTRANCE_GROUP_ONE_WAY, ENTRANCE_TYPE_ONE_WAY}, + { ENTR_GRAVEYARD_7, -1, {{ -1 }}, "Nocturne of Shadow", "Graveyard Warp Pad", ENTRANCE_GROUP_ONE_WAY, ENTRANCE_GROUP_ONE_WAY, ENTRANCE_TYPE_ONE_WAY}, + { ENTR_TEMPLE_OF_TIME_7, -1, {{ -1 }}, "Prelude of Light", "Temple of Time Warp Pad", ENTRANCE_GROUP_ONE_WAY, ENTRANCE_GROUP_ONE_WAY, ENTRANCE_TYPE_ONE_WAY}, - { 0x0554, -1, SINGLE_SCENE_INFO(0x60), "DMT Owl Flight", "Kakariko Village Owl Drop", ENTRANCE_GROUP_ONE_WAY, ENTRANCE_GROUP_ONE_WAY, ENTRANCE_TYPE_ONE_WAY}, - { 0x027E, -1, SINGLE_SCENE_INFO(0x57), "LH Owl Flight", "Hyrule Field Owl Drop", ENTRANCE_GROUP_ONE_WAY, ENTRANCE_GROUP_ONE_WAY, ENTRANCE_TYPE_ONE_WAY}, + { ENTR_KAKARIKO_VILLAGE_14, -1, SINGLE_SCENE_INFO(SCENE_DEATH_MOUNTAIN_TRAIL), "DMT Owl Flight", "Kakariko Village Owl Drop", ENTRANCE_GROUP_ONE_WAY, ENTRANCE_GROUP_ONE_WAY, ENTRANCE_TYPE_ONE_WAY}, + { ENTR_HYRULE_FIELD_9, -1, SINGLE_SCENE_INFO(SCENE_LAKE_HYLIA), "LH Owl Flight", "Hyrule Field Owl Drop", ENTRANCE_GROUP_ONE_WAY, ENTRANCE_GROUP_ONE_WAY, ENTRANCE_TYPE_ONE_WAY}, // Kokiri Forest - { 0x05E0, 0x020D, SINGLE_SCENE_INFO(0x55), "KF", "Lost Woods Bridge", ENTRANCE_GROUP_KOKIRI_FOREST, ENTRANCE_GROUP_LOST_WOODS, ENTRANCE_TYPE_OVERWORLD, "lw"}, - { 0x011E, 0x0286, SINGLE_SCENE_INFO(0x55), "KF", "Lost Woods", ENTRANCE_GROUP_KOKIRI_FOREST, ENTRANCE_GROUP_LOST_WOODS, ENTRANCE_TYPE_OVERWORLD, "lw"}, - { 0x0272, 0x0211, SINGLE_SCENE_INFO(0x55), "KF", "Link's House", ENTRANCE_GROUP_KOKIRI_FOREST, ENTRANCE_GROUP_KOKIRI_FOREST, ENTRANCE_TYPE_INTERIOR, "", 1}, - { 0x0433, 0x0443, SINGLE_SCENE_INFO(0x55), "KF", "Mido's House", ENTRANCE_GROUP_KOKIRI_FOREST, ENTRANCE_GROUP_KOKIRI_FOREST, ENTRANCE_TYPE_INTERIOR, "", 1}, - { 0x0437, 0x0447, SINGLE_SCENE_INFO(0x55), "KF", "Saria's House", ENTRANCE_GROUP_KOKIRI_FOREST, ENTRANCE_GROUP_KOKIRI_FOREST, ENTRANCE_TYPE_INTERIOR, "", 1}, - { 0x009C, 0x033C, SINGLE_SCENE_INFO(0x55), "KF", "House of Twins", ENTRANCE_GROUP_KOKIRI_FOREST, ENTRANCE_GROUP_KOKIRI_FOREST, ENTRANCE_TYPE_INTERIOR, "", 1}, - { 0x00C9, 0x026A, SINGLE_SCENE_INFO(0x55), "KF", "Know-It-All House", ENTRANCE_GROUP_KOKIRI_FOREST, ENTRANCE_GROUP_KOKIRI_FOREST, ENTRANCE_TYPE_INTERIOR, "", 1}, - { 0x00C1, 0x0266, SINGLE_SCENE_INFO(0x55), "KF", "KF Shop", ENTRANCE_GROUP_KOKIRI_FOREST, ENTRANCE_GROUP_KOKIRI_FOREST, ENTRANCE_TYPE_INTERIOR, "", 1}, - { 0x071B, 0x081B, SINGLE_SCENE_INFO(0x55), "KF", "KF Storms Grotto", ENTRANCE_GROUP_KOKIRI_FOREST, ENTRANCE_GROUP_KOKIRI_FOREST, ENTRANCE_TYPE_GROTTO, "chest", 1}, - { 0x0000, 0x0209, SINGLE_SCENE_INFO(0x55), "KF", "Deku Tree", ENTRANCE_GROUP_KOKIRI_FOREST, ENTRANCE_GROUP_KOKIRI_FOREST, ENTRANCE_TYPE_DUNGEON, "", 1}, - { 0x0211, 0x0272, SINGLE_SCENE_INFO(0x34), "Link's House", "KF", ENTRANCE_GROUP_KOKIRI_FOREST, ENTRANCE_GROUP_KOKIRI_FOREST, ENTRANCE_TYPE_INTERIOR, ""}, - { 0x0443, 0x0433, SINGLE_SCENE_INFO(0x28), "Mido's House", "KF", ENTRANCE_GROUP_KOKIRI_FOREST, ENTRANCE_GROUP_KOKIRI_FOREST, ENTRANCE_TYPE_INTERIOR, ""}, - { 0x0447, 0x0437, SINGLE_SCENE_INFO(0x29), "Saria's House", "KF", ENTRANCE_GROUP_KOKIRI_FOREST, ENTRANCE_GROUP_KOKIRI_FOREST, ENTRANCE_TYPE_INTERIOR, ""}, - { 0x033C, 0x009C, SINGLE_SCENE_INFO(0x27), "House of Twins", "KF", ENTRANCE_GROUP_KOKIRI_FOREST, ENTRANCE_GROUP_KOKIRI_FOREST, ENTRANCE_TYPE_INTERIOR, ""}, - { 0x026A, 0x00C9, SINGLE_SCENE_INFO(0x26), "Know-It-All House", "KF", ENTRANCE_GROUP_KOKIRI_FOREST, ENTRANCE_GROUP_KOKIRI_FOREST, ENTRANCE_TYPE_INTERIOR, ""}, - { 0x0266, 0x00C1, SINGLE_SCENE_INFO(0x2D), "KF Shop", "KF", ENTRANCE_GROUP_KOKIRI_FOREST, ENTRANCE_GROUP_KOKIRI_FOREST, ENTRANCE_TYPE_INTERIOR, ""}, - { 0x081B, 0x071B, {{ 0x3E, 0x00 }}, "KF Storms Grotto", "KF", ENTRANCE_GROUP_KOKIRI_FOREST, ENTRANCE_GROUP_KOKIRI_FOREST, ENTRANCE_TYPE_GROTTO, "chest"}, - { 0x0209, 0x0000, SINGLE_SCENE_INFO(0x00), "Deku Tree", "KF", ENTRANCE_GROUP_KOKIRI_FOREST, ENTRANCE_GROUP_KOKIRI_FOREST, ENTRANCE_TYPE_DUNGEON, ""}, - { 0x040F, 0x0252, SINGLE_SCENE_INFO(0x00), "Deku Tree Boss Door", "Gohma", ENTRANCE_GROUP_KOKIRI_FOREST, ENTRANCE_GROUP_KOKIRI_FOREST, ENTRANCE_TYPE_DUNGEON, "", 1}, - { 0x0252, 0x040F, SINGLE_SCENE_INFO(0x11), "Gohma", "Deku Tree Boss Door", ENTRANCE_GROUP_KOKIRI_FOREST, ENTRANCE_GROUP_KOKIRI_FOREST, ENTRANCE_TYPE_DUNGEON, "", 1}, + { ENTR_LOST_WOODS_9, ENTR_KOKIRI_FOREST_2, SINGLE_SCENE_INFO(SCENE_KOKIRI_FOREST), "KF", "Lost Woods Bridge", ENTRANCE_GROUP_KOKIRI_FOREST, ENTRANCE_GROUP_LOST_WOODS, ENTRANCE_TYPE_OVERWORLD, "lw"}, + { ENTR_LOST_WOODS_0, ENTR_KOKIRI_FOREST_6, SINGLE_SCENE_INFO(SCENE_KOKIRI_FOREST), "KF", "Lost Woods", ENTRANCE_GROUP_KOKIRI_FOREST, ENTRANCE_GROUP_LOST_WOODS, ENTRANCE_TYPE_OVERWORLD, "lw"}, + { ENTR_LINKS_HOUSE_1, ENTR_KOKIRI_FOREST_3, SINGLE_SCENE_INFO(SCENE_KOKIRI_FOREST), "KF", "Link's House", ENTRANCE_GROUP_KOKIRI_FOREST, ENTRANCE_GROUP_KOKIRI_FOREST, ENTRANCE_TYPE_INTERIOR, "", 1}, + { ENTR_MIDOS_HOUSE_0, ENTR_KOKIRI_FOREST_9, SINGLE_SCENE_INFO(SCENE_KOKIRI_FOREST), "KF", "Mido's House", ENTRANCE_GROUP_KOKIRI_FOREST, ENTRANCE_GROUP_KOKIRI_FOREST, ENTRANCE_TYPE_INTERIOR, "", 1}, + { ENTR_SARIAS_HOUSE_0, ENTR_KOKIRI_FOREST_10, SINGLE_SCENE_INFO(SCENE_KOKIRI_FOREST), "KF", "Saria's House", ENTRANCE_GROUP_KOKIRI_FOREST, ENTRANCE_GROUP_KOKIRI_FOREST, ENTRANCE_TYPE_INTERIOR, "", 1}, + { ENTR_TWINS_HOUSE_0, ENTR_KOKIRI_FOREST_8, SINGLE_SCENE_INFO(SCENE_KOKIRI_FOREST), "KF", "House of Twins", ENTRANCE_GROUP_KOKIRI_FOREST, ENTRANCE_GROUP_KOKIRI_FOREST, ENTRANCE_TYPE_INTERIOR, "", 1}, + { ENTR_KNOW_IT_ALL_BROS_HOUSE_0, ENTR_KOKIRI_FOREST_5, SINGLE_SCENE_INFO(SCENE_KOKIRI_FOREST), "KF", "Know-It-All House", ENTRANCE_GROUP_KOKIRI_FOREST, ENTRANCE_GROUP_KOKIRI_FOREST, ENTRANCE_TYPE_INTERIOR, "", 1}, + { ENTR_KOKIRI_SHOP_0, ENTR_KOKIRI_FOREST_4, SINGLE_SCENE_INFO(SCENE_KOKIRI_FOREST), "KF", "KF Shop", ENTRANCE_GROUP_KOKIRI_FOREST, ENTRANCE_GROUP_KOKIRI_FOREST, ENTRANCE_TYPE_INTERIOR, "", 1}, + { ENTRANCE_RANDO_GROTTO_LOAD(GROTTO_KF_STORMS_OFFSET), ENTRANCE_RANDO_GROTTO_EXIT(GROTTO_KF_STORMS_OFFSET), SINGLE_SCENE_INFO(SCENE_KOKIRI_FOREST), "KF", "KF Storms Grotto", ENTRANCE_GROUP_KOKIRI_FOREST, ENTRANCE_GROUP_KOKIRI_FOREST, ENTRANCE_TYPE_GROTTO, "chest", 1}, + { ENTR_DEKU_TREE_0, ENTR_KOKIRI_FOREST_1, SINGLE_SCENE_INFO(SCENE_KOKIRI_FOREST), "KF", "Deku Tree", ENTRANCE_GROUP_KOKIRI_FOREST, ENTRANCE_GROUP_KOKIRI_FOREST, ENTRANCE_TYPE_DUNGEON, "", 1}, + { ENTR_KOKIRI_FOREST_3, ENTR_LINKS_HOUSE_1, SINGLE_SCENE_INFO(SCENE_LINKS_HOUSE), "Link's House", "KF", ENTRANCE_GROUP_KOKIRI_FOREST, ENTRANCE_GROUP_KOKIRI_FOREST, ENTRANCE_TYPE_INTERIOR, ""}, + { ENTR_KOKIRI_FOREST_9, ENTR_MIDOS_HOUSE_0, SINGLE_SCENE_INFO(SCENE_MIDOS_HOUSE), "Mido's House", "KF", ENTRANCE_GROUP_KOKIRI_FOREST, ENTRANCE_GROUP_KOKIRI_FOREST, ENTRANCE_TYPE_INTERIOR, ""}, + { ENTR_KOKIRI_FOREST_10, ENTR_SARIAS_HOUSE_0, SINGLE_SCENE_INFO(SCENE_SARIAS_HOUSE), "Saria's House", "KF", ENTRANCE_GROUP_KOKIRI_FOREST, ENTRANCE_GROUP_KOKIRI_FOREST, ENTRANCE_TYPE_INTERIOR, ""}, + { ENTR_KOKIRI_FOREST_8, ENTR_TWINS_HOUSE_0, SINGLE_SCENE_INFO(SCENE_TWINS_HOUSE), "House of Twins", "KF", ENTRANCE_GROUP_KOKIRI_FOREST, ENTRANCE_GROUP_KOKIRI_FOREST, ENTRANCE_TYPE_INTERIOR, ""}, + { ENTR_KOKIRI_FOREST_5, ENTR_KNOW_IT_ALL_BROS_HOUSE_0, SINGLE_SCENE_INFO(SCENE_KNOW_IT_ALL_BROS_HOUSE), "Know-It-All House", "KF", ENTRANCE_GROUP_KOKIRI_FOREST, ENTRANCE_GROUP_KOKIRI_FOREST, ENTRANCE_TYPE_INTERIOR, ""}, + { ENTR_KOKIRI_FOREST_4, ENTR_KOKIRI_SHOP_0, SINGLE_SCENE_INFO(SCENE_KOKIRI_SHOP), "KF Shop", "KF", ENTRANCE_GROUP_KOKIRI_FOREST, ENTRANCE_GROUP_KOKIRI_FOREST, ENTRANCE_TYPE_INTERIOR, ""}, + { ENTRANCE_RANDO_GROTTO_EXIT(GROTTO_KF_STORMS_OFFSET), ENTRANCE_RANDO_GROTTO_LOAD(GROTTO_KF_STORMS_OFFSET), {{ SCENE_GROTTOS, 0x00 }}, "KF Storms Grotto", "KF", ENTRANCE_GROUP_KOKIRI_FOREST, ENTRANCE_GROUP_KOKIRI_FOREST, ENTRANCE_TYPE_GROTTO, "chest"}, + { ENTR_KOKIRI_FOREST_1, ENTR_DEKU_TREE_0, SINGLE_SCENE_INFO(SCENE_DEKU_TREE), "Deku Tree", "KF", ENTRANCE_GROUP_KOKIRI_FOREST, ENTRANCE_GROUP_KOKIRI_FOREST, ENTRANCE_TYPE_DUNGEON, ""}, + { ENTR_DEKU_TREE_BOSS_0, ENTR_DEKU_TREE_1, SINGLE_SCENE_INFO(SCENE_DEKU_TREE), "Deku Tree Boss Door", "Gohma", ENTRANCE_GROUP_KOKIRI_FOREST, ENTRANCE_GROUP_KOKIRI_FOREST, ENTRANCE_TYPE_DUNGEON, "", 1}, + { ENTR_DEKU_TREE_1, ENTR_DEKU_TREE_BOSS_0, SINGLE_SCENE_INFO(SCENE_DEKU_TREE_BOSS), "Gohma", "Deku Tree Boss Door", ENTRANCE_GROUP_KOKIRI_FOREST, ENTRANCE_GROUP_KOKIRI_FOREST, ENTRANCE_TYPE_DUNGEON, "", 1}, // Lost Woods - { 0x020D, 0x05E0, SINGLE_SCENE_INFO(0x5B), "Lost Woods Bridge", "KF", ENTRANCE_GROUP_LOST_WOODS, ENTRANCE_GROUP_KOKIRI_FOREST, ENTRANCE_TYPE_OVERWORLD, "lw"}, - { 0x0185, 0x04DE, SINGLE_SCENE_INFO(0x5B), "Lost Woods Bridge", "Hyrule Field", ENTRANCE_GROUP_LOST_WOODS, ENTRANCE_GROUP_HYRULE_FIELD, ENTRANCE_TYPE_OVERWORLD, "lw,hf"}, - { 0x0286, 0x011E, SINGLE_SCENE_INFO(0x5B), "Lost Woods", "KF", ENTRANCE_GROUP_LOST_WOODS, ENTRANCE_GROUP_KOKIRI_FOREST, ENTRANCE_TYPE_OVERWORLD, "lw"}, - { 0x04E2, 0x04D6, SINGLE_SCENE_INFO(0x5B), "Lost Woods", "Goron City", ENTRANCE_GROUP_LOST_WOODS, ENTRANCE_GROUP_GORON_CITY, ENTRANCE_TYPE_OVERWORLD, "lw,gc"}, - { 0x01DD, 0x04DA, SINGLE_SCENE_INFO(0x5B), "Lost Woods", "ZR", ENTRANCE_GROUP_LOST_WOODS, ENTRANCE_GROUP_ZORAS_RIVER, ENTRANCE_TYPE_OVERWORLD, "lw"}, - { 0x00FC, 0x01A9, SINGLE_SCENE_INFO(0x5B), "Lost Woods", "SFM", ENTRANCE_GROUP_LOST_WOODS, ENTRANCE_GROUP_SFM, ENTRANCE_TYPE_OVERWORLD, "lw"}, - { 0x071A, 0x081A, SINGLE_SCENE_INFO(0x5B), "Lost Woods", "LW Near Shortcuts Grotto", ENTRANCE_GROUP_LOST_WOODS, ENTRANCE_GROUP_LOST_WOODS, ENTRANCE_TYPE_GROTTO, "lw,chest", 1}, - { 0x0719, 0x0819, SINGLE_SCENE_INFO(0x5B), "Lost Woods", "LW Scrubs Grotto", ENTRANCE_GROUP_LOST_WOODS, ENTRANCE_GROUP_LOST_WOODS, ENTRANCE_TYPE_GROTTO, "lw", 1}, - { 0x0720, 0x0820, SINGLE_SCENE_INFO(0x5B), "Lost Woods", "Deku Theater", ENTRANCE_GROUP_LOST_WOODS, ENTRANCE_GROUP_LOST_WOODS, ENTRANCE_TYPE_GROTTO, "lw,mask,stage", 1}, - { 0x081A, 0x071A, {{ 0x3E, 0x00 }}, "LW Near Shortcuts Grotto", "Lost Woods", ENTRANCE_GROUP_LOST_WOODS, ENTRANCE_GROUP_LOST_WOODS, ENTRANCE_TYPE_GROTTO, "lw,chest"}, - { 0x0819, 0x0719, {{ 0x3E, 0x07 }}, "LW Scrubs Grotto", "Lost Woods", ENTRANCE_GROUP_LOST_WOODS, ENTRANCE_GROUP_LOST_WOODS, ENTRANCE_TYPE_GROTTO, "lw"}, - { 0x0820, 0x0720, {{ 0x3E, 0x0C }}, "Deku Theater", "Lost Woods", ENTRANCE_GROUP_LOST_WOODS, ENTRANCE_GROUP_LOST_WOODS, ENTRANCE_TYPE_GROTTO, "lw,mask,stage"}, + { ENTR_KOKIRI_FOREST_2, ENTR_LOST_WOODS_9, SINGLE_SCENE_INFO(SCENE_LOST_WOODS), "Lost Woods Bridge", "KF", ENTRANCE_GROUP_LOST_WOODS, ENTRANCE_GROUP_KOKIRI_FOREST, ENTRANCE_TYPE_OVERWORLD, "lw"}, + { ENTR_HYRULE_FIELD_3, ENTR_LOST_WOODS_8, SINGLE_SCENE_INFO(SCENE_LOST_WOODS), "Lost Woods Bridge", "Hyrule Field", ENTRANCE_GROUP_LOST_WOODS, ENTRANCE_GROUP_HYRULE_FIELD, ENTRANCE_TYPE_OVERWORLD, "lw,hf"}, + { ENTR_KOKIRI_FOREST_6, ENTR_LOST_WOODS_0, SINGLE_SCENE_INFO(SCENE_LOST_WOODS), "Lost Woods", "KF", ENTRANCE_GROUP_LOST_WOODS, ENTRANCE_GROUP_KOKIRI_FOREST, ENTRANCE_TYPE_OVERWORLD, "lw"}, + { ENTR_GORON_CITY_3, ENTR_LOST_WOODS_6, SINGLE_SCENE_INFO(SCENE_LOST_WOODS), "Lost Woods", "Goron City", ENTRANCE_GROUP_LOST_WOODS, ENTRANCE_GROUP_GORON_CITY, ENTRANCE_TYPE_OVERWORLD, "lw,gc"}, + { ENTR_ZORAS_RIVER_4, ENTR_LOST_WOODS_7, SINGLE_SCENE_INFO(SCENE_LOST_WOODS), "Lost Woods", "ZR", ENTRANCE_GROUP_LOST_WOODS, ENTRANCE_GROUP_ZORAS_RIVER, ENTRANCE_TYPE_OVERWORLD, "lw"}, + { ENTR_SACRED_FOREST_MEADOW_0, ENTR_LOST_WOODS_1, SINGLE_SCENE_INFO(SCENE_LOST_WOODS), "Lost Woods", "SFM", ENTRANCE_GROUP_LOST_WOODS, ENTRANCE_GROUP_SFM, ENTRANCE_TYPE_OVERWORLD, "lw"}, + { ENTRANCE_RANDO_GROTTO_LOAD(GROTTO_LW_NEAR_SHORTCUTS_OFFSET), ENTRANCE_RANDO_GROTTO_EXIT(GROTTO_LW_NEAR_SHORTCUTS_OFFSET), SINGLE_SCENE_INFO(SCENE_LOST_WOODS), "Lost Woods", "LW Near Shortcuts Grotto", ENTRANCE_GROUP_LOST_WOODS, ENTRANCE_GROUP_LOST_WOODS, ENTRANCE_TYPE_GROTTO, "lw,chest", 1}, + { ENTRANCE_RANDO_GROTTO_LOAD(GROTTO_LW_SCRUBS_OFFSET), ENTRANCE_RANDO_GROTTO_EXIT(GROTTO_LW_SCRUBS_OFFSET), SINGLE_SCENE_INFO(SCENE_LOST_WOODS), "Lost Woods", "LW Scrubs Grotto", ENTRANCE_GROUP_LOST_WOODS, ENTRANCE_GROUP_LOST_WOODS, ENTRANCE_TYPE_GROTTO, "lw", 1}, + { ENTRANCE_RANDO_GROTTO_LOAD(GROTTO_LW_DEKU_THEATRE_OFFSET), ENTRANCE_RANDO_GROTTO_EXIT(GROTTO_LW_DEKU_THEATRE_OFFSET), SINGLE_SCENE_INFO(SCENE_LOST_WOODS), "Lost Woods", "Deku Theater", ENTRANCE_GROUP_LOST_WOODS, ENTRANCE_GROUP_LOST_WOODS, ENTRANCE_TYPE_GROTTO, "lw,mask,stage", 1}, + { ENTRANCE_RANDO_GROTTO_EXIT(GROTTO_LW_NEAR_SHORTCUTS_OFFSET), ENTRANCE_RANDO_GROTTO_LOAD(GROTTO_LW_NEAR_SHORTCUTS_OFFSET), {{ SCENE_GROTTOS, 0x00 }}, "LW Near Shortcuts Grotto", "Lost Woods", ENTRANCE_GROUP_LOST_WOODS, ENTRANCE_GROUP_LOST_WOODS, ENTRANCE_TYPE_GROTTO, "lw,chest"}, + { ENTRANCE_RANDO_GROTTO_EXIT(GROTTO_LW_SCRUBS_OFFSET), ENTRANCE_RANDO_GROTTO_LOAD(GROTTO_LW_SCRUBS_OFFSET), {{ SCENE_GROTTOS, 0x07 }}, "LW Scrubs Grotto", "Lost Woods", ENTRANCE_GROUP_LOST_WOODS, ENTRANCE_GROUP_LOST_WOODS, ENTRANCE_TYPE_GROTTO, "lw"}, + { ENTRANCE_RANDO_GROTTO_EXIT(GROTTO_LW_DEKU_THEATRE_OFFSET), ENTRANCE_RANDO_GROTTO_LOAD(GROTTO_LW_DEKU_THEATRE_OFFSET), {{ SCENE_GROTTOS, 0x0C }}, "Deku Theater", "Lost Woods", ENTRANCE_GROUP_LOST_WOODS, ENTRANCE_GROUP_LOST_WOODS, ENTRANCE_TYPE_GROTTO, "lw,mask,stage"}, // Sacred Forest Meadow - { 0x01A9, 0x00FC, SINGLE_SCENE_INFO(0x56), "SFM", "Lost Woods", ENTRANCE_GROUP_SFM, ENTRANCE_GROUP_LOST_WOODS, ENTRANCE_TYPE_OVERWORLD, "lw"}, - { 0x0716, 0x0816, SINGLE_SCENE_INFO(0x56), "SFM", "SFM Wolfos Grotto", ENTRANCE_GROUP_SFM, ENTRANCE_GROUP_SFM, ENTRANCE_TYPE_GROTTO, "chest", 1}, - { 0x0718, 0x0818, SINGLE_SCENE_INFO(0x56), "SFM", "SFM Fairy Grotto", ENTRANCE_GROUP_SFM, ENTRANCE_GROUP_SFM, ENTRANCE_TYPE_GROTTO, "", 1}, - { 0x0717, 0x0817, SINGLE_SCENE_INFO(0x56), "SFM", "SFM Storms Grotto", ENTRANCE_GROUP_SFM, ENTRANCE_GROUP_SFM, ENTRANCE_TYPE_GROTTO, "scrubs", 1}, - { 0x0169, 0x0215, SINGLE_SCENE_INFO(0x56), "SFM", "Forest Temple", ENTRANCE_GROUP_SFM, ENTRANCE_GROUP_SFM, ENTRANCE_TYPE_DUNGEON, "", 1}, - { 0x0816, 0x0716, {{ 0x3E, 0x08 }}, "SFM Wolfos Grotto", "SFM", ENTRANCE_GROUP_SFM, ENTRANCE_GROUP_SFM, ENTRANCE_TYPE_GROTTO}, - { 0x0818, 0x0718, {{ 0x3C, 0x00 }}, "SFM Fairy Grotto", "SFM", ENTRANCE_GROUP_SFM, ENTRANCE_GROUP_SFM, ENTRANCE_TYPE_GROTTO}, - { 0x0817, 0x0717, {{ 0x3E, 0x0A }}, "SFM Storms Grotto", "SFM", ENTRANCE_GROUP_SFM, ENTRANCE_GROUP_SFM, ENTRANCE_TYPE_GROTTO, "scrubs"}, - { 0x0215, 0x0169, SINGLE_SCENE_INFO(0x03), "Forest Temple", "SFM", ENTRANCE_GROUP_SFM, ENTRANCE_GROUP_SFM, ENTRANCE_TYPE_DUNGEON}, - { 0x000C, 0x024E, SINGLE_SCENE_INFO(0x03), "Forest Temple Boss Door", "Phantom Ganon", ENTRANCE_GROUP_SFM, ENTRANCE_GROUP_SFM, ENTRANCE_TYPE_DUNGEON, "", 1}, - { 0x024E, 0x000C, SINGLE_SCENE_INFO(0x14), "Phantom Ganon", "Forest Temple Boss Door", ENTRANCE_GROUP_SFM, ENTRANCE_GROUP_SFM, ENTRANCE_TYPE_DUNGEON, "", 1}, + { ENTR_LOST_WOODS_1, ENTR_SACRED_FOREST_MEADOW_0, SINGLE_SCENE_INFO(SCENE_SACRED_FOREST_MEADOW), "SFM", "Lost Woods", ENTRANCE_GROUP_SFM, ENTRANCE_GROUP_LOST_WOODS, ENTRANCE_TYPE_OVERWORLD, "lw"}, + { ENTRANCE_RANDO_GROTTO_LOAD(GROTTO_SFM_WOLFOS_OFFSET), ENTRANCE_RANDO_GROTTO_EXIT(GROTTO_SFM_WOLFOS_OFFSET), SINGLE_SCENE_INFO(SCENE_SACRED_FOREST_MEADOW), "SFM", "SFM Wolfos Grotto", ENTRANCE_GROUP_SFM, ENTRANCE_GROUP_SFM, ENTRANCE_TYPE_GROTTO, "chest", 1}, + { ENTRANCE_RANDO_GROTTO_LOAD(GROTTO_SFM_FAIRY_OFFSET), ENTRANCE_RANDO_GROTTO_EXIT(GROTTO_SFM_FAIRY_OFFSET), SINGLE_SCENE_INFO(SCENE_SACRED_FOREST_MEADOW), "SFM", "SFM Fairy Grotto", ENTRANCE_GROUP_SFM, ENTRANCE_GROUP_SFM, ENTRANCE_TYPE_GROTTO, "", 1}, + { ENTRANCE_RANDO_GROTTO_LOAD(GROTTO_SFM_STORMS_OFFSET), ENTRANCE_RANDO_GROTTO_EXIT(GROTTO_SFM_STORMS_OFFSET), SINGLE_SCENE_INFO(SCENE_SACRED_FOREST_MEADOW), "SFM", "SFM Storms Grotto", ENTRANCE_GROUP_SFM, ENTRANCE_GROUP_SFM, ENTRANCE_TYPE_GROTTO, "scrubs", 1}, + { ENTR_FOREST_TEMPLE_0, ENTR_SACRED_FOREST_MEADOW_1, SINGLE_SCENE_INFO(SCENE_SACRED_FOREST_MEADOW), "SFM", "Forest Temple", ENTRANCE_GROUP_SFM, ENTRANCE_GROUP_SFM, ENTRANCE_TYPE_DUNGEON, "", 1}, + { ENTRANCE_RANDO_GROTTO_EXIT(GROTTO_SFM_WOLFOS_OFFSET), ENTRANCE_RANDO_GROTTO_LOAD(GROTTO_SFM_WOLFOS_OFFSET), {{ SCENE_GROTTOS, 0x08 }}, "SFM Wolfos Grotto", "SFM", ENTRANCE_GROUP_SFM, ENTRANCE_GROUP_SFM, ENTRANCE_TYPE_GROTTO}, + { ENTRANCE_RANDO_GROTTO_EXIT(GROTTO_SFM_FAIRY_OFFSET), ENTRANCE_RANDO_GROTTO_LOAD(GROTTO_SFM_FAIRY_OFFSET), {{ SCENE_FAIRYS_FOUNTAIN, 0x00 }}, "SFM Fairy Grotto", "SFM", ENTRANCE_GROUP_SFM, ENTRANCE_GROUP_SFM, ENTRANCE_TYPE_GROTTO}, + { ENTRANCE_RANDO_GROTTO_EXIT(GROTTO_SFM_STORMS_OFFSET), ENTRANCE_RANDO_GROTTO_LOAD(GROTTO_SFM_STORMS_OFFSET), {{ SCENE_GROTTOS, 0x0A }}, "SFM Storms Grotto", "SFM", ENTRANCE_GROUP_SFM, ENTRANCE_GROUP_SFM, ENTRANCE_TYPE_GROTTO, "scrubs"}, + { ENTR_SACRED_FOREST_MEADOW_1, ENTR_FOREST_TEMPLE_0, SINGLE_SCENE_INFO(SCENE_FOREST_TEMPLE), "Forest Temple", "SFM", ENTRANCE_GROUP_SFM, ENTRANCE_GROUP_SFM, ENTRANCE_TYPE_DUNGEON}, + { ENTR_FOREST_TEMPLE_BOSS_0, ENTR_FOREST_TEMPLE_1, SINGLE_SCENE_INFO(SCENE_FOREST_TEMPLE), "Forest Temple Boss Door", "Phantom Ganon", ENTRANCE_GROUP_SFM, ENTRANCE_GROUP_SFM, ENTRANCE_TYPE_DUNGEON, "", 1}, + { ENTR_FOREST_TEMPLE_1, ENTR_FOREST_TEMPLE_BOSS_0, SINGLE_SCENE_INFO(SCENE_FOREST_TEMPLE_BOSS), "Phantom Ganon", "Forest Temple Boss Door", ENTRANCE_GROUP_SFM, ENTRANCE_GROUP_SFM, ENTRANCE_TYPE_DUNGEON, "", 1}, // Kakariko Village - { 0x017D, 0x00DB, SINGLE_SCENE_INFO(0x52), "Kakariko", "Hyrule Field", ENTRANCE_GROUP_KAKARIKO, ENTRANCE_GROUP_HYRULE_FIELD, ENTRANCE_TYPE_OVERWORLD, "hf"}, - { 0x00E4, 0x0195, SINGLE_SCENE_INFO(0x52), "Kakariko", "Graveyard", ENTRANCE_GROUP_KAKARIKO, ENTRANCE_GROUP_GRAVEYARD, ENTRANCE_TYPE_OVERWORLD}, - { 0x013D, 0x0191, SINGLE_SCENE_INFO(0x52), "Kakariko", "DMT", ENTRANCE_GROUP_KAKARIKO, ENTRANCE_GROUP_DEATH_MOUNTAIN_TRAIL, ENTRANCE_TYPE_OVERWORLD}, - { 0x02FD, 0x0349, SINGLE_SCENE_INFO(0x52), "Kakariko", "Carpenter Boss House", ENTRANCE_GROUP_KAKARIKO, ENTRANCE_GROUP_KAKARIKO, ENTRANCE_TYPE_INTERIOR, "", 1}, - { 0x0550, 0x04EE, SINGLE_SCENE_INFO(0x52), "Kakariko", "House of Skulltula", ENTRANCE_GROUP_KAKARIKO, ENTRANCE_GROUP_KAKARIKO, ENTRANCE_TYPE_INTERIOR, "", 1}, - { 0x039C, 0x0345, SINGLE_SCENE_INFO(0x52), "Kakariko", "Impa's House Front", ENTRANCE_GROUP_KAKARIKO, ENTRANCE_GROUP_KAKARIKO, ENTRANCE_TYPE_INTERIOR, "", 1}, - { 0x05C8, 0x05DC, SINGLE_SCENE_INFO(0x52), "Kakariko", "Impa's House Back", ENTRANCE_GROUP_KAKARIKO, ENTRANCE_GROUP_KAKARIKO, ENTRANCE_TYPE_INTERIOR, "cow", 1}, - { 0x0453, 0x0351, SINGLE_SCENE_INFO(0x52), "Kakariko", "Windmill", ENTRANCE_GROUP_KAKARIKO, ENTRANCE_GROUP_KAKARIKO, ENTRANCE_TYPE_INTERIOR, "", 1}, - { 0x003B, 0x0463, SINGLE_SCENE_INFO(0x52), "Kakariko", "Kak Shooting Gallery", ENTRANCE_GROUP_KAKARIKO, ENTRANCE_GROUP_KAKARIKO, ENTRANCE_TYPE_INTERIOR, "adult", 1}, - { 0x0072, 0x034D, SINGLE_SCENE_INFO(0x52), "Kakariko", "Granny's Potion Shop", ENTRANCE_GROUP_KAKARIKO, ENTRANCE_GROUP_KAKARIKO, ENTRANCE_TYPE_INTERIOR, "", 1}, - { 0x00B7, 0x0201, SINGLE_SCENE_INFO(0x52), "Kakariko", "Kak Bazaar", ENTRANCE_GROUP_KAKARIKO, ENTRANCE_GROUP_KAKARIKO, ENTRANCE_TYPE_INTERIOR, "shop", 1}, - { 0x0384, 0x044B, SINGLE_SCENE_INFO(0x52), "Kakariko", "Kak Potion Shop Front", ENTRANCE_GROUP_KAKARIKO, ENTRANCE_GROUP_KAKARIKO, ENTRANCE_TYPE_INTERIOR, "", 1}, - { 0x03EC, 0x04FF, SINGLE_SCENE_INFO(0x52), "Kakariko", "Kak Potion Shop Back", ENTRANCE_GROUP_KAKARIKO, ENTRANCE_GROUP_KAKARIKO, ENTRANCE_TYPE_INTERIOR, "", 1}, - { 0x070A, 0x080A, SINGLE_SCENE_INFO(0x52), "Kakariko", "Kak Open Grotto", ENTRANCE_GROUP_KAKARIKO, ENTRANCE_GROUP_KAKARIKO, ENTRANCE_TYPE_GROTTO, "chest", 1}, - { 0x070B, 0x080B, SINGLE_SCENE_INFO(0x52), "Kakariko", "Kak Redead Grotto", ENTRANCE_GROUP_KAKARIKO, ENTRANCE_GROUP_KAKARIKO, ENTRANCE_TYPE_GROTTO, "chest", 1}, - { 0x0098, 0x02A6, SINGLE_SCENE_INFO(0x52), "Kakariko", "Bottom of the Well", ENTRANCE_GROUP_KAKARIKO, ENTRANCE_GROUP_KAKARIKO, ENTRANCE_TYPE_DUNGEON, "botw", 1}, - { 0x0349, 0x02FD, SINGLE_SCENE_INFO(0x2A), "Carpenter Boss House", "Kakariko", ENTRANCE_GROUP_KAKARIKO, ENTRANCE_GROUP_KAKARIKO, ENTRANCE_TYPE_INTERIOR}, - { 0x04EE, 0x0550, SINGLE_SCENE_INFO(0x50), "House of Skulltula", "Kakariko", ENTRANCE_GROUP_KAKARIKO, ENTRANCE_GROUP_KAKARIKO, ENTRANCE_TYPE_INTERIOR}, - { 0x0345, 0x039C, SINGLE_SCENE_INFO(0x37), "Impa's House Front", "Kakariko", ENTRANCE_GROUP_KAKARIKO, ENTRANCE_GROUP_KAKARIKO, ENTRANCE_TYPE_INTERIOR}, - { 0x05DC, 0x05C8, SINGLE_SCENE_INFO(0x37), "Impa's House Back", "Kakariko", ENTRANCE_GROUP_KAKARIKO, ENTRANCE_GROUP_KAKARIKO, ENTRANCE_TYPE_INTERIOR, "cow"}, - { 0x0351, 0x0453, SINGLE_SCENE_INFO(0x48), "Windmill", "Kakariko", ENTRANCE_GROUP_KAKARIKO, ENTRANCE_GROUP_KAKARIKO, ENTRANCE_TYPE_INTERIOR}, - { 0x0463, 0x003B, {{ 0x42, 0x00 }}, "Kak Shooting Gallery", "Kakariko", ENTRANCE_GROUP_KAKARIKO, ENTRANCE_GROUP_KAKARIKO, ENTRANCE_TYPE_INTERIOR}, - { 0x034D, 0x0072, SINGLE_SCENE_INFO(0x4E), "Granny's Potion Shop", "Kakariko", ENTRANCE_GROUP_KAKARIKO, ENTRANCE_GROUP_KAKARIKO, ENTRANCE_TYPE_INTERIOR}, - { 0x0201, 0x00B7, {{ 0x2C, 0x00 }}, "Kak Bazaar", "Kakariko", ENTRANCE_GROUP_KAKARIKO, ENTRANCE_GROUP_KAKARIKO, ENTRANCE_TYPE_INTERIOR, "shop"}, - { 0x044B, 0x0384, SINGLE_SCENE_INFO(0x30), "Kak Potion Shop Front", "Kakariko", ENTRANCE_GROUP_KAKARIKO, ENTRANCE_GROUP_KAKARIKO, ENTRANCE_TYPE_INTERIOR}, - { 0x04FF, 0x03EC, SINGLE_SCENE_INFO(0x30), "Kak Potion Shop Back", "Kakariko", ENTRANCE_GROUP_KAKARIKO, ENTRANCE_GROUP_KAKARIKO, ENTRANCE_TYPE_INTERIOR}, - { 0x080A, 0x070A, {{ 0x3E, 0x00 }}, "Kak Open Grotto", "Kakariko", ENTRANCE_GROUP_KAKARIKO, ENTRANCE_GROUP_KAKARIKO, ENTRANCE_TYPE_GROTTO, "chest"}, - { 0x080B, 0x070B, {{ 0x3E, 0x03 }}, "Kak Redead Grotto", "Kakariko", ENTRANCE_GROUP_KAKARIKO, ENTRANCE_GROUP_KAKARIKO, ENTRANCE_TYPE_GROTTO, "chest"}, - { 0x02A6, 0x0098, SINGLE_SCENE_INFO(0x08), "Bottom of the Well", "Kakariko", ENTRANCE_GROUP_KAKARIKO, ENTRANCE_GROUP_KAKARIKO, ENTRANCE_TYPE_DUNGEON, "botw"}, + { ENTR_HYRULE_FIELD_1, ENTR_KAKARIKO_VILLAGE_0, SINGLE_SCENE_INFO(SCENE_KAKARIKO_VILLAGE), "Kakariko", "Hyrule Field", ENTRANCE_GROUP_KAKARIKO, ENTRANCE_GROUP_HYRULE_FIELD, ENTRANCE_TYPE_OVERWORLD, "hf"}, + { ENTR_GRAVEYARD_0, ENTR_KAKARIKO_VILLAGE_2, SINGLE_SCENE_INFO(SCENE_KAKARIKO_VILLAGE), "Kakariko", "Graveyard", ENTRANCE_GROUP_KAKARIKO, ENTRANCE_GROUP_GRAVEYARD, ENTRANCE_TYPE_OVERWORLD}, + { ENTR_DEATH_MOUNTAIN_TRAIL_0, ENTR_KAKARIKO_VILLAGE_1, SINGLE_SCENE_INFO(SCENE_KAKARIKO_VILLAGE), "Kakariko", "DMT", ENTRANCE_GROUP_KAKARIKO, ENTRANCE_GROUP_DEATH_MOUNTAIN_TRAIL, ENTRANCE_TYPE_OVERWORLD}, + { ENTR_KAKARIKO_CENTER_GUEST_HOUSE_0, ENTR_KAKARIKO_VILLAGE_6, SINGLE_SCENE_INFO(SCENE_KAKARIKO_VILLAGE), "Kakariko", "Carpenter Boss House", ENTRANCE_GROUP_KAKARIKO, ENTRANCE_GROUP_KAKARIKO, ENTRANCE_TYPE_INTERIOR, "", 1}, + { ENTR_HOUSE_OF_SKULLTULA_0, ENTR_KAKARIKO_VILLAGE_11, SINGLE_SCENE_INFO(SCENE_KAKARIKO_VILLAGE), "Kakariko", "House of Skulltula", ENTRANCE_GROUP_KAKARIKO, ENTRANCE_GROUP_KAKARIKO, ENTRANCE_TYPE_INTERIOR, "", 1}, + { ENTR_IMPAS_HOUSE_0, ENTR_KAKARIKO_VILLAGE_5, SINGLE_SCENE_INFO(SCENE_KAKARIKO_VILLAGE), "Kakariko", "Impa's House Front", ENTRANCE_GROUP_KAKARIKO, ENTRANCE_GROUP_KAKARIKO, ENTRANCE_TYPE_INTERIOR, "", 1}, + { ENTR_IMPAS_HOUSE_1, ENTR_KAKARIKO_VILLAGE_15, SINGLE_SCENE_INFO(SCENE_KAKARIKO_VILLAGE), "Kakariko", "Impa's House Back", ENTRANCE_GROUP_KAKARIKO, ENTRANCE_GROUP_KAKARIKO, ENTRANCE_TYPE_INTERIOR, "cow", 1}, + { ENTR_WINDMILL_AND_DAMPES_GRAVE_1, ENTR_KAKARIKO_VILLAGE_8, SINGLE_SCENE_INFO(SCENE_KAKARIKO_VILLAGE), "Kakariko", "Windmill", ENTRANCE_GROUP_KAKARIKO, ENTRANCE_GROUP_KAKARIKO, ENTRANCE_TYPE_INTERIOR, "", 1}, + { ENTR_SHOOTING_GALLERY_0, ENTR_KAKARIKO_VILLAGE_10, SINGLE_SCENE_INFO(SCENE_KAKARIKO_VILLAGE), "Kakariko", "Kak Shooting Gallery", ENTRANCE_GROUP_KAKARIKO, ENTRANCE_GROUP_KAKARIKO, ENTRANCE_TYPE_INTERIOR, "adult", 1}, + { ENTR_POTION_SHOP_GRANNY_0, ENTR_KAKARIKO_VILLAGE_7, SINGLE_SCENE_INFO(SCENE_KAKARIKO_VILLAGE), "Kakariko", "Granny's Potion Shop", ENTRANCE_GROUP_KAKARIKO, ENTRANCE_GROUP_KAKARIKO, ENTRANCE_TYPE_INTERIOR, "", 1}, + { ENTR_BAZAAR_0, ENTR_KAKARIKO_VILLAGE_3, SINGLE_SCENE_INFO(SCENE_KAKARIKO_VILLAGE), "Kakariko", "Kak Bazaar", ENTRANCE_GROUP_KAKARIKO, ENTRANCE_GROUP_KAKARIKO, ENTRANCE_TYPE_INTERIOR, "shop", 1}, + { ENTR_POTION_SHOP_KAKARIKO_0, ENTR_KAKARIKO_VILLAGE_9, SINGLE_SCENE_INFO(SCENE_KAKARIKO_VILLAGE), "Kakariko", "Kak Potion Shop Front", ENTRANCE_GROUP_KAKARIKO, ENTRANCE_GROUP_KAKARIKO, ENTRANCE_TYPE_INTERIOR, "", 1}, + { ENTR_POTION_SHOP_KAKARIKO_2, ENTR_KAKARIKO_VILLAGE_12, SINGLE_SCENE_INFO(SCENE_KAKARIKO_VILLAGE), "Kakariko", "Kak Potion Shop Back", ENTRANCE_GROUP_KAKARIKO, ENTRANCE_GROUP_KAKARIKO, ENTRANCE_TYPE_INTERIOR, "", 1}, + { ENTRANCE_RANDO_GROTTO_LOAD(GROTTO_KAK_OPEN_OFFSET), ENTRANCE_RANDO_GROTTO_EXIT(GROTTO_KAK_OPEN_OFFSET), SINGLE_SCENE_INFO(SCENE_KAKARIKO_VILLAGE), "Kakariko", "Kak Open Grotto", ENTRANCE_GROUP_KAKARIKO, ENTRANCE_GROUP_KAKARIKO, ENTRANCE_TYPE_GROTTO, "chest", 1}, + { ENTRANCE_RANDO_GROTTO_LOAD(GROTTO_KAK_REDEAD_OFFSET), ENTRANCE_RANDO_GROTTO_EXIT(GROTTO_KAK_REDEAD_OFFSET), SINGLE_SCENE_INFO(SCENE_KAKARIKO_VILLAGE), "Kakariko", "Kak Redead Grotto", ENTRANCE_GROUP_KAKARIKO, ENTRANCE_GROUP_KAKARIKO, ENTRANCE_TYPE_GROTTO, "chest", 1}, + { ENTR_BOTTOM_OF_THE_WELL_0, ENTR_KAKARIKO_VILLAGE_4, SINGLE_SCENE_INFO(SCENE_KAKARIKO_VILLAGE), "Kakariko", "Bottom of the Well", ENTRANCE_GROUP_KAKARIKO, ENTRANCE_GROUP_KAKARIKO, ENTRANCE_TYPE_DUNGEON, "botw", 1}, + { ENTR_KAKARIKO_VILLAGE_6, ENTR_KAKARIKO_CENTER_GUEST_HOUSE_0, SINGLE_SCENE_INFO(SCENE_KAKARIKO_CENTER_GUEST_HOUSE), "Carpenter Boss House", "Kakariko", ENTRANCE_GROUP_KAKARIKO, ENTRANCE_GROUP_KAKARIKO, ENTRANCE_TYPE_INTERIOR}, + { ENTR_KAKARIKO_VILLAGE_11, ENTR_HOUSE_OF_SKULLTULA_0, SINGLE_SCENE_INFO(SCENE_HOUSE_OF_SKULLTULA), "House of Skulltula", "Kakariko", ENTRANCE_GROUP_KAKARIKO, ENTRANCE_GROUP_KAKARIKO, ENTRANCE_TYPE_INTERIOR}, + { ENTR_KAKARIKO_VILLAGE_5, ENTR_IMPAS_HOUSE_0, SINGLE_SCENE_INFO(SCENE_IMPAS_HOUSE), "Impa's House Front", "Kakariko", ENTRANCE_GROUP_KAKARIKO, ENTRANCE_GROUP_KAKARIKO, ENTRANCE_TYPE_INTERIOR}, + { ENTR_KAKARIKO_VILLAGE_15, ENTR_IMPAS_HOUSE_1, SINGLE_SCENE_INFO(SCENE_IMPAS_HOUSE), "Impa's House Back", "Kakariko", ENTRANCE_GROUP_KAKARIKO, ENTRANCE_GROUP_KAKARIKO, ENTRANCE_TYPE_INTERIOR, "cow"}, + { ENTR_KAKARIKO_VILLAGE_8, ENTR_WINDMILL_AND_DAMPES_GRAVE_1, SINGLE_SCENE_INFO(SCENE_WINDMILL_AND_DAMPES_GRAVE), "Windmill", "Kakariko", ENTRANCE_GROUP_KAKARIKO, ENTRANCE_GROUP_KAKARIKO, ENTRANCE_TYPE_INTERIOR}, + { ENTR_KAKARIKO_VILLAGE_10, ENTR_SHOOTING_GALLERY_0, {{ SCENE_SHOOTING_GALLERY, 0x00 }}, "Kak Shooting Gallery", "Kakariko", ENTRANCE_GROUP_KAKARIKO, ENTRANCE_GROUP_KAKARIKO, ENTRANCE_TYPE_INTERIOR}, + { ENTR_KAKARIKO_VILLAGE_7, ENTR_POTION_SHOP_GRANNY_0, SINGLE_SCENE_INFO(SCENE_POTION_SHOP_GRANNY), "Granny's Potion Shop", "Kakariko", ENTRANCE_GROUP_KAKARIKO, ENTRANCE_GROUP_KAKARIKO, ENTRANCE_TYPE_INTERIOR}, + { ENTR_KAKARIKO_VILLAGE_3, ENTR_BAZAAR_0, {{ SCENE_BAZAAR, 0x00 }}, "Kak Bazaar", "Kakariko", ENTRANCE_GROUP_KAKARIKO, ENTRANCE_GROUP_KAKARIKO, ENTRANCE_TYPE_INTERIOR, "shop"}, + { ENTR_KAKARIKO_VILLAGE_9, ENTR_POTION_SHOP_KAKARIKO_0, SINGLE_SCENE_INFO(SCENE_POTION_SHOP_KAKARIKO), "Kak Potion Shop Front", "Kakariko", ENTRANCE_GROUP_KAKARIKO, ENTRANCE_GROUP_KAKARIKO, ENTRANCE_TYPE_INTERIOR}, + { ENTR_KAKARIKO_VILLAGE_12, ENTR_POTION_SHOP_KAKARIKO_2, SINGLE_SCENE_INFO(SCENE_POTION_SHOP_KAKARIKO), "Kak Potion Shop Back", "Kakariko", ENTRANCE_GROUP_KAKARIKO, ENTRANCE_GROUP_KAKARIKO, ENTRANCE_TYPE_INTERIOR}, + { ENTRANCE_RANDO_GROTTO_EXIT(GROTTO_KAK_OPEN_OFFSET), ENTRANCE_RANDO_GROTTO_LOAD(GROTTO_KAK_OPEN_OFFSET), {{ SCENE_GROTTOS, 0x00 }}, "Kak Open Grotto", "Kakariko", ENTRANCE_GROUP_KAKARIKO, ENTRANCE_GROUP_KAKARIKO, ENTRANCE_TYPE_GROTTO, "chest"}, + { ENTRANCE_RANDO_GROTTO_EXIT(GROTTO_KAK_REDEAD_OFFSET), ENTRANCE_RANDO_GROTTO_LOAD(GROTTO_KAK_REDEAD_OFFSET), {{ SCENE_GROTTOS, 0x03 }}, "Kak Redead Grotto", "Kakariko", ENTRANCE_GROUP_KAKARIKO, ENTRANCE_GROUP_KAKARIKO, ENTRANCE_TYPE_GROTTO, "chest"}, + { ENTR_KAKARIKO_VILLAGE_4, ENTR_BOTTOM_OF_THE_WELL_0, SINGLE_SCENE_INFO(SCENE_BOTTOM_OF_THE_WELL), "Bottom of the Well", "Kakariko", ENTRANCE_GROUP_KAKARIKO, ENTRANCE_GROUP_KAKARIKO, ENTRANCE_TYPE_DUNGEON, "botw"}, // The Graveyard - { 0x0195, 0x00E4, SINGLE_SCENE_INFO(0x53), "Graveyard", "Kakariko", ENTRANCE_GROUP_GRAVEYARD, ENTRANCE_GROUP_KAKARIKO, ENTRANCE_TYPE_OVERWORLD}, - { 0x030D, 0x0355, SINGLE_SCENE_INFO(0x53), "Graveyard", "Dampe's Shack", ENTRANCE_GROUP_GRAVEYARD, ENTRANCE_GROUP_GRAVEYARD, ENTRANCE_TYPE_INTERIOR, "", 1}, - { 0x004B, 0x035D, SINGLE_SCENE_INFO(0x53), "Graveyard", "Shield Grave", ENTRANCE_GROUP_GRAVEYARD, ENTRANCE_GROUP_GRAVEYARD, ENTRANCE_TYPE_GROTTO, "", 1}, - { 0x031C, 0x0361, SINGLE_SCENE_INFO(0x53), "Graveyard", "Heart Piece Grave", ENTRANCE_GROUP_GRAVEYARD, ENTRANCE_GROUP_GRAVEYARD, ENTRANCE_TYPE_GROTTO, "", 1}, - { 0x002D, 0x050B, SINGLE_SCENE_INFO(0x53), "Graveyard", "Composer's Grave", ENTRANCE_GROUP_GRAVEYARD, ENTRANCE_GROUP_GRAVEYARD, ENTRANCE_TYPE_GROTTO, "", 1}, - { 0x044F, 0x0359, SINGLE_SCENE_INFO(0x53), "Graveyard", "Dampe's Grave", ENTRANCE_GROUP_GRAVEYARD, ENTRANCE_GROUP_GRAVEYARD, ENTRANCE_TYPE_GROTTO, "race", 1}, - { 0x0037, 0x0205, SINGLE_SCENE_INFO(0x53), "Graveyard", "Shadow Temple", ENTRANCE_GROUP_GRAVEYARD, ENTRANCE_GROUP_GRAVEYARD, ENTRANCE_TYPE_DUNGEON, "", 1}, - { 0x0355, 0x030D, SINGLE_SCENE_INFO(0x3A), "Dampe's Shack", "Graveyard", ENTRANCE_GROUP_GRAVEYARD, ENTRANCE_GROUP_GRAVEYARD, ENTRANCE_TYPE_INTERIOR}, - { 0x035D, 0x004B, SINGLE_SCENE_INFO(0x40), "Shield Grave", "Graveyard", ENTRANCE_GROUP_GRAVEYARD, ENTRANCE_GROUP_GRAVEYARD, ENTRANCE_TYPE_GROTTO}, - { 0x0361, 0x031C, SINGLE_SCENE_INFO(0x3F), "Heart Piece Grave", "Graveyard", ENTRANCE_GROUP_GRAVEYARD, ENTRANCE_GROUP_GRAVEYARD, ENTRANCE_TYPE_GROTTO}, - { 0x050B, 0x002D, SINGLE_SCENE_INFO(0x41), "Composer's Grave", "Graveyard", ENTRANCE_GROUP_GRAVEYARD, ENTRANCE_GROUP_GRAVEYARD, ENTRANCE_TYPE_GROTTO}, - { 0x0359, 0x044F, SINGLE_SCENE_INFO(0x48), "Dampe's Grave", "Graveyard", ENTRANCE_GROUP_GRAVEYARD, ENTRANCE_GROUP_GRAVEYARD, ENTRANCE_TYPE_GROTTO, "race"}, - { 0x0205, 0x0037, SINGLE_SCENE_INFO(0x07), "Shadow Temple", "Graveyard", ENTRANCE_GROUP_GRAVEYARD, ENTRANCE_GROUP_GRAVEYARD, ENTRANCE_TYPE_DUNGEON}, - { 0x0413, 0x02B2, SINGLE_SCENE_INFO(0x07), "Shadow Temple Boss Door", "Bongo-Bongo", ENTRANCE_GROUP_GRAVEYARD, ENTRANCE_GROUP_GRAVEYARD, ENTRANCE_TYPE_DUNGEON, "", 1}, - { 0x02B2, 0x0413, SINGLE_SCENE_INFO(0x18), "Bongo-Bongo", "Shadow Temple Boss Door", ENTRANCE_GROUP_GRAVEYARD, ENTRANCE_GROUP_GRAVEYARD, ENTRANCE_TYPE_DUNGEON, "", 1}, + { ENTR_KAKARIKO_VILLAGE_2, ENTR_GRAVEYARD_0, SINGLE_SCENE_INFO(SCENE_GRAVEYARD), "Graveyard", "Kakariko", ENTRANCE_GROUP_GRAVEYARD, ENTRANCE_GROUP_KAKARIKO, ENTRANCE_TYPE_OVERWORLD}, + { ENTR_GRAVEKEEPERS_HUT_0, ENTR_GRAVEYARD_2, SINGLE_SCENE_INFO(SCENE_GRAVEYARD), "Graveyard", "Dampe's Shack", ENTRANCE_GROUP_GRAVEYARD, ENTRANCE_GROUP_GRAVEYARD, ENTRANCE_TYPE_INTERIOR, "", 1}, + { ENTR_GRAVE_WITH_FAIRYS_FOUNTAIN_0, ENTR_GRAVEYARD_4, SINGLE_SCENE_INFO(SCENE_GRAVEYARD), "Graveyard", "Shield Grave", ENTRANCE_GROUP_GRAVEYARD, ENTRANCE_GROUP_GRAVEYARD, ENTRANCE_TYPE_GROTTO, "", 1}, + { ENTR_REDEAD_GRAVE_0, ENTR_GRAVEYARD_5, SINGLE_SCENE_INFO(SCENE_GRAVEYARD), "Graveyard", "Heart Piece Grave", ENTRANCE_GROUP_GRAVEYARD, ENTRANCE_GROUP_GRAVEYARD, ENTRANCE_TYPE_GROTTO, "", 1}, + { ENTR_ROYAL_FAMILYS_TOMB_0, ENTR_GRAVEYARD_6, SINGLE_SCENE_INFO(SCENE_GRAVEYARD), "Graveyard", "Composer's Grave", ENTRANCE_GROUP_GRAVEYARD, ENTRANCE_GROUP_GRAVEYARD, ENTRANCE_TYPE_GROTTO, "", 1}, + { ENTR_WINDMILL_AND_DAMPES_GRAVE_0, ENTR_GRAVEYARD_3, SINGLE_SCENE_INFO(SCENE_GRAVEYARD), "Graveyard", "Dampe's Grave", ENTRANCE_GROUP_GRAVEYARD, ENTRANCE_GROUP_GRAVEYARD, ENTRANCE_TYPE_GROTTO, "race", 1}, + { ENTR_SHADOW_TEMPLE_0, ENTR_GRAVEYARD_1, SINGLE_SCENE_INFO(SCENE_GRAVEYARD), "Graveyard", "Shadow Temple", ENTRANCE_GROUP_GRAVEYARD, ENTRANCE_GROUP_GRAVEYARD, ENTRANCE_TYPE_DUNGEON, "", 1}, + { ENTR_GRAVEYARD_2, ENTR_GRAVEKEEPERS_HUT_0, SINGLE_SCENE_INFO(SCENE_GRAVEKEEPERS_HUT), "Dampe's Shack", "Graveyard", ENTRANCE_GROUP_GRAVEYARD, ENTRANCE_GROUP_GRAVEYARD, ENTRANCE_TYPE_INTERIOR}, + { ENTR_GRAVEYARD_4, ENTR_GRAVE_WITH_FAIRYS_FOUNTAIN_0, SINGLE_SCENE_INFO(SCENE_GRAVE_WITH_FAIRYS_FOUNTAIN), "Shield Grave", "Graveyard", ENTRANCE_GROUP_GRAVEYARD, ENTRANCE_GROUP_GRAVEYARD, ENTRANCE_TYPE_GROTTO}, + { ENTR_GRAVEYARD_5, ENTR_REDEAD_GRAVE_0, SINGLE_SCENE_INFO(SCENE_REDEAD_GRAVE), "Heart Piece Grave", "Graveyard", ENTRANCE_GROUP_GRAVEYARD, ENTRANCE_GROUP_GRAVEYARD, ENTRANCE_TYPE_GROTTO}, + { ENTR_GRAVEYARD_6, ENTR_ROYAL_FAMILYS_TOMB_0, SINGLE_SCENE_INFO(SCENE_ROYAL_FAMILYS_TOMB), "Composer's Grave", "Graveyard", ENTRANCE_GROUP_GRAVEYARD, ENTRANCE_GROUP_GRAVEYARD, ENTRANCE_TYPE_GROTTO}, + { ENTR_GRAVEYARD_3, ENTR_WINDMILL_AND_DAMPES_GRAVE_0, SINGLE_SCENE_INFO(SCENE_WINDMILL_AND_DAMPES_GRAVE), "Dampe's Grave", "Graveyard", ENTRANCE_GROUP_GRAVEYARD, ENTRANCE_GROUP_GRAVEYARD, ENTRANCE_TYPE_GROTTO, "race"}, + { ENTR_GRAVEYARD_1, ENTR_SHADOW_TEMPLE_0, SINGLE_SCENE_INFO(SCENE_SHADOW_TEMPLE), "Shadow Temple", "Graveyard", ENTRANCE_GROUP_GRAVEYARD, ENTRANCE_GROUP_GRAVEYARD, ENTRANCE_TYPE_DUNGEON}, + { ENTR_SHADOW_TEMPLE_BOSS_0, ENTR_SHADOW_TEMPLE_1, SINGLE_SCENE_INFO(SCENE_SHADOW_TEMPLE), "Shadow Temple Boss Door", "Bongo-Bongo", ENTRANCE_GROUP_GRAVEYARD, ENTRANCE_GROUP_GRAVEYARD, ENTRANCE_TYPE_DUNGEON, "", 1}, + { ENTR_SHADOW_TEMPLE_1, ENTR_SHADOW_TEMPLE_BOSS_0, SINGLE_SCENE_INFO(SCENE_SHADOW_TEMPLE_BOSS), "Bongo-Bongo", "Shadow Temple Boss Door", ENTRANCE_GROUP_GRAVEYARD, ENTRANCE_GROUP_GRAVEYARD, ENTRANCE_TYPE_DUNGEON, "", 1}, // Death Mountain Trail - { 0x0191, 0x013D, SINGLE_SCENE_INFO(0x60), "DMT", "Kakariko", ENTRANCE_GROUP_DEATH_MOUNTAIN_TRAIL, ENTRANCE_GROUP_KAKARIKO, ENTRANCE_TYPE_OVERWORLD}, - { 0x014D, 0x01B9, SINGLE_SCENE_INFO(0x60), "DMT", "Goron City", ENTRANCE_GROUP_DEATH_MOUNTAIN_TRAIL, ENTRANCE_GROUP_GORON_CITY, ENTRANCE_TYPE_OVERWORLD, "gc"}, - { 0x0147, 0x01BD, SINGLE_SCENE_INFO(0x60), "DMT", "DMC", ENTRANCE_GROUP_DEATH_MOUNTAIN_TRAIL, ENTRANCE_GROUP_DEATH_MOUNTAIN_CRATER, ENTRANCE_TYPE_OVERWORLD}, - { 0x0315, 0x045B, SINGLE_SCENE_INFO(0x60), "DMT", "DMT Great Fairy Fountain", ENTRANCE_GROUP_DEATH_MOUNTAIN_TRAIL, ENTRANCE_GROUP_DEATH_MOUNTAIN_TRAIL, ENTRANCE_TYPE_INTERIOR, "", 1}, - { 0x0708, 0x0808, SINGLE_SCENE_INFO(0x60), "DMT", "DMT Storms Grotto", ENTRANCE_GROUP_DEATH_MOUNTAIN_TRAIL, ENTRANCE_GROUP_DEATH_MOUNTAIN_TRAIL, ENTRANCE_TYPE_GROTTO, "chest", 1}, - { 0x0709, 0x0809, SINGLE_SCENE_INFO(0x60), "DMT", "DMT Cow Grotto", ENTRANCE_GROUP_DEATH_MOUNTAIN_TRAIL, ENTRANCE_GROUP_DEATH_MOUNTAIN_TRAIL, ENTRANCE_TYPE_GROTTO, "", 1}, - { 0x0004, 0x0242, SINGLE_SCENE_INFO(0x60), "DMT", "Dodongo's Cavern", ENTRANCE_GROUP_DEATH_MOUNTAIN_TRAIL, ENTRANCE_GROUP_DEATH_MOUNTAIN_TRAIL, ENTRANCE_TYPE_DUNGEON, "dc", 1}, - { 0x045B, 0x0315, {{ 0x3B, 0x00 }}, "DMT Great Fairy Fountain", "DMT", ENTRANCE_GROUP_DEATH_MOUNTAIN_TRAIL, ENTRANCE_GROUP_DEATH_MOUNTAIN_TRAIL, ENTRANCE_TYPE_INTERIOR}, - { 0x0808, 0x0708, {{ 0x3E, 0x00 }}, "DMT Storms Grotto", "DMT", ENTRANCE_GROUP_DEATH_MOUNTAIN_TRAIL, ENTRANCE_GROUP_DEATH_MOUNTAIN_TRAIL, ENTRANCE_TYPE_GROTTO, "chest"}, - { 0x0809, 0x0709, {{ 0x3E, 0x0D }}, "DMT Cow Grotto", "DMT", ENTRANCE_GROUP_DEATH_MOUNTAIN_TRAIL, ENTRANCE_GROUP_DEATH_MOUNTAIN_TRAIL, ENTRANCE_TYPE_GROTTO}, - { 0x0242, 0x0004, SINGLE_SCENE_INFO(0x01), "Dodongo's Cavern", "DMT", ENTRANCE_GROUP_DEATH_MOUNTAIN_TRAIL, ENTRANCE_GROUP_DEATH_MOUNTAIN_TRAIL, ENTRANCE_TYPE_DUNGEON, "dc"}, - { 0x040B, 0x00C5, SINGLE_SCENE_INFO(0x01), "Dodongo's Cavern Boss Door", "King Dodongo", ENTRANCE_GROUP_DEATH_MOUNTAIN_TRAIL, ENTRANCE_GROUP_DEATH_MOUNTAIN_TRAIL, ENTRANCE_TYPE_DUNGEON, "dc", 1}, - { 0x00C5, 0x040B, SINGLE_SCENE_INFO(0x12), "King Dodongo", "Dodongo's Cavern Boss Door", ENTRANCE_GROUP_DEATH_MOUNTAIN_TRAIL, ENTRANCE_GROUP_DEATH_MOUNTAIN_TRAIL, ENTRANCE_TYPE_DUNGEON, "dc", 1}, + { ENTR_GORON_CITY_0, ENTR_DEATH_MOUNTAIN_TRAIL_1, SINGLE_SCENE_INFO(SCENE_DEATH_MOUNTAIN_TRAIL), "DMT", "Goron City", ENTRANCE_GROUP_DEATH_MOUNTAIN_TRAIL, ENTRANCE_GROUP_GORON_CITY, ENTRANCE_TYPE_OVERWORLD, "gc"}, + { ENTR_KAKARIKO_VILLAGE_1, ENTR_DEATH_MOUNTAIN_TRAIL_0, SINGLE_SCENE_INFO(SCENE_DEATH_MOUNTAIN_TRAIL), "DMT", "Kakariko", ENTRANCE_GROUP_DEATH_MOUNTAIN_TRAIL, ENTRANCE_GROUP_KAKARIKO, ENTRANCE_TYPE_OVERWORLD}, + { ENTR_DEATH_MOUNTAIN_CRATER_0, ENTR_DEATH_MOUNTAIN_TRAIL_2, SINGLE_SCENE_INFO(SCENE_DEATH_MOUNTAIN_TRAIL), "DMT", "DMC", ENTRANCE_GROUP_DEATH_MOUNTAIN_TRAIL, ENTRANCE_GROUP_DEATH_MOUNTAIN_CRATER, ENTRANCE_TYPE_OVERWORLD}, + { ENTR_GREAT_FAIRYS_FOUNTAIN_MAGIC_0, ENTR_DEATH_MOUNTAIN_TRAIL_4, SINGLE_SCENE_INFO(SCENE_DEATH_MOUNTAIN_TRAIL), "DMT", "DMT Great Fairy Fountain", ENTRANCE_GROUP_DEATH_MOUNTAIN_TRAIL, ENTRANCE_GROUP_DEATH_MOUNTAIN_TRAIL, ENTRANCE_TYPE_INTERIOR, "", 1}, + { ENTRANCE_RANDO_GROTTO_LOAD(GROTTO_DMT_STORMS_OFFSET), ENTRANCE_RANDO_GROTTO_EXIT(GROTTO_DMT_STORMS_OFFSET), SINGLE_SCENE_INFO(SCENE_DEATH_MOUNTAIN_TRAIL), "DMT", "DMT Storms Grotto", ENTRANCE_GROUP_DEATH_MOUNTAIN_TRAIL, ENTRANCE_GROUP_DEATH_MOUNTAIN_TRAIL, ENTRANCE_TYPE_GROTTO, "chest", 1}, + { ENTRANCE_RANDO_GROTTO_LOAD(GROTTO_DMT_COW_OFFSET), ENTRANCE_RANDO_GROTTO_EXIT(GROTTO_DMT_COW_OFFSET), SINGLE_SCENE_INFO(SCENE_DEATH_MOUNTAIN_TRAIL), "DMT", "DMT Cow Grotto", ENTRANCE_GROUP_DEATH_MOUNTAIN_TRAIL, ENTRANCE_GROUP_DEATH_MOUNTAIN_TRAIL, ENTRANCE_TYPE_GROTTO, "", 1}, + { ENTR_DODONGOS_CAVERN_0, ENTR_DEATH_MOUNTAIN_TRAIL_3, SINGLE_SCENE_INFO(SCENE_DEATH_MOUNTAIN_TRAIL), "DMT", "Dodongo's Cavern", ENTRANCE_GROUP_DEATH_MOUNTAIN_TRAIL, ENTRANCE_GROUP_DEATH_MOUNTAIN_TRAIL, ENTRANCE_TYPE_DUNGEON, "dc", 1}, + { ENTR_DEATH_MOUNTAIN_TRAIL_4, ENTR_GREAT_FAIRYS_FOUNTAIN_MAGIC_0, {{ SCENE_GREAT_FAIRYS_FOUNTAIN_MAGIC, 0x00 }}, "DMT Great Fairy Fountain", "DMT", ENTRANCE_GROUP_DEATH_MOUNTAIN_TRAIL, ENTRANCE_GROUP_DEATH_MOUNTAIN_TRAIL, ENTRANCE_TYPE_INTERIOR}, + { ENTRANCE_RANDO_GROTTO_EXIT(GROTTO_DMT_STORMS_OFFSET), ENTRANCE_RANDO_GROTTO_LOAD(GROTTO_DMT_STORMS_OFFSET), {{ SCENE_GROTTOS, 0x00 }}, "DMT Storms Grotto", "DMT", ENTRANCE_GROUP_DEATH_MOUNTAIN_TRAIL, ENTRANCE_GROUP_DEATH_MOUNTAIN_TRAIL, ENTRANCE_TYPE_GROTTO, "chest"}, + { ENTRANCE_RANDO_GROTTO_EXIT(GROTTO_DMT_COW_OFFSET), ENTRANCE_RANDO_GROTTO_LOAD(GROTTO_DMT_COW_OFFSET), {{ SCENE_GROTTOS, 0x0D }}, "DMT Cow Grotto", "DMT", ENTRANCE_GROUP_DEATH_MOUNTAIN_TRAIL, ENTRANCE_GROUP_DEATH_MOUNTAIN_TRAIL, ENTRANCE_TYPE_GROTTO}, + { ENTR_DEATH_MOUNTAIN_TRAIL_3, ENTR_DODONGOS_CAVERN_0, SINGLE_SCENE_INFO(SCENE_DODONGOS_CAVERN), "Dodongo's Cavern", "DMT", ENTRANCE_GROUP_DEATH_MOUNTAIN_TRAIL, ENTRANCE_GROUP_DEATH_MOUNTAIN_TRAIL, ENTRANCE_TYPE_DUNGEON, "dc"}, + { ENTR_DODONGOS_CAVERN_BOSS_0, ENTR_DODONGOS_CAVERN_1, SINGLE_SCENE_INFO(SCENE_DODONGOS_CAVERN), "Dodongo's Cavern Boss Door", "King Dodongo", ENTRANCE_GROUP_DEATH_MOUNTAIN_TRAIL, ENTRANCE_GROUP_DEATH_MOUNTAIN_TRAIL, ENTRANCE_TYPE_DUNGEON, "dc", 1}, + { ENTR_DODONGOS_CAVERN_1, ENTR_DODONGOS_CAVERN_BOSS_0, SINGLE_SCENE_INFO(SCENE_DODONGOS_CAVERN_BOSS), "King Dodongo", "Dodongo's Cavern Boss Door", ENTRANCE_GROUP_DEATH_MOUNTAIN_TRAIL, ENTRANCE_GROUP_DEATH_MOUNTAIN_TRAIL, ENTRANCE_TYPE_DUNGEON, "dc", 1}, // Death Mountain Crater - { 0x01C1, 0x0246, SINGLE_SCENE_INFO(0x61), "DMC", "Goron City", ENTRANCE_GROUP_DEATH_MOUNTAIN_CRATER, ENTRANCE_GROUP_GORON_CITY, ENTRANCE_TYPE_OVERWORLD, "gc"}, - { 0x01BD, 0x0147, SINGLE_SCENE_INFO(0x61), "DMC", "DMT", ENTRANCE_GROUP_DEATH_MOUNTAIN_CRATER, ENTRANCE_GROUP_DEATH_MOUNTAIN_TRAIL, ENTRANCE_TYPE_OVERWORLD}, - { 0x04BE, 0x0482, SINGLE_SCENE_INFO(0x61), "DMC", "DMC Great Fairy Fountain", ENTRANCE_GROUP_DEATH_MOUNTAIN_CRATER, ENTRANCE_GROUP_DEATH_MOUNTAIN_CRATER, ENTRANCE_TYPE_INTERIOR, "", 1}, - { 0x0706, 0x0806, SINGLE_SCENE_INFO(0x61), "DMC", "DMC Upper Grotto", ENTRANCE_GROUP_DEATH_MOUNTAIN_CRATER, ENTRANCE_GROUP_DEATH_MOUNTAIN_CRATER, ENTRANCE_TYPE_GROTTO, "chest", 1}, - { 0x0705, 0x0805, SINGLE_SCENE_INFO(0x61), "DMC", "DMC Hammer Grotto", ENTRANCE_GROUP_DEATH_MOUNTAIN_CRATER, ENTRANCE_GROUP_DEATH_MOUNTAIN_CRATER, ENTRANCE_TYPE_GROTTO, "scrubs", 1}, - { 0x0165, 0x024A, SINGLE_SCENE_INFO(0x61), "DMC", "Fire Temple", ENTRANCE_GROUP_DEATH_MOUNTAIN_CRATER, ENTRANCE_GROUP_DEATH_MOUNTAIN_CRATER, ENTRANCE_TYPE_DUNGEON, "", 1}, - { 0x0482, 0x04BE, {{ 0x3B, 0x01 }}, "DMC Great Fairy Fountain", "DMC", ENTRANCE_GROUP_DEATH_MOUNTAIN_CRATER, ENTRANCE_GROUP_DEATH_MOUNTAIN_CRATER, ENTRANCE_TYPE_INTERIOR}, - { 0x0806, 0x0706, {{ 0x3E, 0x00 }}, "DMC Upper Grotto", "DMC", ENTRANCE_GROUP_DEATH_MOUNTAIN_CRATER, ENTRANCE_GROUP_DEATH_MOUNTAIN_CRATER, ENTRANCE_TYPE_GROTTO, "chest"}, - { 0x0805, 0x0705, {{ 0x3E, 0x04 }}, "DMC Hammer Grotto", "DMC", ENTRANCE_GROUP_DEATH_MOUNTAIN_CRATER, ENTRANCE_GROUP_DEATH_MOUNTAIN_CRATER, ENTRANCE_TYPE_GROTTO, "scrubs"}, - { 0x024A, 0x0165, SINGLE_SCENE_INFO(0x04), "Fire Temple", "DMC", ENTRANCE_GROUP_DEATH_MOUNTAIN_CRATER, ENTRANCE_GROUP_DEATH_MOUNTAIN_CRATER, ENTRANCE_TYPE_DUNGEON}, - { 0x0305, 0x0175, SINGLE_SCENE_INFO(0x04), "Fire Temple Boss Door", "Volvagia", ENTRANCE_GROUP_DEATH_MOUNTAIN_CRATER, ENTRANCE_GROUP_DEATH_MOUNTAIN_CRATER, ENTRANCE_TYPE_DUNGEON, "", 1}, - { 0x0175, 0x0305, SINGLE_SCENE_INFO(0x15), "Volvagia", "Fire Temple Boss Door", ENTRANCE_GROUP_DEATH_MOUNTAIN_CRATER, ENTRANCE_GROUP_DEATH_MOUNTAIN_CRATER, ENTRANCE_TYPE_DUNGEON, "", 1}, + { ENTR_GORON_CITY_1, ENTR_DEATH_MOUNTAIN_CRATER_1, SINGLE_SCENE_INFO(SCENE_DEATH_MOUNTAIN_CRATER), "DMC", "Goron City", ENTRANCE_GROUP_DEATH_MOUNTAIN_CRATER, ENTRANCE_GROUP_GORON_CITY, ENTRANCE_TYPE_OVERWORLD, "gc"}, + { ENTR_DEATH_MOUNTAIN_TRAIL_2, ENTR_DEATH_MOUNTAIN_CRATER_0, SINGLE_SCENE_INFO(SCENE_DEATH_MOUNTAIN_CRATER), "DMC", "DMT", ENTRANCE_GROUP_DEATH_MOUNTAIN_CRATER, ENTRANCE_GROUP_DEATH_MOUNTAIN_TRAIL, ENTRANCE_TYPE_OVERWORLD}, + { ENTR_GREAT_FAIRYS_FOUNTAIN_MAGIC_1, ENTR_DEATH_MOUNTAIN_CRATER_3, SINGLE_SCENE_INFO(SCENE_DEATH_MOUNTAIN_CRATER), "DMC", "DMC Great Fairy Fountain", ENTRANCE_GROUP_DEATH_MOUNTAIN_CRATER, ENTRANCE_GROUP_DEATH_MOUNTAIN_CRATER, ENTRANCE_TYPE_INTERIOR, "", 1}, + { ENTRANCE_RANDO_GROTTO_LOAD(GROTTO_DMC_UPPER_OFFSET), ENTRANCE_RANDO_GROTTO_EXIT(GROTTO_DMC_UPPER_OFFSET), SINGLE_SCENE_INFO(SCENE_DEATH_MOUNTAIN_CRATER), "DMC", "DMC Upper Grotto", ENTRANCE_GROUP_DEATH_MOUNTAIN_CRATER, ENTRANCE_GROUP_DEATH_MOUNTAIN_CRATER, ENTRANCE_TYPE_GROTTO, "chest", 1}, + { ENTRANCE_RANDO_GROTTO_LOAD(GROTTO_DMC_HAMMER_OFFSET), ENTRANCE_RANDO_GROTTO_EXIT(GROTTO_DMC_HAMMER_OFFSET), SINGLE_SCENE_INFO(SCENE_DEATH_MOUNTAIN_CRATER), "DMC", "DMC Hammer Grotto", ENTRANCE_GROUP_DEATH_MOUNTAIN_CRATER, ENTRANCE_GROUP_DEATH_MOUNTAIN_CRATER, ENTRANCE_TYPE_GROTTO, "scrubs", 1}, + { ENTR_FIRE_TEMPLE_0, ENTR_DEATH_MOUNTAIN_CRATER_2, SINGLE_SCENE_INFO(SCENE_DEATH_MOUNTAIN_CRATER), "DMC", "Fire Temple", ENTRANCE_GROUP_DEATH_MOUNTAIN_CRATER, ENTRANCE_GROUP_DEATH_MOUNTAIN_CRATER, ENTRANCE_TYPE_DUNGEON, "", 1}, + { ENTR_DEATH_MOUNTAIN_CRATER_3, ENTR_GREAT_FAIRYS_FOUNTAIN_MAGIC_1, {{ SCENE_GREAT_FAIRYS_FOUNTAIN_MAGIC, 0x01 }}, "DMC Great Fairy Fountain", "DMC", ENTRANCE_GROUP_DEATH_MOUNTAIN_CRATER, ENTRANCE_GROUP_DEATH_MOUNTAIN_CRATER, ENTRANCE_TYPE_INTERIOR}, + { ENTRANCE_RANDO_GROTTO_EXIT(GROTTO_DMC_UPPER_OFFSET), ENTRANCE_RANDO_GROTTO_LOAD(GROTTO_DMC_UPPER_OFFSET), {{ SCENE_GROTTOS, 0x00 }}, "DMC Upper Grotto", "DMC", ENTRANCE_GROUP_DEATH_MOUNTAIN_CRATER, ENTRANCE_GROUP_DEATH_MOUNTAIN_CRATER, ENTRANCE_TYPE_GROTTO, "chest"}, + { ENTRANCE_RANDO_GROTTO_EXIT(GROTTO_DMC_HAMMER_OFFSET), ENTRANCE_RANDO_GROTTO_LOAD(GROTTO_DMC_HAMMER_OFFSET), {{ SCENE_GROTTOS, 0x04 }}, "DMC Hammer Grotto", "DMC", ENTRANCE_GROUP_DEATH_MOUNTAIN_CRATER, ENTRANCE_GROUP_DEATH_MOUNTAIN_CRATER, ENTRANCE_TYPE_GROTTO, "scrubs"}, + { ENTR_DEATH_MOUNTAIN_CRATER_2, ENTR_FIRE_TEMPLE_0, SINGLE_SCENE_INFO(SCENE_FIRE_TEMPLE), "Fire Temple", "DMC", ENTRANCE_GROUP_DEATH_MOUNTAIN_CRATER, ENTRANCE_GROUP_DEATH_MOUNTAIN_CRATER, ENTRANCE_TYPE_DUNGEON}, + { ENTR_FIRE_TEMPLE_BOSS_0, ENTR_FIRE_TEMPLE_1, SINGLE_SCENE_INFO(SCENE_FIRE_TEMPLE), "Fire Temple Boss Door", "Volvagia", ENTRANCE_GROUP_DEATH_MOUNTAIN_CRATER, ENTRANCE_GROUP_DEATH_MOUNTAIN_CRATER, ENTRANCE_TYPE_DUNGEON, "", 1}, + { ENTR_FIRE_TEMPLE_1, ENTR_FIRE_TEMPLE_BOSS_0, SINGLE_SCENE_INFO(SCENE_FIRE_TEMPLE_BOSS), "Volvagia", "Fire Temple Boss Door", ENTRANCE_GROUP_DEATH_MOUNTAIN_CRATER, ENTRANCE_GROUP_DEATH_MOUNTAIN_CRATER, ENTRANCE_TYPE_DUNGEON, "", 1}, // Goron City - { 0x01B9, 0x014D, SINGLE_SCENE_INFO(0x62), "Goron City", "DMT", ENTRANCE_GROUP_GORON_CITY, ENTRANCE_GROUP_DEATH_MOUNTAIN_TRAIL, ENTRANCE_TYPE_OVERWORLD, "gc"}, - { 0x0246, 0x01C1, SINGLE_SCENE_INFO(0x62), "Goron City", "DMC", ENTRANCE_GROUP_GORON_CITY, ENTRANCE_GROUP_DEATH_MOUNTAIN_CRATER, ENTRANCE_TYPE_OVERWORLD, "gc"}, - { 0x04D6, 0x04E2, SINGLE_SCENE_INFO(0x62), "Goron City", "Lost Woods", ENTRANCE_GROUP_GORON_CITY, ENTRANCE_GROUP_LOST_WOODS, ENTRANCE_TYPE_OVERWORLD, "gc,lw"}, - { 0x037C, 0x03FC, SINGLE_SCENE_INFO(0x62), "Goron City", "Goron Shop", ENTRANCE_GROUP_GORON_CITY, ENTRANCE_GROUP_GORON_CITY, ENTRANCE_TYPE_INTERIOR, "gc", 1}, - { 0x0707, 0x0807, SINGLE_SCENE_INFO(0x62), "Goron City", "Goron City Grotto", ENTRANCE_GROUP_GORON_CITY, ENTRANCE_GROUP_GORON_CITY, ENTRANCE_TYPE_GROTTO, "gc,scrubs", 1}, - { 0x03FC, 0x037C, SINGLE_SCENE_INFO(0x2E), "Goron Shop", "Goron City", ENTRANCE_GROUP_GORON_CITY, ENTRANCE_GROUP_GORON_CITY, ENTRANCE_TYPE_INTERIOR, "gc"}, - { 0x0807, 0x0707, {{ 0x3E, 0x04 }}, "Goron City Grotto", "Goron City", ENTRANCE_GROUP_GORON_CITY, ENTRANCE_GROUP_GORON_CITY, ENTRANCE_TYPE_GROTTO, "gc,scrubs"}, + { ENTR_DEATH_MOUNTAIN_TRAIL_1, ENTR_GORON_CITY_0, SINGLE_SCENE_INFO(SCENE_GORON_CITY), "Goron City", "DMT", ENTRANCE_GROUP_GORON_CITY, ENTRANCE_GROUP_DEATH_MOUNTAIN_TRAIL, ENTRANCE_TYPE_OVERWORLD, "gc"}, + { ENTR_DEATH_MOUNTAIN_CRATER_1, ENTR_GORON_CITY_1, SINGLE_SCENE_INFO(SCENE_GORON_CITY), "Goron City", "DMC", ENTRANCE_GROUP_GORON_CITY, ENTRANCE_GROUP_DEATH_MOUNTAIN_CRATER, ENTRANCE_TYPE_OVERWORLD, "gc"}, + { ENTR_LOST_WOODS_6, ENTR_GORON_CITY_3, SINGLE_SCENE_INFO(SCENE_GORON_CITY), "Goron City", "Lost Woods", ENTRANCE_GROUP_GORON_CITY, ENTRANCE_GROUP_LOST_WOODS, ENTRANCE_TYPE_OVERWORLD, "gc,lw"}, + { ENTR_GORON_SHOP_0, ENTR_GORON_CITY_2, SINGLE_SCENE_INFO(SCENE_GORON_CITY), "Goron City", "Goron Shop", ENTRANCE_GROUP_GORON_CITY, ENTRANCE_GROUP_GORON_CITY, ENTRANCE_TYPE_INTERIOR, "gc", 1}, + { ENTRANCE_RANDO_GROTTO_LOAD(GROTTO_GORON_CITY_OFFSET), ENTRANCE_RANDO_GROTTO_EXIT(GROTTO_GORON_CITY_OFFSET), SINGLE_SCENE_INFO(SCENE_GORON_CITY), "Goron City", "Goron City Grotto", ENTRANCE_GROUP_GORON_CITY, ENTRANCE_GROUP_GORON_CITY, ENTRANCE_TYPE_GROTTO, "gc,scrubs", 1}, + { ENTR_GORON_CITY_2, ENTR_GORON_SHOP_0, SINGLE_SCENE_INFO(SCENE_GORON_SHOP), "Goron Shop", "Goron City", ENTRANCE_GROUP_GORON_CITY, ENTRANCE_GROUP_GORON_CITY, ENTRANCE_TYPE_INTERIOR, "gc"}, + { ENTRANCE_RANDO_GROTTO_EXIT(GROTTO_GORON_CITY_OFFSET), ENTRANCE_RANDO_GROTTO_LOAD(GROTTO_GORON_CITY_OFFSET), {{ SCENE_GROTTOS, 0x04 }}, "Goron City Grotto", "Goron City", ENTRANCE_GROUP_GORON_CITY, ENTRANCE_GROUP_GORON_CITY, ENTRANCE_TYPE_GROTTO, "gc,scrubs"}, // Zora's River - { 0x0181, 0x00EA, SINGLE_SCENE_INFO(0x54), "ZR", "Hyrule Field", ENTRANCE_GROUP_ZORAS_RIVER, ENTRANCE_GROUP_HYRULE_FIELD, ENTRANCE_TYPE_OVERWORLD, "hf"}, - { 0x04DA, 0x01DD, SINGLE_SCENE_INFO(0x54), "ZR", "Lost Woods", ENTRANCE_GROUP_ZORAS_RIVER, ENTRANCE_GROUP_LOST_WOODS, ENTRANCE_TYPE_OVERWORLD, "lw"}, - { 0x0108, 0x019D, SINGLE_SCENE_INFO(0x54), "ZR", "Zora's Domain", ENTRANCE_GROUP_ZORAS_RIVER, ENTRANCE_GROUP_ZORAS_DOMAIN, ENTRANCE_TYPE_OVERWORLD}, - { 0x0702, 0x0802, SINGLE_SCENE_INFO(0x54), "ZR", "ZR Storms Grotto", ENTRANCE_GROUP_ZORAS_RIVER, ENTRANCE_GROUP_ZORAS_RIVER, ENTRANCE_TYPE_GROTTO, "scrubs", 1}, - { 0x0703, 0x0803, SINGLE_SCENE_INFO(0x54), "ZR", "ZR Fairy Grotto", ENTRANCE_GROUP_ZORAS_RIVER, ENTRANCE_GROUP_ZORAS_RIVER, ENTRANCE_TYPE_GROTTO, "", 1}, - { 0x0704, 0x0804, SINGLE_SCENE_INFO(0x54), "ZR", "ZR Open Grotto", ENTRANCE_GROUP_ZORAS_RIVER, ENTRANCE_GROUP_ZORAS_RIVER, ENTRANCE_TYPE_GROTTO, "chest", 1}, - { 0x0802, 0x0702, {{ 0x3E, 0x0A }}, "ZR Storms Grotto", "ZR", ENTRANCE_GROUP_ZORAS_RIVER, ENTRANCE_GROUP_ZORAS_RIVER, ENTRANCE_TYPE_GROTTO, "scrubs"}, - { 0x0803, 0x0703, {{ 0x3C, 0x00 }}, "ZR Fairy Grotto", "ZR", ENTRANCE_GROUP_ZORAS_RIVER, ENTRANCE_GROUP_ZORAS_RIVER, ENTRANCE_TYPE_GROTTO}, - { 0x0804, 0x0704, {{ 0x3E, 0x00 }}, "ZR Open Grotto", "ZR", ENTRANCE_GROUP_ZORAS_RIVER, ENTRANCE_GROUP_ZORAS_RIVER, ENTRANCE_TYPE_GROTTO, "chest"}, + { ENTR_HYRULE_FIELD_2, ENTR_ZORAS_RIVER_0, SINGLE_SCENE_INFO(SCENE_ZORAS_RIVER), "ZR", "Hyrule Field", ENTRANCE_GROUP_ZORAS_RIVER, ENTRANCE_GROUP_HYRULE_FIELD, ENTRANCE_TYPE_OVERWORLD, "hf"}, + { ENTR_LOST_WOODS_7, ENTR_ZORAS_RIVER_4, SINGLE_SCENE_INFO(SCENE_ZORAS_RIVER), "ZR", "Lost Woods", ENTRANCE_GROUP_ZORAS_RIVER, ENTRANCE_GROUP_LOST_WOODS, ENTRANCE_TYPE_OVERWORLD, "lw"}, + { ENTR_ZORAS_DOMAIN_0, ENTR_ZORAS_RIVER_2, SINGLE_SCENE_INFO(SCENE_ZORAS_RIVER), "ZR", "Zora's Domain", ENTRANCE_GROUP_ZORAS_RIVER, ENTRANCE_GROUP_ZORAS_DOMAIN, ENTRANCE_TYPE_OVERWORLD}, + { ENTRANCE_RANDO_GROTTO_LOAD(GROTTO_ZR_STORMS_OFFSET), ENTRANCE_RANDO_GROTTO_EXIT(GROTTO_ZR_STORMS_OFFSET), SINGLE_SCENE_INFO(SCENE_ZORAS_RIVER), "ZR", "ZR Storms Grotto", ENTRANCE_GROUP_ZORAS_RIVER, ENTRANCE_GROUP_ZORAS_RIVER, ENTRANCE_TYPE_GROTTO, "scrubs", 1}, + { ENTRANCE_RANDO_GROTTO_LOAD(GROTTO_ZR_FAIRY_OFFSET), ENTRANCE_RANDO_GROTTO_EXIT(GROTTO_ZR_FAIRY_OFFSET), SINGLE_SCENE_INFO(SCENE_ZORAS_RIVER), "ZR", "ZR Fairy Grotto", ENTRANCE_GROUP_ZORAS_RIVER, ENTRANCE_GROUP_ZORAS_RIVER, ENTRANCE_TYPE_GROTTO, "", 1}, + { ENTRANCE_RANDO_GROTTO_LOAD(GROTTO_ZR_OPEN_OFFSET), ENTRANCE_RANDO_GROTTO_EXIT(GROTTO_ZR_OPEN_OFFSET), SINGLE_SCENE_INFO(SCENE_ZORAS_RIVER), "ZR", "ZR Open Grotto", ENTRANCE_GROUP_ZORAS_RIVER, ENTRANCE_GROUP_ZORAS_RIVER, ENTRANCE_TYPE_GROTTO, "chest", 1}, + { ENTRANCE_RANDO_GROTTO_EXIT(GROTTO_ZR_STORMS_OFFSET), ENTRANCE_RANDO_GROTTO_LOAD(GROTTO_ZR_STORMS_OFFSET), {{ SCENE_GROTTOS, 0x0A }}, "ZR Storms Grotto", "ZR", ENTRANCE_GROUP_ZORAS_RIVER, ENTRANCE_GROUP_ZORAS_RIVER, ENTRANCE_TYPE_GROTTO, "scrubs"}, + { ENTRANCE_RANDO_GROTTO_EXIT(GROTTO_ZR_FAIRY_OFFSET), ENTRANCE_RANDO_GROTTO_LOAD(GROTTO_ZR_FAIRY_OFFSET), {{ SCENE_FAIRYS_FOUNTAIN, 0x00 }}, "ZR Fairy Grotto", "ZR", ENTRANCE_GROUP_ZORAS_RIVER, ENTRANCE_GROUP_ZORAS_RIVER, ENTRANCE_TYPE_GROTTO}, + { ENTRANCE_RANDO_GROTTO_EXIT(GROTTO_ZR_OPEN_OFFSET), ENTRANCE_RANDO_GROTTO_LOAD(GROTTO_ZR_OPEN_OFFSET), {{ SCENE_GROTTOS, 0x00 }}, "ZR Open Grotto", "ZR", ENTRANCE_GROUP_ZORAS_RIVER, ENTRANCE_GROUP_ZORAS_RIVER, ENTRANCE_TYPE_GROTTO, "chest"}, // Zora's Domain - { 0x019D, 0x0108, SINGLE_SCENE_INFO(0x58), "Zora's Domain", "ZR", ENTRANCE_GROUP_ZORAS_DOMAIN, ENTRANCE_GROUP_ZORAS_RIVER, ENTRANCE_TYPE_OVERWORLD}, - { 0x0560, 0x0328, SINGLE_SCENE_INFO(0x58), "Zora's Domain", "Lake Hylia", ENTRANCE_GROUP_ZORAS_DOMAIN, ENTRANCE_GROUP_LAKE_HYLIA, ENTRANCE_TYPE_OVERWORLD, "lh"}, - { 0x0225, 0x01A1, SINGLE_SCENE_INFO(0x58), "Zora's Domain", "ZF", ENTRANCE_GROUP_ZORAS_DOMAIN, ENTRANCE_GROUP_ZORAS_FOUNTAIN, ENTRANCE_TYPE_OVERWORLD}, - { 0x0380, 0x03C4, SINGLE_SCENE_INFO(0x58), "Zora's Domain", "Zora Shop", ENTRANCE_GROUP_ZORAS_DOMAIN, ENTRANCE_GROUP_ZORAS_DOMAIN, ENTRANCE_TYPE_INTERIOR, "", 1}, - { 0x071C, 0x081C, SINGLE_SCENE_INFO(0x58), "Zora's Domain", "ZD Storms Grotto", ENTRANCE_GROUP_ZORAS_DOMAIN, ENTRANCE_GROUP_ZORAS_DOMAIN, ENTRANCE_TYPE_GROTTO, "fairy", 1}, - { 0x03C4, 0x0380, SINGLE_SCENE_INFO(0x2F), "Zora Shop", "Zora's Domain", ENTRANCE_GROUP_ZORAS_DOMAIN, ENTRANCE_GROUP_ZORAS_DOMAIN, ENTRANCE_TYPE_INTERIOR}, - { 0x081C, 0x071C, {{ 0x3C, 0x00 }}, "ZD Storms Grotto", "Zora's Domain", ENTRANCE_GROUP_ZORAS_DOMAIN, ENTRANCE_GROUP_ZORAS_DOMAIN, ENTRANCE_TYPE_GROTTO, "fairy"}, + { ENTR_ZORAS_RIVER_2, ENTR_ZORAS_DOMAIN_0, SINGLE_SCENE_INFO(SCENE_ZORAS_DOMAIN), "Zora's Domain", "ZR", ENTRANCE_GROUP_ZORAS_DOMAIN, ENTRANCE_GROUP_ZORAS_RIVER, ENTRANCE_TYPE_OVERWORLD}, + { ENTR_LAKE_HYLIA_7, ENTR_ZORAS_DOMAIN_4, SINGLE_SCENE_INFO(SCENE_ZORAS_DOMAIN), "Zora's Domain", "Lake Hylia", ENTRANCE_GROUP_ZORAS_DOMAIN, ENTRANCE_GROUP_LAKE_HYLIA, ENTRANCE_TYPE_OVERWORLD, "lh"}, + { ENTR_ZORAS_FOUNTAIN_2, ENTR_ZORAS_DOMAIN_1, SINGLE_SCENE_INFO(SCENE_ZORAS_DOMAIN), "Zora's Domain", "ZF", ENTRANCE_GROUP_ZORAS_DOMAIN, ENTRANCE_GROUP_ZORAS_FOUNTAIN, ENTRANCE_TYPE_OVERWORLD}, + { ENTR_ZORA_SHOP_0, ENTR_ZORAS_DOMAIN_2, SINGLE_SCENE_INFO(SCENE_ZORAS_DOMAIN), "Zora's Domain", "Zora Shop", ENTRANCE_GROUP_ZORAS_DOMAIN, ENTRANCE_GROUP_ZORAS_DOMAIN, ENTRANCE_TYPE_INTERIOR, "", 1}, + { ENTRANCE_RANDO_GROTTO_LOAD(GROTTO_ZD_STORMS_OFFSET), ENTRANCE_RANDO_GROTTO_EXIT(GROTTO_ZD_STORMS_OFFSET), SINGLE_SCENE_INFO(SCENE_ZORAS_DOMAIN), "Zora's Domain", "ZD Storms Grotto", ENTRANCE_GROUP_ZORAS_DOMAIN, ENTRANCE_GROUP_ZORAS_DOMAIN, ENTRANCE_TYPE_GROTTO, "fairy", 1}, + { ENTR_ZORAS_DOMAIN_2, ENTR_ZORA_SHOP_0, SINGLE_SCENE_INFO(SCENE_ZORA_SHOP), "Zora Shop", "Zora's Domain", ENTRANCE_GROUP_ZORAS_DOMAIN, ENTRANCE_GROUP_ZORAS_DOMAIN, ENTRANCE_TYPE_INTERIOR}, + { ENTRANCE_RANDO_GROTTO_EXIT(GROTTO_ZD_STORMS_OFFSET), ENTRANCE_RANDO_GROTTO_LOAD(GROTTO_ZD_STORMS_OFFSET), {{ SCENE_FAIRYS_FOUNTAIN, 0x00 }}, "ZD Storms Grotto", "Zora's Domain", ENTRANCE_GROUP_ZORAS_DOMAIN, ENTRANCE_GROUP_ZORAS_DOMAIN, ENTRANCE_TYPE_GROTTO, "fairy"}, // Zora's Fountain - { 0x01A1, 0x0225, SINGLE_SCENE_INFO(0x59), "ZF", "Zora's Domain", ENTRANCE_GROUP_ZORAS_FOUNTAIN, ENTRANCE_GROUP_ZORAS_DOMAIN, ENTRANCE_TYPE_OVERWORLD}, - { 0x0371, 0x0394, SINGLE_SCENE_INFO(0x59), "ZF", "ZF Great Fairy Fountain", ENTRANCE_GROUP_ZORAS_FOUNTAIN, ENTRANCE_GROUP_ZORAS_FOUNTAIN, ENTRANCE_TYPE_INTERIOR, "", 1}, - { 0x0028, 0x0221, SINGLE_SCENE_INFO(0x59), "ZF", "Jabu Jabu's Belly", ENTRANCE_GROUP_ZORAS_FOUNTAIN, ENTRANCE_GROUP_ZORAS_FOUNTAIN, ENTRANCE_TYPE_DUNGEON, "", 1}, - { 0x0088, 0x03D4, SINGLE_SCENE_INFO(0x59), "ZF", "Ice Cavern", ENTRANCE_GROUP_ZORAS_FOUNTAIN, ENTRANCE_GROUP_ZORAS_FOUNTAIN, ENTRANCE_TYPE_DUNGEON, "", 1}, - { 0x0394, 0x0371, {{ 0x3D, 0x00 }}, "ZF Great Fairy Fountain", "ZF", ENTRANCE_GROUP_ZORAS_FOUNTAIN, ENTRANCE_GROUP_ZORAS_FOUNTAIN, ENTRANCE_TYPE_INTERIOR}, - { 0x0221, 0x0028, SINGLE_SCENE_INFO(0x02), "Jabu Jabu's Belly", "ZF", ENTRANCE_GROUP_ZORAS_FOUNTAIN, ENTRANCE_GROUP_ZORAS_FOUNTAIN, ENTRANCE_TYPE_DUNGEON}, - { 0x0301, 0x0407, SINGLE_SCENE_INFO(0x02), "Jabu Jabu's Belly Boss Door", "Barinade", ENTRANCE_GROUP_ZORAS_FOUNTAIN, ENTRANCE_GROUP_ZORAS_FOUNTAIN, ENTRANCE_TYPE_DUNGEON, "", 1}, - { 0x0407, 0x0301, SINGLE_SCENE_INFO(0x13), "Barinade", "Jabu Jabu's Belly Boss Door", ENTRANCE_GROUP_ZORAS_FOUNTAIN, ENTRANCE_GROUP_ZORAS_FOUNTAIN, ENTRANCE_TYPE_DUNGEON, "", 1}, - { 0x03D4, 0x0088, SINGLE_SCENE_INFO(0x09), "Ice Cavern", "ZF", ENTRANCE_GROUP_ZORAS_FOUNTAIN, ENTRANCE_GROUP_ZORAS_FOUNTAIN, ENTRANCE_TYPE_DUNGEON}, + { ENTR_ZORAS_DOMAIN_1, ENTR_ZORAS_FOUNTAIN_2, SINGLE_SCENE_INFO(SCENE_ZORAS_FOUNTAIN), "ZF", "Zora's Domain", ENTRANCE_GROUP_ZORAS_FOUNTAIN, ENTRANCE_GROUP_ZORAS_DOMAIN, ENTRANCE_TYPE_OVERWORLD}, + { ENTR_GREAT_FAIRYS_FOUNTAIN_SPELLS_0, ENTR_ZORAS_FOUNTAIN_5, SINGLE_SCENE_INFO(SCENE_ZORAS_FOUNTAIN), "ZF", "ZF Great Fairy Fountain", ENTRANCE_GROUP_ZORAS_FOUNTAIN, ENTRANCE_GROUP_ZORAS_FOUNTAIN, ENTRANCE_TYPE_INTERIOR, "", 1}, + { ENTR_JABU_JABU_0, ENTR_ZORAS_FOUNTAIN_1, SINGLE_SCENE_INFO(SCENE_ZORAS_FOUNTAIN), "ZF", "Jabu Jabu's Belly", ENTRANCE_GROUP_ZORAS_FOUNTAIN, ENTRANCE_GROUP_ZORAS_FOUNTAIN, ENTRANCE_TYPE_DUNGEON, "", 1}, + { ENTR_ICE_CAVERN_0, ENTR_ZORAS_FOUNTAIN_3, SINGLE_SCENE_INFO(SCENE_ZORAS_FOUNTAIN), "ZF", "Ice Cavern", ENTRANCE_GROUP_ZORAS_FOUNTAIN, ENTRANCE_GROUP_ZORAS_FOUNTAIN, ENTRANCE_TYPE_DUNGEON, "", 1}, + { ENTR_ZORAS_FOUNTAIN_5, ENTR_GREAT_FAIRYS_FOUNTAIN_SPELLS_0, {{ SCENE_GREAT_FAIRYS_FOUNTAIN_SPELLS, 0x00 }}, "ZF Great Fairy Fountain", "ZF", ENTRANCE_GROUP_ZORAS_FOUNTAIN, ENTRANCE_GROUP_ZORAS_FOUNTAIN, ENTRANCE_TYPE_INTERIOR}, + { ENTR_ZORAS_FOUNTAIN_1, ENTR_JABU_JABU_0, SINGLE_SCENE_INFO(SCENE_JABU_JABU), "Jabu Jabu's Belly", "ZF", ENTRANCE_GROUP_ZORAS_FOUNTAIN, ENTRANCE_GROUP_ZORAS_FOUNTAIN, ENTRANCE_TYPE_DUNGEON}, + { ENTR_JABU_JABU_BOSS_0, ENTR_JABU_JABU_1, SINGLE_SCENE_INFO(SCENE_JABU_JABU), "Jabu Jabu's Belly Boss Door", "Barinade", ENTRANCE_GROUP_ZORAS_FOUNTAIN, ENTRANCE_GROUP_ZORAS_FOUNTAIN, ENTRANCE_TYPE_DUNGEON, "", 1}, + { ENTR_JABU_JABU_1, ENTR_JABU_JABU_BOSS_0, SINGLE_SCENE_INFO(SCENE_JABU_JABU_BOSS), "Barinade", "Jabu Jabu's Belly Boss Door", ENTRANCE_GROUP_ZORAS_FOUNTAIN, ENTRANCE_GROUP_ZORAS_FOUNTAIN, ENTRANCE_TYPE_DUNGEON, "", 1}, + { ENTR_ZORAS_FOUNTAIN_3, ENTR_ICE_CAVERN_0, SINGLE_SCENE_INFO(SCENE_ICE_CAVERN), "Ice Cavern", "ZF", ENTRANCE_GROUP_ZORAS_FOUNTAIN, ENTRANCE_GROUP_ZORAS_FOUNTAIN, ENTRANCE_TYPE_DUNGEON}, // Hyrule Field - { 0x04DE, 0x0185, SINGLE_SCENE_INFO(0x51), "Hyrule Field", "Lost Woods Bridge", ENTRANCE_GROUP_HYRULE_FIELD, ENTRANCE_GROUP_LOST_WOODS, ENTRANCE_TYPE_OVERWORLD, "hf,lw"}, - { 0x0276, 0x01FD, SINGLE_SCENE_INFO(0x51), "Hyrule Field", "Market Entrance", ENTRANCE_GROUP_HYRULE_FIELD, ENTRANCE_GROUP_MARKET, ENTRANCE_TYPE_OVERWORLD, "hf"}, - { 0x0157, 0x01F9, SINGLE_SCENE_INFO(0x51), "Hyrule Field", "Lon Lon Ranch", ENTRANCE_GROUP_HYRULE_FIELD, ENTRANCE_GROUP_LON_LON_RANCH, ENTRANCE_TYPE_OVERWORLD, "hf,llr"}, - { 0x00DB, 0x017D, SINGLE_SCENE_INFO(0x51), "Hyrule Field", "Kakariko", ENTRANCE_GROUP_HYRULE_FIELD, ENTRANCE_GROUP_KAKARIKO, ENTRANCE_TYPE_OVERWORLD, "hf"}, - { 0x00EA, 0x0181, SINGLE_SCENE_INFO(0x51), "Hyrule Field", "ZR", ENTRANCE_GROUP_HYRULE_FIELD, ENTRANCE_GROUP_ZORAS_RIVER, ENTRANCE_TYPE_OVERWORLD, "hf"}, - { 0x0102, 0x0189, SINGLE_SCENE_INFO(0x51), "Hyrule Field", "Lake Hylia", ENTRANCE_GROUP_HYRULE_FIELD, ENTRANCE_GROUP_LAKE_HYLIA, ENTRANCE_TYPE_OVERWORLD, "hf,lh"}, - { 0x0117, 0x018D, SINGLE_SCENE_INFO(0x51), "Hyrule Field", "GV", ENTRANCE_GROUP_HYRULE_FIELD, ENTRANCE_GROUP_GERUDO_VALLEY, ENTRANCE_TYPE_OVERWORLD, "hf"}, - { 0x0710, 0x0810, SINGLE_SCENE_INFO(0x51), "Hyrule Field", "HF Near Market Grotto", ENTRANCE_GROUP_HYRULE_FIELD, ENTRANCE_GROUP_HYRULE_FIELD, ENTRANCE_TYPE_GROTTO, "chest", 1}, - { 0x070E, 0x080E, SINGLE_SCENE_INFO(0x51), "Hyrule Field", "HF Near Kak Grotto", ENTRANCE_GROUP_HYRULE_FIELD, ENTRANCE_GROUP_HYRULE_FIELD, ENTRANCE_TYPE_GROTTO, "spider", 1}, - { 0x070D, 0x080D, SINGLE_SCENE_INFO(0x51), "Hyrule Field", "HF Tektite Grotto", ENTRANCE_GROUP_HYRULE_FIELD, ENTRANCE_GROUP_HYRULE_FIELD, ENTRANCE_TYPE_GROTTO, "water", 1}, - { 0x070F, 0x080F, SINGLE_SCENE_INFO(0x51), "Hyrule Field", "HF Fairy Grotto", ENTRANCE_GROUP_HYRULE_FIELD, ENTRANCE_GROUP_HYRULE_FIELD, ENTRANCE_TYPE_GROTTO, "", 1}, - { 0x0711, 0x0811, SINGLE_SCENE_INFO(0x51), "Hyrule Field", "HF Cow Grotto", ENTRANCE_GROUP_HYRULE_FIELD, ENTRANCE_GROUP_HYRULE_FIELD, ENTRANCE_TYPE_GROTTO, "webbed", 1}, - { 0x0713, 0x0813, SINGLE_SCENE_INFO(0x51), "Hyrule Field", "HF Open Grotto", ENTRANCE_GROUP_HYRULE_FIELD, ENTRANCE_GROUP_HYRULE_FIELD, ENTRANCE_TYPE_GROTTO, "chest", 1}, - { 0x0712, 0x0812, SINGLE_SCENE_INFO(0x51), "Hyrule Field", "HF Inside Fence Grotto", ENTRANCE_GROUP_HYRULE_FIELD, ENTRANCE_GROUP_HYRULE_FIELD, ENTRANCE_TYPE_GROTTO, "scrubs", 1}, - { 0x0714, 0x0814, SINGLE_SCENE_INFO(0x51), "Hyrule Field", "HF Southeast Grotto", ENTRANCE_GROUP_HYRULE_FIELD, ENTRANCE_GROUP_HYRULE_FIELD, ENTRANCE_TYPE_GROTTO, "chest", 1}, - { 0x0810, 0x0710, {{ 0x3E, 0x00 }}, "HF Near Market Grotto", "Hyrule Field", ENTRANCE_GROUP_HYRULE_FIELD, ENTRANCE_GROUP_HYRULE_FIELD, ENTRANCE_TYPE_GROTTO}, - { 0x080E, 0x070E, {{ 0x3E, 0x01 }}, "HF Near Kak Grotto", "Hyrule Field", ENTRANCE_GROUP_HYRULE_FIELD, ENTRANCE_GROUP_HYRULE_FIELD, ENTRANCE_TYPE_GROTTO, "spider"}, - { 0x080D, 0x070D, {{ 0x3E, 0x0B }}, "HF Tektite Grotto", "Hyrule Field", ENTRANCE_GROUP_HYRULE_FIELD, ENTRANCE_GROUP_HYRULE_FIELD, ENTRANCE_TYPE_GROTTO, "water"}, - { 0x080F, 0x070F, {{ 0x3C, 0x00 }}, "HF Fairy Grotto", "Hyrule Field", ENTRANCE_GROUP_HYRULE_FIELD, ENTRANCE_GROUP_HYRULE_FIELD, ENTRANCE_TYPE_GROTTO}, - { 0x0811, 0x0711, {{ 0x3E, 0x05 }}, "HF Cow Grotto", "Hyrule Field", ENTRANCE_GROUP_HYRULE_FIELD, ENTRANCE_GROUP_HYRULE_FIELD, ENTRANCE_TYPE_GROTTO, "webbed"}, - { 0x0813, 0x0713, {{ 0x3E, 0x00 }}, "HF Open Grotto", "Hyrule Field", ENTRANCE_GROUP_HYRULE_FIELD, ENTRANCE_GROUP_HYRULE_FIELD, ENTRANCE_TYPE_GROTTO, "chest"}, - { 0x0812, 0x0712, {{ 0x3E, 0x02 }}, "HF Inside Fence Grotto", "Hyrule Field", ENTRANCE_GROUP_HYRULE_FIELD, ENTRANCE_GROUP_HYRULE_FIELD, ENTRANCE_TYPE_GROTTO, "srubs"}, - { 0x0814, 0x0714, {{ 0x3E, 0x00 }}, "HF Southeast Grotto", "Hyrule Field", ENTRANCE_GROUP_HYRULE_FIELD, ENTRANCE_GROUP_HYRULE_FIELD, ENTRANCE_TYPE_GROTTO, "chest"}, + { ENTR_LOST_WOODS_8, ENTR_HYRULE_FIELD_3, SINGLE_SCENE_INFO(SCENE_HYRULE_FIELD), "Hyrule Field", "Lost Woods Bridge", ENTRANCE_GROUP_HYRULE_FIELD, ENTRANCE_GROUP_LOST_WOODS, ENTRANCE_TYPE_OVERWORLD, "hf,lw"}, + { ENTR_MARKET_ENTRANCE_DAY_1, ENTR_HYRULE_FIELD_7, SINGLE_SCENE_INFO(SCENE_HYRULE_FIELD), "Hyrule Field", "Market Entrance", ENTRANCE_GROUP_HYRULE_FIELD, ENTRANCE_GROUP_MARKET, ENTRANCE_TYPE_OVERWORLD, "hf"}, + { ENTR_LON_LON_RANCH_0, ENTR_HYRULE_FIELD_6, SINGLE_SCENE_INFO(SCENE_HYRULE_FIELD), "Hyrule Field", "Lon Lon Ranch", ENTRANCE_GROUP_HYRULE_FIELD, ENTRANCE_GROUP_LON_LON_RANCH, ENTRANCE_TYPE_OVERWORLD, "hf,llr"}, + { ENTR_KAKARIKO_VILLAGE_0, ENTR_HYRULE_FIELD_1, SINGLE_SCENE_INFO(SCENE_HYRULE_FIELD), "Hyrule Field", "Kakariko", ENTRANCE_GROUP_HYRULE_FIELD, ENTRANCE_GROUP_KAKARIKO, ENTRANCE_TYPE_OVERWORLD, "hf"}, + { ENTR_ZORAS_RIVER_0, ENTR_HYRULE_FIELD_2, SINGLE_SCENE_INFO(SCENE_HYRULE_FIELD), "Hyrule Field", "ZR", ENTRANCE_GROUP_HYRULE_FIELD, ENTRANCE_GROUP_ZORAS_RIVER, ENTRANCE_TYPE_OVERWORLD, "hf"}, + { ENTR_LAKE_HYLIA_0, ENTR_HYRULE_FIELD_4, SINGLE_SCENE_INFO(SCENE_HYRULE_FIELD), "Hyrule Field", "Lake Hylia", ENTRANCE_GROUP_HYRULE_FIELD, ENTRANCE_GROUP_LAKE_HYLIA, ENTRANCE_TYPE_OVERWORLD, "hf,lh"}, + { ENTR_GERUDO_VALLEY_0, ENTR_HYRULE_FIELD_5, SINGLE_SCENE_INFO(SCENE_HYRULE_FIELD), "Hyrule Field", "GV", ENTRANCE_GROUP_HYRULE_FIELD, ENTRANCE_GROUP_GERUDO_VALLEY, ENTRANCE_TYPE_OVERWORLD, "hf"}, + { ENTRANCE_RANDO_GROTTO_LOAD(GROTTO_HF_NEAR_MARKET_OFFSET), ENTRANCE_RANDO_GROTTO_EXIT(GROTTO_HF_NEAR_MARKET_OFFSET), SINGLE_SCENE_INFO(SCENE_HYRULE_FIELD), "Hyrule Field", "HF Near Market Grotto", ENTRANCE_GROUP_HYRULE_FIELD, ENTRANCE_GROUP_HYRULE_FIELD, ENTRANCE_TYPE_GROTTO, "chest", 1}, + { ENTRANCE_RANDO_GROTTO_LOAD(GROTTO_HF_NEAR_KAK_OFFSET), ENTRANCE_RANDO_GROTTO_EXIT(GROTTO_HF_NEAR_KAK_OFFSET), SINGLE_SCENE_INFO(SCENE_HYRULE_FIELD), "Hyrule Field", "HF Near Kak Grotto", ENTRANCE_GROUP_HYRULE_FIELD, ENTRANCE_GROUP_HYRULE_FIELD, ENTRANCE_TYPE_GROTTO, "spider", 1}, + { ENTRANCE_RANDO_GROTTO_LOAD(GROTTO_HF_TEKTITE_OFFSET), ENTRANCE_RANDO_GROTTO_EXIT(GROTTO_HF_TEKTITE_OFFSET), SINGLE_SCENE_INFO(SCENE_HYRULE_FIELD), "Hyrule Field", "HF Tektite Grotto", ENTRANCE_GROUP_HYRULE_FIELD, ENTRANCE_GROUP_HYRULE_FIELD, ENTRANCE_TYPE_GROTTO, "water", 1}, + { ENTRANCE_RANDO_GROTTO_LOAD(GROTTO_HF_FAIRY_OFFSET), ENTRANCE_RANDO_GROTTO_EXIT(GROTTO_HF_FAIRY_OFFSET), SINGLE_SCENE_INFO(SCENE_HYRULE_FIELD), "Hyrule Field", "HF Fairy Grotto", ENTRANCE_GROUP_HYRULE_FIELD, ENTRANCE_GROUP_HYRULE_FIELD, ENTRANCE_TYPE_GROTTO, "", 1}, + { ENTRANCE_RANDO_GROTTO_LOAD(GROTTO_HF_COW_OFFSET), ENTRANCE_RANDO_GROTTO_EXIT(GROTTO_HF_COW_OFFSET), SINGLE_SCENE_INFO(SCENE_HYRULE_FIELD), "Hyrule Field", "HF Cow Grotto", ENTRANCE_GROUP_HYRULE_FIELD, ENTRANCE_GROUP_HYRULE_FIELD, ENTRANCE_TYPE_GROTTO, "webbed", 1}, + { ENTRANCE_RANDO_GROTTO_LOAD(GROTTO_HF_OPEN_OFFSET), ENTRANCE_RANDO_GROTTO_EXIT(GROTTO_HF_OPEN_OFFSET), SINGLE_SCENE_INFO(SCENE_HYRULE_FIELD), "Hyrule Field", "HF Open Grotto", ENTRANCE_GROUP_HYRULE_FIELD, ENTRANCE_GROUP_HYRULE_FIELD, ENTRANCE_TYPE_GROTTO, "chest", 1}, + { ENTRANCE_RANDO_GROTTO_LOAD(GROTTO_HF_INSIDE_FENCE_OFFSET), ENTRANCE_RANDO_GROTTO_EXIT(GROTTO_HF_INSIDE_FENCE_OFFSET), SINGLE_SCENE_INFO(SCENE_HYRULE_FIELD), "Hyrule Field", "HF Inside Fence Grotto", ENTRANCE_GROUP_HYRULE_FIELD, ENTRANCE_GROUP_HYRULE_FIELD, ENTRANCE_TYPE_GROTTO, "scrubs", 1}, + { ENTRANCE_RANDO_GROTTO_LOAD(GROTTO_HF_SOUTHEAST_OFFSET), ENTRANCE_RANDO_GROTTO_EXIT(GROTTO_HF_SOUTHEAST_OFFSET), SINGLE_SCENE_INFO(SCENE_HYRULE_FIELD), "Hyrule Field", "HF Southeast Grotto", ENTRANCE_GROUP_HYRULE_FIELD, ENTRANCE_GROUP_HYRULE_FIELD, ENTRANCE_TYPE_GROTTO, "chest", 1}, + { ENTRANCE_RANDO_GROTTO_EXIT(GROTTO_HF_NEAR_MARKET_OFFSET), ENTRANCE_RANDO_GROTTO_LOAD(GROTTO_HF_NEAR_MARKET_OFFSET), {{ SCENE_GROTTOS, 0x00 }}, "HF Near Market Grotto", "Hyrule Field", ENTRANCE_GROUP_HYRULE_FIELD, ENTRANCE_GROUP_HYRULE_FIELD, ENTRANCE_TYPE_GROTTO}, + { ENTRANCE_RANDO_GROTTO_EXIT(GROTTO_HF_NEAR_KAK_OFFSET), ENTRANCE_RANDO_GROTTO_LOAD(GROTTO_HF_NEAR_KAK_OFFSET), {{ SCENE_GROTTOS, 0x01 }}, "HF Near Kak Grotto", "Hyrule Field", ENTRANCE_GROUP_HYRULE_FIELD, ENTRANCE_GROUP_HYRULE_FIELD, ENTRANCE_TYPE_GROTTO, "spider"}, + { ENTRANCE_RANDO_GROTTO_EXIT(GROTTO_HF_TEKTITE_OFFSET), ENTRANCE_RANDO_GROTTO_LOAD(GROTTO_HF_TEKTITE_OFFSET), {{ SCENE_GROTTOS, 0x0B }}, "HF Tektite Grotto", "Hyrule Field", ENTRANCE_GROUP_HYRULE_FIELD, ENTRANCE_GROUP_HYRULE_FIELD, ENTRANCE_TYPE_GROTTO, "water"}, + { ENTRANCE_RANDO_GROTTO_EXIT(GROTTO_HF_FAIRY_OFFSET), ENTRANCE_RANDO_GROTTO_LOAD(GROTTO_HF_FAIRY_OFFSET), {{ SCENE_FAIRYS_FOUNTAIN, 0x00 }}, "HF Fairy Grotto", "Hyrule Field", ENTRANCE_GROUP_HYRULE_FIELD, ENTRANCE_GROUP_HYRULE_FIELD, ENTRANCE_TYPE_GROTTO}, + { ENTRANCE_RANDO_GROTTO_EXIT(GROTTO_HF_COW_OFFSET), ENTRANCE_RANDO_GROTTO_LOAD(GROTTO_HF_COW_OFFSET), {{ SCENE_GROTTOS, 0x05 }}, "HF Cow Grotto", "Hyrule Field", ENTRANCE_GROUP_HYRULE_FIELD, ENTRANCE_GROUP_HYRULE_FIELD, ENTRANCE_TYPE_GROTTO, "webbed"}, + { ENTRANCE_RANDO_GROTTO_EXIT(GROTTO_HF_OPEN_OFFSET), ENTRANCE_RANDO_GROTTO_LOAD(GROTTO_HF_OPEN_OFFSET), {{ SCENE_GROTTOS, 0x00 }}, "HF Open Grotto", "Hyrule Field", ENTRANCE_GROUP_HYRULE_FIELD, ENTRANCE_GROUP_HYRULE_FIELD, ENTRANCE_TYPE_GROTTO, "chest"}, + { ENTRANCE_RANDO_GROTTO_EXIT(GROTTO_HF_INSIDE_FENCE_OFFSET), ENTRANCE_RANDO_GROTTO_LOAD(GROTTO_HF_INSIDE_FENCE_OFFSET), {{ SCENE_GROTTOS, 0x02 }}, "HF Inside Fence Grotto", "Hyrule Field", ENTRANCE_GROUP_HYRULE_FIELD, ENTRANCE_GROUP_HYRULE_FIELD, ENTRANCE_TYPE_GROTTO, "srubs"}, + { ENTRANCE_RANDO_GROTTO_EXIT(GROTTO_HF_SOUTHEAST_OFFSET), ENTRANCE_RANDO_GROTTO_LOAD(GROTTO_HF_SOUTHEAST_OFFSET), {{ SCENE_GROTTOS, 0x00 }}, "HF Southeast Grotto", "Hyrule Field", ENTRANCE_GROUP_HYRULE_FIELD, ENTRANCE_GROUP_HYRULE_FIELD, ENTRANCE_TYPE_GROTTO, "chest"}, // Lon Lon Ranch - { 0x01F9, 0x0157, SINGLE_SCENE_INFO(0x63), "Lon Lon Ranch", "Hyrule Field", ENTRANCE_GROUP_LON_LON_RANCH, ENTRANCE_GROUP_HYRULE_FIELD, ENTRANCE_TYPE_OVERWORLD, "hf"}, - { 0x004F, 0x0378, SINGLE_SCENE_INFO(0x63), "Lon Lon Ranch", "Talon's House", ENTRANCE_GROUP_LON_LON_RANCH, ENTRANCE_GROUP_LON_LON_RANCH, ENTRANCE_TYPE_INTERIOR, "llr", 1}, - { 0x02F9, 0x042F, SINGLE_SCENE_INFO(0x63), "Lon Lon Ranch", "LLR Stables", ENTRANCE_GROUP_LON_LON_RANCH, ENTRANCE_GROUP_LON_LON_RANCH, ENTRANCE_TYPE_INTERIOR, "cow", 1}, - { 0x05D0, 0x05D4, SINGLE_SCENE_INFO(0x63), "Lon Lon Ranch", "LLR Tower", ENTRANCE_GROUP_LON_LON_RANCH, ENTRANCE_GROUP_LON_LON_RANCH, ENTRANCE_TYPE_INTERIOR, "cow", 1}, - { 0x0715, 0x0815, SINGLE_SCENE_INFO(0x63), "Lon Lon Ranch", "LLR Grotto", ENTRANCE_GROUP_LON_LON_RANCH, ENTRANCE_GROUP_LON_LON_RANCH, ENTRANCE_TYPE_GROTTO, "scrubs", 1}, - { 0x0378, 0x004F, {{ 0x4C, 0x00 }}, "Talon's House", "Lon Lon Ranch", ENTRANCE_GROUP_LON_LON_RANCH, ENTRANCE_GROUP_LON_LON_RANCH, ENTRANCE_TYPE_INTERIOR, "llr"}, - { 0x042F, 0x02F9, SINGLE_SCENE_INFO(0x36), "LLR Stables", "Lon Lon Ranch", ENTRANCE_GROUP_LON_LON_RANCH, ENTRANCE_GROUP_LON_LON_RANCH, ENTRANCE_TYPE_INTERIOR, "cow"}, - { 0x05D4, 0x05D0, {{ 0x4C, 0x01 }}, "LLR Tower", "Lon Lon Ranch", ENTRANCE_GROUP_LON_LON_RANCH, ENTRANCE_GROUP_LON_LON_RANCH, ENTRANCE_TYPE_INTERIOR, "cow"}, - { 0x0815, 0x0715, {{ 0x3E, 0x04 }}, "LLR Grotto", "Lon Lon Ranch", ENTRANCE_GROUP_LON_LON_RANCH, ENTRANCE_GROUP_LON_LON_RANCH, ENTRANCE_TYPE_GROTTO, "scrubs"}, + { ENTR_HYRULE_FIELD_6, ENTR_LON_LON_RANCH_0, SINGLE_SCENE_INFO(SCENE_LON_LON_RANCH), "Lon Lon Ranch", "Hyrule Field", ENTRANCE_GROUP_LON_LON_RANCH, ENTRANCE_GROUP_HYRULE_FIELD, ENTRANCE_TYPE_OVERWORLD, "hf"}, + { ENTR_LON_LON_BUILDINGS_0, ENTR_LON_LON_RANCH_4, SINGLE_SCENE_INFO(SCENE_LON_LON_RANCH), "Lon Lon Ranch", "Talon's House", ENTRANCE_GROUP_LON_LON_RANCH, ENTRANCE_GROUP_LON_LON_RANCH, ENTRANCE_TYPE_INTERIOR, "llr", 1}, + { ENTR_STABLE_0, ENTR_LON_LON_RANCH_5, SINGLE_SCENE_INFO(SCENE_LON_LON_RANCH), "Lon Lon Ranch", "LLR Stables", ENTRANCE_GROUP_LON_LON_RANCH, ENTRANCE_GROUP_LON_LON_RANCH, ENTRANCE_TYPE_INTERIOR, "cow", 1}, + { ENTR_LON_LON_BUILDINGS_1, ENTR_LON_LON_RANCH_10, SINGLE_SCENE_INFO(SCENE_LON_LON_RANCH), "Lon Lon Ranch", "LLR Tower", ENTRANCE_GROUP_LON_LON_RANCH, ENTRANCE_GROUP_LON_LON_RANCH, ENTRANCE_TYPE_INTERIOR, "cow", 1}, + { ENTRANCE_RANDO_GROTTO_LOAD(GROTTO_LLR_OFFSET), ENTRANCE_RANDO_GROTTO_EXIT(GROTTO_LLR_OFFSET), SINGLE_SCENE_INFO(SCENE_LON_LON_RANCH), "Lon Lon Ranch", "LLR Grotto", ENTRANCE_GROUP_LON_LON_RANCH, ENTRANCE_GROUP_LON_LON_RANCH, ENTRANCE_TYPE_GROTTO, "scrubs", 1}, + { ENTR_LON_LON_RANCH_4, ENTR_LON_LON_BUILDINGS_0, {{ SCENE_LON_LON_BUILDINGS, 0x00 }}, "Talon's House", "Lon Lon Ranch", ENTRANCE_GROUP_LON_LON_RANCH, ENTRANCE_GROUP_LON_LON_RANCH, ENTRANCE_TYPE_INTERIOR, "llr"}, + { ENTR_LON_LON_RANCH_5, ENTR_STABLE_0, SINGLE_SCENE_INFO(SCENE_STABLE), "LLR Stables", "Lon Lon Ranch", ENTRANCE_GROUP_LON_LON_RANCH, ENTRANCE_GROUP_LON_LON_RANCH, ENTRANCE_TYPE_INTERIOR, "cow"}, + { ENTR_LON_LON_RANCH_10, ENTR_LON_LON_BUILDINGS_1, {{ SCENE_LON_LON_BUILDINGS, 0x01 }}, "LLR Tower", "Lon Lon Ranch", ENTRANCE_GROUP_LON_LON_RANCH, ENTRANCE_GROUP_LON_LON_RANCH, ENTRANCE_TYPE_INTERIOR, "cow"}, + { ENTRANCE_RANDO_GROTTO_EXIT(GROTTO_LLR_OFFSET), ENTRANCE_RANDO_GROTTO_LOAD(GROTTO_LLR_OFFSET), {{ SCENE_GROTTOS, 0x04 }}, "LLR Grotto", "Lon Lon Ranch", ENTRANCE_GROUP_LON_LON_RANCH, ENTRANCE_GROUP_LON_LON_RANCH, ENTRANCE_TYPE_GROTTO, "scrubs"}, // Lake Hylia - { 0x0189, 0x0102, SINGLE_SCENE_INFO(0x57), "Lake Hylia", "Hyrule Field", ENTRANCE_GROUP_LAKE_HYLIA, ENTRANCE_GROUP_HYRULE_FIELD, ENTRANCE_TYPE_OVERWORLD, "lh"}, - { 0x0328, 0x0560, SINGLE_SCENE_INFO(0x57), "Lake Hylia", "Zora's Domain", ENTRANCE_GROUP_LAKE_HYLIA, ENTRANCE_GROUP_ZORAS_DOMAIN, ENTRANCE_TYPE_OVERWORLD, "lh"}, - { 0x0043, 0x03CC, SINGLE_SCENE_INFO(0x57), "Lake Hylia", "LH Lab", ENTRANCE_GROUP_LAKE_HYLIA, ENTRANCE_GROUP_LAKE_HYLIA, ENTRANCE_TYPE_INTERIOR, "lh", 1}, - { 0x045F, 0x0309, SINGLE_SCENE_INFO(0x57), "Lake Hylia", "Fishing Hole", ENTRANCE_GROUP_LAKE_HYLIA, ENTRANCE_GROUP_LAKE_HYLIA, ENTRANCE_TYPE_INTERIOR, "lh", 1}, - { 0x0701, 0x0801, SINGLE_SCENE_INFO(0x57), "Lake Hylia", "LH Grotto", ENTRANCE_GROUP_LAKE_HYLIA, ENTRANCE_GROUP_LAKE_HYLIA, ENTRANCE_TYPE_GROTTO, "scrubs", 1}, - { 0x0010, 0x021D, SINGLE_SCENE_INFO(0x57), "Lake Hylia", "Water Temple", ENTRANCE_GROUP_LAKE_HYLIA, ENTRANCE_GROUP_LAKE_HYLIA, ENTRANCE_TYPE_DUNGEON, "lh", 1}, - { 0x03CC, 0x0043, SINGLE_SCENE_INFO(0x38), "LH Lab", "Lake Hylia", ENTRANCE_GROUP_LAKE_HYLIA, ENTRANCE_GROUP_LAKE_HYLIA, ENTRANCE_TYPE_INTERIOR, "lh"}, - { 0x0309, 0x045F, SINGLE_SCENE_INFO(0x49), "Fishing Hole", "Lake Hylia", ENTRANCE_GROUP_LAKE_HYLIA, ENTRANCE_GROUP_LAKE_HYLIA, ENTRANCE_TYPE_INTERIOR, "lh"}, - { 0x0801, 0x0701, {{ 0x3E, 0x04 }}, "LH Grotto", "Lake Hylia", ENTRANCE_GROUP_LAKE_HYLIA, ENTRANCE_GROUP_LAKE_HYLIA, ENTRANCE_TYPE_GROTTO, "lh,scrubs"}, - { 0x021D, 0x0010, SINGLE_SCENE_INFO(0x05), "Water Temple", "Lake Hylia", ENTRANCE_GROUP_LAKE_HYLIA, ENTRANCE_GROUP_LAKE_HYLIA, ENTRANCE_TYPE_DUNGEON, "lh"}, - { 0x0417, 0x0423, SINGLE_SCENE_INFO(0x05), "Water Temple Boss Door", "Morpha", ENTRANCE_GROUP_LAKE_HYLIA, ENTRANCE_GROUP_LAKE_HYLIA, ENTRANCE_TYPE_DUNGEON, "lh", 1}, - { 0x0423, 0x0417, SINGLE_SCENE_INFO(0x16), "Morpha", "Water Temple Boss Door", ENTRANCE_GROUP_LAKE_HYLIA, ENTRANCE_GROUP_LAKE_HYLIA, ENTRANCE_TYPE_DUNGEON, "lh", 1}, + { ENTR_HYRULE_FIELD_4, ENTR_LAKE_HYLIA_0, SINGLE_SCENE_INFO(SCENE_LAKE_HYLIA), "Lake Hylia", "Hyrule Field", ENTRANCE_GROUP_LAKE_HYLIA, ENTRANCE_GROUP_HYRULE_FIELD, ENTRANCE_TYPE_OVERWORLD, "lh"}, + { ENTR_ZORAS_DOMAIN_4, ENTR_LAKE_HYLIA_7, SINGLE_SCENE_INFO(SCENE_LAKE_HYLIA), "Lake Hylia", "Zora's Domain", ENTRANCE_GROUP_LAKE_HYLIA, ENTRANCE_GROUP_ZORAS_DOMAIN, ENTRANCE_TYPE_OVERWORLD, "lh"}, + { ENTR_LAKESIDE_LABORATORY_0, ENTR_LAKE_HYLIA_4, SINGLE_SCENE_INFO(SCENE_LAKE_HYLIA), "Lake Hylia", "LH Lab", ENTRANCE_GROUP_LAKE_HYLIA, ENTRANCE_GROUP_LAKE_HYLIA, ENTRANCE_TYPE_INTERIOR, "lh", 1}, + { ENTR_FISHING_POND_0, ENTR_LAKE_HYLIA_6, SINGLE_SCENE_INFO(SCENE_LAKE_HYLIA), "Lake Hylia", "Fishing Hole", ENTRANCE_GROUP_LAKE_HYLIA, ENTRANCE_GROUP_LAKE_HYLIA, ENTRANCE_TYPE_INTERIOR, "lh", 1}, + { ENTRANCE_RANDO_GROTTO_LOAD(GROTTO_LH_OFFSET), ENTRANCE_RANDO_GROTTO_EXIT(GROTTO_LH_OFFSET), SINGLE_SCENE_INFO(SCENE_LAKE_HYLIA), "Lake Hylia", "LH Grotto", ENTRANCE_GROUP_LAKE_HYLIA, ENTRANCE_GROUP_LAKE_HYLIA, ENTRANCE_TYPE_GROTTO, "scrubs", 1}, + { ENTR_WATER_TEMPLE_0, ENTR_LAKE_HYLIA_2, SINGLE_SCENE_INFO(SCENE_LAKE_HYLIA), "Lake Hylia", "Water Temple", ENTRANCE_GROUP_LAKE_HYLIA, ENTRANCE_GROUP_LAKE_HYLIA, ENTRANCE_TYPE_DUNGEON, "lh", 1}, + { ENTR_LAKE_HYLIA_4, ENTR_LAKESIDE_LABORATORY_0, SINGLE_SCENE_INFO(SCENE_LAKESIDE_LABORATORY), "LH Lab", "Lake Hylia", ENTRANCE_GROUP_LAKE_HYLIA, ENTRANCE_GROUP_LAKE_HYLIA, ENTRANCE_TYPE_INTERIOR, "lh"}, + { ENTR_LAKE_HYLIA_6, ENTR_FISHING_POND_0, SINGLE_SCENE_INFO(SCENE_FISHING_POND), "Fishing Hole", "Lake Hylia", ENTRANCE_GROUP_LAKE_HYLIA, ENTRANCE_GROUP_LAKE_HYLIA, ENTRANCE_TYPE_INTERIOR, "lh"}, + { ENTRANCE_RANDO_GROTTO_EXIT(GROTTO_LH_OFFSET), ENTRANCE_RANDO_GROTTO_LOAD(GROTTO_LH_OFFSET), {{ SCENE_GROTTOS, 0x04 }}, "LH Grotto", "Lake Hylia", ENTRANCE_GROUP_LAKE_HYLIA, ENTRANCE_GROUP_LAKE_HYLIA, ENTRANCE_TYPE_GROTTO, "lh,scrubs"}, + { ENTR_LAKE_HYLIA_2, ENTR_WATER_TEMPLE_0, SINGLE_SCENE_INFO(SCENE_WATER_TEMPLE), "Water Temple", "Lake Hylia", ENTRANCE_GROUP_LAKE_HYLIA, ENTRANCE_GROUP_LAKE_HYLIA, ENTRANCE_TYPE_DUNGEON, "lh"}, + { ENTR_WATER_TEMPLE_BOSS_0, ENTR_WATER_TEMPLE_1, SINGLE_SCENE_INFO(SCENE_WATER_TEMPLE), "Water Temple Boss Door", "Morpha", ENTRANCE_GROUP_LAKE_HYLIA, ENTRANCE_GROUP_LAKE_HYLIA, ENTRANCE_TYPE_DUNGEON, "lh", 1}, + { ENTR_WATER_TEMPLE_1, ENTR_WATER_TEMPLE_BOSS_0, SINGLE_SCENE_INFO(SCENE_WATER_TEMPLE_BOSS), "Morpha", "Water Temple Boss Door", ENTRANCE_GROUP_LAKE_HYLIA, ENTRANCE_GROUP_LAKE_HYLIA, ENTRANCE_TYPE_DUNGEON, "lh", 1}, // Gerudo Area - { 0x018D, 0x0117, SINGLE_SCENE_INFO(0x5A), "GV", "Hyrule Field", ENTRANCE_GROUP_GERUDO_VALLEY, ENTRANCE_GROUP_HYRULE_FIELD, ENTRANCE_TYPE_OVERWORLD, "hf"}, - { 0x0129, 0x022D, SINGLE_SCENE_INFO(0x5A), "GV", "GF", ENTRANCE_GROUP_GERUDO_VALLEY, ENTRANCE_GROUP_GERUDO_VALLEY, ENTRANCE_TYPE_OVERWORLD, "gerudo fortress"}, - { 0x0219, -1, SINGLE_SCENE_INFO(0x5A), "GV", "Lake Hylia", ENTRANCE_GROUP_GERUDO_VALLEY, ENTRANCE_GROUP_LAKE_HYLIA, ENTRANCE_TYPE_OVERWORLD, "lh"}, - { 0x03A0, 0x03D0, SINGLE_SCENE_INFO(0x5A), "GV", "Carpenters' Tent", ENTRANCE_GROUP_GERUDO_VALLEY, ENTRANCE_GROUP_GERUDO_VALLEY, ENTRANCE_TYPE_INTERIOR, "", 1}, - { 0x071F, 0x081F, SINGLE_SCENE_INFO(0x5A), "GV", "GV Octorok Grotto", ENTRANCE_GROUP_GERUDO_VALLEY, ENTRANCE_GROUP_GERUDO_VALLEY, ENTRANCE_TYPE_GROTTO, "", 1}, - { 0x071E, 0x081E, SINGLE_SCENE_INFO(0x5A), "GV", "GV Storms Grotto", ENTRANCE_GROUP_GERUDO_VALLEY, ENTRANCE_GROUP_GERUDO_VALLEY, ENTRANCE_TYPE_GROTTO, "scrubs", 1}, - { 0x022D, 0x0129, SINGLE_SCENE_INFO(0x5D), "GF", "GV", ENTRANCE_GROUP_GERUDO_VALLEY, ENTRANCE_GROUP_GERUDO_VALLEY, ENTRANCE_TYPE_OVERWORLD, "gerudo fortress"}, - { 0x0130, 0x03AC, SINGLE_SCENE_INFO(0x5D), "GF", "Haunted Wasteland", ENTRANCE_GROUP_GERUDO_VALLEY, ENTRANCE_GROUP_HAUNTED_WASTELAND, ENTRANCE_TYPE_OVERWORLD, "gerudo fortress"}, - { 0x071D, 0x081D, SINGLE_SCENE_INFO(0x5D), "GF", "GF Storms Grotto", ENTRANCE_GROUP_GERUDO_VALLEY, ENTRANCE_GROUP_GERUDO_VALLEY, ENTRANCE_TYPE_GROTTO, "gerudo fortress", 1}, - { 0x0008, 0x03A8, SINGLE_SCENE_INFO(0x5D), "GF", "Gerudo Training Grounds", ENTRANCE_GROUP_GERUDO_VALLEY, ENTRANCE_GROUP_GERUDO_VALLEY, ENTRANCE_TYPE_DUNGEON, "gerudo fortress,gtg", 1}, - { 0x03D0, 0x03A0, SINGLE_SCENE_INFO(0x39), "Carpenters' Tent", "GV", ENTRANCE_GROUP_GERUDO_VALLEY, ENTRANCE_GROUP_GERUDO_VALLEY, ENTRANCE_TYPE_INTERIOR}, - { 0x081F, 0x071F, {{ 0x3E, 0x06 }}, "GV Octorok Grotto", "GV", ENTRANCE_GROUP_GERUDO_VALLEY, ENTRANCE_GROUP_GERUDO_VALLEY, ENTRANCE_TYPE_GROTTO}, - { 0x081E, 0x071E, {{ 0x3E, 0x0A }}, "GV Storms Grotto", "GV", ENTRANCE_GROUP_GERUDO_VALLEY, ENTRANCE_GROUP_GERUDO_VALLEY, ENTRANCE_TYPE_GROTTO, "scrubs"}, - { 0x081D, 0x071D, {{ 0x3C, 0x00 }}, "GF Storms Grotto", "GF", ENTRANCE_GROUP_GERUDO_VALLEY, ENTRANCE_GROUP_GERUDO_VALLEY, ENTRANCE_TYPE_GROTTO, "gerudo fortress"}, - { 0x03A8, 0x0008, SINGLE_SCENE_INFO(0x0B), "Gerudo Training Grounds", "GF", ENTRANCE_GROUP_GERUDO_VALLEY, ENTRANCE_GROUP_GERUDO_VALLEY, ENTRANCE_TYPE_DUNGEON, "gerudo fortress,gtg"}, + { ENTR_HYRULE_FIELD_5, ENTR_GERUDO_VALLEY_0, SINGLE_SCENE_INFO(SCENE_GERUDO_VALLEY), "GV", "Hyrule Field", ENTRANCE_GROUP_GERUDO_VALLEY, ENTRANCE_GROUP_HYRULE_FIELD, ENTRANCE_TYPE_OVERWORLD, "hf"}, + { ENTR_GERUDOS_FORTRESS_0, ENTR_GERUDO_VALLEY_3, SINGLE_SCENE_INFO(SCENE_GERUDO_VALLEY), "GV", "GF", ENTRANCE_GROUP_GERUDO_VALLEY, ENTRANCE_GROUP_GERUDO_VALLEY, ENTRANCE_TYPE_OVERWORLD, "gerudo fortress"}, + { ENTR_GERUDOS_FORTRESS_0_5, -1, SINGLE_SCENE_INFO(SCENE_GERUDO_VALLEY), "GV", "Lake Hylia", ENTRANCE_GROUP_GERUDO_VALLEY, ENTRANCE_GROUP_LAKE_HYLIA, ENTRANCE_TYPE_OVERWORLD, "lh"}, + { ENTR_CARPENTERS_TENT_0, ENTR_GERUDO_VALLEY_4, SINGLE_SCENE_INFO(SCENE_GERUDO_VALLEY), "GV", "Carpenters' Tent", ENTRANCE_GROUP_GERUDO_VALLEY, ENTRANCE_GROUP_GERUDO_VALLEY, ENTRANCE_TYPE_INTERIOR, "", 1}, + { ENTRANCE_RANDO_GROTTO_LOAD(GROTTO_GV_OCTOROK_OFFSET), ENTRANCE_RANDO_GROTTO_EXIT(GROTTO_GV_OCTOROK_OFFSET), SINGLE_SCENE_INFO(SCENE_GERUDO_VALLEY), "GV", "GV Octorok Grotto", ENTRANCE_GROUP_GERUDO_VALLEY, ENTRANCE_GROUP_GERUDO_VALLEY, ENTRANCE_TYPE_GROTTO, "", 1}, + { ENTRANCE_RANDO_GROTTO_LOAD(GROTTO_GV_STORMS_OFFSET), ENTRANCE_RANDO_GROTTO_EXIT(GROTTO_GV_STORMS_OFFSET), SINGLE_SCENE_INFO(SCENE_GERUDO_VALLEY), "GV", "GV Storms Grotto", ENTRANCE_GROUP_GERUDO_VALLEY, ENTRANCE_GROUP_GERUDO_VALLEY, ENTRANCE_TYPE_GROTTO, "scrubs", 1}, + { ENTR_GERUDO_VALLEY_3, ENTR_GERUDOS_FORTRESS_0, SINGLE_SCENE_INFO(SCENE_GERUDOS_FORTRESS), "GF", "GV", ENTRANCE_GROUP_GERUDO_VALLEY, ENTRANCE_GROUP_GERUDO_VALLEY, ENTRANCE_TYPE_OVERWORLD, "gerudo fortress"}, + { ENTR_HAUNTED_WASTELAND_0, ENTR_GERUDOS_FORTRESS_15, SINGLE_SCENE_INFO(SCENE_GERUDOS_FORTRESS), "GF", "Haunted Wasteland", ENTRANCE_GROUP_GERUDO_VALLEY, ENTRANCE_GROUP_HAUNTED_WASTELAND, ENTRANCE_TYPE_OVERWORLD, "gerudo fortress"}, + { ENTRANCE_RANDO_GROTTO_LOAD(GROTTO_GF_STORMS_OFFSET), ENTRANCE_RANDO_GROTTO_EXIT(GROTTO_GF_STORMS_OFFSET), SINGLE_SCENE_INFO(SCENE_GERUDOS_FORTRESS), "GF", "GF Storms Grotto", ENTRANCE_GROUP_GERUDO_VALLEY, ENTRANCE_GROUP_GERUDO_VALLEY, ENTRANCE_TYPE_GROTTO, "gerudo fortress", 1}, + { ENTR_GERUDO_TRAINING_GROUND_0, ENTR_GERUDOS_FORTRESS_14, SINGLE_SCENE_INFO(SCENE_GERUDOS_FORTRESS), "GF", "Gerudo Training Grounds", ENTRANCE_GROUP_GERUDO_VALLEY, ENTRANCE_GROUP_GERUDO_VALLEY, ENTRANCE_TYPE_DUNGEON, "gerudo fortress,gtg", 1}, + { ENTR_GERUDO_VALLEY_4, ENTR_CARPENTERS_TENT_0, SINGLE_SCENE_INFO(SCENE_CARPENTERS_TENT), "Carpenters' Tent", "GV", ENTRANCE_GROUP_GERUDO_VALLEY, ENTRANCE_GROUP_GERUDO_VALLEY, ENTRANCE_TYPE_INTERIOR}, + { ENTRANCE_RANDO_GROTTO_EXIT(GROTTO_GV_OCTOROK_OFFSET), ENTRANCE_RANDO_GROTTO_LOAD(GROTTO_GV_OCTOROK_OFFSET), {{ SCENE_GROTTOS, 0x06 }}, "GV Octorok Grotto", "GV", ENTRANCE_GROUP_GERUDO_VALLEY, ENTRANCE_GROUP_GERUDO_VALLEY, ENTRANCE_TYPE_GROTTO}, + { ENTRANCE_RANDO_GROTTO_EXIT(GROTTO_GV_STORMS_OFFSET), ENTRANCE_RANDO_GROTTO_LOAD(GROTTO_GV_STORMS_OFFSET), {{ SCENE_GROTTOS, 0x0A }}, "GV Storms Grotto", "GV", ENTRANCE_GROUP_GERUDO_VALLEY, ENTRANCE_GROUP_GERUDO_VALLEY, ENTRANCE_TYPE_GROTTO, "scrubs"}, + { ENTRANCE_RANDO_GROTTO_EXIT(GROTTO_GF_STORMS_OFFSET), ENTRANCE_RANDO_GROTTO_LOAD(GROTTO_GF_STORMS_OFFSET), {{ SCENE_FAIRYS_FOUNTAIN, 0x00 }}, "GF Storms Grotto", "GF", ENTRANCE_GROUP_GERUDO_VALLEY, ENTRANCE_GROUP_GERUDO_VALLEY, ENTRANCE_TYPE_GROTTO, "gerudo fortress"}, + { ENTR_GERUDOS_FORTRESS_14, ENTR_GERUDO_TRAINING_GROUND_0, SINGLE_SCENE_INFO(SCENE_GERUDO_TRAINING_GROUND), "Gerudo Training Grounds", "GF", ENTRANCE_GROUP_GERUDO_VALLEY, ENTRANCE_GROUP_GERUDO_VALLEY, ENTRANCE_TYPE_DUNGEON, "gerudo fortress,gtg"}, // The Wasteland - { 0x03AC, 0x0130, SINGLE_SCENE_INFO(0x5E), "Haunted Wasteland", "GF", ENTRANCE_GROUP_HAUNTED_WASTELAND, ENTRANCE_GROUP_GERUDO_VALLEY, ENTRANCE_TYPE_OVERWORLD, "hw,gerudo fortress"}, - { 0x0123, 0x0365, SINGLE_SCENE_INFO(0x5E), "Haunted Wasteland", "Desert Colossus", ENTRANCE_GROUP_HAUNTED_WASTELAND, ENTRANCE_GROUP_HAUNTED_WASTELAND, ENTRANCE_TYPE_OVERWORLD, "dc,hw"}, - { 0x0365, 0x0123, SINGLE_SCENE_INFO(0x5C), "Desert Colossus", "Haunted Wasteland", ENTRANCE_GROUP_HAUNTED_WASTELAND, ENTRANCE_GROUP_HAUNTED_WASTELAND, ENTRANCE_TYPE_OVERWORLD, "dc,hw"}, - { 0x0588, 0x057C, SINGLE_SCENE_INFO(0x5C), "Desert Colossus", "Colossus Great Fairy Fountain", ENTRANCE_GROUP_HAUNTED_WASTELAND, ENTRANCE_GROUP_HAUNTED_WASTELAND, ENTRANCE_TYPE_INTERIOR, "dc", 1}, - { 0x0700, 0x0800, SINGLE_SCENE_INFO(0x5C), "Desert Colossus", "Colossus Grotto", ENTRANCE_GROUP_HAUNTED_WASTELAND, ENTRANCE_GROUP_HAUNTED_WASTELAND, ENTRANCE_TYPE_GROTTO, "dc,scrubs", 1}, - { 0x0082, 0x01E1, SINGLE_SCENE_INFO(0x5C), "Desert Colossus", "Spirit Temple", ENTRANCE_GROUP_HAUNTED_WASTELAND, ENTRANCE_GROUP_HAUNTED_WASTELAND, ENTRANCE_TYPE_DUNGEON, "dc", 1}, - { 0x057C, 0x0588, {{ 0x3D, 0x02 }}, "Colossus Great Fairy Fountain", "Colossus", ENTRANCE_GROUP_HAUNTED_WASTELAND, ENTRANCE_GROUP_HAUNTED_WASTELAND, ENTRANCE_TYPE_INTERIOR, "dc"}, - { 0x0800, 0x0700, {{ 0x3E, 0x0A }}, "Colossus Grotto", "Desert Colossus", ENTRANCE_GROUP_HAUNTED_WASTELAND, ENTRANCE_GROUP_HAUNTED_WASTELAND, ENTRANCE_TYPE_GROTTO, "dc,scrubs"}, - { 0x01E1, 0x0082, SINGLE_SCENE_INFO(0x06), "Spirit Temple", "Desert Colossus", ENTRANCE_GROUP_HAUNTED_WASTELAND, ENTRANCE_GROUP_HAUNTED_WASTELAND, ENTRANCE_TYPE_DUNGEON, "dc"}, - { 0x008D, 0x02F5, SINGLE_SCENE_INFO(0x06), "Spirit Temple Boss Door", "Twinrova", ENTRANCE_GROUP_HAUNTED_WASTELAND, ENTRANCE_GROUP_HAUNTED_WASTELAND, ENTRANCE_TYPE_DUNGEON, "", 1}, - { 0x02F5, 0x008D, SINGLE_SCENE_INFO(0x17), "Twinrova", "Spirit Temple Boss Door", ENTRANCE_GROUP_HAUNTED_WASTELAND, ENTRANCE_GROUP_HAUNTED_WASTELAND, ENTRANCE_TYPE_DUNGEON, "", 1}, + { ENTR_GERUDOS_FORTRESS_15, ENTR_HAUNTED_WASTELAND_0, SINGLE_SCENE_INFO(SCENE_HAUNTED_WASTELAND), "Haunted Wasteland", "GF", ENTRANCE_GROUP_HAUNTED_WASTELAND, ENTRANCE_GROUP_GERUDO_VALLEY, ENTRANCE_TYPE_OVERWORLD, "hw,gerudo fortress"}, + { ENTR_DESERT_COLOSSUS_0, ENTR_HAUNTED_WASTELAND_1, SINGLE_SCENE_INFO(SCENE_HAUNTED_WASTELAND), "Haunted Wasteland", "Desert Colossus", ENTRANCE_GROUP_HAUNTED_WASTELAND, ENTRANCE_GROUP_HAUNTED_WASTELAND, ENTRANCE_TYPE_OVERWORLD, "dc,hw"}, + { ENTR_HAUNTED_WASTELAND_1, ENTR_DESERT_COLOSSUS_0, SINGLE_SCENE_INFO(SCENE_DESERT_COLOSSUS), "Desert Colossus", "Haunted Wasteland", ENTRANCE_GROUP_HAUNTED_WASTELAND, ENTRANCE_GROUP_HAUNTED_WASTELAND, ENTRANCE_TYPE_OVERWORLD, "dc,hw"}, + { ENTR_GREAT_FAIRYS_FOUNTAIN_SPELLS_2, ENTR_DESERT_COLOSSUS_7, SINGLE_SCENE_INFO(SCENE_DESERT_COLOSSUS), "Desert Colossus", "Colossus Great Fairy Fountain", ENTRANCE_GROUP_HAUNTED_WASTELAND, ENTRANCE_GROUP_HAUNTED_WASTELAND, ENTRANCE_TYPE_INTERIOR, "dc", 1}, + { ENTRANCE_RANDO_GROTTO_LOAD(GROTTO_COLOSSUS_OFFSET), ENTRANCE_RANDO_GROTTO_EXIT(GROTTO_COLOSSUS_OFFSET), SINGLE_SCENE_INFO(SCENE_DESERT_COLOSSUS), "Desert Colossus", "Colossus Grotto", ENTRANCE_GROUP_HAUNTED_WASTELAND, ENTRANCE_GROUP_HAUNTED_WASTELAND, ENTRANCE_TYPE_GROTTO, "dc,scrubs", 1}, + { ENTR_SPIRIT_TEMPLE_0, ENTR_DESERT_COLOSSUS_1, SINGLE_SCENE_INFO(SCENE_DESERT_COLOSSUS), "Desert Colossus", "Spirit Temple", ENTRANCE_GROUP_HAUNTED_WASTELAND, ENTRANCE_GROUP_HAUNTED_WASTELAND, ENTRANCE_TYPE_DUNGEON, "dc", 1}, + { ENTR_DESERT_COLOSSUS_7, ENTR_GREAT_FAIRYS_FOUNTAIN_SPELLS_2, {{ SCENE_GREAT_FAIRYS_FOUNTAIN_SPELLS, 0x02 }}, "Colossus Great Fairy Fountain", "Colossus", ENTRANCE_GROUP_HAUNTED_WASTELAND, ENTRANCE_GROUP_HAUNTED_WASTELAND, ENTRANCE_TYPE_INTERIOR, "dc"}, + { ENTRANCE_RANDO_GROTTO_EXIT(GROTTO_COLOSSUS_OFFSET), ENTRANCE_RANDO_GROTTO_LOAD(GROTTO_COLOSSUS_OFFSET), {{ SCENE_GROTTOS, 0x0A }}, "Colossus Grotto", "Desert Colossus", ENTRANCE_GROUP_HAUNTED_WASTELAND, ENTRANCE_GROUP_HAUNTED_WASTELAND, ENTRANCE_TYPE_GROTTO, "dc,scrubs"}, + { ENTR_DESERT_COLOSSUS_1, ENTR_SPIRIT_TEMPLE_0, SINGLE_SCENE_INFO(SCENE_SPIRIT_TEMPLE), "Spirit Temple", "Desert Colossus", ENTRANCE_GROUP_HAUNTED_WASTELAND, ENTRANCE_GROUP_HAUNTED_WASTELAND, ENTRANCE_TYPE_DUNGEON, "dc"}, + { ENTR_SPIRIT_TEMPLE_BOSS_0, ENTR_SPIRIT_TEMPLE_1, SINGLE_SCENE_INFO(SCENE_SPIRIT_TEMPLE), "Spirit Temple Boss Door", "Twinrova", ENTRANCE_GROUP_HAUNTED_WASTELAND, ENTRANCE_GROUP_HAUNTED_WASTELAND, ENTRANCE_TYPE_DUNGEON, "", 1}, + { ENTR_SPIRIT_TEMPLE_1, ENTR_SPIRIT_TEMPLE_BOSS_0, SINGLE_SCENE_INFO(SCENE_SPIRIT_TEMPLE_BOSS), "Twinrova", "Spirit Temple Boss Door", ENTRANCE_GROUP_HAUNTED_WASTELAND, ENTRANCE_GROUP_HAUNTED_WASTELAND, ENTRANCE_TYPE_DUNGEON, "", 1}, // Market - { 0x01FD, 0x0276, {SCENE_NO_SPAWN(0x1B), SCENE_NO_SPAWN(0x1C), SCENE_NO_SPAWN(0x1D)}, "Market Entrance", "Hyrule Field", ENTRANCE_GROUP_MARKET, ENTRANCE_GROUP_HYRULE_FIELD, ENTRANCE_TYPE_OVERWORLD, "hf"}, - { 0x00B1, 0x0033, {SCENE_NO_SPAWN(0x1B), SCENE_NO_SPAWN(0x1C), SCENE_NO_SPAWN(0x1D)}, "Market Entrance", "Market", ENTRANCE_GROUP_MARKET, ENTRANCE_GROUP_MARKET, ENTRANCE_TYPE_OVERWORLD}, - { 0x007E, 0x026E, {SCENE_NO_SPAWN(0x1B), SCENE_NO_SPAWN(0x1C), SCENE_NO_SPAWN(0x1D)}, "Market Entrance", "Guard House", ENTRANCE_GROUP_MARKET, ENTRANCE_GROUP_MARKET, ENTRANCE_TYPE_INTERIOR, "pots,poe", 1}, - { 0x0033, 0x00B1, {SCENE_NO_SPAWN(0x20), SCENE_NO_SPAWN(0x21), SCENE_NO_SPAWN(0x22), SCENE_NO_SPAWN(0x1E), SCENE_NO_SPAWN(0x1F)}, "Market", "Market Entrance", ENTRANCE_GROUP_MARKET, ENTRANCE_GROUP_MARKET, ENTRANCE_TYPE_OVERWORLD}, - { 0x0138, 0x025A, {SCENE_NO_SPAWN(0x20), SCENE_NO_SPAWN(0x21), SCENE_NO_SPAWN(0x22), SCENE_NO_SPAWN(0x1E), SCENE_NO_SPAWN(0x1F)}, "Market", "HC Grounds / OGC", ENTRANCE_GROUP_MARKET, ENTRANCE_GROUP_HYRULE_CASTLE, ENTRANCE_TYPE_OVERWORLD, "outside ganon's castle"}, - { 0x0171, 0x025E, {SCENE_NO_SPAWN(0x20), SCENE_NO_SPAWN(0x21), SCENE_NO_SPAWN(0x22), SCENE_NO_SPAWN(0x1E), SCENE_NO_SPAWN(0x1F)}, "Market", "Outside Temple of Time", ENTRANCE_GROUP_MARKET, ENTRANCE_GROUP_MARKET, ENTRANCE_TYPE_OVERWORLD}, - { 0x016D, 0x01CD, {SCENE_NO_SPAWN(0x20), SCENE_NO_SPAWN(0x21), SCENE_NO_SPAWN(0x22), SCENE_NO_SPAWN(0x1E), SCENE_NO_SPAWN(0x1F)}, "Market", "MK Shooting Gallery", ENTRANCE_GROUP_MARKET, ENTRANCE_GROUP_MARKET, ENTRANCE_TYPE_INTERIOR, "child", 1}, - { 0x0507, 0x03BC, {SCENE_NO_SPAWN(0x20), SCENE_NO_SPAWN(0x21), SCENE_NO_SPAWN(0x22), SCENE_NO_SPAWN(0x1E), SCENE_NO_SPAWN(0x1F)}, "Market", "Bombchu Bowling", ENTRANCE_GROUP_MARKET, ENTRANCE_GROUP_MARKET, ENTRANCE_TYPE_INTERIOR, "", 1}, - { 0x0063, 0x01D5, {SCENE_NO_SPAWN(0x20), SCENE_NO_SPAWN(0x21), SCENE_NO_SPAWN(0x22), SCENE_NO_SPAWN(0x1E), SCENE_NO_SPAWN(0x1F)}, "Market", "Treasure Chest Game", ENTRANCE_GROUP_MARKET, ENTRANCE_GROUP_MARKET, ENTRANCE_TYPE_INTERIOR, "", 1}, - { 0x043B, 0x0067, {SCENE_NO_SPAWN(0x20), SCENE_NO_SPAWN(0x21), SCENE_NO_SPAWN(0x22), SCENE_NO_SPAWN(0x1E), SCENE_NO_SPAWN(0x1F)}, "Market", "Man-in-Green's House", ENTRANCE_GROUP_MARKET, ENTRANCE_GROUP_MARKET, ENTRANCE_TYPE_INTERIOR, "", 1}, - { 0x0530, 0x01D1, {SCENE_NO_SPAWN(0x20), SCENE_NO_SPAWN(0x21), SCENE_NO_SPAWN(0x22), SCENE_NO_SPAWN(0x1E), SCENE_NO_SPAWN(0x1F)}, "Market", "Mask Shop", ENTRANCE_GROUP_MARKET, ENTRANCE_GROUP_MARKET, ENTRANCE_TYPE_INTERIOR, "", 1}, - { 0x052C, 0x03B8, {SCENE_NO_SPAWN(0x20), SCENE_NO_SPAWN(0x21), SCENE_NO_SPAWN(0x22), SCENE_NO_SPAWN(0x1E), SCENE_NO_SPAWN(0x1F)}, "Market", "MK Bazaar", ENTRANCE_GROUP_MARKET, ENTRANCE_GROUP_MARKET, ENTRANCE_TYPE_INTERIOR, "shop", 1}, - { 0x0388, 0x02A2, {SCENE_NO_SPAWN(0x20), SCENE_NO_SPAWN(0x21), SCENE_NO_SPAWN(0x22), SCENE_NO_SPAWN(0x1E), SCENE_NO_SPAWN(0x1F)}, "Market", "MK Potion Shop", ENTRANCE_GROUP_MARKET, ENTRANCE_GROUP_MARKET, ENTRANCE_TYPE_INTERIOR, "", 1}, - { 0x0528, 0x03C0, {SCENE_NO_SPAWN(0x20), SCENE_NO_SPAWN(0x21), SCENE_NO_SPAWN(0x22), SCENE_NO_SPAWN(0x1E), SCENE_NO_SPAWN(0x1F)}, "Market", "Bombchu Shop", ENTRANCE_GROUP_MARKET, ENTRANCE_GROUP_MARKET, ENTRANCE_TYPE_INTERIOR, "", 1}, - { 0x026E, 0x007E, {{ 0x4D }}, "Guard House", "Market Entrance", ENTRANCE_GROUP_MARKET, ENTRANCE_GROUP_MARKET, ENTRANCE_TYPE_INTERIOR, "pots,poe"}, - { 0x01CD, 0x016D, {{ 0x42, 0x01 }}, "MK Shooting Gallery", "Market", ENTRANCE_GROUP_MARKET, ENTRANCE_GROUP_MARKET, ENTRANCE_TYPE_INTERIOR}, - { 0x03BC, 0x0507, SINGLE_SCENE_INFO(0x4B), "Bombchu Bowling", "Market", ENTRANCE_GROUP_MARKET, ENTRANCE_GROUP_MARKET, ENTRANCE_TYPE_INTERIOR}, - { 0x01D5, 0x0063, SINGLE_SCENE_INFO(0x10), "Treasure Chest Game", "Market", ENTRANCE_GROUP_MARKET, ENTRANCE_GROUP_MARKET, ENTRANCE_TYPE_INTERIOR}, - { 0x0067, 0x043B, SINGLE_SCENE_INFO(0x2B), "Man-in-Green's House", "Market", ENTRANCE_GROUP_MARKET, ENTRANCE_GROUP_MARKET, ENTRANCE_TYPE_INTERIOR}, - { 0x01D1, 0x0530, SINGLE_SCENE_INFO(0x33), "Mask Shop", "Market", ENTRANCE_GROUP_MARKET, ENTRANCE_GROUP_MARKET, ENTRANCE_TYPE_INTERIOR}, - { 0x03B8, 0x052C, {{ 0x2C, 0x01 }}, "MK Bazaar", "Market", ENTRANCE_GROUP_MARKET, ENTRANCE_GROUP_MARKET, ENTRANCE_TYPE_INTERIOR, "shop"}, - { 0x02A2, 0x0388, SINGLE_SCENE_INFO(0x31), "MK Potion Shop", "Market", ENTRANCE_GROUP_MARKET, ENTRANCE_GROUP_MARKET, ENTRANCE_TYPE_INTERIOR}, - { 0x03C0, 0x0528, SINGLE_SCENE_INFO(0x32), "Bombchu Shop", "Market", ENTRANCE_GROUP_MARKET, ENTRANCE_GROUP_MARKET, ENTRANCE_TYPE_INTERIOR}, - { 0x025E, 0x0171, {SCENE_NO_SPAWN(0x23), SCENE_NO_SPAWN(0x24), SCENE_NO_SPAWN(0x25)}, "Outside Temple of Time", "Market", ENTRANCE_GROUP_MARKET, ENTRANCE_GROUP_MARKET, ENTRANCE_TYPE_OVERWORLD, "tot"}, - { 0x0053, 0x0472, {SCENE_NO_SPAWN(0x23), SCENE_NO_SPAWN(0x24), SCENE_NO_SPAWN(0x25)}, "Outside Temple of Time", "Temple of Time", ENTRANCE_GROUP_MARKET, ENTRANCE_GROUP_MARKET, ENTRANCE_TYPE_INTERIOR, "tot", 1}, - { 0x0472, 0x0053, SINGLE_SCENE_INFO(0x43), "Temple of Time", "Outside Temple of Time", ENTRANCE_GROUP_MARKET, ENTRANCE_GROUP_MARKET, ENTRANCE_TYPE_INTERIOR, "tot"}, + { ENTR_HYRULE_FIELD_7, ENTR_MARKET_ENTRANCE_DAY_1, {SCENE_NO_SPAWN(SCENE_MARKET_ENTRANCE_DAY), SCENE_NO_SPAWN(SCENE_MARKET_ENTRANCE_NIGHT), SCENE_NO_SPAWN(SCENE_MARKET_ENTRANCE_RUINS)}, "Market Entrance", "Hyrule Field", ENTRANCE_GROUP_MARKET, ENTRANCE_GROUP_HYRULE_FIELD, ENTRANCE_TYPE_OVERWORLD, "hf"}, + { ENTR_MARKET_DAY_0, ENTR_MARKET_ENTRANCE_DAY_0, {SCENE_NO_SPAWN(SCENE_MARKET_ENTRANCE_DAY), SCENE_NO_SPAWN(SCENE_MARKET_ENTRANCE_NIGHT), SCENE_NO_SPAWN(SCENE_MARKET_ENTRANCE_RUINS)}, "Market Entrance", "Market", ENTRANCE_GROUP_MARKET, ENTRANCE_GROUP_MARKET, ENTRANCE_TYPE_OVERWORLD}, + { ENTR_MARKET_GUARD_HOUSE_0, ENTR_MARKET_ENTRANCE_DAY_2, {SCENE_NO_SPAWN(SCENE_MARKET_ENTRANCE_DAY), SCENE_NO_SPAWN(SCENE_MARKET_ENTRANCE_NIGHT), SCENE_NO_SPAWN(SCENE_MARKET_ENTRANCE_RUINS)}, "Market Entrance", "Guard House", ENTRANCE_GROUP_MARKET, ENTRANCE_GROUP_MARKET, ENTRANCE_TYPE_INTERIOR, "pots,poe", 1}, + { ENTR_MARKET_ENTRANCE_DAY_0, ENTR_MARKET_DAY_0, {SCENE_NO_SPAWN(SCENE_MARKET_DAY), SCENE_NO_SPAWN(SCENE_MARKET_NIGHT), SCENE_NO_SPAWN(SCENE_MARKET_RUINS), SCENE_NO_SPAWN(SCENE_BACK_ALLEY_DAY), SCENE_NO_SPAWN(SCENE_BACK_ALLEY_NIGHT)}, "Market", "Market Entrance", ENTRANCE_GROUP_MARKET, ENTRANCE_GROUP_MARKET, ENTRANCE_TYPE_OVERWORLD}, + { ENTR_HYRULE_CASTLE_0, ENTR_MARKET_DAY_1, {SCENE_NO_SPAWN(SCENE_MARKET_DAY), SCENE_NO_SPAWN(SCENE_MARKET_NIGHT), SCENE_NO_SPAWN(SCENE_MARKET_RUINS), SCENE_NO_SPAWN(SCENE_BACK_ALLEY_DAY), SCENE_NO_SPAWN(SCENE_BACK_ALLEY_NIGHT)}, "Market", "HC Grounds / OGC", ENTRANCE_GROUP_MARKET, ENTRANCE_GROUP_HYRULE_CASTLE, ENTRANCE_TYPE_OVERWORLD, "outside ganon's castle"}, + { ENTR_TEMPLE_OF_TIME_EXTERIOR_DAY_0, ENTR_MARKET_DAY_2, {SCENE_NO_SPAWN(SCENE_MARKET_DAY), SCENE_NO_SPAWN(SCENE_MARKET_NIGHT), SCENE_NO_SPAWN(SCENE_MARKET_RUINS), SCENE_NO_SPAWN(SCENE_BACK_ALLEY_DAY), SCENE_NO_SPAWN(SCENE_BACK_ALLEY_NIGHT)}, "Market", "Outside Temple of Time", ENTRANCE_GROUP_MARKET, ENTRANCE_GROUP_MARKET, ENTRANCE_TYPE_OVERWORLD}, + { ENTR_SHOOTING_GALLERY_1, ENTR_MARKET_DAY_8, {SCENE_NO_SPAWN(SCENE_MARKET_DAY), SCENE_NO_SPAWN(SCENE_MARKET_NIGHT), SCENE_NO_SPAWN(SCENE_MARKET_RUINS), SCENE_NO_SPAWN(SCENE_BACK_ALLEY_DAY), SCENE_NO_SPAWN(SCENE_BACK_ALLEY_NIGHT)}, "Market", "MK Shooting Gallery", ENTRANCE_GROUP_MARKET, ENTRANCE_GROUP_MARKET, ENTRANCE_TYPE_INTERIOR, "child", 1}, + { ENTR_BOMBCHU_BOWLING_ALLEY_0, ENTR_MARKET_DAY_7, {SCENE_NO_SPAWN(SCENE_MARKET_DAY), SCENE_NO_SPAWN(SCENE_MARKET_NIGHT), SCENE_NO_SPAWN(SCENE_MARKET_RUINS), SCENE_NO_SPAWN(SCENE_BACK_ALLEY_DAY), SCENE_NO_SPAWN(SCENE_BACK_ALLEY_NIGHT)}, "Market", "Bombchu Bowling", ENTRANCE_GROUP_MARKET, ENTRANCE_GROUP_MARKET, ENTRANCE_TYPE_INTERIOR, "", 1}, + { ENTR_TREASURE_BOX_SHOP_0, ENTR_MARKET_DAY_10, {SCENE_NO_SPAWN(SCENE_MARKET_DAY), SCENE_NO_SPAWN(SCENE_MARKET_NIGHT), SCENE_NO_SPAWN(SCENE_MARKET_RUINS), SCENE_NO_SPAWN(SCENE_BACK_ALLEY_DAY), SCENE_NO_SPAWN(SCENE_BACK_ALLEY_NIGHT)}, "Market", "Treasure Chest Game", ENTRANCE_GROUP_MARKET, ENTRANCE_GROUP_MARKET, ENTRANCE_TYPE_INTERIOR, "", 1}, + { ENTR_BACK_ALLEY_HOUSE_0, ENTR_BACK_ALLEY_DAY_3, {SCENE_NO_SPAWN(SCENE_MARKET_DAY), SCENE_NO_SPAWN(SCENE_MARKET_NIGHT), SCENE_NO_SPAWN(SCENE_MARKET_RUINS), SCENE_NO_SPAWN(SCENE_BACK_ALLEY_DAY), SCENE_NO_SPAWN(SCENE_BACK_ALLEY_NIGHT)}, "Market", "Man-in-Green's House", ENTRANCE_GROUP_MARKET, ENTRANCE_GROUP_MARKET, ENTRANCE_TYPE_INTERIOR, "", 1}, + { ENTR_HAPPY_MASK_SHOP_0, ENTR_MARKET_DAY_9, {SCENE_NO_SPAWN(SCENE_MARKET_DAY), SCENE_NO_SPAWN(SCENE_MARKET_NIGHT), SCENE_NO_SPAWN(SCENE_MARKET_RUINS), SCENE_NO_SPAWN(SCENE_BACK_ALLEY_DAY), SCENE_NO_SPAWN(SCENE_BACK_ALLEY_NIGHT)}, "Market", "Mask Shop", ENTRANCE_GROUP_MARKET, ENTRANCE_GROUP_MARKET, ENTRANCE_TYPE_INTERIOR, "", 1}, + { ENTR_BAZAAR_1, ENTR_MARKET_DAY_6, {SCENE_NO_SPAWN(SCENE_MARKET_DAY), SCENE_NO_SPAWN(SCENE_MARKET_NIGHT), SCENE_NO_SPAWN(SCENE_MARKET_RUINS), SCENE_NO_SPAWN(SCENE_BACK_ALLEY_DAY), SCENE_NO_SPAWN(SCENE_BACK_ALLEY_NIGHT)}, "Market", "MK Bazaar", ENTRANCE_GROUP_MARKET, ENTRANCE_GROUP_MARKET, ENTRANCE_TYPE_INTERIOR, "shop", 1}, + { ENTR_POTION_SHOP_MARKET_0, ENTR_MARKET_DAY_5, {SCENE_NO_SPAWN(SCENE_MARKET_DAY), SCENE_NO_SPAWN(SCENE_MARKET_NIGHT), SCENE_NO_SPAWN(SCENE_MARKET_RUINS), SCENE_NO_SPAWN(SCENE_BACK_ALLEY_DAY), SCENE_NO_SPAWN(SCENE_BACK_ALLEY_NIGHT)}, "Market", "MK Potion Shop", ENTRANCE_GROUP_MARKET, ENTRANCE_GROUP_MARKET, ENTRANCE_TYPE_INTERIOR, "", 1}, + { ENTR_BOMBCHU_SHOP_1, ENTR_BACK_ALLEY_DAY_2, {SCENE_NO_SPAWN(SCENE_MARKET_DAY), SCENE_NO_SPAWN(SCENE_MARKET_NIGHT), SCENE_NO_SPAWN(SCENE_MARKET_RUINS), SCENE_NO_SPAWN(SCENE_BACK_ALLEY_DAY), SCENE_NO_SPAWN(SCENE_BACK_ALLEY_NIGHT)}, "Market", "Bombchu Shop", ENTRANCE_GROUP_MARKET, ENTRANCE_GROUP_MARKET, ENTRANCE_TYPE_INTERIOR, "", 1}, + { ENTR_MARKET_ENTRANCE_DAY_2, ENTR_MARKET_GUARD_HOUSE_0, {{ SCENE_MARKET_GUARD_HOUSE }}, "Guard House", "Market Entrance", ENTRANCE_GROUP_MARKET, ENTRANCE_GROUP_MARKET, ENTRANCE_TYPE_INTERIOR, "pots,poe"}, + { ENTR_MARKET_DAY_8, ENTR_SHOOTING_GALLERY_1, {{ SCENE_SHOOTING_GALLERY, 0x01 }}, "MK Shooting Gallery", "Market", ENTRANCE_GROUP_MARKET, ENTRANCE_GROUP_MARKET, ENTRANCE_TYPE_INTERIOR}, + { ENTR_MARKET_DAY_7, ENTR_BOMBCHU_BOWLING_ALLEY_0, SINGLE_SCENE_INFO(SCENE_BOMBCHU_BOWLING_ALLEY), "Bombchu Bowling", "Market", ENTRANCE_GROUP_MARKET, ENTRANCE_GROUP_MARKET, ENTRANCE_TYPE_INTERIOR}, + { ENTR_MARKET_DAY_10, ENTR_TREASURE_BOX_SHOP_0, SINGLE_SCENE_INFO(SCENE_TREASURE_BOX_SHOP), "Treasure Chest Game", "Market", ENTRANCE_GROUP_MARKET, ENTRANCE_GROUP_MARKET, ENTRANCE_TYPE_INTERIOR}, + { ENTR_BACK_ALLEY_DAY_3, ENTR_BACK_ALLEY_HOUSE_0, SINGLE_SCENE_INFO(SCENE_BACK_ALLEY_HOUSE), "Man-in-Green's House", "Market", ENTRANCE_GROUP_MARKET, ENTRANCE_GROUP_MARKET, ENTRANCE_TYPE_INTERIOR}, + { ENTR_MARKET_DAY_9, ENTR_HAPPY_MASK_SHOP_0, SINGLE_SCENE_INFO(SCENE_HAPPY_MASK_SHOP), "Mask Shop", "Market", ENTRANCE_GROUP_MARKET, ENTRANCE_GROUP_MARKET, ENTRANCE_TYPE_INTERIOR}, + { ENTR_MARKET_DAY_6, ENTR_BAZAAR_1, {{ SCENE_BAZAAR, 0x01 }}, "MK Bazaar", "Market", ENTRANCE_GROUP_MARKET, ENTRANCE_GROUP_MARKET, ENTRANCE_TYPE_INTERIOR, "shop"}, + { ENTR_MARKET_DAY_5, ENTR_POTION_SHOP_MARKET_0, SINGLE_SCENE_INFO(SCENE_POTION_SHOP_MARKET), "MK Potion Shop", "Market", ENTRANCE_GROUP_MARKET, ENTRANCE_GROUP_MARKET, ENTRANCE_TYPE_INTERIOR}, + { ENTR_BACK_ALLEY_DAY_2, ENTR_BOMBCHU_SHOP_1, SINGLE_SCENE_INFO(SCENE_BOMBCHU_SHOP), "Bombchu Shop", "Market", ENTRANCE_GROUP_MARKET, ENTRANCE_GROUP_MARKET, ENTRANCE_TYPE_INTERIOR}, + { ENTR_MARKET_DAY_2, ENTR_TEMPLE_OF_TIME_EXTERIOR_DAY_0, {SCENE_NO_SPAWN(SCENE_TEMPLE_OF_TIME_EXTERIOR_DAY), SCENE_NO_SPAWN(SCENE_TEMPLE_OF_TIME_EXTERIOR_NIGHT), SCENE_NO_SPAWN(SCENE_TEMPLE_OF_TIME_EXTERIOR_RUINS)}, "Outside Temple of Time", "Market", ENTRANCE_GROUP_MARKET, ENTRANCE_GROUP_MARKET, ENTRANCE_TYPE_OVERWORLD, "tot"}, + { ENTR_TEMPLE_OF_TIME_0, ENTR_TEMPLE_OF_TIME_EXTERIOR_DAY_1, {SCENE_NO_SPAWN(SCENE_TEMPLE_OF_TIME_EXTERIOR_DAY), SCENE_NO_SPAWN(SCENE_TEMPLE_OF_TIME_EXTERIOR_NIGHT), SCENE_NO_SPAWN(SCENE_TEMPLE_OF_TIME_EXTERIOR_RUINS)}, "Outside Temple of Time", "Temple of Time", ENTRANCE_GROUP_MARKET, ENTRANCE_GROUP_MARKET, ENTRANCE_TYPE_INTERIOR, "tot", 1}, + { ENTR_TEMPLE_OF_TIME_EXTERIOR_DAY_1, ENTR_TEMPLE_OF_TIME_0, SINGLE_SCENE_INFO(SCENE_TEMPLE_OF_TIME), "Temple of Time", "Outside Temple of Time", ENTRANCE_GROUP_MARKET, ENTRANCE_GROUP_MARKET, ENTRANCE_TYPE_INTERIOR, "tot"}, // Hyrule Castle - { 0x025A, 0x0138, {SCENE_NO_SPAWN(0x5F), SCENE_NO_SPAWN(0x64)}, "HC Grounds / OGC", "Market", ENTRANCE_GROUP_HYRULE_CASTLE, ENTRANCE_GROUP_MARKET, ENTRANCE_TYPE_OVERWORLD, "outside ganon's castle"}, - { 0x0578, 0x0340, SINGLE_SCENE_INFO(0x5F), "HC Grounds", "HC Great Fairy Fountain", ENTRANCE_GROUP_HYRULE_CASTLE, ENTRANCE_GROUP_HYRULE_CASTLE, ENTRANCE_TYPE_INTERIOR, "", 1}, - { 0x070C, 0x080C, SINGLE_SCENE_INFO(0x5F), "HC Grounds", "HC Storms Grotto", ENTRANCE_GROUP_HYRULE_CASTLE, ENTRANCE_GROUP_HYRULE_CASTLE, ENTRANCE_TYPE_GROTTO, "bombable", 1}, - { 0x0340, 0x0578, {{ 0x3D, 0x01 }}, "HC Great Fairy Fountain", "HC Grounds", ENTRANCE_GROUP_HYRULE_CASTLE, ENTRANCE_GROUP_HYRULE_CASTLE, ENTRANCE_TYPE_INTERIOR}, - { 0x080C, 0x070C, {{ 0x3E, 0x09 }}, "HC Storms Grotto", "HC Grounds", ENTRANCE_GROUP_HYRULE_CASTLE, ENTRANCE_GROUP_HYRULE_CASTLE, ENTRANCE_TYPE_GROTTO, "bombable"}, - { 0x04C2, 0x03E8, SINGLE_SCENE_INFO(0x64), "OGC", "OGC Great Fairy Fountain", ENTRANCE_GROUP_HYRULE_CASTLE, ENTRANCE_GROUP_HYRULE_CASTLE, ENTRANCE_TYPE_INTERIOR, "outside ganon's castle", 1}, - { 0x0467, 0x023D, SINGLE_SCENE_INFO(0x64), "OGC", "Ganon's Castle", ENTRANCE_GROUP_HYRULE_CASTLE, ENTRANCE_GROUP_HYRULE_CASTLE, ENTRANCE_TYPE_DUNGEON, "outside ganon's castle,gc", 1}, - { 0x03E8, 0x04C2, {{ 0x3B, 0x02 }}, "OGC Great Fairy Fountain", "OGC", ENTRANCE_GROUP_HYRULE_CASTLE, ENTRANCE_GROUP_HYRULE_CASTLE, ENTRANCE_TYPE_INTERIOR, "outside ganon's castle"}, - { 0x023D, 0x0467, SINGLE_SCENE_INFO(0x0D), "Ganon's Castle", "OGC", ENTRANCE_GROUP_HYRULE_CASTLE, ENTRANCE_GROUP_HYRULE_CASTLE, ENTRANCE_TYPE_DUNGEON, "outside ganon's castle,gc"} + { ENTR_MARKET_DAY_1, ENTR_HYRULE_CASTLE_0, {SCENE_NO_SPAWN(SCENE_HYRULE_CASTLE), SCENE_NO_SPAWN(SCENE_OUTSIDE_GANONS_CASTLE)}, "HC Grounds / OGC", "Market", ENTRANCE_GROUP_HYRULE_CASTLE, ENTRANCE_GROUP_MARKET, ENTRANCE_TYPE_OVERWORLD, "outside ganon's castle"}, + { ENTR_GREAT_FAIRYS_FOUNTAIN_SPELLS_1, ENTR_HYRULE_CASTLE_2, SINGLE_SCENE_INFO(SCENE_HYRULE_CASTLE), "HC Grounds", "HC Great Fairy Fountain", ENTRANCE_GROUP_HYRULE_CASTLE, ENTRANCE_GROUP_HYRULE_CASTLE, ENTRANCE_TYPE_INTERIOR, "", 1}, + { ENTRANCE_RANDO_GROTTO_LOAD(GROTTO_HC_STORMS_OFFSET), ENTRANCE_RANDO_GROTTO_EXIT(GROTTO_HC_STORMS_OFFSET), SINGLE_SCENE_INFO(SCENE_HYRULE_CASTLE), "HC Grounds", "HC Storms Grotto", ENTRANCE_GROUP_HYRULE_CASTLE, ENTRANCE_GROUP_HYRULE_CASTLE, ENTRANCE_TYPE_GROTTO, "bombable", 1}, + { ENTR_HYRULE_CASTLE_2, ENTR_GREAT_FAIRYS_FOUNTAIN_SPELLS_1, {{ SCENE_GREAT_FAIRYS_FOUNTAIN_SPELLS, 0x01 }}, "HC Great Fairy Fountain", "HC Grounds", ENTRANCE_GROUP_HYRULE_CASTLE, ENTRANCE_GROUP_HYRULE_CASTLE, ENTRANCE_TYPE_INTERIOR}, + { ENTRANCE_RANDO_GROTTO_EXIT(GROTTO_HC_STORMS_OFFSET), ENTRANCE_RANDO_GROTTO_LOAD(GROTTO_HC_STORMS_OFFSET), {{ SCENE_GROTTOS, 0x09 }}, "HC Storms Grotto", "HC Grounds", ENTRANCE_GROUP_HYRULE_CASTLE, ENTRANCE_GROUP_HYRULE_CASTLE, ENTRANCE_TYPE_GROTTO, "bombable"}, + { ENTR_GREAT_FAIRYS_FOUNTAIN_MAGIC_2, ENTR_POTION_SHOP_KAKARIKO_1, SINGLE_SCENE_INFO(SCENE_OUTSIDE_GANONS_CASTLE), "OGC", "OGC Great Fairy Fountain", ENTRANCE_GROUP_HYRULE_CASTLE, ENTRANCE_GROUP_HYRULE_CASTLE, ENTRANCE_TYPE_INTERIOR, "outside ganon's castle", 1}, + { ENTR_INSIDE_GANONS_CASTLE_0, ENTR_HYRULE_CASTLE_1, SINGLE_SCENE_INFO(SCENE_OUTSIDE_GANONS_CASTLE), "OGC", "Ganon's Castle", ENTRANCE_GROUP_HYRULE_CASTLE, ENTRANCE_GROUP_HYRULE_CASTLE, ENTRANCE_TYPE_DUNGEON, "outside ganon's castle,gc", 1}, + { ENTR_POTION_SHOP_KAKARIKO_1, ENTR_GREAT_FAIRYS_FOUNTAIN_MAGIC_2, {{ SCENE_GREAT_FAIRYS_FOUNTAIN_MAGIC, 0x02 }}, "OGC Great Fairy Fountain", "OGC", ENTRANCE_GROUP_HYRULE_CASTLE, ENTRANCE_GROUP_HYRULE_CASTLE, ENTRANCE_TYPE_INTERIOR, "outside ganon's castle"}, + { ENTR_HYRULE_CASTLE_1, ENTR_INSIDE_GANONS_CASTLE_0, SINGLE_SCENE_INFO(SCENE_INSIDE_GANONS_CASTLE), "Ganon's Castle", "OGC", ENTRANCE_GROUP_HYRULE_CASTLE, ENTRANCE_GROUP_HYRULE_CASTLE, ENTRANCE_TYPE_DUNGEON, "outside ganon's castle,gc"} }; // Check if Link is in the area and return that scene/entrance for tracking @@ -411,9 +412,9 @@ bool IsEntranceDiscovered(s16 index) { if (!isDiscovered) { // If the pair included one of the hyrule field <-> zora's river entrances, // the randomizer will have also overriden the water-based entrances, so check those too - if ((index == 0x00EA && Entrance_GetIsEntranceDiscovered(0x01D9)) || (index == 0x01D9 && Entrance_GetIsEntranceDiscovered(0x00EA))) { + if ((index == ENTR_ZORAS_RIVER_0 && Entrance_GetIsEntranceDiscovered(ENTR_ZORAS_RIVER_3)) || (index == ENTR_ZORAS_RIVER_3 && Entrance_GetIsEntranceDiscovered(ENTR_ZORAS_RIVER_0))) { isDiscovered = true; - } else if ((index == 0x0181 && Entrance_GetIsEntranceDiscovered(0x0311)) || (index == 0x0311 && Entrance_GetIsEntranceDiscovered(0x0181))) { + } else if ((index == ENTR_HYRULE_FIELD_2 && Entrance_GetIsEntranceDiscovered(ENTR_HYRULE_FIELD_14)) || (index == ENTR_HYRULE_FIELD_14 && Entrance_GetIsEntranceDiscovered(ENTR_HYRULE_FIELD_2))) { isDiscovered = true; } } diff --git a/soh/soh/Enhancements/randomizer/randomizer_grotto.c b/soh/soh/Enhancements/randomizer/randomizer_grotto.c index 9f30e3be8..662602543 100644 --- a/soh/soh/Enhancements/randomizer/randomizer_grotto.c +++ b/soh/soh/Enhancements/randomizer/randomizer_grotto.c @@ -11,76 +11,76 @@ extern PlayState* gPlayState; // Information necessary for entering each grotto static const GrottoLoadInfo grottoLoadTable[NUM_GROTTOS] = { - {.entranceIndex = 0x05BC, .content = 0xFD, .scene = 0x5C}, // Desert Colossus -> Colossus Grotto - {.entranceIndex = 0x05A4, .content = 0xEF, .scene = 0x57}, // Lake Hylia -> LH Grotto - {.entranceIndex = 0x05BC, .content = 0xEB, .scene = 0x54}, // Zora River -> ZR Storms Grotto - {.entranceIndex = 0x036D, .content = 0xE6, .scene = 0x54}, // Zora River -> ZR Fairy Grotto - {.entranceIndex = 0x003F, .content = 0x29, .scene = 0x54}, // Zora River -> ZR Open Grotto - {.entranceIndex = 0x05A4, .content = 0xF9, .scene = 0x61}, // DMC Lower Nearby -> DMC Hammer Grotto - {.entranceIndex = 0x003F, .content = 0x7A, .scene = 0x61}, // DMC Upper Nearby -> DMC Upper Grotto - {.entranceIndex = 0x05A4, .content = 0xFB, .scene = 0x62}, // GC Grotto Platform -> GC Grotto - {.entranceIndex = 0x003F, .content = 0x57, .scene = 0x60}, // Death Mountain -> DMT Storms Grotto - {.entranceIndex = 0x05FC, .content = 0xF8, .scene = 0x60}, // Death Mountain Summit -> DMT Cow Grotto - {.entranceIndex = 0x003F, .content = 0x28, .scene = 0x52}, // Kak Backyard -> Kak Open Grotto - {.entranceIndex = 0x05A0, .content = 0xE7, .scene = 0x52}, // Kakariko Village -> Kak Redead Grotto - {.entranceIndex = 0x05B8, .content = 0xF6, .scene = 0x5F}, // Hyrule Castle Grounds -> HC Storms Grotto - {.entranceIndex = 0x05C0, .content = 0xE1, .scene = 0x51}, // Hyrule Field -> HF Tektite Grotto - {.entranceIndex = 0x0598, .content = 0xE5, .scene = 0x51}, // Hyrule Field -> HF Near Kak Grotto - {.entranceIndex = 0x036D, .content = 0xFF, .scene = 0x51}, // Hyrule Field -> HF Fairy Grotto - {.entranceIndex = 0x003F, .content = 0x00, .scene = 0x51}, // Hyrule Field -> HF Near Market Grotto - {.entranceIndex = 0x05A8, .content = 0xE4, .scene = 0x51}, // Hyrule Field -> HF Cow Grotto - {.entranceIndex = 0x059C, .content = 0xE6, .scene = 0x51}, // Hyrule Field -> HF Inside Fence Grotto - {.entranceIndex = 0x003F, .content = 0x03, .scene = 0x51}, // Hyrule Field -> HF Open Grotto - {.entranceIndex = 0x003F, .content = 0x22, .scene = 0x51}, // Hyrule Field -> HF Southeast Grotto - {.entranceIndex = 0x05A4, .content = 0xFC, .scene = 0x63}, // Lon Lon Ranch -> LLR Grotto - {.entranceIndex = 0x05B4, .content = 0xED, .scene = 0x56}, // SFM Entryway -> SFM Wolfos Grotto - {.entranceIndex = 0x05BC, .content = 0xEE, .scene = 0x56}, // Sacred Forest Meadow -> SFM Storms Grotto - {.entranceIndex = 0x036D, .content = 0xFF, .scene = 0x56}, // Sacred Forest Meadow -> SFM Fairy Grotto - {.entranceIndex = 0x05B0, .content = 0xF5, .scene = 0x5B}, // LW Beyond Mido -> LW Scrubs Grotto - {.entranceIndex = 0x003F, .content = 0x14, .scene = 0x5B}, // Lost Woods -> LW Near Shortcuts Grotto - {.entranceIndex = 0x003F, .content = 0x2C, .scene = 0x55}, // Kokiri Forest -> KF Storms Grotto - {.entranceIndex = 0x036D, .content = 0xFF, .scene = 0x58}, // Zoras Domain -> ZD Storms Grotto - {.entranceIndex = 0x036D, .content = 0xFF, .scene = 0x5D}, // Gerudo Fortress -> GF Storms Grotto - {.entranceIndex = 0x05BC, .content = 0xF0, .scene = 0x5A}, // GV Fortress Side -> GV Storms Grotto - {.entranceIndex = 0x05AC, .content = 0xF2, .scene = 0x5A}, // GV Grotto Ledge -> GV Octorok Grotto - {.entranceIndex = 0x05C4, .content = 0xF3, .scene = 0x5B}, // LW Beyond Mido -> Deku Theater + {.entranceIndex = ENTR_GROTTOS_10, .content = 0xFD, .scene = SCENE_DESERT_COLOSSUS}, // Desert Colossus -> Colossus Grotto + {.entranceIndex = ENTR_GROTTOS_4, .content = 0xEF, .scene = SCENE_LAKE_HYLIA}, // Lake Hylia -> LH Grotto + {.entranceIndex = ENTR_GROTTOS_10, .content = 0xEB, .scene = SCENE_ZORAS_RIVER}, // Zora River -> ZR Storms Grotto + {.entranceIndex = ENTR_FAIRYS_FOUNTAIN_0, .content = 0xE6, .scene = SCENE_ZORAS_RIVER}, // Zora River -> ZR Fairy Grotto + {.entranceIndex = ENTR_GROTTOS_0, .content = 0x29, .scene = SCENE_ZORAS_RIVER}, // Zora River -> ZR Open Grotto + {.entranceIndex = ENTR_GROTTOS_4, .content = 0xF9, .scene = SCENE_DEATH_MOUNTAIN_CRATER}, // DMC Lower Nearby -> DMC Hammer Grotto + {.entranceIndex = ENTR_GROTTOS_0, .content = 0x7A, .scene = SCENE_DEATH_MOUNTAIN_CRATER}, // DMC Upper Nearby -> DMC Upper Grotto + {.entranceIndex = ENTR_GROTTOS_4, .content = 0xFB, .scene = SCENE_GORON_CITY}, // GC Grotto Platform -> GC Grotto + {.entranceIndex = ENTR_GROTTOS_0, .content = 0x57, .scene = SCENE_DEATH_MOUNTAIN_TRAIL}, // Death Mountain -> DMT Storms Grotto + {.entranceIndex = ENTR_GROTTOS_13, .content = 0xF8, .scene = SCENE_DEATH_MOUNTAIN_TRAIL}, // Death Mountain Summit -> DMT Cow Grotto + {.entranceIndex = ENTR_GROTTOS_0, .content = 0x28, .scene = SCENE_KAKARIKO_VILLAGE}, // Kak Backyard -> Kak Open Grotto + {.entranceIndex = ENTR_GROTTOS_3, .content = 0xE7, .scene = SCENE_KAKARIKO_VILLAGE}, // Kakariko Village -> Kak Redead Grotto + {.entranceIndex = ENTR_GROTTOS_9, .content = 0xF6, .scene = SCENE_HYRULE_CASTLE}, // Hyrule Castle Grounds -> HC Storms Grotto + {.entranceIndex = ENTR_GROTTOS_11, .content = 0xE1, .scene = SCENE_HYRULE_FIELD}, // Hyrule Field -> HF Tektite Grotto + {.entranceIndex = ENTR_GROTTOS_1, .content = 0xE5, .scene = SCENE_HYRULE_FIELD}, // Hyrule Field -> HF Near Kak Grotto + {.entranceIndex = ENTR_FAIRYS_FOUNTAIN_0, .content = 0xFF, .scene = SCENE_HYRULE_FIELD}, // Hyrule Field -> HF Fairy Grotto + {.entranceIndex = ENTR_GROTTOS_0, .content = 0x00, .scene = SCENE_HYRULE_FIELD}, // Hyrule Field -> HF Near Market Grotto + {.entranceIndex = ENTR_GROTTOS_5, .content = 0xE4, .scene = SCENE_HYRULE_FIELD}, // Hyrule Field -> HF Cow Grotto + {.entranceIndex = ENTR_GROTTOS_2, .content = 0xE6, .scene = SCENE_HYRULE_FIELD}, // Hyrule Field -> HF Inside Fence Grotto + {.entranceIndex = ENTR_GROTTOS_0, .content = 0x03, .scene = SCENE_HYRULE_FIELD}, // Hyrule Field -> HF Open Grotto + {.entranceIndex = ENTR_GROTTOS_0, .content = 0x22, .scene = SCENE_HYRULE_FIELD}, // Hyrule Field -> HF Southeast Grotto + {.entranceIndex = ENTR_GROTTOS_4, .content = 0xFC, .scene = SCENE_LON_LON_RANCH}, // Lon Lon Ranch -> LLR Grotto + {.entranceIndex = ENTR_GROTTOS_8, .content = 0xED, .scene = SCENE_SACRED_FOREST_MEADOW}, // SFM Entryway -> SFM Wolfos Grotto + {.entranceIndex = ENTR_GROTTOS_10, .content = 0xEE, .scene = SCENE_SACRED_FOREST_MEADOW}, // Sacred Forest Meadow -> SFM Storms Grotto + {.entranceIndex = ENTR_FAIRYS_FOUNTAIN_0, .content = 0xFF, .scene = SCENE_SACRED_FOREST_MEADOW}, // Sacred Forest Meadow -> SFM Fairy Grotto + {.entranceIndex = ENTR_GROTTOS_7, .content = 0xF5, .scene = SCENE_LOST_WOODS}, // LW Beyond Mido -> LW Scrubs Grotto + {.entranceIndex = ENTR_GROTTOS_0, .content = 0x14, .scene = SCENE_LOST_WOODS}, // Lost Woods -> LW Near Shortcuts Grotto + {.entranceIndex = ENTR_GROTTOS_0, .content = 0x2C, .scene = SCENE_KOKIRI_FOREST}, // Kokiri Forest -> KF Storms Grotto + {.entranceIndex = ENTR_FAIRYS_FOUNTAIN_0, .content = 0xFF, .scene = SCENE_ZORAS_DOMAIN}, // Zoras Domain -> ZD Storms Grotto + {.entranceIndex = ENTR_FAIRYS_FOUNTAIN_0, .content = 0xFF, .scene = SCENE_GERUDOS_FORTRESS}, // Gerudo Fortress -> GF Storms Grotto + {.entranceIndex = ENTR_GROTTOS_10, .content = 0xF0, .scene = SCENE_GERUDO_VALLEY}, // GV Fortress Side -> GV Storms Grotto + {.entranceIndex = ENTR_GROTTOS_6, .content = 0xF2, .scene = SCENE_GERUDO_VALLEY}, // GV Grotto Ledge -> GV Octorok Grotto + {.entranceIndex = ENTR_GROTTOS_12, .content = 0xF3, .scene = SCENE_LOST_WOODS}, // LW Beyond Mido -> Deku Theater }; // Information necessary for setting up returning from a grotto static const GrottoReturnInfo grottoReturnTable[NUM_GROTTOS] = { - {.entranceIndex = 0x0123, .room = 0x00, .angle = 0xA71C, .pos = {.x = 62.5078f, .y = -32.0f, .z = -1296.2f}}, // Colossus Grotto -> Desert Colossus - {.entranceIndex = 0x0102, .room = 0x00, .angle = 0x0000, .pos = {.x = -3039.34f, .y = -1033.0f, .z = 6080.74f}}, // LH Grotto -> Lake Hylia - {.entranceIndex = 0x00EA, .room = 0x00, .angle = 0x0000, .pos = {.x = -1630.05f, .y = 100.0f, .z = -132.104f}}, // ZR Storms Grotto -> Zora River - {.entranceIndex = 0x00EA, .room = 0x00, .angle = 0xE000, .pos = {.x = 649.507f, .y = 570.0f, .z = -346.853f}}, // ZR Fairy Grotto -> Zora River - {.entranceIndex = 0x00EA, .room = 0x00, .angle = 0x8000, .pos = {.x = 362.29f, .y = 570.0f, .z = 111.48f}}, // ZR Open Grotto -> Zora River - {.entranceIndex = 0x0246, .room = 0x01, .angle = 0x31C7, .pos = {.x = -1666.73f, .y = 721.0f, .z = -459.21f}}, // DMC Hammer Grotto -> DMC Lower Local - {.entranceIndex = 0x0147, .room = 0x01, .angle = 0x238E, .pos = {.x = 63.723f, .y = 1265.0f, .z = 1791.39f}}, // DMC Upper Grotto -> DMC Upper Local - {.entranceIndex = 0x014D, .room = 0x03, .angle = 0x0000, .pos = {.x = 1104.73f, .y = 580.0f, .z = -1159.95f}}, // GC Grotto -> GC Grotto Platform - {.entranceIndex = 0x01B9, .room = 0x00, .angle = 0x8000, .pos = {.x = -387.584f, .y = 1386.0f, .z = -1213.05f}}, // DMT Storms Grotto -> Death Mountain - {.entranceIndex = 0x01B9, .room = 0x00, .angle = 0x8000, .pos = {.x = -691.022f, .y = 1946.0f, .z = -312.969f}}, // DMT Cow Grotto -> Death Mountain Summit - {.entranceIndex = 0x00DB, .room = 0x00, .angle = 0x0000, .pos = {.x = 855.238f, .y = 80.0f, .z = -234.095f}}, // Kak Open Grotto -> Kak Backyard - {.entranceIndex = 0x00DB, .room = 0x00, .angle = 0x0000, .pos = {.x = -401.873f, .y = 0.0f, .z = 402.792f}}, // Kak Redead Grotto -> Kakariko Village - {.entranceIndex = 0x0138, .room = 0x00, .angle = 0x9555, .pos = {.x = 1009.02f, .y = 1571.0f, .z = 855.532f}}, // HC Storms Grotto -> Castle Grounds - {.entranceIndex = 0x01F9, .room = 0x00, .angle = 0x1555, .pos = {.x = -4949.58f, .y = -300.0f, .z = 2837.59f}}, // HF Tektite Grotto -> Hyrule Field - {.entranceIndex = 0x01F9, .room = 0x00, .angle = 0xC000, .pos = {.x = 2050.6f, .y = 20.0f, .z = -160.397f}}, // HF Near Kak Grotto -> Hyrule Field - {.entranceIndex = 0x01F9, .room = 0x00, .angle = 0x0000, .pos = {.x = -4447.66f, .y = -300.0f, .z = -393.191f}}, // HF Fairy Grotto -> Hyrule Field - {.entranceIndex = 0x01F9, .room = 0x00, .angle = 0xE000, .pos = {.x = -1446.56f, .y = 0.0f, .z = 830.775f}}, // HF Near Market Grotto -> Hyrule Field - {.entranceIndex = 0x01F9, .room = 0x00, .angle = 0x0000, .pos = {.x = -7874.07f, .y = -300.0f, .z = 6921.31f}}, // HF Cow Grotto -> Hyrule Field - {.entranceIndex = 0x01F9, .room = 0x00, .angle = 0xEAAB, .pos = {.x = -4989.13f, .y = -700.0f, .z = 13821.1f}}, // HF Inside Fence Grotto -> Hyrule Field - {.entranceIndex = 0x01F9, .room = 0x00, .angle = 0x8000, .pos = {.x = -4032.61f, .y = -700.0f, .z = 13831.5f}}, // HF Open Grotto -> Hyrule Field - {.entranceIndex = 0x01F9, .room = 0x00, .angle = 0x9555, .pos = {.x = -288.313f, .y = -500.0f, .z = 12320.2f}}, // HF Southeast Grotto -> Hyrule Field - {.entranceIndex = 0x0157, .room = 0x00, .angle = 0xAAAB, .pos = {.x = 1775.92f, .y = 0.0f, .z = 1486.82f}}, // LLR Grotto -> Lon Lon Ranch - {.entranceIndex = 0x00FC, .room = 0x00, .angle = 0x8000, .pos = {.x = -189.861f, .y = 0.0f, .z = 1898.09f}}, // SFM Wolfos Grotto -> SFM Entryway - {.entranceIndex = 0x00FC, .room = 0x00, .angle = 0xAAAB, .pos = {.x = 314.853f, .y = 480.0f, .z = -2300.39f}}, // SFM Storms Grotto -> Sacred Forest Meadow - {.entranceIndex = 0x00FC, .room = 0x00, .angle = 0x0000, .pos = {.x = 55.034f, .y = 0.0f, .z = 250.595f}}, // SFM Fairy Grotto -> Sacred Forest Meadow - {.entranceIndex = 0x01A9, .room = 0x08, .angle = 0x2000, .pos = {.x = 691.994f, .y = 0.0f, .z = -2502.2f}}, // LW Scrubs Grotto -> LW Beyond Mido - {.entranceIndex = 0x011E, .room = 0x02, .angle = 0xE000, .pos = {.x = 905.755f, .y = 0.0f, .z = -901.43f}}, // LW Near Shortcuts Grotto -> Lost Woods - {.entranceIndex = 0x0286, .room = 0x00, .angle = 0x4000, .pos = {.x = -507.065f, .y = 380.0f, .z = -1220.43f}}, // KF Storms Grotto -> Kokiri Forest - {.entranceIndex = 0x0108, .room = 0x01, .angle = 0xD555, .pos = {.x = -855.68f, .y = 14.0f, .z = -474.422f}}, // ZD Storms Grotto -> Zoras Domain - {.entranceIndex = 0x0129, .room = 0x00, .angle = 0x4000, .pos = {.x = 380.521f, .y = 333.0f, .z = -1560.74f}}, // GF Storms Grotto -> Gerudo Fortress - {.entranceIndex = 0x022D, .room = 0x00, .angle = 0x9555, .pos = {.x = -1326.34f, .y = 15.0f, .z = -983.994f}}, // GV Storms Grotto -> GV Fortress Side - {.entranceIndex = 0x0117, .room = 0x00, .angle = 0x8000, .pos = {.x = 291.513f, .y = -555.0f, .z = 1478.39f}}, // GV Octorok Grotto -> GV Grotto Ledge - {.entranceIndex = 0x01A9, .room = 0x06, .angle = 0x4000, .pos = {.x = 109.281f, .y = -20.0f, .z = -1601.42f}}, // Deku Theater -> LW Beyond Mido + {.entranceIndex = ENTR_DESERT_COLOSSUS_0, .room = 0x00, .angle = 0xA71C, .pos = {.x = 62.5078f, .y = -32.0f, .z = -1296.2f}}, // Colossus Grotto -> Desert Colossus + {.entranceIndex = ENTR_LAKE_HYLIA_0, .room = 0x00, .angle = 0x0000, .pos = {.x = -3039.34f, .y = -1033.0f, .z = 6080.74f}}, // LH Grotto -> Lake Hylia + {.entranceIndex = ENTR_ZORAS_RIVER_0, .room = 0x00, .angle = 0x0000, .pos = {.x = -1630.05f, .y = 100.0f, .z = -132.104f}}, // ZR Storms Grotto -> Zora River + {.entranceIndex = ENTR_ZORAS_RIVER_0, .room = 0x00, .angle = 0xE000, .pos = {.x = 649.507f, .y = 570.0f, .z = -346.853f}}, // ZR Fairy Grotto -> Zora River + {.entranceIndex = ENTR_ZORAS_RIVER_0, .room = 0x00, .angle = 0x8000, .pos = {.x = 362.29f, .y = 570.0f, .z = 111.48f}}, // ZR Open Grotto -> Zora River + {.entranceIndex = ENTR_DEATH_MOUNTAIN_CRATER_1, .room = 0x01, .angle = 0x31C7, .pos = {.x = -1666.73f, .y = 721.0f, .z = -459.21f}}, // DMC Hammer Grotto -> DMC Lower Local + {.entranceIndex = ENTR_DEATH_MOUNTAIN_CRATER_0, .room = 0x01, .angle = 0x238E, .pos = {.x = 63.723f, .y = 1265.0f, .z = 1791.39f}}, // DMC Upper Grotto -> DMC Upper Local + {.entranceIndex = ENTR_GORON_CITY_0, .room = 0x03, .angle = 0x0000, .pos = {.x = 1104.73f, .y = 580.0f, .z = -1159.95f}}, // GC Grotto -> GC Grotto Platform + {.entranceIndex = ENTR_DEATH_MOUNTAIN_TRAIL_1, .room = 0x00, .angle = 0x8000, .pos = {.x = -387.584f, .y = 1386.0f, .z = -1213.05f}}, // DMT Storms Grotto -> Death Mountain + {.entranceIndex = ENTR_DEATH_MOUNTAIN_TRAIL_1, .room = 0x00, .angle = 0x8000, .pos = {.x = -691.022f, .y = 1946.0f, .z = -312.969f}}, // DMT Cow Grotto -> Death Mountain Summit + {.entranceIndex = ENTR_KAKARIKO_VILLAGE_0, .room = 0x00, .angle = 0x0000, .pos = {.x = 855.238f, .y = 80.0f, .z = -234.095f}}, // Kak Open Grotto -> Kak Backyard + {.entranceIndex = ENTR_KAKARIKO_VILLAGE_0, .room = 0x00, .angle = 0x0000, .pos = {.x = -401.873f, .y = 0.0f, .z = 402.792f}}, // Kak Redead Grotto -> Kakariko Village + {.entranceIndex = ENTR_HYRULE_CASTLE_0, .room = 0x00, .angle = 0x9555, .pos = {.x = 1009.02f, .y = 1571.0f, .z = 855.532f}}, // HC Storms Grotto -> Castle Grounds + {.entranceIndex = ENTR_HYRULE_FIELD_6, .room = 0x00, .angle = 0x1555, .pos = {.x = -4949.58f, .y = -300.0f, .z = 2837.59f}}, // HF Tektite Grotto -> Hyrule Field + {.entranceIndex = ENTR_HYRULE_FIELD_6, .room = 0x00, .angle = 0xC000, .pos = {.x = 2050.6f, .y = 20.0f, .z = -160.397f}}, // HF Near Kak Grotto -> Hyrule Field + {.entranceIndex = ENTR_HYRULE_FIELD_6, .room = 0x00, .angle = 0x0000, .pos = {.x = -4447.66f, .y = -300.0f, .z = -393.191f}}, // HF Fairy Grotto -> Hyrule Field + {.entranceIndex = ENTR_HYRULE_FIELD_6, .room = 0x00, .angle = 0xE000, .pos = {.x = -1446.56f, .y = 0.0f, .z = 830.775f}}, // HF Near Market Grotto -> Hyrule Field + {.entranceIndex = ENTR_HYRULE_FIELD_6, .room = 0x00, .angle = 0x0000, .pos = {.x = -7874.07f, .y = -300.0f, .z = 6921.31f}}, // HF Cow Grotto -> Hyrule Field + {.entranceIndex = ENTR_HYRULE_FIELD_6, .room = 0x00, .angle = 0xEAAB, .pos = {.x = -4989.13f, .y = -700.0f, .z = 13821.1f}}, // HF Inside Fence Grotto -> Hyrule Field + {.entranceIndex = ENTR_HYRULE_FIELD_6, .room = 0x00, .angle = 0x8000, .pos = {.x = -4032.61f, .y = -700.0f, .z = 13831.5f}}, // HF Open Grotto -> Hyrule Field + {.entranceIndex = ENTR_HYRULE_FIELD_6, .room = 0x00, .angle = 0x9555, .pos = {.x = -288.313f, .y = -500.0f, .z = 12320.2f}}, // HF Southeast Grotto -> Hyrule Field + {.entranceIndex = ENTR_LON_LON_RANCH_0, .room = 0x00, .angle = 0xAAAB, .pos = {.x = 1775.92f, .y = 0.0f, .z = 1486.82f}}, // LLR Grotto -> Lon Lon Ranch + {.entranceIndex = ENTR_SACRED_FOREST_MEADOW_0, .room = 0x00, .angle = 0x8000, .pos = {.x = -189.861f, .y = 0.0f, .z = 1898.09f}}, // SFM Wolfos Grotto -> SFM Entryway + {.entranceIndex = ENTR_SACRED_FOREST_MEADOW_0, .room = 0x00, .angle = 0xAAAB, .pos = {.x = 314.853f, .y = 480.0f, .z = -2300.39f}}, // SFM Storms Grotto -> Sacred Forest Meadow + {.entranceIndex = ENTR_SACRED_FOREST_MEADOW_0, .room = 0x00, .angle = 0x0000, .pos = {.x = 55.034f, .y = 0.0f, .z = 250.595f}}, // SFM Fairy Grotto -> Sacred Forest Meadow + {.entranceIndex = ENTR_LOST_WOODS_1, .room = 0x08, .angle = 0x2000, .pos = {.x = 691.994f, .y = 0.0f, .z = -2502.2f}}, // LW Scrubs Grotto -> LW Beyond Mido + {.entranceIndex = ENTR_LOST_WOODS_0, .room = 0x02, .angle = 0xE000, .pos = {.x = 905.755f, .y = 0.0f, .z = -901.43f}}, // LW Near Shortcuts Grotto -> Lost Woods + {.entranceIndex = ENTR_KOKIRI_FOREST_6, .room = 0x00, .angle = 0x4000, .pos = {.x = -507.065f, .y = 380.0f, .z = -1220.43f}}, // KF Storms Grotto -> Kokiri Forest + {.entranceIndex = ENTR_ZORAS_DOMAIN_0, .room = 0x01, .angle = 0xD555, .pos = {.x = -855.68f, .y = 14.0f, .z = -474.422f}}, // ZD Storms Grotto -> Zoras Domain + {.entranceIndex = ENTR_GERUDOS_FORTRESS_0, .room = 0x00, .angle = 0x4000, .pos = {.x = 380.521f, .y = 333.0f, .z = -1560.74f}}, // GF Storms Grotto -> Gerudo Fortress + {.entranceIndex = ENTR_GERUDO_VALLEY_3, .room = 0x00, .angle = 0x9555, .pos = {.x = -1326.34f, .y = 15.0f, .z = -983.994f}}, // GV Storms Grotto -> GV Fortress Side + {.entranceIndex = ENTR_GERUDO_VALLEY_0, .room = 0x00, .angle = 0x8000, .pos = {.x = 291.513f, .y = -555.0f, .z = 1478.39f}}, // GV Octorok Grotto -> GV Grotto Ledge + {.entranceIndex = ENTR_LOST_WOODS_1, .room = 0x06, .angle = 0x4000, .pos = {.x = 109.281f, .y = -20.0f, .z = -1601.42f}}, // Deku Theater -> LW Beyond Mido }; static s16 grottoExitList[NUM_GROTTOS] = {0}; @@ -139,7 +139,7 @@ s16 Grotto_OverrideSpecialEntrance(s16 nextEntranceIndex) { // If Link hits a grotto exit, load the entrance index from the grotto exit list // based on the current grotto ID - if (nextEntranceIndex == 0x7FFF) { + if (nextEntranceIndex == ENTR_RETURN_GROTTO) { Entrance_SetEntranceDiscovered(ENTRANCE_RANDO_GROTTO_EXIT_START + grottoId); EntranceTracker_SetLastEntranceOverride(ENTRANCE_RANDO_GROTTO_EXIT_START + grottoId); nextEntranceIndex = grottoExitList[grottoId]; @@ -158,7 +158,7 @@ s16 Grotto_OverrideSpecialEntrance(s16 nextEntranceIndex) { // When the nextEntranceIndex is determined by a dynamic exit, // or set by Entrance_OverrideBlueWarp to mark a blue warp entrance, // we have to set the respawn information and nextEntranceIndex manually - if (gPlayState != NULL && gPlayState->nextEntranceIndex != -1) { + if (gPlayState != NULL && gPlayState->nextEntranceIndex != ENTR_LOAD_OPENING) { gSaveContext.respawnFlag = 2; nextEntranceIndex = grotto.entranceIndex; gPlayState->transitionType = TRANS_TYPE_FADE_WHITE; @@ -167,9 +167,9 @@ s16 Grotto_OverrideSpecialEntrance(s16 nextEntranceIndex) { gSaveContext.respawnFlag = 2; nextEntranceIndex = grotto.entranceIndex; gSaveContext.nextTransitionType = TRANS_TYPE_FADE_WHITE; - // Otherwise return 0x7FFF and let the game handle it + // Otherwise return 0x7FFF (ENTR_RETURN_GROTTO) and let the game handle it } else { - nextEntranceIndex = 0x7FFF; + nextEntranceIndex = ENTR_RETURN_GROTTO; } lastEntranceType = GROTTO_RETURN; diff --git a/soh/soh/Enhancements/randomizer/randomizer_grotto.h b/soh/soh/Enhancements/randomizer/randomizer_grotto.h index 6a10d651d..c516d32bf 100644 --- a/soh/soh/Enhancements/randomizer/randomizer_grotto.h +++ b/soh/soh/Enhancements/randomizer/randomizer_grotto.h @@ -3,7 +3,7 @@ #include "z64math.h" -#define NUM_GROTTOS 33 +#define NUM_GROTTOS GROTTO_OFFSET_MAX #define NOT_GROTTO 0 #define GROTTO_LOAD 1 #define GROTTO_RETURN 2 diff --git a/soh/soh/Enhancements/randomizer/savefile.cpp b/soh/soh/Enhancements/randomizer/savefile.cpp index 33278d0b7..29f2ee9a4 100644 --- a/soh/soh/Enhancements/randomizer/savefile.cpp +++ b/soh/soh/Enhancements/randomizer/savefile.cpp @@ -305,7 +305,7 @@ extern "C" void Randomizer_InitSaveFile() { switch (startingAge) { case RO_AGE_ADULT: // Adult gSaveContext.linkAge = LINK_AGE_ADULT; - gSaveContext.entranceIndex = 0x5F4; + gSaveContext.entranceIndex = ENTR_TEMPLE_OF_TIME_7; gSaveContext.savedSceneNum = SCENE_LON_LON_RANCH; // Set scene num manually to ToT break; case RO_AGE_CHILD: // Child diff --git a/soh/soh/OTRGlobals.cpp b/soh/soh/OTRGlobals.cpp index ad57d1ca5..242745ae3 100644 --- a/soh/soh/OTRGlobals.cpp +++ b/soh/soh/OTRGlobals.cpp @@ -2342,7 +2342,7 @@ extern "C" int CustomMessage_RetrieveIfExists(PlayState* play) { actorParams = stone->params; // if we're in a generic grotto - if (play->sceneNum == 62 && actorParams == 14360) { + if (play->sceneNum == SCENE_GROTTOS && actorParams == 14360) { // look for the chest in the actorlist to determine // which grotto we're in int numOfActorLists = diff --git a/soh/soh/SaveManager.cpp b/soh/soh/SaveManager.cpp index e61cf9223..42f94ee2c 100644 --- a/soh/soh/SaveManager.cpp +++ b/soh/soh/SaveManager.cpp @@ -732,7 +732,7 @@ void SaveManager::InitFileDebug() { } } - gSaveContext.entranceIndex = 0xCD; + gSaveContext.entranceIndex = ENTR_HYRULE_FIELD_0; gSaveContext.magicLevel = 0; gSaveContext.sceneFlags[5].swch = 0x40000000; } @@ -875,7 +875,7 @@ void SaveManager::InitFileMaxed() { } } - gSaveContext.entranceIndex = 0xCD; + gSaveContext.entranceIndex = ENTR_HYRULE_FIELD_0; gSaveContext.sceneFlags[5].swch = 0x40000000; } diff --git a/soh/soh/z_scene_otr.cpp b/soh/soh/z_scene_otr.cpp index ef98a4b3a..6926f313f 100644 --- a/soh/soh/z_scene_otr.cpp +++ b/soh/soh/z_scene_otr.cpp @@ -296,7 +296,7 @@ bool Scene_CommandTimeSettings(PlayState* play, LUS::ISceneCommand* cmd) { play->envCtx.sunPos.z = (Math_CosS(((void)0, gSaveContext.dayTime) - 0x8000) * 20.0f) * 25.0f; if (((play->envCtx.timeIncrement == 0) && (gSaveContext.cutsceneIndex < 0xFFF0)) || - (gSaveContext.entranceIndex == 0x0604)) { + (gSaveContext.entranceIndex == ENTR_LAKE_HYLIA_8)) { gSaveContext.skyboxTime = ((void)0, gSaveContext.dayTime); if ((gSaveContext.skyboxTime >= 0x2AAC) && (gSaveContext.skyboxTime < 0x4555)) { gSaveContext.skyboxTime = 0x3556; diff --git a/soh/src/code/z_actor.c b/soh/src/code/z_actor.c index 79a3c8ace..b032b9e2b 100644 --- a/soh/src/code/z_actor.c +++ b/soh/src/code/z_actor.c @@ -6137,7 +6137,7 @@ s32 func_80038154(PlayState* play, Actor* actor, Vec3s* arg2, Vec3s* arg3, f32 a actor->focus.pos = actor->world.pos; actor->focus.pos.y += arg4; - if (!(((play->csCtx.state != CS_STATE_IDLE) || (gDbgCamEnabled)) && (gSaveContext.entranceIndex == 0x00EE))) { + if (!(((play->csCtx.state != CS_STATE_IDLE) || (gDbgCamEnabled)) && (gSaveContext.entranceIndex == ENTR_KOKIRI_FOREST_0))) { var = actor->yawTowardsPlayer - actor->shape.rot.y; abs_var = ABS(var); if (abs_var >= 0x4300) { @@ -6146,7 +6146,7 @@ s32 func_80038154(PlayState* play, Actor* actor, Vec3s* arg2, Vec3s* arg3, f32 a } } - if (((play->csCtx.state != CS_STATE_IDLE) || (gDbgCamEnabled)) && (gSaveContext.entranceIndex == 0x00EE)) { + if (((play->csCtx.state != CS_STATE_IDLE) || (gDbgCamEnabled)) && (gSaveContext.entranceIndex == ENTR_KOKIRI_FOREST_0)) { sp2C = play->view.eye; } else { sp2C = player->actor.focus.pos; @@ -6166,7 +6166,7 @@ s32 func_80038290(PlayState* play, Actor* actor, Vec3s* arg2, Vec3s* arg3, Vec3f actor->focus.pos = arg4; - if (!(((play->csCtx.state != CS_STATE_IDLE) || (gDbgCamEnabled)) && (gSaveContext.entranceIndex == 0x00EE))) { + if (!(((play->csCtx.state != CS_STATE_IDLE) || (gDbgCamEnabled)) && (gSaveContext.entranceIndex == ENTR_KOKIRI_FOREST_0))) { var = actor->yawTowardsPlayer - actor->shape.rot.y; abs_var = ABS(var); if (abs_var >= 0x4300) { @@ -6175,7 +6175,7 @@ s32 func_80038290(PlayState* play, Actor* actor, Vec3s* arg2, Vec3s* arg3, Vec3f } } - if (((play->csCtx.state != CS_STATE_IDLE) || (gDbgCamEnabled)) && (gSaveContext.entranceIndex == 0x00EE)) { + if (((play->csCtx.state != CS_STATE_IDLE) || (gDbgCamEnabled)) && (gSaveContext.entranceIndex == ENTR_KOKIRI_FOREST_0)) { sp24 = play->view.eye; } else { sp24 = player->actor.focus.pos; diff --git a/soh/src/code/z_demo.c b/soh/src/code/z_demo.c index 0d769ca65..9c0dd9b05 100644 --- a/soh/src/code/z_demo.c +++ b/soh/src/code/z_demo.c @@ -56,40 +56,40 @@ CutsceneStateHandler sCsStateHandlers2[] = { u8 sTitleCsState = 0; EntranceCutscene sEntranceCutsceneTable[] = { - { 0x0185, 2, 0xA0, gHyruleFieldIntroCs }, - { 0x013D, 2, 0xA1, gDMTIntroCs }, - { 0x00DB, 2, 0xA3, gKakarikoVillageIntroCs }, - { 0x0108, 2, 0xA4, gZorasDomainIntroCs }, - { 0x0138, 1, 0xA5, gHyruleCastleIntroCs }, - { 0x014D, 2, 0xA6, gGoronCityIntroCs }, - { 0x0053, 2, 0xA7, gTempleOfTimeIntroCs }, - { 0x0000, 2, 0xA8, gDekuTreeIntroCs }, - { 0x028A, 0, 0x18, gHyruleFieldSouthEponaJumpCs }, - { 0x0292, 0, 0x18, gHyruleFieldEastEponaJumpCs }, - { 0x028E, 0, 0x18, gHyruleFieldWestEponaJumpCs }, - { 0x0476, 0, 0x18, gHyruleFieldGateEponaJumpCs }, - { 0x050F, 1, 0xA9, gHyruleFieldGetOoTCs }, - { 0x0102, 2, 0xB1, gLakeHyliaIntroCs }, - { 0x0117, 2, 0xB2, gGerudoValleyIntroCs }, - { 0x0129, 2, 0xB3, gGerudoFortressIntroCs }, - { 0x0157, 2, 0xB4, gLonLonRanchIntroCs }, - { 0x0028, 2, 0xB5, gJabuJabuIntroCs }, - { 0x00E4, 2, 0xB6, gGraveyardIntroCs }, - { 0x0225, 2, 0xB7, gZorasFountainIntroCs }, - { 0x0123, 2, 0xB8, gDesertColossusIntroCs }, - { 0x0147, 2, 0xB9, gDeathMountainCraterIntroCs }, - { 0x0138, 0, 0xBA, gGanonsCastleIntroCs }, - { 0x0574, 2, 0x5A, gSunSongGraveSunSongTeachPart2Cs }, - { 0x0538, 2, 0xBB, gForestBarrierCs }, - { 0x053C, 2, 0xBC, gWaterBarrierCs }, - { 0x0540, 2, 0xBD, gShadowBarrierCs }, - { 0x0544, 2, 0xBE, gFireBarrierCs }, - { 0x0548, 2, 0xBF, gLightBarrierCs }, - { 0x054C, 2, 0xAD, gSpiritBarrierCs }, - { 0x008D, 0, 0xC0, gSpiritBossNabooruKnuckleIntroCs }, - { 0x03B4, 0, 0xC7, gGerudoFortressFirstCaptureCs }, - { 0x0246, 2, 0xB9, gDeathMountainCraterIntroCs }, - { 0x05E8, 2, 0xC6, gKokiriForestDekuSproutCs }, + { ENTR_HYRULE_FIELD_3, 2, 0xA0, gHyruleFieldIntroCs }, + { ENTR_DEATH_MOUNTAIN_TRAIL_0, 2, 0xA1, gDMTIntroCs }, + { ENTR_KAKARIKO_VILLAGE_0, 2, 0xA3, gKakarikoVillageIntroCs }, + { ENTR_ZORAS_DOMAIN_0, 2, 0xA4, gZorasDomainIntroCs }, + { ENTR_HYRULE_CASTLE_0, 1, 0xA5, gHyruleCastleIntroCs }, + { ENTR_GORON_CITY_0, 2, 0xA6, gGoronCityIntroCs }, + { ENTR_TEMPLE_OF_TIME_0, 2, 0xA7, gTempleOfTimeIntroCs }, + { ENTR_DEKU_TREE_0, 2, 0xA8, gDekuTreeIntroCs }, + { ENTR_HYRULE_FIELD_11, 0, 0x18, gHyruleFieldSouthEponaJumpCs }, + { ENTR_HYRULE_FIELD_13, 0, 0x18, gHyruleFieldEastEponaJumpCs }, + { ENTR_HYRULE_FIELD_12, 0, 0x18, gHyruleFieldWestEponaJumpCs }, + { ENTR_HYRULE_FIELD_15, 0, 0x18, gHyruleFieldGateEponaJumpCs }, + { ENTR_HYRULE_FIELD_16, 1, 0xA9, gHyruleFieldGetOoTCs }, + { ENTR_LAKE_HYLIA_0, 2, 0xB1, gLakeHyliaIntroCs }, + { ENTR_GERUDO_VALLEY_0, 2, 0xB2, gGerudoValleyIntroCs }, + { ENTR_GERUDOS_FORTRESS_0, 2, 0xB3, gGerudoFortressIntroCs }, + { ENTR_LON_LON_RANCH_0, 2, 0xB4, gLonLonRanchIntroCs }, + { ENTR_JABU_JABU_0, 2, 0xB5, gJabuJabuIntroCs }, + { ENTR_GRAVEYARD_0, 2, 0xB6, gGraveyardIntroCs }, + { ENTR_ZORAS_FOUNTAIN_2, 2, 0xB7, gZorasFountainIntroCs }, + { ENTR_DESERT_COLOSSUS_0, 2, 0xB8, gDesertColossusIntroCs }, + { ENTR_DEATH_MOUNTAIN_CRATER_0, 2, 0xB9, gDeathMountainCraterIntroCs }, + { ENTR_HYRULE_CASTLE_0, 0, 0xBA, gGanonsCastleIntroCs }, + { ENTR_ROYAL_FAMILYS_TOMB_1, 2, 0x5A, gSunSongGraveSunSongTeachPart2Cs }, + { ENTR_INSIDE_GANONS_CASTLE_2, 2, 0xBB, gForestBarrierCs }, + { ENTR_INSIDE_GANONS_CASTLE_3, 2, 0xBC, gWaterBarrierCs }, + { ENTR_INSIDE_GANONS_CASTLE_4, 2, 0xBD, gShadowBarrierCs }, + { ENTR_INSIDE_GANONS_CASTLE_5, 2, 0xBE, gFireBarrierCs }, + { ENTR_INSIDE_GANONS_CASTLE_6, 2, 0xBF, gLightBarrierCs }, + { ENTR_INSIDE_GANONS_CASTLE_7, 2, 0xAD, gSpiritBarrierCs }, + { ENTR_SPIRIT_TEMPLE_BOSS_0, 0, 0xC0, gSpiritBossNabooruKnuckleIntroCs }, + { ENTR_GERUDOS_FORTRESS_17, 0, 0xC7, gGerudoFortressFirstCaptureCs }, + { ENTR_DEATH_MOUNTAIN_CRATER_1, 2, 0xB9, gDeathMountainCraterIntroCs }, + { ENTR_KOKIRI_FOREST_12, 2, 0xC6, gKokiriForestDekuSproutCs }, }; // Unused, seems to be an early list of dungeon entrance cutscene locations @@ -246,7 +246,7 @@ void func_80064824(PlayState* play, CutsceneContext* csCtx, CsCmdBase* cmd) { case 3: if (sp3F != 0) { Flags_SetEnv(play, 0); - if (gSaveContext.entranceIndex == 0x0053 || (IS_RANDO && gSaveContext.entranceIndex == 0x05F4)) { + if (gSaveContext.entranceIndex == ENTR_TEMPLE_OF_TIME_0 || (IS_RANDO && gSaveContext.entranceIndex == ENTR_TEMPLE_OF_TIME_7)) { Flags_SetEnv(play, 2); } } @@ -574,43 +574,43 @@ void Cutscene_Command_Terminator(PlayState* play, CutsceneContext* csCtx, CsCmdB switch (cmd->base) { case 1: - play->nextEntranceIndex = 0x00A0; + play->nextEntranceIndex = ENTR_CUTSCENE_MAP_0; gSaveContext.cutsceneIndex = 0xFFF1; play->transitionTrigger = TRANS_TRIGGER_START; play->transitionType = TRANS_TYPE_FADE_BLACK; break; case 2: - play->nextEntranceIndex = 0x00A0; + play->nextEntranceIndex = ENTR_CUTSCENE_MAP_0; gSaveContext.cutsceneIndex = 0xFFF0; play->transitionTrigger = TRANS_TRIGGER_START; play->transitionType = TRANS_TYPE_FILL_WHITE; break; case 3: - play->nextEntranceIndex = 0x0117; + play->nextEntranceIndex = ENTR_GERUDO_VALLEY_0; gSaveContext.cutsceneIndex = 0xFFF1; play->transitionTrigger = TRANS_TRIGGER_START; play->transitionType = TRANS_TYPE_FILL_WHITE; break; case 4: - play->nextEntranceIndex = 0x013D; + play->nextEntranceIndex = ENTR_DEATH_MOUNTAIN_TRAIL_0; gSaveContext.cutsceneIndex = 0xFFF0; play->transitionTrigger = TRANS_TRIGGER_START; play->transitionType = TRANS_TYPE_FILL_WHITE; break; case 5: - play->nextEntranceIndex = 0x00EE; + play->nextEntranceIndex = ENTR_KOKIRI_FOREST_0; gSaveContext.cutsceneIndex = 0xFFF0; play->transitionTrigger = TRANS_TRIGGER_START; play->transitionType = TRANS_TYPE_FILL_WHITE; break; case 6: - play->nextEntranceIndex = 0x00A0; + play->nextEntranceIndex = ENTR_CUTSCENE_MAP_0; gSaveContext.cutsceneIndex = 0xFFF2; play->transitionTrigger = TRANS_TRIGGER_START; play->transitionType = TRANS_TYPE_FILL_WHITE; break; case 7: - play->nextEntranceIndex = 0x00EE; + play->nextEntranceIndex = ENTR_KOKIRI_FOREST_0; gSaveContext.cutsceneIndex = 0xFFF2; play->transitionTrigger = TRANS_TRIGGER_START; play->transitionType = TRANS_TYPE_INSTANT; @@ -626,7 +626,7 @@ void Cutscene_Command_Terminator(PlayState* play, CutsceneContext* csCtx, CsCmdB } if (!Flags_GetEventChkInf(EVENTCHKINF_PULLED_MASTER_SWORD_FROM_PEDESTAL)) { Flags_SetEventChkInf(EVENTCHKINF_PULLED_MASTER_SWORD_FROM_PEDESTAL); - play->nextEntranceIndex = 0x00A0; + play->nextEntranceIndex = ENTR_CUTSCENE_MAP_0; play->transitionTrigger = TRANS_TRIGGER_START; gSaveContext.cutsceneIndex = 0xFFF3; play->transitionType = TRANS_TYPE_INSTANT; @@ -638,253 +638,253 @@ void Cutscene_Command_Terminator(PlayState* play, CutsceneContext* csCtx, CsCmdB play->linkAgeOnLoad = 1; } } - play->nextEntranceIndex = 0x02CA; + play->nextEntranceIndex = ENTR_TEMPLE_OF_TIME_2; play->transitionTrigger = TRANS_TRIGGER_START; play->transitionType = TRANS_TYPE_FADE_WHITE; gSaveContext.nextTransitionType = TRANS_TYPE_FADE_WHITE; } break; case 9: - play->nextEntranceIndex = 0x0117; + play->nextEntranceIndex = ENTR_GERUDO_VALLEY_0; gSaveContext.cutsceneIndex = 0xFFF0; play->transitionTrigger = TRANS_TRIGGER_START; play->transitionType = TRANS_TYPE_FILL_BROWN; break; case 10: - play->nextEntranceIndex = 0x00BB; + play->nextEntranceIndex = ENTR_LINKS_HOUSE_0; gSaveContext.cutsceneIndex = 0xFFF0; play->transitionTrigger = TRANS_TRIGGER_START; play->transitionType = TRANS_TYPE_FADE_BLACK; break; case 11: - play->nextEntranceIndex = 0x00EE; + play->nextEntranceIndex = ENTR_KOKIRI_FOREST_0; gSaveContext.cutsceneIndex = 0xFFF3; play->transitionTrigger = TRANS_TRIGGER_START; play->transitionType = TRANS_TYPE_FADE_WHITE; break; case 12: - play->nextEntranceIndex = 0x047A; + play->nextEntranceIndex = ENTR_DEATH_MOUNTAIN_TRAIL_5; play->transitionTrigger = TRANS_TRIGGER_START; play->transitionType = TRANS_TYPE_FADE_BLACK; break; case 13: - play->nextEntranceIndex = 0x010E; + play->nextEntranceIndex = ENTR_ZORAS_FOUNTAIN_0; play->transitionTrigger = TRANS_TRIGGER_START; play->transitionType = TRANS_TYPE_FADE_BLACK; gSaveContext.nextTransitionType = TRANS_TYPE_FADE_BLACK; break; case 14: - play->nextEntranceIndex = 0x0457; + play->nextEntranceIndex = ENTR_KOKIRI_FOREST_11; play->transitionTrigger = TRANS_TRIGGER_START; play->transitionType = TRANS_TYPE_FADE_BLACK; break; case 15: - play->nextEntranceIndex = 0x0053; + play->nextEntranceIndex = ENTR_TEMPLE_OF_TIME_0; play->transitionTrigger = TRANS_TRIGGER_START; gSaveContext.cutsceneIndex = 0xFFF4; play->transitionType = TRANS_TYPE_FADE_WHITE; break; case 16: - play->nextEntranceIndex = 0x0053; + play->nextEntranceIndex = ENTR_TEMPLE_OF_TIME_0; play->transitionTrigger = TRANS_TRIGGER_START; gSaveContext.cutsceneIndex = 0xFFF5; play->transitionType = TRANS_TYPE_FADE_WHITE; break; case 17: - play->nextEntranceIndex = 0x0053; + play->nextEntranceIndex = ENTR_TEMPLE_OF_TIME_0; play->transitionTrigger = TRANS_TRIGGER_START; gSaveContext.cutsceneIndex = 0xFFF6; play->transitionType = TRANS_TYPE_FADE_WHITE; break; case 18: Flags_SetEventChkInf(EVENTCHKINF_ENTERED_MASTER_SWORD_CHAMBER); - play->nextEntranceIndex = 0x0324; + play->nextEntranceIndex = ENTR_TEMPLE_OF_TIME_4; play->transitionTrigger = TRANS_TRIGGER_START; play->transitionType = TRANS_TYPE_FADE_BLACK; gSaveContext.nextTransitionType = TRANS_TYPE_FADE_BLACK; break; case 19: - play->nextEntranceIndex = 0x013D; + play->nextEntranceIndex = ENTR_DEATH_MOUNTAIN_TRAIL_0; play->transitionTrigger = TRANS_TRIGGER_START; play->transitionType = TRANS_TYPE_FADE_BLACK_FAST; gSaveContext.cutsceneIndex = 0x8000; break; case 21: - play->nextEntranceIndex = 0x0102; + play->nextEntranceIndex = ENTR_LAKE_HYLIA_0; play->transitionTrigger = TRANS_TRIGGER_START; gSaveContext.cutsceneIndex = 0xFFF0; play->transitionType = TRANS_TYPE_FADE_WHITE; break; case 22: Item_Give(play, ITEM_SONG_REQUIEM); - play->nextEntranceIndex = 0x0123; + play->nextEntranceIndex = ENTR_DESERT_COLOSSUS_0; play->transitionTrigger = TRANS_TRIGGER_START; gSaveContext.cutsceneIndex = 0xFFF0; play->transitionType = TRANS_TYPE_FADE_WHITE; break; case 23: - play->nextEntranceIndex = 0x00A0; + play->nextEntranceIndex = ENTR_CUTSCENE_MAP_0; play->transitionTrigger = TRANS_TRIGGER_START; gSaveContext.cutsceneIndex = 0xFFF8; play->transitionType = TRANS_TYPE_FADE_WHITE; break; case 24: - play->nextEntranceIndex = 0x0028; + play->nextEntranceIndex = ENTR_JABU_JABU_0; play->transitionTrigger = TRANS_TRIGGER_START; play->transitionType = TRANS_TYPE_FADE_BLACK; break; case 25: play->linkAgeOnLoad = 0; - play->nextEntranceIndex = 0x006B; + play->nextEntranceIndex = ENTR_CHAMBER_OF_THE_SAGES_0; play->transitionTrigger = TRANS_TRIGGER_START; gSaveContext.cutsceneIndex = 0xFFF0; play->transitionType = TRANS_TYPE_FADE_WHITE; break; case 26: - play->nextEntranceIndex = 0x0053; + play->nextEntranceIndex = ENTR_TEMPLE_OF_TIME_0; play->transitionTrigger = TRANS_TRIGGER_START; gSaveContext.cutsceneIndex = 0xFFF4; play->transitionType = TRANS_TYPE_FADE_WHITE; break; case 27: - play->nextEntranceIndex = 0x0053; + play->nextEntranceIndex = ENTR_TEMPLE_OF_TIME_0; play->transitionTrigger = TRANS_TRIGGER_START; gSaveContext.cutsceneIndex = 0xFFF5; play->transitionType = TRANS_TYPE_FADE_WHITE; break; case 28: - play->nextEntranceIndex = 0x0053; + play->nextEntranceIndex = ENTR_TEMPLE_OF_TIME_0; play->transitionTrigger = TRANS_TRIGGER_START; gSaveContext.cutsceneIndex = 0xFFF6; play->transitionType = TRANS_TYPE_FADE_WHITE; break; case 29: - play->nextEntranceIndex = 0x006B; + play->nextEntranceIndex = ENTR_CHAMBER_OF_THE_SAGES_0; play->transitionTrigger = TRANS_TRIGGER_START; gSaveContext.chamberCutsceneNum = 0; play->transitionType = TRANS_TYPE_FADE_WHITE; break; case 30: - play->nextEntranceIndex = 0x006B; + play->nextEntranceIndex = ENTR_CHAMBER_OF_THE_SAGES_0; play->transitionTrigger = TRANS_TRIGGER_START; play->transitionType = TRANS_TYPE_FADE_WHITE; Item_Give(play, ITEM_MEDALLION_FIRE); gSaveContext.chamberCutsceneNum = 1; break; case 31: - play->nextEntranceIndex = 0x006B; + play->nextEntranceIndex = ENTR_CHAMBER_OF_THE_SAGES_0; play->transitionTrigger = TRANS_TRIGGER_START; play->transitionType = TRANS_TYPE_FADE_WHITE; gSaveContext.chamberCutsceneNum = 2; break; case 32: play->linkAgeOnLoad = 1; - play->nextEntranceIndex = 0x00CD; + play->nextEntranceIndex = ENTR_HYRULE_FIELD_0; play->transitionTrigger = TRANS_TRIGGER_START; gSaveContext.cutsceneIndex = 0xFFF2; play->transitionType = TRANS_TYPE_INSTANT; break; case 33: - play->nextEntranceIndex = 0x00CD; + play->nextEntranceIndex = ENTR_HYRULE_FIELD_0; play->transitionTrigger = TRANS_TRIGGER_START; play->transitionType = TRANS_TYPE_FADE_WHITE; break; case 34: - play->nextEntranceIndex = 0x00A0; + play->nextEntranceIndex = ENTR_CUTSCENE_MAP_0; play->transitionTrigger = TRANS_TRIGGER_START; gSaveContext.cutsceneIndex = 0xFFF3; play->transitionType = TRANS_TYPE_FADE_WHITE; break; case 35: - play->nextEntranceIndex = 0x00CD; + play->nextEntranceIndex = ENTR_HYRULE_FIELD_0; play->transitionTrigger = TRANS_TRIGGER_START; gSaveContext.cutsceneIndex = 0xFFF0; play->transitionType = TRANS_TYPE_FADE_BLACK_FAST; break; case 38: - play->nextEntranceIndex = 0x00A0; + play->nextEntranceIndex = ENTR_CUTSCENE_MAP_0; play->transitionTrigger = TRANS_TRIGGER_START; gSaveContext.cutsceneIndex = 0xFFF4; play->transitionType = TRANS_TYPE_FADE_BLACK_FAST; break; case 39: - play->nextEntranceIndex = 0x0053; + play->nextEntranceIndex = ENTR_TEMPLE_OF_TIME_0; play->transitionTrigger = TRANS_TRIGGER_START; gSaveContext.cutsceneIndex = 0xFFF9; play->transitionType = TRANS_TYPE_FADE_BLACK_FAST; break; case 40: play->linkAgeOnLoad = 0; - play->nextEntranceIndex = 0x0053; + play->nextEntranceIndex = ENTR_TEMPLE_OF_TIME_0; play->transitionTrigger = TRANS_TRIGGER_START; gSaveContext.cutsceneIndex = 0xFFFA; play->transitionType = TRANS_TYPE_FADE_BLACK_FAST; break; case 41: - play->nextEntranceIndex = 0x04E6; + play->nextEntranceIndex = ENTR_LAKE_HYLIA_5; play->transitionTrigger = TRANS_TRIGGER_START; play->transitionType = TRANS_TYPE_FADE_BLACK; break; case 42: - play->nextEntranceIndex = 0x00DB; + play->nextEntranceIndex = ENTR_KAKARIKO_VILLAGE_0; play->transitionTrigger = TRANS_TRIGGER_START; gSaveContext.cutsceneIndex = 0xFFF2; play->transitionType = TRANS_TYPE_FADE_BLACK_FAST; break; case 43: - play->nextEntranceIndex = 0x0503; + play->nextEntranceIndex = ENTR_WINDMILL_AND_DAMPES_GRAVE_2; play->transitionTrigger = TRANS_TRIGGER_START; play->transitionType = TRANS_TYPE_FADE_BLACK_FAST; break; case 44: - play->nextEntranceIndex = 0x0320; + play->nextEntranceIndex = ENTR_TEMPLE_OF_TIME_3; play->transitionTrigger = TRANS_TRIGGER_START; play->transitionType = TRANS_TYPE_FADE_WHITE_INSTANT; break; case 46: Flags_SetEventChkInf(EVENTCHKINF_ENTERED_MASTER_SWORD_CHAMBER); - play->nextEntranceIndex = 0x0324; + play->nextEntranceIndex = ENTR_TEMPLE_OF_TIME_4; play->transitionTrigger = TRANS_TRIGGER_START; play->transitionType = TRANS_TYPE_FADE_BLACK_FAST; break; case 47: Item_Give(play, ITEM_SONG_NOCTURNE); Flags_SetEventChkInf(EVENTCHKINF_LEARNED_NOCTURNE_OF_SHADOW); - play->nextEntranceIndex = 0x00DB; + play->nextEntranceIndex = ENTR_KAKARIKO_VILLAGE_0; play->transitionTrigger = TRANS_TRIGGER_START; gSaveContext.cutsceneIndex = 0xFFF1; play->transitionType = TRANS_TYPE_FADE_BLACK_FAST; break; case 48: - play->nextEntranceIndex = 0x01ED; + play->nextEntranceIndex = ENTR_DESERT_COLOSSUS_4; play->transitionTrigger = TRANS_TRIGGER_START; play->transitionType = TRANS_TYPE_SANDSTORM_END; gSaveContext.nextTransitionType = TRANS_TYPE_SANDSTORM_END; break; case 49: - play->nextEntranceIndex = 0x058C; + play->nextEntranceIndex = ENTR_TEMPLE_OF_TIME_5; play->transitionTrigger = TRANS_TRIGGER_START; play->transitionType = TRANS_TYPE_FADE_BLACK_FAST; break; case 50: - play->nextEntranceIndex = 0x0513; + play->nextEntranceIndex = ENTR_KAKARIKO_VILLAGE_13; play->transitionTrigger = TRANS_TRIGGER_START; play->transitionType = TRANS_TYPE_FADE_WHITE_INSTANT; break; case 51: - play->nextEntranceIndex = 0x00CD; + play->nextEntranceIndex = ENTR_HYRULE_FIELD_0; gSaveContext.cutsceneIndex = 0xFFF8; play->transitionTrigger = TRANS_TRIGGER_START; play->transitionType = TRANS_TYPE_CIRCLE(TCA_NORMAL, TCC_WHITE, TCS_SLOW); break; case 52: - play->nextEntranceIndex = 0x0053; + play->nextEntranceIndex = ENTR_TEMPLE_OF_TIME_0; gSaveContext.cutsceneIndex = 0xFFF7; play->transitionTrigger = TRANS_TRIGGER_START; play->transitionType = TRANS_TYPE_INSTANT; break; case 53: - play->nextEntranceIndex = 0x050F; + play->nextEntranceIndex = ENTR_HYRULE_FIELD_16; play->transitionTrigger = TRANS_TRIGGER_START; play->transitionType = TRANS_TYPE_FADE_WHITE; break; @@ -892,102 +892,102 @@ void Cutscene_Command_Terminator(PlayState* play, CutsceneContext* csCtx, CsCmdB gSaveContext.gameMode = 3; Audio_SetSoundBanksMute(0x6F); play->linkAgeOnLoad = 1; - play->nextEntranceIndex = 0x0117; + play->nextEntranceIndex = ENTR_GERUDO_VALLEY_0; gSaveContext.cutsceneIndex = 0xFFF2; play->transitionTrigger = TRANS_TRIGGER_START; play->transitionType = TRANS_TYPE_FADE_BLACK; break; case 55: - play->nextEntranceIndex = 0x0129; + play->nextEntranceIndex = ENTR_GERUDOS_FORTRESS_0; gSaveContext.cutsceneIndex = 0xFFF1; play->transitionTrigger = TRANS_TRIGGER_START; play->transitionType = TRANS_TYPE_FADE_BLACK; break; case 56: - play->nextEntranceIndex = 0x00DB; + play->nextEntranceIndex = ENTR_KAKARIKO_VILLAGE_0; gSaveContext.cutsceneIndex = 0xFFF4; play->transitionTrigger = TRANS_TRIGGER_START; play->transitionType = TRANS_TYPE_FADE_BLACK; break; case 57: - play->nextEntranceIndex = 0x013D; + play->nextEntranceIndex = ENTR_DEATH_MOUNTAIN_TRAIL_0; gSaveContext.cutsceneIndex = 0xFFF3; play->transitionTrigger = TRANS_TRIGGER_START; play->transitionType = TRANS_TYPE_FADE_BLACK; break; case 58: - play->nextEntranceIndex = 0x014D; + play->nextEntranceIndex = ENTR_GORON_CITY_0; gSaveContext.cutsceneIndex = 0xFFF1; play->transitionTrigger = TRANS_TRIGGER_START; play->transitionType = TRANS_TYPE_FADE_BLACK; break; case 59: - play->nextEntranceIndex = 0x0102; + play->nextEntranceIndex = ENTR_LAKE_HYLIA_0; gSaveContext.cutsceneIndex = 0xFFF1; play->transitionTrigger = TRANS_TRIGGER_START; play->transitionType = TRANS_TYPE_FADE_BLACK; break; case 60: - play->nextEntranceIndex = 0x010E; + play->nextEntranceIndex = ENTR_ZORAS_FOUNTAIN_0; gSaveContext.cutsceneIndex = 0xFFF2; play->transitionTrigger = TRANS_TRIGGER_START; play->transitionType = TRANS_TYPE_FADE_BLACK; break; case 61: - play->nextEntranceIndex = 0x0108; + play->nextEntranceIndex = ENTR_ZORAS_DOMAIN_0; gSaveContext.cutsceneIndex = 0xFFF0; play->transitionTrigger = TRANS_TRIGGER_START; play->transitionType = TRANS_TYPE_FADE_BLACK; break; case 62: play->linkAgeOnLoad = 0; - play->nextEntranceIndex = 0x00EE; + play->nextEntranceIndex = ENTR_KOKIRI_FOREST_0; gSaveContext.cutsceneIndex = 0xFFF6; play->transitionTrigger = TRANS_TRIGGER_START; play->transitionType = TRANS_TYPE_FADE_BLACK; break; case 63: - play->nextEntranceIndex = 0x00EE; + play->nextEntranceIndex = ENTR_KOKIRI_FOREST_0; gSaveContext.cutsceneIndex = 0xFFF7; play->transitionTrigger = TRANS_TRIGGER_START; play->transitionType = TRANS_TYPE_FADE_BLACK; break; case 64: - play->nextEntranceIndex = 0x00CD; + play->nextEntranceIndex = ENTR_HYRULE_FIELD_0; gSaveContext.cutsceneIndex = 0xFFF5; play->transitionTrigger = TRANS_TRIGGER_START; play->transitionType = TRANS_TYPE_FADE_BLACK; break; case 65: play->linkAgeOnLoad = 1; - play->nextEntranceIndex = 0x0157; + play->nextEntranceIndex = ENTR_LON_LON_RANCH_0; gSaveContext.cutsceneIndex = 0xFFF2; play->transitionTrigger = TRANS_TRIGGER_START; play->transitionType = TRANS_TYPE_FADE_BLACK; break; case 66: - play->nextEntranceIndex = 0x0554; + play->nextEntranceIndex = ENTR_KAKARIKO_VILLAGE_14; play->transitionTrigger = TRANS_TRIGGER_START; play->transitionType = TRANS_TYPE_FADE_BLACK; break; case 67: - play->nextEntranceIndex = 0x027E; + play->nextEntranceIndex = ENTR_HYRULE_FIELD_9; play->transitionTrigger = TRANS_TRIGGER_START; play->transitionType = TRANS_TYPE_FADE_BLACK; break; case 68: - play->nextEntranceIndex = 0x00A0; + play->nextEntranceIndex = ENTR_CUTSCENE_MAP_0; play->transitionTrigger = TRANS_TRIGGER_START; gSaveContext.cutsceneIndex = 0xFFF5; play->transitionType = TRANS_TYPE_FADE_BLACK; break; case 69: - play->nextEntranceIndex = 0x05E8; + play->nextEntranceIndex = ENTR_KOKIRI_FOREST_12; play->transitionTrigger = TRANS_TRIGGER_START; play->transitionType = TRANS_TYPE_FADE_BLACK; break; case 70: - play->nextEntranceIndex = 0x013D; + play->nextEntranceIndex = ENTR_DEATH_MOUNTAIN_TRAIL_0; play->transitionTrigger = TRANS_TRIGGER_START; gSaveContext.cutsceneIndex = 0xFFF4; play->transitionType = TRANS_TYPE_FADE_BLACK; @@ -999,13 +999,13 @@ void Cutscene_Command_Terminator(PlayState* play, CutsceneContext* csCtx, CsCmdB gSaveContext.equips.equipment |= EQUIP_VALUE_BOOTS_KOKIRI << (EQUIP_TYPE_BOOTS * 4); Player_SetEquipmentData(play, player); play->linkAgeOnLoad = 1; - play->nextEntranceIndex = 0x0053; + play->nextEntranceIndex = ENTR_TEMPLE_OF_TIME_0; play->transitionTrigger = TRANS_TRIGGER_START; gSaveContext.cutsceneIndex = 0xFFF1; play->transitionType = TRANS_TYPE_FADE_BLACK; break; case 72: - play->nextEntranceIndex = 0x0400; + play->nextEntranceIndex = ENTR_CASTLE_COURTYARD_ZELDA_0; play->transitionTrigger = TRANS_TRIGGER_START; gSaveContext.cutsceneIndex = 0xFFF0; play->transitionType = TRANS_TYPE_FADE_BLACK; @@ -1013,13 +1013,13 @@ void Cutscene_Command_Terminator(PlayState* play, CutsceneContext* csCtx, CsCmdB break; case 73: play->linkAgeOnLoad = 1; - play->nextEntranceIndex = 0x0157; + play->nextEntranceIndex = ENTR_LON_LON_RANCH_0; play->transitionTrigger = TRANS_TRIGGER_START; gSaveContext.cutsceneIndex = 0xFFF2; play->transitionType = TRANS_TYPE_FADE_BLACK; break; case 74: - play->nextEntranceIndex = 0x0157; + play->nextEntranceIndex = ENTR_LON_LON_RANCH_0; play->transitionTrigger = TRANS_TRIGGER_START; gSaveContext.cutsceneIndex = 0xFFF3; play->transitionType = TRANS_TYPE_FADE_WHITE; @@ -1027,27 +1027,27 @@ void Cutscene_Command_Terminator(PlayState* play, CutsceneContext* csCtx, CsCmdB break; case 75: play->linkAgeOnLoad = 1; - play->nextEntranceIndex = 0x0157; + play->nextEntranceIndex = ENTR_LON_LON_RANCH_0; play->transitionTrigger = TRANS_TRIGGER_START; gSaveContext.cutsceneIndex = 0xFFF4; play->transitionType = TRANS_TYPE_FADE_BLACK; break; case 76: play->linkAgeOnLoad = 0; - play->nextEntranceIndex = 0x0157; + play->nextEntranceIndex = ENTR_LON_LON_RANCH_0; play->transitionTrigger = TRANS_TRIGGER_START; gSaveContext.cutsceneIndex = 0xFFF5; play->transitionType = TRANS_TYPE_FADE_BLACK; break; case 77: play->linkAgeOnLoad = 1; - play->nextEntranceIndex = 0x0157; + play->nextEntranceIndex = ENTR_LON_LON_RANCH_0; play->transitionTrigger = TRANS_TRIGGER_START; gSaveContext.cutsceneIndex = 0xFFF6; play->transitionType = TRANS_TYPE_FADE_BLACK; break; case 78: - play->nextEntranceIndex = 0x0157; + play->nextEntranceIndex = ENTR_LON_LON_RANCH_0; play->transitionTrigger = TRANS_TRIGGER_START; gSaveContext.cutsceneIndex = 0xFFF7; play->transitionType = TRANS_TYPE_FADE_BLACK; @@ -1067,36 +1067,36 @@ void Cutscene_Command_Terminator(PlayState* play, CutsceneContext* csCtx, CsCmdB case 91: case 92: case 93: - play->nextEntranceIndex = 0x0157; + play->nextEntranceIndex = ENTR_LON_LON_RANCH_0; play->transitionTrigger = TRANS_TRIGGER_START; play->transitionType = TRANS_TYPE_FADE_BLACK; break; case 94: - play->nextEntranceIndex = 0x02AE; + play->nextEntranceIndex = ENTR_LON_LON_RANCH_1; play->transitionTrigger = TRANS_TRIGGER_START; play->transitionType = TRANS_TYPE_FADE_WHITE; break; case 95: if ((Flags_GetEventChkInf(EVENTCHKINF_USED_FOREST_TEMPLE_BLUE_WARP)) && (Flags_GetEventChkInf(EVENTCHKINF_USED_FIRE_TEMPLE_BLUE_WARP)) && (Flags_GetEventChkInf(EVENTCHKINF_USED_WATER_TEMPLE_BLUE_WARP))) { - play->nextEntranceIndex = 0x0053; + play->nextEntranceIndex = ENTR_TEMPLE_OF_TIME_0; play->transitionTrigger = TRANS_TRIGGER_START; gSaveContext.cutsceneIndex = 0xFFF3; play->transitionType = TRANS_TYPE_FADE_BLACK; } else { switch (gSaveContext.sceneSetupIndex) { case 8: - play->nextEntranceIndex = 0x00FC; + play->nextEntranceIndex = ENTR_SACRED_FOREST_MEADOW_0; play->transitionTrigger = TRANS_TRIGGER_START; play->transitionType = TRANS_TYPE_FADE_BLACK; break; case 9: - play->nextEntranceIndex = 0x0147; + play->nextEntranceIndex = ENTR_DEATH_MOUNTAIN_CRATER_0; play->transitionTrigger = TRANS_TRIGGER_START; play->transitionType = TRANS_TYPE_FADE_BLACK; break; case 10: - play->nextEntranceIndex = 0x0102; + play->nextEntranceIndex = ENTR_LAKE_HYLIA_0; play->transitionTrigger = TRANS_TRIGGER_START; gSaveContext.cutsceneIndex = 0xFFF0; play->transitionType = TRANS_TYPE_FADE_WHITE; @@ -1106,13 +1106,13 @@ void Cutscene_Command_Terminator(PlayState* play, CutsceneContext* csCtx, CsCmdB break; case 96: if (CHECK_QUEST_ITEM(QUEST_MEDALLION_SHADOW)) { - play->nextEntranceIndex = 0x006B; + play->nextEntranceIndex = ENTR_CHAMBER_OF_THE_SAGES_0; play->transitionTrigger = TRANS_TRIGGER_START; gSaveContext.cutsceneIndex = 0xFFF1; play->transitionType = TRANS_TYPE_FADE_WHITE_FAST; } else { Flags_SetEventChkInf(EVENTCHKINF_OBTAINED_SPIRIT_MEDALLION); - play->nextEntranceIndex = 0x0610; + play->nextEntranceIndex = ENTR_DESERT_COLOSSUS_8; play->transitionTrigger = TRANS_TRIGGER_START; play->transitionType = TRANS_TYPE_FADE_WHITE; gSaveContext.nextTransitionType = TRANS_TYPE_FADE_WHITE; @@ -1120,48 +1120,48 @@ void Cutscene_Command_Terminator(PlayState* play, CutsceneContext* csCtx, CsCmdB break; case 97: if (CHECK_QUEST_ITEM(QUEST_MEDALLION_SPIRIT)) { - play->nextEntranceIndex = 0x006B; + play->nextEntranceIndex = ENTR_CHAMBER_OF_THE_SAGES_0; play->transitionTrigger = TRANS_TRIGGER_START; gSaveContext.cutsceneIndex = 0xFFF1; play->transitionType = TRANS_TYPE_FADE_WHITE_FAST; } else { - play->nextEntranceIndex = 0x0580; + play->nextEntranceIndex = ENTR_GRAVEYARD_8; play->transitionTrigger = TRANS_TRIGGER_START; play->transitionType = TRANS_TYPE_FADE_WHITE; gSaveContext.nextTransitionType = TRANS_TYPE_FADE_WHITE; } break; case 98: - play->nextEntranceIndex = 0x0564; + play->nextEntranceIndex = ENTR_DEATH_MOUNTAIN_CRATER_5; play->transitionTrigger = TRANS_TRIGGER_START; play->transitionType = TRANS_TYPE_FADE_WHITE; gSaveContext.nextTransitionType = TRANS_TYPE_FADE_WHITE; break; case 99: - play->nextEntranceIndex = 0x0608; + play->nextEntranceIndex = ENTR_SACRED_FOREST_MEADOW_3; play->transitionTrigger = TRANS_TRIGGER_START; play->transitionType = TRANS_TYPE_FADE_BLACK; gSaveContext.nextTransitionType = TRANS_TYPE_FADE_BLACK; break; case 100: - play->nextEntranceIndex = 0x00EE; + play->nextEntranceIndex = ENTR_KOKIRI_FOREST_0; gSaveContext.cutsceneIndex = 0xFFF8; play->transitionTrigger = TRANS_TRIGGER_START; play->transitionType = TRANS_TYPE_FADE_WHITE; gSaveContext.nextTransitionType = TRANS_TYPE_FADE_WHITE; break; case 101: - play->nextEntranceIndex = 0x01F5; + play->nextEntranceIndex = ENTR_DESERT_COLOSSUS_6; play->transitionTrigger = TRANS_TRIGGER_START; play->transitionType = TRANS_TYPE_SANDSTORM_END; break; case 102: - play->nextEntranceIndex = 0x0590; + play->nextEntranceIndex = ENTR_TEMPLE_OF_TIME_6; play->transitionTrigger = TRANS_TRIGGER_START; play->transitionType = TRANS_TYPE_FADE_BLACK; break; case 103: - play->nextEntranceIndex = 0x00CD; + play->nextEntranceIndex = ENTR_HYRULE_FIELD_0; play->transitionTrigger = TRANS_TRIGGER_START; gSaveContext.cutsceneIndex = 0xFFF3; play->transitionType = TRANS_TYPE_FADE_BLACK; @@ -1169,21 +1169,21 @@ void Cutscene_Command_Terminator(PlayState* play, CutsceneContext* csCtx, CsCmdB case 104: switch (sTitleCsState) { case 0: - play->nextEntranceIndex = 0x008D; + play->nextEntranceIndex = ENTR_SPIRIT_TEMPLE_BOSS_0; play->transitionTrigger = TRANS_TRIGGER_START; gSaveContext.cutsceneIndex = 0xFFF2; play->transitionType = TRANS_TYPE_FADE_BLACK; sTitleCsState++; break; case 1: - play->nextEntranceIndex = 0x0147; + play->nextEntranceIndex = ENTR_DEATH_MOUNTAIN_CRATER_0; play->transitionTrigger = TRANS_TRIGGER_START; gSaveContext.cutsceneIndex = 0xFFF1; play->transitionType = TRANS_TYPE_FADE_BLACK; sTitleCsState++; break; case 2: - play->nextEntranceIndex = 0x00A0; + play->nextEntranceIndex = ENTR_CUTSCENE_MAP_0; play->transitionTrigger = TRANS_TRIGGER_START; gSaveContext.cutsceneIndex = 0xFFF6; play->transitionType = TRANS_TYPE_FADE_BLACK; @@ -1192,43 +1192,43 @@ void Cutscene_Command_Terminator(PlayState* play, CutsceneContext* csCtx, CsCmdB } break; case 105: - play->nextEntranceIndex = 0x00E4; + play->nextEntranceIndex = ENTR_GRAVEYARD_0; play->transitionTrigger = TRANS_TRIGGER_START; gSaveContext.cutsceneIndex = 0xFFF1; play->transitionType = TRANS_TYPE_FADE_BLACK; break; case 106: - play->nextEntranceIndex = 0x0574; + play->nextEntranceIndex = ENTR_ROYAL_FAMILYS_TOMB_1; play->transitionTrigger = TRANS_TRIGGER_START; play->transitionType = TRANS_TYPE_FADE_BLACK; break; case 107: - play->nextEntranceIndex = 0x0538; + play->nextEntranceIndex = ENTR_INSIDE_GANONS_CASTLE_2; play->transitionTrigger = TRANS_TRIGGER_START; play->transitionType = TRANS_TYPE_FADE_BLACK; break; case 108: - play->nextEntranceIndex = 0x053C; + play->nextEntranceIndex = ENTR_INSIDE_GANONS_CASTLE_3; play->transitionTrigger = TRANS_TRIGGER_START; play->transitionType = TRANS_TYPE_FADE_BLACK; break; case 109: - play->nextEntranceIndex = 0x0540; + play->nextEntranceIndex = ENTR_INSIDE_GANONS_CASTLE_4; play->transitionTrigger = TRANS_TRIGGER_START; play->transitionType = TRANS_TYPE_FADE_BLACK; break; case 110: - play->nextEntranceIndex = 0x0544; + play->nextEntranceIndex = ENTR_INSIDE_GANONS_CASTLE_5; play->transitionTrigger = TRANS_TRIGGER_START; play->transitionType = TRANS_TYPE_FADE_BLACK; break; case 111: - play->nextEntranceIndex = 0x0548; + play->nextEntranceIndex = ENTR_INSIDE_GANONS_CASTLE_6; play->transitionTrigger = TRANS_TRIGGER_START; play->transitionType = TRANS_TYPE_FADE_BLACK; break; case 112: - play->nextEntranceIndex = 0x054C; + play->nextEntranceIndex = ENTR_INSIDE_GANONS_CASTLE_7; play->transitionTrigger = TRANS_TRIGGER_START; play->transitionType = TRANS_TYPE_FADE_BLACK; break; @@ -1246,23 +1246,23 @@ void Cutscene_Command_Terminator(PlayState* play, CutsceneContext* csCtx, CsCmdB } break; case 114: - play->nextEntranceIndex = 0x0185; + play->nextEntranceIndex = ENTR_HYRULE_FIELD_3; play->transitionTrigger = TRANS_TRIGGER_START; play->transitionType = TRANS_TYPE_FADE_BLACK; break; case 115: - play->nextEntranceIndex = 0x0594; + play->nextEntranceIndex = ENTR_HYRULE_FIELD_17; play->transitionTrigger = TRANS_TRIGGER_START; play->transitionType = TRANS_TYPE_FADE_BLACK; gSaveContext.nextTransitionType = TRANS_TYPE_FADE_BLACK; break; case 116: if (Flags_GetEventChkInf(EVENTCHKINF_OBTAINED_SPIRIT_MEDALLION)) { - play->nextEntranceIndex = 0x0580; + play->nextEntranceIndex = ENTR_GRAVEYARD_8; play->transitionTrigger = TRANS_TRIGGER_START; play->transitionType = TRANS_TYPE_FADE_WHITE; } else { - play->nextEntranceIndex = 0x0610; + play->nextEntranceIndex = ENTR_DESERT_COLOSSUS_8; play->transitionTrigger = TRANS_TRIGGER_START; play->transitionType = TRANS_TYPE_FADE_WHITE; } @@ -1272,13 +1272,13 @@ void Cutscene_Command_Terminator(PlayState* play, CutsceneContext* csCtx, CsCmdB gSaveContext.gameMode = 3; Audio_SetSoundBanksMute(0x6F); play->linkAgeOnLoad = 0; - play->nextEntranceIndex = 0x00CD; + play->nextEntranceIndex = ENTR_HYRULE_FIELD_0; gSaveContext.cutsceneIndex = 0xFFF7; play->transitionTrigger = TRANS_TRIGGER_START; play->transitionType = TRANS_TYPE_FADE_WHITE; break; case 118: - gSaveContext.respawn[RESPAWN_MODE_DOWN].entranceIndex = 0x0517; + gSaveContext.respawn[RESPAWN_MODE_DOWN].entranceIndex = ENTR_GANON_BOSS_0; Play_TriggerVoidOut(play); gSaveContext.respawnFlag = -2; gSaveContext.nextTransitionType = TRANS_TYPE_FADE_BLACK; @@ -1286,7 +1286,7 @@ void Cutscene_Command_Terminator(PlayState* play, CutsceneContext* csCtx, CsCmdB case 119: gSaveContext.dayTime = 0x8000; gSaveContext.skyboxTime = 0x8000; - play->nextEntranceIndex = 0x05F0; + play->nextEntranceIndex = ENTR_CASTLE_COURTYARD_ZELDA_1; play->transitionTrigger = TRANS_TRIGGER_START; play->transitionType = TRANS_TYPE_FADE_WHITE; break; @@ -1314,12 +1314,12 @@ void Cutscene_Command_TransitionFX(PlayState* play, CutsceneContext* csCtx, CsCm play->envCtx.screenFillColor[2] = 160; if (cmd->base == 1) { play->envCtx.screenFillColor[3] = 255.0f * temp; - if ((temp == 0.0f) && (gSaveContext.entranceIndex == 0x006B)) { + if ((temp == 0.0f) && (gSaveContext.entranceIndex == ENTR_CHAMBER_OF_THE_SAGES_0)) { Audio_PlaySoundGeneral(NA_SE_SY_WHITE_OUT_S, &D_801333D4, 4, &D_801333E0, &D_801333E0, &D_801333E8); } else if ((temp == 0.0f) && - ((gSaveContext.entranceIndex == 0x0053) || (gSaveContext.entranceIndex == 0x0138) || - (gSaveContext.entranceIndex == 0x0371))) { + ((gSaveContext.entranceIndex == ENTR_TEMPLE_OF_TIME_0) || (gSaveContext.entranceIndex == ENTR_HYRULE_CASTLE_0) || + (gSaveContext.entranceIndex == ENTR_GREAT_FAIRYS_FOUNTAIN_SPELLS_0))) { Audio_PlaySoundGeneral(NA_SE_EV_WHITE_OUT, &D_801333D4, 4, &D_801333E0, &D_801333E0, &D_801333E8); } else if ((temp == 0.0f) && (play->sceneNum == SCENE_INSIDE_GANONS_CASTLE)) { @@ -2024,10 +2024,10 @@ void func_80068DC0(PlayState* play, CutsceneContext* csCtx) { if (D_8015FCC8 != 0) { switch (gSaveContext.entranceIndex) { - case 0x028A: - case 0x028E: - case 0x0292: - case 0x0476: + case ENTR_HYRULE_FIELD_11: + case ENTR_HYRULE_FIELD_12: + case ENTR_HYRULE_FIELD_13: + case ENTR_HYRULE_FIELD_15: Play_CopyCamera(play, D_8015FCC6, csCtx->unk_14); } @@ -2115,12 +2115,12 @@ void Cutscene_HandleEntranceTriggers(PlayState* play) { if (IS_RANDO && // don't skip epona escape cutscenes - gSaveContext.entranceIndex != 650 && - gSaveContext.entranceIndex != 654 && - gSaveContext.entranceIndex != 658 && - gSaveContext.entranceIndex != 1142 && + gSaveContext.entranceIndex != ENTR_HYRULE_FIELD_11 && + gSaveContext.entranceIndex != ENTR_HYRULE_FIELD_12 && + gSaveContext.entranceIndex != ENTR_HYRULE_FIELD_13 && + gSaveContext.entranceIndex != ENTR_HYRULE_FIELD_15 && // don't skip nabooru iron knuckle cs - gSaveContext.entranceIndex != 141) { + gSaveContext.entranceIndex != ENTR_SPIRIT_TEMPLE_BOSS_0) { gSaveContext.showTitleCard = false; return; } @@ -2152,24 +2152,24 @@ void Cutscene_HandleConditionalTriggers(PlayState* play) { if ((gSaveContext.gameMode == 0) && (gSaveContext.respawnFlag <= 0) && (gSaveContext.cutsceneIndex < 0xFFF0)) { const bool bShouldTowerRandoSkip = (IS_RANDO && Randomizer_GetSettingValue(RSK_SKIP_TOWER_ESCAPE)); - if ((gSaveContext.entranceIndex == 0x01E1) && !Flags_GetEventChkInf(EVENTCHKINF_LEARNED_REQUIEM_OF_SPIRIT)) { + if ((gSaveContext.entranceIndex == ENTR_DESERT_COLOSSUS_1) && !Flags_GetEventChkInf(EVENTCHKINF_LEARNED_REQUIEM_OF_SPIRIT)) { if (!IS_RANDO) { Flags_SetEventChkInf(EVENTCHKINF_LEARNED_REQUIEM_OF_SPIRIT); - gSaveContext.entranceIndex = 0x0123; + gSaveContext.entranceIndex = ENTR_DESERT_COLOSSUS_0; gSaveContext.cutsceneIndex = 0xFFF0; } - } else if ((gSaveContext.entranceIndex == 0x00DB) && LINK_IS_ADULT && (Flags_GetEventChkInf(EVENTCHKINF_USED_FOREST_TEMPLE_BLUE_WARP)) && + } else if ((gSaveContext.entranceIndex == ENTR_KAKARIKO_VILLAGE_0) && LINK_IS_ADULT && (Flags_GetEventChkInf(EVENTCHKINF_USED_FOREST_TEMPLE_BLUE_WARP)) && (Flags_GetEventChkInf(EVENTCHKINF_USED_FIRE_TEMPLE_BLUE_WARP)) && (Flags_GetEventChkInf(EVENTCHKINF_USED_WATER_TEMPLE_BLUE_WARP)) && !Flags_GetEventChkInf(EVENTCHKINF_BONGO_BONGO_ESCAPED_FROM_WELL)) { if (!IS_RANDO) { Flags_SetEventChkInf(EVENTCHKINF_BONGO_BONGO_ESCAPED_FROM_WELL); gSaveContext.cutsceneIndex = 0xFFF0; } - } else if ((gSaveContext.entranceIndex == 0x05E0) && !Flags_GetEventChkInf(EVENTCHKINF_SPOKE_TO_SARIA_ON_BRIDGE)) { + } else if ((gSaveContext.entranceIndex == ENTR_LOST_WOODS_9) && !Flags_GetEventChkInf(EVENTCHKINF_SPOKE_TO_SARIA_ON_BRIDGE)) { if (!IS_RANDO) { Flags_SetEventChkInf(EVENTCHKINF_SPOKE_TO_SARIA_ON_BRIDGE); Item_Give(play, ITEM_OCARINA_FAIRY); - gSaveContext.entranceIndex = 0x011E; + gSaveContext.entranceIndex = ENTR_LOST_WOODS_0; gSaveContext.cutsceneIndex = 0xFFF0; } } else if (CHECK_QUEST_ITEM(QUEST_MEDALLION_SPIRIT) && CHECK_QUEST_ITEM(QUEST_MEDALLION_SHADOW) && @@ -2177,7 +2177,7 @@ void Cutscene_HandleConditionalTriggers(PlayState* play) { (gEntranceTable[((void)0, gSaveContext.entranceIndex)].scene == SCENE_TEMPLE_OF_TIME)) { if (!IS_RANDO) { Flags_SetEventChkInf(EVENTCHKINF_RETURNED_TO_TEMPLE_OF_TIME_WITH_ALL_MEDALLIONS); - gSaveContext.entranceIndex = 0x0053; + gSaveContext.entranceIndex = ENTR_TEMPLE_OF_TIME_0; gSaveContext.cutsceneIndex = 0xFFF8; } } else if ((!Flags_GetEventChkInf(EVENTCHKINF_WATCHED_GANONS_CASTLE_COLLAPSE_CAUGHT_BY_GERUDO) && @@ -2185,7 +2185,7 @@ void Cutscene_HandleConditionalTriggers(PlayState* play) { (bShouldTowerRandoSkip && gEntranceTable[((void)0, gSaveContext.entranceIndex)].scene == SCENE_GANONS_TOWER_COLLAPSE_EXTERIOR)) { Flags_SetEventChkInf(EVENTCHKINF_WATCHED_GANONS_CASTLE_COLLAPSE_CAUGHT_BY_GERUDO); - gSaveContext.entranceIndex = 0x0517; + gSaveContext.entranceIndex = ENTR_GANON_BOSS_0; // In rando, skip the cutscene for the tower falling down after the escape. if (IS_RANDO) { return; diff --git a/soh/src/code/z_horse.c b/soh/src/code/z_horse.c index c36e6095e..6f7aa2d3a 100644 --- a/soh/src/code/z_horse.c +++ b/soh/src/code/z_horse.c @@ -68,7 +68,7 @@ void func_8006D0EC(PlayState* play, Player* player) { horseActor = Actor_Spawn(&play->actorCtx, play, ACTOR_EN_HORSE, 3586.0f, 1413.0f, -402.0f, 0, 0x4000, 0, 1, true); horseActor->room = -1; - } else if ((gSaveContext.entranceIndex == 1230) && (Flags_GetEventChkInf(EVENTCHKINF_EPONA_OBTAINED))) { + } else if ((gSaveContext.entranceIndex == ENTR_LON_LON_RANCH_7) && (Flags_GetEventChkInf(EVENTCHKINF_EPONA_OBTAINED))) { Actor* horseActor = Actor_Spawn(&play->actorCtx, play, ACTOR_EN_HORSE, -25.0f, 0.0f, -1600.0f, 0, -0x4000, 0, 1, true); assert(horseActor != NULL); @@ -134,8 +134,8 @@ void func_8006D684(PlayState* play, Player* player) { s32 i; Vec3s spawnPos; - if ((gSaveContext.entranceIndex == 0x028A || gSaveContext.entranceIndex == 0x028E || - gSaveContext.entranceIndex == 0x0292 || gSaveContext.entranceIndex == 0x0476) && + if ((gSaveContext.entranceIndex == ENTR_HYRULE_FIELD_11 || gSaveContext.entranceIndex == ENTR_HYRULE_FIELD_12 || + gSaveContext.entranceIndex == ENTR_HYRULE_FIELD_13 || gSaveContext.entranceIndex == ENTR_HYRULE_FIELD_15) && (gSaveContext.respawnFlag == 0)) { Vec3s spawnPositions[] = { { 0xF46F, 0x0139, 0x1E14 }, @@ -144,13 +144,13 @@ void func_8006D684(PlayState* play, Player* player) { { 0xF6F7, 0x0139, 0x1766 }, }; - if (gSaveContext.entranceIndex == 0x028A) { + if (gSaveContext.entranceIndex == ENTR_HYRULE_FIELD_11) { spawnPos = spawnPositions[0]; - } else if (gSaveContext.entranceIndex == 0x028E) { + } else if (gSaveContext.entranceIndex == ENTR_HYRULE_FIELD_12) { spawnPos = spawnPositions[1]; - } else if (gSaveContext.entranceIndex == 0x0292) { + } else if (gSaveContext.entranceIndex == ENTR_HYRULE_FIELD_13) { spawnPos = spawnPositions[2]; - } else { + } else { // entranceIndex == ENTR_HYRULE_FIELD_15 spawnPos = spawnPositions[3]; } @@ -253,8 +253,8 @@ void func_8006DC68(PlayState* play, Player* player) { if (func_8006CFC0(play->sceneNum)) { if ((gSaveContext.sceneSetupIndex > 3) || - ((gSaveContext.entranceIndex == 0x028A || gSaveContext.entranceIndex == 0x028E || - gSaveContext.entranceIndex == 0x0292 || gSaveContext.entranceIndex == 0x0476) && + ((gSaveContext.entranceIndex == ENTR_HYRULE_FIELD_11 || gSaveContext.entranceIndex == ENTR_HYRULE_FIELD_12 || + gSaveContext.entranceIndex == ENTR_HYRULE_FIELD_13 || gSaveContext.entranceIndex == ENTR_HYRULE_FIELD_15) && (gSaveContext.respawnFlag == 0)) || ((play->sceneNum == SCENE_LON_LON_RANCH) && ((gSaveContext.eventInf[0] & 0xF) == 6) && !Flags_GetEventChkInf(EVENTCHKINF_EPONA_OBTAINED) && (DREG(1) == 0))) { diff --git a/soh/src/code/z_kankyo.c b/soh/src/code/z_kankyo.c index 41bf060df..77c7546f8 100644 --- a/soh/src/code/z_kankyo.c +++ b/soh/src/code/z_kankyo.c @@ -1322,7 +1322,7 @@ void Environment_DrawSunAndMoon(PlayState* play) { play->envCtx.sunPos.z = +(Math_CosS(((void)0, gSaveContext.dayTime) - 0x8000) * 20.0f) * 25.0f; } - if (gSaveContext.entranceIndex != 0xCD || ((void)0, gSaveContext.sceneSetupIndex) != 5) { + if (gSaveContext.entranceIndex != ENTR_HYRULE_FIELD_0 || ((void)0, gSaveContext.sceneSetupIndex) != 5) { Matrix_Translate(play->view.eye.x + play->envCtx.sunPos.x, play->view.eye.y + play->envCtx.sunPos.y, play->view.eye.z + play->envCtx.sunPos.z, MTXMODE_NEW); @@ -2004,7 +2004,7 @@ void Environment_PlaySceneSequence(PlayState* play) { play->envCtx.unk_E0 = 0xFF; // both lost woods exits on the bridge from kokiri to hyrule field - if (((void)0, gSaveContext.entranceIndex) == 0x4DE || ((void)0, gSaveContext.entranceIndex) == 0x5E0) { + if (((void)0, gSaveContext.entranceIndex) == ENTR_LOST_WOODS_8 || ((void)0, gSaveContext.entranceIndex) == ENTR_LOST_WOODS_9) { Audio_PlayNatureAmbienceSequence(NATURE_ID_KOKIRI_REGION); } else if (((void)0, gSaveContext.forcedSeqId) != NA_BGM_GENERAL_SFX) { if (!Environment_IsForcedSequenceDisabled()) { @@ -2546,22 +2546,22 @@ void Environment_WarpSongLeave(PlayState* play) { gSaveContext.nextTransitionType = TRANS_TYPE_FADE_WHITE; switch (play->nextEntranceIndex) { - case 0x147: + case ENTR_DEATH_MOUNTAIN_CRATER_0: Flags_SetEventChkInf(EVENTCHKINF_ENTERED_DEATH_MOUNTAIN_CRATER); break; - case 0x0102: + case ENTR_LAKE_HYLIA_0: Flags_SetEventChkInf(EVENTCHKINF_ENTERED_LAKE_HYLIA); break; - case 0x0123: + case ENTR_DESERT_COLOSSUS_0: Flags_SetEventChkInf(EVENTCHKINF_ENTERED_DESERT_COLOSSUS); break; - case 0x00E4: + case ENTR_GRAVEYARD_0: Flags_SetEventChkInf(EVENTCHKINF_ENTERED_GRAVEYARD); break; - case 0x0053: + case ENTR_TEMPLE_OF_TIME_0: Flags_SetEventChkInf(EVENTCHKINF_ENTERED_TEMPLE_OF_TIME); break; - case 0x00FC: + case ENTR_SACRED_FOREST_MEADOW_0: break; } } diff --git a/soh/src/code/z_parameter.c b/soh/src/code/z_parameter.c index bc51079f1..8d98535df 100644 --- a/soh/src/code/z_parameter.c +++ b/soh/src/code/z_parameter.c @@ -1724,7 +1724,7 @@ void GameplayStats_SetTimestamp(PlayState* play, u8 item) { } // Use ITEM_KEY_BOSS only for Ganon's boss key - not any other boss keys if (play != NULL) { - if (item == ITEM_KEY_BOSS && play->sceneNum != 13 && play->sceneNum != 10) { + if (item == ITEM_KEY_BOSS && play->sceneNum != SCENE_INSIDE_GANONS_CASTLE && play->sceneNum != SCENE_GANONS_TOWER) { return; } } @@ -5071,7 +5071,7 @@ void Interface_Draw(PlayState* play) { aButtonColor = (Color_RGB8){ 0, 200, 50 }; } - static s16 spoilingItemEntrances[] = { 0x01AD, 0x0153, 0x0153 }; + static s16 spoilingItemEntrances[] = { ENTR_LOST_WOODS_2, ENTR_ZORAS_DOMAIN_3, ENTR_ZORAS_DOMAIN_3 }; static f32 D_80125B54[] = { -40.0f, -35.0f }; // unused static s16 D_80125B5C[] = { 91, 91 }; // unused static s16 D_8015FFE0; diff --git a/soh/src/code/z_play.c b/soh/src/code/z_play.c index 698a41b70..d6c84e355 100644 --- a/soh/src/code/z_play.c +++ b/soh/src/code/z_play.c @@ -229,7 +229,7 @@ void Play_Destroy(GameState* thisx) { void GivePlayerRandoRewardSongOfTime(PlayState* play, RandomizerCheck check) { Player* player = GET_PLAYER(play); - if (gSaveContext.entranceIndex == 0x050F && player != NULL && !Player_InBlockingCsMode(play, player) && + if (gSaveContext.entranceIndex == ENTR_HYRULE_FIELD_16 && player != NULL && !Player_InBlockingCsMode(play, player) && !Flags_GetTreasure(play, 0x1F) && gSaveContext.nextTransitionType == TRANS_NEXT_TYPE_DEFAULT && !gSaveContext.pendingIceTrapCount) { GetItemEntry getItemEntry = Randomizer_GetItemFromKnownCheck(check, RG_SONG_OF_TIME); GiveItemEntryWithoutActor(play, getItemEntry); @@ -241,9 +241,9 @@ void GivePlayerRandoRewardSongOfTime(PlayState* play, RandomizerCheck check) { void GivePlayerRandoRewardNocturne(PlayState* play, RandomizerCheck check) { Player* player = GET_PLAYER(play); - if ((gSaveContext.entranceIndex == 0x00DB || - gSaveContext.entranceIndex == 0x0191 || - gSaveContext.entranceIndex == 0x0195) && LINK_IS_ADULT && CHECK_QUEST_ITEM(QUEST_MEDALLION_FOREST) && + if ((gSaveContext.entranceIndex == ENTR_KAKARIKO_VILLAGE_0 || + gSaveContext.entranceIndex == ENTR_KAKARIKO_VILLAGE_1 || + gSaveContext.entranceIndex == ENTR_KAKARIKO_VILLAGE_2) && LINK_IS_ADULT && CHECK_QUEST_ITEM(QUEST_MEDALLION_FOREST) && CHECK_QUEST_ITEM(QUEST_MEDALLION_FIRE) && CHECK_QUEST_ITEM(QUEST_MEDALLION_WATER) && player != NULL && !Player_InBlockingCsMode(play, player) && !Flags_GetEventChkInf(EVENTCHKINF_BONGO_BONGO_ESCAPED_FROM_WELL)) { GetItemEntry getItemEntry = Randomizer_GetItemFromKnownCheck(check, RG_NOCTURNE_OF_SHADOW); @@ -257,7 +257,7 @@ void GivePlayerRandoRewardRequiem(PlayState* play, RandomizerCheck check) { Player* player = GET_PLAYER(play); if ((gSaveContext.gameMode == 0) && (gSaveContext.respawnFlag <= 0) && (gSaveContext.cutsceneIndex < 0xFFF0)) { - if ((gSaveContext.entranceIndex == 0x01E1) && !Flags_GetEventChkInf(EVENTCHKINF_LEARNED_REQUIEM_OF_SPIRIT) && player != NULL && + if ((gSaveContext.entranceIndex == ENTR_DESERT_COLOSSUS_1) && !Flags_GetEventChkInf(EVENTCHKINF_LEARNED_REQUIEM_OF_SPIRIT) && player != NULL && !Player_InBlockingCsMode(play, player)) { GetItemEntry getItemEntry = Randomizer_GetItemFromKnownCheck(check, RG_SONG_OF_TIME); GiveItemEntryWithoutActor(play, getItemEntry); @@ -270,7 +270,7 @@ void GivePlayerRandoRewardRequiem(PlayState* play, RandomizerCheck check) { void GivePlayerRandoRewardMasterSword(PlayState* play, RandomizerCheck check) { Player* player = GET_PLAYER(play); - if (gSaveContext.entranceIndex == 0x02CA && LINK_IS_ADULT && player != NULL && + if (gSaveContext.entranceIndex == ENTR_TEMPLE_OF_TIME_2 && LINK_IS_ADULT && player != NULL && !Player_InBlockingCsMode(play, player) && Randomizer_GetSettingValue(RSK_SHUFFLE_MASTER_SWORD) && !Flags_GetRandomizerInf(RAND_INF_TOT_MASTER_SWORD)) { GetItemEntry getItemEntry = Randomizer_GetItemFromKnownCheck(check, RG_MASTER_SWORD); @@ -454,7 +454,7 @@ void GivePlayerRandoRewardZeldaLightArrowsGift(PlayState* play, RandomizerCheck void GivePlayerRandoRewardSariaGift(PlayState* play, RandomizerCheck check) { Player* player = GET_PLAYER(play); - if (gSaveContext.entranceIndex == 0x05E0) { + if (gSaveContext.entranceIndex == ENTR_LOST_WOODS_9) { GetItemEntry getItemEntry = Randomizer_GetItemFromKnownCheck(check, RG_ZELDAS_LULLABY); if (!Flags_GetEventChkInf(EVENTCHKINF_SPOKE_TO_SARIA_ON_BRIDGE) && player != NULL && !Player_InBlockingCsMode(play, player)) { @@ -483,12 +483,12 @@ void Play_Init(GameState* thisx) { // Skip Child Stealth when option is enabled, Zelda's Letter isn't obtained and Impa's reward hasn't been received // eventChkInf[4] & 1 = Got Zelda's Letter // eventChkInf[5] & 0x200 = Got Impa's reward - // entranceIndex 0x7A, Castle Courtyard - Day from crawlspace - // entranceIndex 0x400, Zelda's Courtyard + // entranceIndex 0x7A, ENTR_CASTLE_COURTYARD_GUARDS_DAY_0, Castle Courtyard - Day from crawlspace + // entranceIndex 0x400, ENTR_CASTLE_COURTYARD_ZELDA_0, Zelda's Courtyard if (IS_RANDO && Randomizer_GetSettingValue(RSK_SKIP_CHILD_STEALTH) && !Flags_GetEventChkInf(EVENTCHKINF_OBTAINED_ZELDAS_LETTER) && !Flags_GetEventChkInf(EVENTCHKINF_LEARNED_ZELDAS_LULLABY)) { - if (gSaveContext.entranceIndex == 0x7A) { - gSaveContext.entranceIndex = 0x400; + if (gSaveContext.entranceIndex == ENTR_CASTLE_COURTYARD_GUARDS_DAY_0) { + gSaveContext.entranceIndex = ENTR_CASTLE_COURTYARD_ZELDA_0; } } @@ -499,7 +499,7 @@ void Play_Init(GameState* thisx) { } // Invalid entrance, so immediately exit the game to opening title - if (gSaveContext.entranceIndex == -1) { + if (gSaveContext.entranceIndex == ENTR_LOAD_OPENING) { gSaveContext.entranceIndex = 0; play->state.running = false; SET_NEXT_GAMESTATE(&play->state, Opening_Init, OpeningContext); @@ -645,8 +645,8 @@ void Play_Init(GameState* thisx) { if (gSaveContext.gameMode != 1) { if (gSaveContext.nextTransitionType == TRANS_NEXT_TYPE_DEFAULT) { - play->transitionType = - (gEntranceTable[((void)0, gSaveContext.entranceIndex) + tempSetupIndex].field >> 7) & 0x7F; // Fade In + play->transitionType = ENTRANCE_INFO_END_TRANS_TYPE( + gEntranceTable[((void)0, gSaveContext.entranceIndex) + tempSetupIndex].field); // Fade In } else { play->transitionType = gSaveContext.nextTransitionType; gSaveContext.nextTransitionType = TRANS_NEXT_TYPE_DEFAULT; @@ -868,7 +868,7 @@ void Play_Update(PlayState* play) { sp6E = (gSaveContext.cutsceneIndex & 0xF) + 4; } - if (!(gEntranceTable[play->nextEntranceIndex + sp6E].field & 0x8000)) { // Continue BGM Off + if (!(gEntranceTable[play->nextEntranceIndex + sp6E].field & ENTRANCE_INFO_CONTINUE_BGM_FLAG)) { // Continue BGM Off // "Sound initalized. 111" osSyncPrintf("\n\n\nサウンドイニシャル来ました。111"); if ((play->transitionType < TRANS_TYPE_MAX) && !Environment_IsForcedSequenceDisabled()) { @@ -2266,11 +2266,11 @@ void Play_LoadToLastEntrance(PlayState* play) { if ((play->sceneNum == SCENE_GANONS_TOWER_COLLAPSE_INTERIOR) || (play->sceneNum == SCENE_GANONS_TOWER_COLLAPSE_EXTERIOR) || (play->sceneNum == SCENE_INSIDE_GANONS_CASTLE_COLLAPSE) || (play->sceneNum == SCENE_GANON_BOSS)) { - play->nextEntranceIndex = 0x043F; + play->nextEntranceIndex = ENTR_GANONS_TOWER_COLLAPSE_EXTERIOR_0; Item_Give(play, ITEM_SWORD_MASTER); - } else if ((gSaveContext.entranceIndex == 0x028A) || (gSaveContext.entranceIndex == 0x028E) || - (gSaveContext.entranceIndex == 0x0292) || (gSaveContext.entranceIndex == 0x0476)) { - play->nextEntranceIndex = 0x01F9; + } else if ((gSaveContext.entranceIndex == ENTR_HYRULE_FIELD_11) || (gSaveContext.entranceIndex == ENTR_HYRULE_FIELD_12) || + (gSaveContext.entranceIndex == ENTR_HYRULE_FIELD_13) || (gSaveContext.entranceIndex == ENTR_HYRULE_FIELD_15)) { + play->nextEntranceIndex = ENTR_HYRULE_FIELD_6; } else { play->nextEntranceIndex = gSaveContext.entranceIndex; } diff --git a/soh/src/code/z_scene.c b/soh/src/code/z_scene.c index 2a0a5d5d7..1702dc3d9 100644 --- a/soh/src/code/z_scene.c +++ b/soh/src/code/z_scene.c @@ -360,7 +360,7 @@ void Scene_CommandTimeSettings(PlayState* play, SceneCmd* cmd) { play->envCtx.sunPos.z = (Math_CosS(((void)0, gSaveContext.dayTime) - 0x8000) * 20.0f) * 25.0f; if (((play->envCtx.timeIncrement == 0) && (gSaveContext.cutsceneIndex < 0xFFF0)) || - (gSaveContext.entranceIndex == 0x0604)) { + (gSaveContext.entranceIndex == ENTR_LAKE_HYLIA_8)) { gSaveContext.skyboxTime = ((void)0, gSaveContext.dayTime); if ((gSaveContext.skyboxTime >= 0x2AAC) && (gSaveContext.skyboxTime < 0x4555)) { gSaveContext.skyboxTime = 0x3556; diff --git a/soh/src/code/z_scene_table.c b/soh/src/code/z_scene_table.c index 1d991e8c0..9cb9a31d7 100644 --- a/soh/src/code/z_scene_table.c +++ b/soh/src/code/z_scene_table.c @@ -26,793 +26,20 @@ #include "soh/mq_asset_hacks.h" #include "soh/Enhancements/randomizer/adult_trade_shuffle.h" -#define ENTRANCE(scene, spawn, continueBgm, displayTitleCard, fadeIn, fadeOut) \ - { \ - scene, spawn, \ - ((continueBgm & 1) << 15) | ((displayTitleCard & 1) << 14) | ((fadeIn & 0x7F) << 7) | (fadeOut & 0x7F) \ - } +// Entrance Table definition +#define DEFINE_ENTRANCE(_0, sceneId, spawn, continueBgm, displayTitleCard, endTransType, startTransType) \ + { sceneId, spawn, \ + (((continueBgm) ? ENTRANCE_INFO_CONTINUE_BGM_FLAG : 0) | \ + ((displayTitleCard) ? ENTRANCE_INFO_DISPLAY_TITLE_CARD_FLAG : 0) | \ + (((endTransType) << ENTRANCE_INFO_END_TRANS_TYPE_SHIFT) & ENTRANCE_INFO_END_TRANS_TYPE_MASK) | \ + (((startTransType) << ENTRANCE_INFO_START_TRANS_TYPE_SHIFT) & ENTRANCE_INFO_START_TRANS_TYPE_MASK)) }, EntranceInfo gEntranceTable[] = { - ENTRANCE(0x00, 0x00, 0, 1, 0x02, 0x02), ENTRANCE(0x00, 0x00, 0, 1, 0x02, 0x02), - ENTRANCE(0x00, 0x00, 0, 1, 0x02, 0x02), ENTRANCE(0x00, 0x00, 0, 1, 0x02, 0x02), - ENTRANCE(0x01, 0x00, 0, 1, 0x02, 0x02), ENTRANCE(0x01, 0x00, 0, 1, 0x02, 0x02), - ENTRANCE(0x01, 0x00, 0, 1, 0x02, 0x02), ENTRANCE(0x01, 0x00, 0, 1, 0x02, 0x02), - ENTRANCE(0x0B, 0x00, 0, 1, 0x02, 0x02), ENTRANCE(0x0B, 0x00, 0, 1, 0x02, 0x02), - ENTRANCE(0x0B, 0x00, 0, 1, 0x02, 0x02), ENTRANCE(0x0B, 0x00, 0, 1, 0x02, 0x02), - ENTRANCE(0x14, 0x00, 1, 1, 0x02, 0x02), ENTRANCE(0x14, 0x00, 1, 1, 0x02, 0x02), - ENTRANCE(0x14, 0x00, 1, 1, 0x02, 0x02), ENTRANCE(0x14, 0x00, 1, 1, 0x02, 0x02), - ENTRANCE(0x05, 0x00, 0, 1, 0x02, 0x02), ENTRANCE(0x05, 0x00, 0, 1, 0x02, 0x02), - ENTRANCE(0x05, 0x00, 0, 1, 0x02, 0x02), ENTRANCE(0x05, 0x00, 0, 1, 0x02, 0x02), - ENTRANCE(0x6E, 0x00, 0, 1, 0x02, 0x02), ENTRANCE(0x6E, 0x00, 0, 1, 0x02, 0x02), - ENTRANCE(0x6E, 0x00, 0, 1, 0x02, 0x02), ENTRANCE(0x6E, 0x00, 0, 1, 0x02, 0x02), - ENTRANCE(0x6C, 0x00, 0, 1, 0x02, 0x02), ENTRANCE(0x6C, 0x00, 0, 1, 0x02, 0x02), - ENTRANCE(0x6C, 0x00, 0, 1, 0x02, 0x02), ENTRANCE(0x6C, 0x00, 0, 1, 0x02, 0x02), - ENTRANCE(0x68, 0x00, 0, 1, 0x02, 0x02), ENTRANCE(0x68, 0x00, 0, 1, 0x02, 0x02), - ENTRANCE(0x68, 0x00, 0, 1, 0x02, 0x02), ENTRANCE(0x68, 0x00, 0, 1, 0x02, 0x02), - ENTRANCE(0x69, 0x00, 0, 1, 0x02, 0x02), ENTRANCE(0x69, 0x00, 0, 1, 0x02, 0x02), - ENTRANCE(0x69, 0x00, 0, 1, 0x02, 0x02), ENTRANCE(0x69, 0x00, 0, 1, 0x02, 0x02), - ENTRANCE(0x6D, 0x00, 0, 1, 0x02, 0x02), ENTRANCE(0x6D, 0x00, 0, 1, 0x02, 0x02), - ENTRANCE(0x6D, 0x00, 0, 1, 0x02, 0x02), ENTRANCE(0x6D, 0x00, 0, 1, 0x02, 0x02), - ENTRANCE(0x02, 0x00, 0, 1, 0x02, 0x02), ENTRANCE(0x02, 0x00, 0, 1, 0x02, 0x02), - ENTRANCE(0x02, 0x00, 0, 1, 0x02, 0x02), ENTRANCE(0x02, 0x00, 0, 1, 0x02, 0x02), - ENTRANCE(0x02, 0x00, 0, 1, 0x02, 0x02), ENTRANCE(0x41, 0x00, 0, 1, 0x02, 0x26), - ENTRANCE(0x41, 0x00, 0, 1, 0x02, 0x26), ENTRANCE(0x41, 0x00, 0, 1, 0x02, 0x26), - ENTRANCE(0x41, 0x00, 0, 1, 0x02, 0x26), ENTRANCE(0x41, 0x00, 0, 1, 0x02, 0x02), - ENTRANCE(0x41, 0x00, 0, 1, 0x02, 0x02), ENTRANCE(0x1B, 0x00, 1, 1, 0x03, 0x03), - ENTRANCE(0x1C, 0x00, 1, 1, 0x02, 0x02), ENTRANCE(0x1D, 0x00, 1, 1, 0x03, 0x03), - ENTRANCE(0x1D, 0x00, 1, 1, 0x02, 0x02), ENTRANCE(0x07, 0x00, 0, 1, 0x02, 0x02), - ENTRANCE(0x07, 0x00, 0, 1, 0x02, 0x02), ENTRANCE(0x07, 0x00, 0, 1, 0x02, 0x02), - ENTRANCE(0x07, 0x00, 0, 1, 0x02, 0x02), ENTRANCE(0x42, 0x00, 0, 1, 0x04, 0x20), - ENTRANCE(0x42, 0x00, 0, 1, 0x04, 0x20), ENTRANCE(0x42, 0x00, 0, 1, 0x04, 0x20), - ENTRANCE(0x42, 0x00, 0, 1, 0x04, 0x20), ENTRANCE(0x3E, 0x00, 0, 1, 0x02, 0x02), - ENTRANCE(0x3E, 0x00, 0, 1, 0x02, 0x02), ENTRANCE(0x3E, 0x00, 0, 1, 0x02, 0x02), - ENTRANCE(0x3E, 0x00, 0, 1, 0x02, 0x02), ENTRANCE(0x38, 0x00, 0, 1, 0x04, 0x20), - ENTRANCE(0x38, 0x00, 0, 1, 0x04, 0x20), ENTRANCE(0x38, 0x00, 0, 1, 0x04, 0x20), - ENTRANCE(0x38, 0x00, 0, 1, 0x04, 0x20), ENTRANCE(0x6A, 0x00, 0, 1, 0x02, 0x02), - ENTRANCE(0x6A, 0x00, 0, 1, 0x02, 0x02), ENTRANCE(0x6A, 0x00, 0, 1, 0x02, 0x02), - ENTRANCE(0x6A, 0x00, 0, 1, 0x02, 0x02), ENTRANCE(0x40, 0x00, 0, 1, 0x02, 0x26), - ENTRANCE(0x40, 0x00, 0, 1, 0x02, 0x26), ENTRANCE(0x40, 0x00, 0, 1, 0x02, 0x26), - ENTRANCE(0x40, 0x00, 0, 1, 0x02, 0x26), ENTRANCE(0x4C, 0x00, 0, 1, 0x04, 0x20), - ENTRANCE(0x4C, 0x00, 0, 1, 0x04, 0x20), ENTRANCE(0x4C, 0x00, 0, 1, 0x04, 0x20), - ENTRANCE(0x4C, 0x00, 0, 1, 0x04, 0x20), ENTRANCE(0x43, 0x00, 0, 1, 0x02, 0x02), - ENTRANCE(0x43, 0x00, 0, 1, 0x02, 0x02), ENTRANCE(0x43, 0x00, 0, 1, 0x02, 0x02), - ENTRANCE(0x43, 0x00, 0, 1, 0x02, 0x02), ENTRANCE(0x43, 0x00, 0, 1, 0x02, 0x02), - ENTRANCE(0x43, 0x00, 0, 1, 0x02, 0x02), ENTRANCE(0x43, 0x00, 0, 1, 0x02, 0x02), - ENTRANCE(0x43, 0x00, 0, 1, 0x02, 0x02), ENTRANCE(0x43, 0x00, 0, 1, 0x02, 0x02), - ENTRANCE(0x43, 0x00, 0, 1, 0x02, 0x02), ENTRANCE(0x43, 0x00, 0, 1, 0x02, 0x02), - ENTRANCE(0x43, 0x00, 0, 1, 0x0B, 0x0B), ENTRANCE(0x43, 0x00, 0, 1, 0x02, 0x02), - ENTRANCE(0x43, 0x00, 0, 1, 0x02, 0x02), ENTRANCE(0x43, 0x00, 0, 1, 0x02, 0x02), - ENTRANCE(0x43, 0x00, 0, 1, 0x02, 0x02), ENTRANCE(0x10, 0x00, 0, 1, 0x04, 0x20), - ENTRANCE(0x10, 0x00, 0, 1, 0x04, 0x20), ENTRANCE(0x10, 0x00, 0, 1, 0x04, 0x20), - ENTRANCE(0x10, 0x00, 0, 1, 0x04, 0x20), ENTRANCE(0x1E, 0x03, 1, 1, 0x03, 0x03), - ENTRANCE(0x1F, 0x03, 1, 1, 0x02, 0x02), ENTRANCE(0x1E, 0x03, 1, 1, 0x02, 0x02), - ENTRANCE(0x1F, 0x03, 1, 1, 0x02, 0x02), ENTRANCE(0x44, 0x00, 0, 1, 0x07, 0x07), - ENTRANCE(0x44, 0x00, 0, 1, 0x07, 0x07), ENTRANCE(0x44, 0x00, 0, 1, 0x07, 0x07), - ENTRANCE(0x44, 0x00, 0, 1, 0x07, 0x07), ENTRANCE(0x44, 0x00, 0, 1, 0x0D, 0x02), - ENTRANCE(0x44, 0x00, 0, 1, 0x0D, 0x02), ENTRANCE(0x44, 0x00, 0, 1, 0x03, 0x03), - ENTRANCE(0x4E, 0x00, 0, 1, 0x04, 0x20), ENTRANCE(0x4E, 0x00, 0, 1, 0x04, 0x20), - ENTRANCE(0x4E, 0x00, 0, 1, 0x04, 0x20), ENTRANCE(0x4E, 0x00, 0, 1, 0x04, 0x20), - ENTRANCE(0x6B, 0x00, 0, 1, 0x22, 0x22), ENTRANCE(0x6B, 0x00, 0, 1, 0x22, 0x22), - ENTRANCE(0x6B, 0x00, 0, 1, 0x22, 0x22), ENTRANCE(0x6B, 0x00, 0, 1, 0x22, 0x22), - ENTRANCE(0x45, 0x00, 0, 1, 0x22, 0x04), ENTRANCE(0x46, 0x00, 0, 1, 0x22, 0x04), - ENTRANCE(0x45, 0x00, 0, 1, 0x22, 0x04), ENTRANCE(0x46, 0x00, 0, 1, 0x22, 0x04), - ENTRANCE(0x4D, 0x00, 0, 1, 0x02, 0x02), ENTRANCE(0x4D, 0x00, 0, 1, 0x02, 0x02), - ENTRANCE(0x4D, 0x00, 0, 1, 0x02, 0x02), ENTRANCE(0x4D, 0x00, 0, 1, 0x02, 0x02), - ENTRANCE(0x06, 0x00, 0, 1, 0x02, 0x02), ENTRANCE(0x06, 0x00, 0, 1, 0x02, 0x02), - ENTRANCE(0x06, 0x00, 0, 1, 0x02, 0x02), ENTRANCE(0x06, 0x00, 0, 1, 0x02, 0x02), - ENTRANCE(0x06, 0x00, 0, 1, 0x02, 0x02), ENTRANCE(0x06, 0x00, 0, 1, 0x02, 0x02), - ENTRANCE(0x09, 0x00, 0, 1, 0x02, 0x02), ENTRANCE(0x09, 0x00, 0, 1, 0x02, 0x02), - ENTRANCE(0x09, 0x00, 0, 1, 0x02, 0x02), ENTRANCE(0x09, 0x00, 0, 1, 0x02, 0x02), - ENTRANCE(0x09, 0x00, 0, 1, 0x02, 0x02), ENTRANCE(0x17, 0x00, 1, 1, 0x02, 0x02), - ENTRANCE(0x17, 0x00, 1, 1, 0x02, 0x02), ENTRANCE(0x17, 0x00, 1, 1, 0x02, 0x02), - ENTRANCE(0x17, 0x00, 1, 1, 0x02, 0x02), ENTRANCE(0x17, 0x00, 0, 1, 0x02, 0x02), - ENTRANCE(0x17, 0x00, 0, 1, 0x02, 0x02), ENTRANCE(0x17, 0x00, 0, 1, 0x02, 0x02), - ENTRANCE(0x65, 0x00, 0, 1, 0x02, 0x02), ENTRANCE(0x65, 0x00, 0, 1, 0x02, 0x02), - ENTRANCE(0x65, 0x00, 0, 1, 0x02, 0x02), ENTRANCE(0x65, 0x00, 0, 1, 0x02, 0x02), - ENTRANCE(0x08, 0x00, 0, 1, 0x04, 0x04), ENTRANCE(0x08, 0x00, 0, 1, 0x04, 0x04), - ENTRANCE(0x08, 0x00, 0, 1, 0x04, 0x04), ENTRANCE(0x08, 0x00, 0, 1, 0x04, 0x04), - ENTRANCE(0x27, 0x00, 0, 1, 0x04, 0x04), ENTRANCE(0x27, 0x00, 0, 1, 0x04, 0x04), - ENTRANCE(0x27, 0x00, 0, 1, 0x04, 0x04), ENTRANCE(0x27, 0x00, 0, 1, 0x04, 0x04), - ENTRANCE(0x47, 0x00, 0, 1, 0x03, 0x03), ENTRANCE(0x47, 0x00, 0, 1, 0x03, 0x03), - ENTRANCE(0x47, 0x00, 0, 1, 0x03, 0x03), ENTRANCE(0x47, 0x00, 0, 1, 0x03, 0x03), - ENTRANCE(0x47, 0x00, 0, 1, 0x0A, 0x0A), ENTRANCE(0x47, 0x00, 0, 1, 0x02, 0x0A), - ENTRANCE(0x47, 0x00, 1, 1, 0x0A, 0x0A), ENTRANCE(0x47, 0x00, 0, 1, 0x0B, 0x0B), - ENTRANCE(0x47, 0x00, 0, 1, 0x03, 0x03), ENTRANCE(0x47, 0x00, 0, 1, 0x02, 0x02), - ENTRANCE(0x47, 0x00, 0, 1, 0x02, 0x02), ENTRANCE(0x47, 0x00, 0, 1, 0x03, 0x03), - ENTRANCE(0x47, 0x00, 0, 1, 0x03, 0x03), ENTRANCE(0x1E, 0x00, 1, 1, 0x03, 0x03), - ENTRANCE(0x1F, 0x00, 1, 1, 0x02, 0x02), ENTRANCE(0x1E, 0x00, 1, 1, 0x02, 0x02), - ENTRANCE(0x1F, 0x00, 1, 1, 0x02, 0x02), ENTRANCE(0x20, 0x00, 1, 1, 0x03, 0x03), - ENTRANCE(0x21, 0x00, 1, 1, 0x02, 0x02), ENTRANCE(0x22, 0x00, 1, 1, 0x02, 0x02), - ENTRANCE(0x22, 0x00, 1, 1, 0x02, 0x02), ENTRANCE(0x20, 0x00, 0, 1, 0x08, 0x08), - ENTRANCE(0x67, 0x00, 0, 1, 0x02, 0x02), ENTRANCE(0x2C, 0x00, 0, 1, 0x04, 0x20), - ENTRANCE(0x2C, 0x00, 0, 1, 0x04, 0x20), ENTRANCE(0x2C, 0x00, 0, 1, 0x04, 0x20), - ENTRANCE(0x2C, 0x00, 0, 1, 0x04, 0x20), ENTRANCE(0x34, 0x00, 0, 1, 0x04, 0x04), - ENTRANCE(0x34, 0x00, 0, 1, 0x04, 0x04), ENTRANCE(0x34, 0x00, 0, 1, 0x04, 0x04), - ENTRANCE(0x34, 0x00, 0, 1, 0x04, 0x04), ENTRANCE(0x34, 0x00, 0, 1, 0x04, 0x02), - ENTRANCE(0x34, 0x00, 0, 1, 0x10, 0x10), ENTRANCE(0x2D, 0x00, 0, 1, 0x04, 0x04), - ENTRANCE(0x2D, 0x00, 0, 1, 0x04, 0x04), ENTRANCE(0x2D, 0x00, 0, 1, 0x04, 0x04), - ENTRANCE(0x2D, 0x00, 0, 1, 0x04, 0x04), ENTRANCE(0x01, 0x01, 1, 0, 0x02, 0x02), - ENTRANCE(0x01, 0x01, 1, 0, 0x02, 0x02), ENTRANCE(0x01, 0x01, 1, 0, 0x02, 0x02), - ENTRANCE(0x01, 0x01, 1, 0, 0x02, 0x02), ENTRANCE(0x26, 0x00, 0, 1, 0x04, 0x04), - ENTRANCE(0x26, 0x00, 0, 1, 0x04, 0x04), ENTRANCE(0x26, 0x00, 0, 1, 0x04, 0x04), - ENTRANCE(0x26, 0x00, 0, 1, 0x04, 0x04), ENTRANCE(0x51, 0x00, 0, 1, 0x03, 0x03), - ENTRANCE(0x51, 0x00, 0, 1, 0x02, 0x02), ENTRANCE(0x51, 0x00, 0, 1, 0x03, 0x03), - ENTRANCE(0x51, 0x00, 0, 1, 0x02, 0x02), ENTRANCE(0x51, 0x00, 0, 1, 0x04, 0x02), - ENTRANCE(0x51, 0x00, 0, 1, 0x21, 0x21), ENTRANCE(0x51, 0x00, 0, 1, 0x21, 0x21), - ENTRANCE(0x51, 0x00, 0, 1, 0x23, 0x23), ENTRANCE(0x51, 0x00, 0, 1, 0x03, 0x03), - ENTRANCE(0x51, 0x00, 1, 1, 0x02, 0x02), ENTRANCE(0x51, 0x00, 0, 1, 0x23, 0x23), - ENTRANCE(0x51, 0x00, 0, 1, 0x03, 0x03), ENTRANCE(0x51, 0x00, 0, 1, 0x29, 0x29), - ENTRANCE(0x51, 0x00, 1, 1, 0x03, 0x03), ENTRANCE(0x52, 0x00, 0, 1, 0x03, 0x03), - ENTRANCE(0x52, 0x00, 0, 1, 0x02, 0x02), ENTRANCE(0x52, 0x00, 0, 1, 0x03, 0x03), - ENTRANCE(0x52, 0x00, 0, 1, 0x02, 0x02), ENTRANCE(0x52, 0x00, 0, 1, 0x26, 0x26), - ENTRANCE(0x52, 0x00, 0, 1, 0x21, 0x21), ENTRANCE(0x52, 0x00, 1, 1, 0x21, 0x21), - ENTRANCE(0x52, 0x00, 0, 1, 0x21, 0x21), ENTRANCE(0x52, 0x00, 1, 1, 0x02, 0x02), - ENTRANCE(0x53, 0x00, 0, 1, 0x03, 0x03), ENTRANCE(0x53, 0x00, 0, 1, 0x02, 0x02), - ENTRANCE(0x53, 0x00, 0, 1, 0x03, 0x03), ENTRANCE(0x53, 0x00, 0, 1, 0x02, 0x02), - ENTRANCE(0x53, 0x00, 0, 1, 0x04, 0x02), ENTRANCE(0x53, 0x00, 1, 1, 0x02, 0x02), - ENTRANCE(0x54, 0x00, 1, 1, 0x03, 0x03), ENTRANCE(0x54, 0x00, 1, 1, 0x02, 0x02), - ENTRANCE(0x54, 0x00, 1, 1, 0x03, 0x03), ENTRANCE(0x54, 0x00, 1, 1, 0x02, 0x02), - ENTRANCE(0x55, 0x00, 0, 1, 0x03, 0x03), ENTRANCE(0x55, 0x00, 0, 1, 0x02, 0x02), - ENTRANCE(0x55, 0x00, 0, 1, 0x03, 0x03), ENTRANCE(0x55, 0x00, 0, 1, 0x02, 0x02), - ENTRANCE(0x55, 0x00, 1, 1, 0x0A, 0x0A), ENTRANCE(0x55, 0x00, 0, 1, 0x0A, 0x0A), - ENTRANCE(0x55, 0x00, 1, 1, 0x0A, 0x0A), ENTRANCE(0x55, 0x00, 0, 1, 0x0D, 0x0A), - ENTRANCE(0x55, 0x00, 0, 1, 0x0A, 0x0A), ENTRANCE(0x55, 0x00, 0, 1, 0x0A, 0x0A), - ENTRANCE(0x55, 0x00, 1, 1, 0x02, 0x02), ENTRANCE(0x55, 0x00, 1, 1, 0x02, 0x02), - ENTRANCE(0x55, 0x00, 1, 1, 0x02, 0x02), ENTRANCE(0x55, 0x00, 1, 1, 0x02, 0x02), - ENTRANCE(0x56, 0x00, 1, 1, 0x02, 0x02), ENTRANCE(0x56, 0x00, 1, 1, 0x02, 0x02), - ENTRANCE(0x56, 0x00, 1, 1, 0x02, 0x02), ENTRANCE(0x56, 0x00, 1, 1, 0x02, 0x02), - ENTRANCE(0x56, 0x00, 0, 1, 0x03, 0x03), ENTRANCE(0x56, 0x00, 0, 1, 0x00, 0x00), - ENTRANCE(0x57, 0x00, 1, 1, 0x03, 0x03), ENTRANCE(0x57, 0x00, 1, 1, 0x02, 0x02), - ENTRANCE(0x57, 0x00, 1, 1, 0x03, 0x03), ENTRANCE(0x57, 0x00, 1, 1, 0x02, 0x02), - ENTRANCE(0x57, 0x00, 0, 1, 0x03, 0x03), ENTRANCE(0x57, 0x00, 1, 1, 0x02, 0x02), - ENTRANCE(0x58, 0x00, 0, 1, 0x02, 0x02), ENTRANCE(0x58, 0x00, 0, 1, 0x02, 0x02), - ENTRANCE(0x58, 0x00, 0, 1, 0x02, 0x02), ENTRANCE(0x58, 0x00, 0, 1, 0x02, 0x02), - ENTRANCE(0x58, 0x00, 1, 1, 0x02, 0x02), ENTRANCE(0x58, 0x00, 1, 1, 0x02, 0x02), - ENTRANCE(0x59, 0x00, 0, 1, 0x03, 0x03), ENTRANCE(0x59, 0x00, 0, 1, 0x02, 0x02), - ENTRANCE(0x59, 0x00, 0, 1, 0x03, 0x03), ENTRANCE(0x59, 0x00, 0, 1, 0x02, 0x02), - ENTRANCE(0x59, 0x00, 0, 1, 0x0D, 0x00), ENTRANCE(0x59, 0x00, 0, 1, 0x02, 0x02), - ENTRANCE(0x59, 0x00, 1, 1, 0x02, 0x02), ENTRANCE(0x59, 0x00, 0, 1, 0x02, 0x02), - ENTRANCE(0x59, 0x00, 1, 1, 0x02, 0x02), ENTRANCE(0x5A, 0x00, 0, 1, 0x03, 0x03), - ENTRANCE(0x5A, 0x00, 0, 1, 0x02, 0x02), ENTRANCE(0x5A, 0x00, 0, 1, 0x03, 0x03), - ENTRANCE(0x5A, 0x00, 0, 1, 0x02, 0x02), ENTRANCE(0x5A, 0x00, 1, 1, 0x0C, 0x0A), - ENTRANCE(0x5A, 0x00, 1, 1, 0x0A, 0x0A), ENTRANCE(0x5A, 0x00, 1, 1, 0x02, 0x02), - ENTRANCE(0x5B, 0x00, 0, 1, 0x02, 0x02), ENTRANCE(0x5B, 0x00, 0, 1, 0x02, 0x02), - ENTRANCE(0x5B, 0x00, 0, 1, 0x02, 0x02), ENTRANCE(0x5B, 0x00, 0, 1, 0x02, 0x02), - ENTRANCE(0x5B, 0x00, 0, 1, 0x02, 0x02), ENTRANCE(0x5C, 0x00, 1, 1, 0x0F, 0x0F), - ENTRANCE(0x5C, 0x00, 1, 1, 0x0F, 0x0F), ENTRANCE(0x5C, 0x00, 1, 1, 0x0F, 0x0F), - ENTRANCE(0x5C, 0x00, 1, 1, 0x0F, 0x0F), ENTRANCE(0x5C, 0x00, 1, 1, 0x02, 0x02), - ENTRANCE(0x5C, 0x00, 1, 1, 0x0F, 0x0F), ENTRANCE(0x5D, 0x00, 1, 1, 0x03, 0x03), - ENTRANCE(0x5D, 0x00, 1, 1, 0x02, 0x02), ENTRANCE(0x5D, 0x00, 1, 1, 0x03, 0x03), - ENTRANCE(0x5D, 0x00, 1, 1, 0x02, 0x02), ENTRANCE(0x5D, 0x00, 1, 1, 0x21, 0x21), - ENTRANCE(0x5D, 0x00, 1, 1, 0x02, 0x02), ENTRANCE(0x5D, 0x00, 1, 1, 0x02, 0x02), - ENTRANCE(0x5E, 0x00, 1, 1, 0x0E, 0x0E), ENTRANCE(0x5E, 0x00, 1, 1, 0x0E, 0x0E), - ENTRANCE(0x5E, 0x00, 1, 1, 0x0E, 0x0E), ENTRANCE(0x5E, 0x00, 1, 1, 0x0E, 0x0E), - ENTRANCE(0x0E, 0x01, 1, 1, 0x02, 0x02), ENTRANCE(0x0E, 0x01, 1, 1, 0x02, 0x02), - ENTRANCE(0x0E, 0x01, 1, 1, 0x02, 0x02), ENTRANCE(0x0E, 0x01, 1, 1, 0x02, 0x02), - ENTRANCE(0x5F, 0x00, 0, 1, 0x03, 0x03), ENTRANCE(0x5F, 0x00, 0, 1, 0x02, 0x02), - ENTRANCE(0x64, 0x00, 0, 1, 0x02, 0x02), ENTRANCE(0x64, 0x00, 0, 1, 0x02, 0x02), - ENTRANCE(0x64, 0x00, 0, 1, 0x04, 0x02), ENTRANCE(0x60, 0x00, 0, 1, 0x03, 0x03), - ENTRANCE(0x60, 0x00, 0, 1, 0x02, 0x02), ENTRANCE(0x60, 0x00, 0, 1, 0x03, 0x03), - ENTRANCE(0x60, 0x00, 0, 1, 0x02, 0x02), ENTRANCE(0x60, 0x00, 1, 1, 0x0A, 0x0A), - ENTRANCE(0x60, 0x00, 0, 1, 0x03, 0x03), ENTRANCE(0x60, 0x00, 0, 1, 0x02, 0x02), - ENTRANCE(0x60, 0x00, 1, 1, 0x02, 0x02), ENTRANCE(0x60, 0x00, 1, 1, 0x03, 0x03), - ENTRANCE(0x60, 0x00, 1, 1, 0x03, 0x03), ENTRANCE(0x61, 0x00, 0, 1, 0x02, 0x02), - ENTRANCE(0x61, 0x00, 0, 1, 0x02, 0x02), ENTRANCE(0x61, 0x00, 0, 1, 0x02, 0x02), - ENTRANCE(0x61, 0x00, 0, 1, 0x02, 0x02), ENTRANCE(0x61, 0x00, 0, 1, 0x03, 0x03), - ENTRANCE(0x61, 0x00, 0, 1, 0x02, 0x02), ENTRANCE(0x62, 0x00, 0, 1, 0x02, 0x02), - ENTRANCE(0x62, 0x00, 0, 1, 0x02, 0x02), ENTRANCE(0x62, 0x00, 0, 1, 0x02, 0x02), - ENTRANCE(0x62, 0x00, 0, 1, 0x02, 0x02), ENTRANCE(0x62, 0x00, 0, 1, 0x02, 0x02), - ENTRANCE(0x62, 0x00, 1, 1, 0x02, 0x02), ENTRANCE(0x58, 0x03, 0, 1, 0x00, 0x00), - ENTRANCE(0x58, 0x03, 0, 1, 0x00, 0x00), ENTRANCE(0x58, 0x03, 0, 1, 0x00, 0x00), - ENTRANCE(0x58, 0x03, 0, 1, 0x00, 0x00), ENTRANCE(0x63, 0x00, 0, 1, 0x03, 0x03), - ENTRANCE(0x63, 0x00, 0, 1, 0x02, 0x02), ENTRANCE(0x63, 0x00, 0, 1, 0x03, 0x03), - ENTRANCE(0x63, 0x00, 0, 1, 0x02, 0x02), ENTRANCE(0x63, 0x00, 0, 1, 0x20, 0x20), - ENTRANCE(0x63, 0x00, 0, 1, 0x2A, 0x2A), ENTRANCE(0x63, 0x00, 1, 1, 0x02, 0x02), - ENTRANCE(0x63, 0x00, 1, 1, 0x02, 0x02), ENTRANCE(0x63, 0x00, 1, 1, 0x02, 0x02), - ENTRANCE(0x63, 0x00, 1, 1, 0x02, 0x02), ENTRANCE(0x63, 0x00, 1, 1, 0x02, 0x02), - ENTRANCE(0x63, 0x00, 1, 1, 0x02, 0x02), ENTRANCE(0x63, 0x00, 1, 1, 0x02, 0x02), - ENTRANCE(0x63, 0x00, 1, 1, 0x02, 0x02), ENTRANCE(0x04, 0x00, 0, 1, 0x02, 0x02), - ENTRANCE(0x04, 0x00, 0, 1, 0x02, 0x02), ENTRANCE(0x04, 0x00, 0, 1, 0x02, 0x02), - ENTRANCE(0x04, 0x00, 0, 1, 0x02, 0x02), ENTRANCE(0x03, 0x00, 0, 1, 0x02, 0x02), - ENTRANCE(0x03, 0x00, 0, 1, 0x02, 0x02), ENTRANCE(0x03, 0x00, 0, 1, 0x02, 0x02), - ENTRANCE(0x03, 0x00, 0, 1, 0x02, 0x02), ENTRANCE(0x42, 0x01, 0, 1, 0x04, 0x20), - ENTRANCE(0x42, 0x01, 0, 1, 0x04, 0x20), ENTRANCE(0x42, 0x01, 0, 1, 0x04, 0x20), - ENTRANCE(0x42, 0x01, 0, 1, 0x04, 0x20), ENTRANCE(0x23, 0x00, 0, 1, 0x03, 0x03), - ENTRANCE(0x24, 0x00, 0, 1, 0x02, 0x02), ENTRANCE(0x25, 0x00, 0, 1, 0x02, 0x02), - ENTRANCE(0x25, 0x00, 0, 1, 0x02, 0x02), ENTRANCE(0x04, 0x01, 1, 1, 0x02, 0x02), - ENTRANCE(0x04, 0x01, 1, 1, 0x02, 0x02), ENTRANCE(0x04, 0x01, 1, 1, 0x02, 0x02), - ENTRANCE(0x04, 0x01, 1, 1, 0x02, 0x02), ENTRANCE(0x0E, 0x00, 1, 1, 0x02, 0x02), - ENTRANCE(0x0E, 0x00, 1, 1, 0x02, 0x02), ENTRANCE(0x0E, 0x00, 1, 1, 0x02, 0x02), - ENTRANCE(0x0E, 0x00, 1, 1, 0x02, 0x02), ENTRANCE(0x51, 0x01, 0, 1, 0x03, 0x03), - ENTRANCE(0x51, 0x01, 0, 1, 0x02, 0x02), ENTRANCE(0x51, 0x01, 0, 1, 0x03, 0x03), - ENTRANCE(0x51, 0x01, 0, 1, 0x02, 0x02), ENTRANCE(0x51, 0x02, 1, 1, 0x03, 0x03), - ENTRANCE(0x51, 0x02, 1, 1, 0x02, 0x02), ENTRANCE(0x51, 0x02, 1, 1, 0x03, 0x03), - ENTRANCE(0x51, 0x02, 1, 1, 0x02, 0x02), ENTRANCE(0x51, 0x03, 0, 1, 0x02, 0x02), - ENTRANCE(0x51, 0x03, 0, 1, 0x02, 0x02), ENTRANCE(0x51, 0x03, 0, 1, 0x02, 0x02), - ENTRANCE(0x51, 0x03, 0, 1, 0x02, 0x02), ENTRANCE(0x51, 0x04, 1, 1, 0x03, 0x03), - ENTRANCE(0x51, 0x04, 1, 1, 0x02, 0x02), ENTRANCE(0x51, 0x04, 1, 1, 0x03, 0x03), - ENTRANCE(0x51, 0x04, 1, 1, 0x02, 0x02), ENTRANCE(0x51, 0x05, 0, 1, 0x03, 0x03), - ENTRANCE(0x51, 0x05, 0, 1, 0x02, 0x02), ENTRANCE(0x51, 0x05, 0, 1, 0x03, 0x03), - ENTRANCE(0x51, 0x05, 0, 1, 0x02, 0x02), ENTRANCE(0x52, 0x01, 0, 1, 0x03, 0x03), - ENTRANCE(0x52, 0x01, 0, 1, 0x02, 0x02), ENTRANCE(0x52, 0x01, 0, 1, 0x03, 0x03), - ENTRANCE(0x52, 0x01, 0, 1, 0x02, 0x02), ENTRANCE(0x52, 0x02, 0, 1, 0x03, 0x03), - ENTRANCE(0x52, 0x02, 0, 1, 0x02, 0x02), ENTRANCE(0x52, 0x02, 0, 1, 0x03, 0x03), - ENTRANCE(0x52, 0x02, 0, 1, 0x02, 0x02), ENTRANCE(0x54, 0x01, 1, 1, 0x03, 0x03), - ENTRANCE(0x54, 0x01, 1, 1, 0x03, 0x03), ENTRANCE(0x54, 0x01, 1, 1, 0x03, 0x03), - ENTRANCE(0x54, 0x01, 1, 1, 0x03, 0x03), ENTRANCE(0x54, 0x02, 0, 1, 0x03, 0x03), - ENTRANCE(0x54, 0x02, 0, 1, 0x02, 0x02), ENTRANCE(0x54, 0x02, 0, 1, 0x03, 0x03), - ENTRANCE(0x54, 0x02, 0, 1, 0x02, 0x02), ENTRANCE(0x58, 0x01, 0, 1, 0x02, 0x02), - ENTRANCE(0x58, 0x01, 0, 1, 0x02, 0x02), ENTRANCE(0x58, 0x01, 0, 1, 0x02, 0x02), - ENTRANCE(0x58, 0x01, 0, 1, 0x02, 0x02), ENTRANCE(0x5A, 0x01, 0, 1, 0x03, 0x03), - ENTRANCE(0x5A, 0x01, 0, 1, 0x02, 0x02), ENTRANCE(0x5A, 0x01, 0, 1, 0x03, 0x03), - ENTRANCE(0x5A, 0x01, 0, 1, 0x02, 0x02), ENTRANCE(0x5B, 0x01, 1, 1, 0x02, 0x02), - ENTRANCE(0x5B, 0x01, 1, 1, 0x02, 0x02), ENTRANCE(0x5B, 0x01, 1, 1, 0x02, 0x02), - ENTRANCE(0x5B, 0x01, 1, 1, 0x02, 0x02), ENTRANCE(0x5B, 0x02, 0, 1, 0x02, 0x02), - ENTRANCE(0x5B, 0x02, 0, 1, 0x02, 0x02), ENTRANCE(0x5B, 0x02, 0, 1, 0x02, 0x02), - ENTRANCE(0x5B, 0x02, 0, 1, 0x02, 0x02), ENTRANCE(0x5B, 0x03, 0, 1, 0x02, 0x02), - ENTRANCE(0x5B, 0x03, 0, 1, 0x02, 0x02), ENTRANCE(0x5B, 0x03, 0, 1, 0x02, 0x02), - ENTRANCE(0x5B, 0x03, 0, 1, 0x02, 0x02), ENTRANCE(0x0E, 0x02, 1, 1, 0x02, 0x02), - ENTRANCE(0x0E, 0x02, 1, 1, 0x02, 0x02), ENTRANCE(0x0E, 0x02, 1, 1, 0x02, 0x02), - ENTRANCE(0x0E, 0x02, 1, 1, 0x02, 0x02), ENTRANCE(0x60, 0x01, 0, 1, 0x03, 0x03), - ENTRANCE(0x60, 0x01, 0, 1, 0x02, 0x02), ENTRANCE(0x60, 0x01, 0, 1, 0x03, 0x03), - ENTRANCE(0x60, 0x01, 0, 1, 0x02, 0x02), ENTRANCE(0x60, 0x02, 0, 1, 0x03, 0x03), - ENTRANCE(0x60, 0x02, 0, 1, 0x02, 0x02), ENTRANCE(0x60, 0x02, 0, 1, 0x03, 0x03), - ENTRANCE(0x60, 0x02, 0, 1, 0x02, 0x02), ENTRANCE(0x62, 0x01, 0, 1, 0x02, 0x02), - ENTRANCE(0x62, 0x01, 0, 1, 0x02, 0x02), ENTRANCE(0x62, 0x01, 0, 1, 0x02, 0x02), - ENTRANCE(0x62, 0x01, 0, 1, 0x02, 0x02), ENTRANCE(0x38, 0x01, 0, 1, 0x04, 0x20), - ENTRANCE(0x38, 0x01, 0, 1, 0x04, 0x20), ENTRANCE(0x38, 0x01, 0, 1, 0x04, 0x20), - ENTRANCE(0x38, 0x01, 0, 1, 0x04, 0x20), ENTRANCE(0x1A, 0x05, 1, 1, 0x02, 0x02), - ENTRANCE(0x1A, 0x05, 1, 1, 0x02, 0x02), ENTRANCE(0x1A, 0x05, 1, 1, 0x02, 0x02), - ENTRANCE(0x1A, 0x05, 1, 1, 0x02, 0x02), ENTRANCE(0x20, 0x08, 0, 1, 0x04, 0x02), - ENTRANCE(0x21, 0x08, 0, 1, 0x04, 0x02), ENTRANCE(0x22, 0x08, 0, 1, 0x04, 0x02), - ENTRANCE(0x22, 0x08, 0, 1, 0x04, 0x02), ENTRANCE(0x20, 0x09, 0, 1, 0x04, 0x02), - ENTRANCE(0x21, 0x09, 0, 1, 0x04, 0x02), ENTRANCE(0x22, 0x09, 0, 1, 0x04, 0x02), - ENTRANCE(0x22, 0x09, 0, 1, 0x04, 0x02), ENTRANCE(0x20, 0x0A, 0, 1, 0x04, 0x02), - ENTRANCE(0x21, 0x0A, 0, 1, 0x04, 0x02), ENTRANCE(0x22, 0x0A, 0, 1, 0x04, 0x02), - ENTRANCE(0x22, 0x0A, 0, 1, 0x04, 0x02), ENTRANCE(0x54, 0x03, 1, 1, 0x03, 0x03), - ENTRANCE(0x54, 0x03, 1, 1, 0x02, 0x02), ENTRANCE(0x54, 0x03, 1, 1, 0x03, 0x03), - ENTRANCE(0x54, 0x03, 1, 1, 0x02, 0x02), ENTRANCE(0x54, 0x04, 0, 1, 0x2C, 0x2C), - ENTRANCE(0x54, 0x04, 0, 1, 0x2C, 0x2C), ENTRANCE(0x54, 0x04, 0, 1, 0x2C, 0x2C), - ENTRANCE(0x54, 0x04, 0, 1, 0x2C, 0x2C), ENTRANCE(0x5C, 0x01, 0, 1, 0x03, 0x03), - ENTRANCE(0x5C, 0x01, 0, 1, 0x02, 0x02), ENTRANCE(0x5C, 0x01, 0, 1, 0x03, 0x03), - ENTRANCE(0x5C, 0x01, 0, 1, 0x02, 0x02), ENTRANCE(0x5C, 0x02, 0, 0, 0x03, 0x03), - ENTRANCE(0x5C, 0x02, 0, 0, 0x02, 0x02), ENTRANCE(0x5C, 0x02, 0, 0, 0x03, 0x03), - ENTRANCE(0x5C, 0x02, 0, 0, 0x02, 0x02), ENTRANCE(0x5C, 0x03, 0, 0, 0x03, 0x03), - ENTRANCE(0x5C, 0x03, 0, 0, 0x02, 0x02), ENTRANCE(0x5C, 0x03, 0, 0, 0x03, 0x03), - ENTRANCE(0x5C, 0x03, 0, 0, 0x02, 0x02), ENTRANCE(0x5C, 0x04, 0, 1, 0x02, 0x02), - ENTRANCE(0x5C, 0x04, 0, 1, 0x02, 0x02), ENTRANCE(0x5C, 0x04, 0, 1, 0x02, 0x02), - ENTRANCE(0x5C, 0x04, 0, 1, 0x02, 0x02), ENTRANCE(0x5C, 0x05, 0, 1, 0x03, 0x03), - ENTRANCE(0x5C, 0x05, 0, 1, 0x02, 0x02), ENTRANCE(0x5C, 0x05, 0, 1, 0x03, 0x03), - ENTRANCE(0x5C, 0x05, 0, 1, 0x02, 0x02), ENTRANCE(0x5C, 0x06, 1, 0, 0x0F, 0x0F), - ENTRANCE(0x5C, 0x06, 1, 0, 0x0F, 0x0F), ENTRANCE(0x5C, 0x06, 1, 0, 0x0F, 0x0F), - ENTRANCE(0x5C, 0x06, 1, 0, 0x0F, 0x0F), ENTRANCE(0x51, 0x06, 0, 1, 0x03, 0x03), - ENTRANCE(0x51, 0x06, 0, 1, 0x02, 0x02), ENTRANCE(0x51, 0x06, 0, 1, 0x03, 0x03), - ENTRANCE(0x51, 0x06, 0, 1, 0x02, 0x02), ENTRANCE(0x51, 0x07, 0, 1, 0x03, 0x03), - ENTRANCE(0x51, 0x07, 0, 1, 0x02, 0x02), ENTRANCE(0x51, 0x07, 0, 1, 0x03, 0x03), - ENTRANCE(0x51, 0x07, 0, 1, 0x02, 0x02), ENTRANCE(0x52, 0x03, 0, 1, 0x04, 0x02), - ENTRANCE(0x52, 0x03, 0, 1, 0x04, 0x02), ENTRANCE(0x52, 0x03, 0, 1, 0x04, 0x02), - ENTRANCE(0x52, 0x03, 0, 1, 0x04, 0x02), ENTRANCE(0x53, 0x01, 0, 1, 0x02, 0x02), - ENTRANCE(0x53, 0x01, 0, 1, 0x02, 0x02), ENTRANCE(0x53, 0x01, 0, 1, 0x02, 0x02), - ENTRANCE(0x53, 0x01, 0, 1, 0x02, 0x02), ENTRANCE(0x55, 0x01, 0, 1, 0x03, 0x03), - ENTRANCE(0x55, 0x01, 0, 1, 0x02, 0x02), ENTRANCE(0x55, 0x01, 0, 1, 0x03, 0x03), - ENTRANCE(0x55, 0x01, 0, 1, 0x02, 0x02), ENTRANCE(0x55, 0x02, 0, 1, 0x02, 0x02), - ENTRANCE(0x55, 0x02, 0, 1, 0x02, 0x02), ENTRANCE(0x55, 0x02, 0, 1, 0x02, 0x02), - ENTRANCE(0x55, 0x02, 0, 1, 0x02, 0x02), ENTRANCE(0x55, 0x03, 0, 1, 0x04, 0x04), - ENTRANCE(0x55, 0x03, 0, 1, 0x04, 0x04), ENTRANCE(0x55, 0x03, 0, 1, 0x04, 0x04), - ENTRANCE(0x55, 0x03, 0, 1, 0x04, 0x04), ENTRANCE(0x56, 0x01, 0, 1, 0x12, 0x12), - ENTRANCE(0x56, 0x01, 0, 1, 0x02, 0x02), ENTRANCE(0x56, 0x01, 0, 1, 0x12, 0x12), - ENTRANCE(0x56, 0x01, 0, 1, 0x02, 0x02), ENTRANCE(0x57, 0x01, 0, 1, 0x03, 0x03), - ENTRANCE(0x57, 0x01, 0, 1, 0x02, 0x02), ENTRANCE(0x57, 0x01, 0, 1, 0x03, 0x03), - ENTRANCE(0x57, 0x01, 0, 1, 0x02, 0x02), ENTRANCE(0x57, 0x02, 0, 1, 0x13, 0x13), - ENTRANCE(0x57, 0x02, 0, 1, 0x02, 0x02), ENTRANCE(0x57, 0x02, 0, 1, 0x13, 0x13), - ENTRANCE(0x57, 0x02, 0, 1, 0x02, 0x02), ENTRANCE(0x59, 0x01, 0, 1, 0x02, 0x02), - ENTRANCE(0x59, 0x01, 0, 1, 0x02, 0x02), ENTRANCE(0x59, 0x01, 0, 1, 0x02, 0x02), - ENTRANCE(0x59, 0x01, 0, 1, 0x02, 0x02), ENTRANCE(0x59, 0x02, 0, 1, 0x03, 0x03), - ENTRANCE(0x59, 0x02, 0, 1, 0x02, 0x02), ENTRANCE(0x59, 0x02, 0, 1, 0x03, 0x03), - ENTRANCE(0x59, 0x02, 0, 1, 0x02, 0x02), ENTRANCE(0x5A, 0x02, 1, 1, 0x03, 0x03), - ENTRANCE(0x5A, 0x02, 1, 1, 0x02, 0x02), ENTRANCE(0x5A, 0x02, 1, 1, 0x03, 0x03), - ENTRANCE(0x5A, 0x02, 1, 1, 0x02, 0x02), ENTRANCE(0x5A, 0x03, 1, 1, 0x03, 0x03), - ENTRANCE(0x5A, 0x03, 1, 1, 0x02, 0x02), ENTRANCE(0x5A, 0x03, 1, 1, 0x03, 0x03), - ENTRANCE(0x5A, 0x03, 1, 1, 0x02, 0x02), ENTRANCE(0x5D, 0x01, 0, 1, 0x03, 0x03), - ENTRANCE(0x5D, 0x01, 0, 1, 0x02, 0x02), ENTRANCE(0x5D, 0x01, 0, 1, 0x03, 0x03), - ENTRANCE(0x5D, 0x01, 0, 1, 0x02, 0x02), ENTRANCE(0x5D, 0x02, 0, 1, 0x03, 0x03), - ENTRANCE(0x5D, 0x02, 0, 1, 0x02, 0x02), ENTRANCE(0x5D, 0x02, 0, 1, 0x03, 0x03), - ENTRANCE(0x5D, 0x02, 0, 1, 0x02, 0x02), ENTRANCE(0x5D, 0x03, 0, 1, 0x03, 0x03), - ENTRANCE(0x5D, 0x03, 0, 1, 0x02, 0x02), ENTRANCE(0x5D, 0x03, 0, 1, 0x03, 0x03), - ENTRANCE(0x5D, 0x03, 0, 1, 0x02, 0x02), ENTRANCE(0x5F, 0x01, 0, 1, 0x03, 0x03), - ENTRANCE(0x5F, 0x01, 0, 1, 0x02, 0x02), ENTRANCE(0x64, 0x01, 0, 1, 0x05, 0x05), - ENTRANCE(0x64, 0x01, 0, 1, 0x05, 0x05), ENTRANCE(0x5F, 0x01, 0, 1, 0x00, 0x00), - ENTRANCE(0x60, 0x03, 0, 1, 0x03, 0x03), ENTRANCE(0x60, 0x03, 0, 1, 0x02, 0x02), - ENTRANCE(0x60, 0x03, 0, 1, 0x03, 0x03), ENTRANCE(0x60, 0x03, 0, 1, 0x02, 0x02), - ENTRANCE(0x61, 0x01, 0, 1, 0x02, 0x02), ENTRANCE(0x61, 0x01, 0, 1, 0x02, 0x02), - ENTRANCE(0x61, 0x01, 0, 1, 0x02, 0x02), ENTRANCE(0x61, 0x01, 0, 1, 0x02, 0x02), - ENTRANCE(0x61, 0x02, 0, 1, 0x02, 0x02), ENTRANCE(0x61, 0x02, 0, 1, 0x02, 0x02), - ENTRANCE(0x61, 0x02, 0, 1, 0x02, 0x02), ENTRANCE(0x61, 0x02, 0, 1, 0x02, 0x02), - ENTRANCE(0x03, 0x01, 1, 1, 0x02, 0x02), ENTRANCE(0x03, 0x01, 1, 1, 0x02, 0x02), - ENTRANCE(0x03, 0x01, 1, 1, 0x02, 0x02), ENTRANCE(0x03, 0x01, 1, 1, 0x02, 0x02), - ENTRANCE(0x00, 0x01, 1, 0, 0x02, 0x02), ENTRANCE(0x00, 0x01, 1, 0, 0x02, 0x02), - ENTRANCE(0x00, 0x01, 1, 0, 0x02, 0x02), ENTRANCE(0x00, 0x01, 1, 0, 0x02, 0x02), - ENTRANCE(0x0E, 0x03, 1, 1, 0x02, 0x02), ENTRANCE(0x0E, 0x03, 1, 1, 0x02, 0x02), - ENTRANCE(0x0E, 0x03, 1, 1, 0x02, 0x02), ENTRANCE(0x0E, 0x03, 1, 1, 0x02, 0x02), - ENTRANCE(0x20, 0x01, 0, 1, 0x03, 0x03), ENTRANCE(0x21, 0x01, 0, 1, 0x02, 0x02), - ENTRANCE(0x22, 0x01, 0, 1, 0x02, 0x02), ENTRANCE(0x22, 0x01, 0, 1, 0x02, 0x02), - ENTRANCE(0x20, 0x02, 0, 1, 0x03, 0x03), ENTRANCE(0x21, 0x02, 0, 1, 0x02, 0x02), - ENTRANCE(0x22, 0x02, 0, 1, 0x02, 0x02), ENTRANCE(0x22, 0x02, 0, 1, 0x02, 0x02), - ENTRANCE(0x20, 0x03, 1, 1, 0x03, 0x03), ENTRANCE(0x21, 0x03, 1, 1, 0x02, 0x02), - ENTRANCE(0x22, 0x03, 1, 1, 0x02, 0x02), ENTRANCE(0x22, 0x03, 1, 1, 0x02, 0x02), - ENTRANCE(0x55, 0x04, 0, 0, 0x04, 0x04), ENTRANCE(0x55, 0x04, 0, 0, 0x04, 0x04), - ENTRANCE(0x55, 0x04, 0, 0, 0x04, 0x04), ENTRANCE(0x55, 0x04, 0, 0, 0x04, 0x04), - ENTRANCE(0x55, 0x05, 0, 0, 0x04, 0x04), ENTRANCE(0x55, 0x05, 0, 0, 0x04, 0x04), - ENTRANCE(0x55, 0x05, 0, 0, 0x04, 0x04), ENTRANCE(0x55, 0x05, 0, 0, 0x04, 0x04), - ENTRANCE(0x1B, 0x02, 0, 0, 0x02, 0x02), ENTRANCE(0x1C, 0x02, 0, 0, 0x02, 0x02), - ENTRANCE(0x1D, 0x02, 0, 0, 0x02, 0x02), ENTRANCE(0x1D, 0x02, 0, 0, 0x02, 0x02), - ENTRANCE(0x34, 0x01, 0, 1, 0x04, 0x04), ENTRANCE(0x34, 0x01, 0, 1, 0x04, 0x04), - ENTRANCE(0x34, 0x01, 0, 1, 0x04, 0x04), ENTRANCE(0x34, 0x01, 0, 1, 0x04, 0x04), - ENTRANCE(0x1B, 0x01, 0, 1, 0x03, 0x03), ENTRANCE(0x1C, 0x01, 0, 1, 0x02, 0x02), - ENTRANCE(0x1D, 0x01, 0, 1, 0x02, 0x02), ENTRANCE(0x1D, 0x01, 0, 1, 0x02, 0x02), - ENTRANCE(0x51, 0x08, 1, 1, 0x03, 0x03), ENTRANCE(0x51, 0x08, 1, 1, 0x02, 0x02), - ENTRANCE(0x51, 0x08, 1, 1, 0x03, 0x03), ENTRANCE(0x51, 0x08, 1, 1, 0x02, 0x02), - ENTRANCE(0x51, 0x09, 0, 1, 0x03, 0x03), ENTRANCE(0x51, 0x09, 0, 1, 0x03, 0x03), - ENTRANCE(0x51, 0x09, 0, 1, 0x03, 0x03), ENTRANCE(0x51, 0x09, 0, 1, 0x03, 0x03), - ENTRANCE(0x51, 0x0A, 0, 1, 0x03, 0x03), ENTRANCE(0x51, 0x0A, 0, 1, 0x03, 0x03), - ENTRANCE(0x51, 0x0A, 0, 1, 0x03, 0x03), ENTRANCE(0x51, 0x0A, 0, 1, 0x03, 0x03), - ENTRANCE(0x55, 0x06, 0, 1, 0x02, 0x02), ENTRANCE(0x55, 0x06, 0, 1, 0x02, 0x02), - ENTRANCE(0x55, 0x06, 0, 1, 0x02, 0x02), ENTRANCE(0x55, 0x06, 0, 1, 0x02, 0x02), - ENTRANCE(0x51, 0x0B, 0, 1, 0x05, 0x05), ENTRANCE(0x51, 0x0B, 0, 1, 0x04, 0x02), - ENTRANCE(0x51, 0x0B, 0, 1, 0x05, 0x05), ENTRANCE(0x51, 0x0B, 0, 1, 0x04, 0x02), - ENTRANCE(0x51, 0x0C, 0, 1, 0x05, 0x05), ENTRANCE(0x51, 0x0C, 0, 1, 0x04, 0x02), - ENTRANCE(0x51, 0x0C, 0, 1, 0x05, 0x05), ENTRANCE(0x51, 0x0C, 0, 1, 0x04, 0x02), - ENTRANCE(0x51, 0x0D, 0, 1, 0x05, 0x05), ENTRANCE(0x51, 0x0D, 0, 1, 0x04, 0x02), - ENTRANCE(0x51, 0x0D, 0, 1, 0x05, 0x05), ENTRANCE(0x51, 0x0D, 0, 1, 0x04, 0x02), - ENTRANCE(0x45, 0x01, 0, 1, 0x03, 0x03), ENTRANCE(0x46, 0x01, 0, 1, 0x02, 0x02), - ENTRANCE(0x45, 0x01, 0, 1, 0x03, 0x03), ENTRANCE(0x46, 0x01, 0, 1, 0x02, 0x02), - ENTRANCE(0x1E, 0x01, 1, 1, 0x03, 0x03), ENTRANCE(0x1F, 0x01, 1, 1, 0x02, 0x02), - ENTRANCE(0x1E, 0x01, 1, 1, 0x02, 0x02), ENTRANCE(0x1F, 0x01, 1, 1, 0x02, 0x02), - ENTRANCE(0x20, 0x04, 1, 1, 0x03, 0x03), ENTRANCE(0x21, 0x04, 1, 1, 0x02, 0x02), - ENTRANCE(0x22, 0x04, 1, 1, 0x02, 0x02), ENTRANCE(0x22, 0x04, 1, 1, 0x02, 0x02), - ENTRANCE(0x20, 0x05, 0, 1, 0x04, 0x02), ENTRANCE(0x21, 0x05, 0, 1, 0x04, 0x02), - ENTRANCE(0x22, 0x05, 0, 1, 0x04, 0x02), ENTRANCE(0x22, 0x05, 0, 1, 0x04, 0x02), - ENTRANCE(0x52, 0x04, 0, 1, 0x02, 0x02), ENTRANCE(0x52, 0x04, 0, 1, 0x02, 0x02), - ENTRANCE(0x52, 0x04, 0, 1, 0x02, 0x02), ENTRANCE(0x52, 0x04, 0, 1, 0x02, 0x02), - ENTRANCE(0x5D, 0x04, 0, 1, 0x03, 0x03), ENTRANCE(0x5D, 0x04, 0, 1, 0x02, 0x02), - ENTRANCE(0x5D, 0x04, 0, 1, 0x03, 0x03), ENTRANCE(0x5D, 0x04, 0, 1, 0x02, 0x02), - ENTRANCE(0x63, 0x01, 0, 0, 0x03, 0x03), ENTRANCE(0x63, 0x01, 0, 0, 0x02, 0x02), - ENTRANCE(0x63, 0x01, 0, 0, 0x03, 0x03), ENTRANCE(0x63, 0x01, 0, 0, 0x02, 0x02), - ENTRANCE(0x07, 0x01, 0, 1, 0x02, 0x02), ENTRANCE(0x07, 0x01, 0, 1, 0x02, 0x02), - ENTRANCE(0x07, 0x01, 0, 1, 0x02, 0x02), ENTRANCE(0x07, 0x01, 0, 1, 0x02, 0x02), - ENTRANCE(0x07, 0x02, 1, 1, 0x02, 0x02), ENTRANCE(0x07, 0x02, 1, 1, 0x02, 0x02), - ENTRANCE(0x07, 0x02, 1, 1, 0x02, 0x02), ENTRANCE(0x07, 0x02, 1, 1, 0x02, 0x02), - ENTRANCE(0x5D, 0x05, 0, 1, 0x03, 0x03), ENTRANCE(0x5D, 0x05, 0, 1, 0x02, 0x02), - ENTRANCE(0x5D, 0x05, 0, 1, 0x03, 0x03), ENTRANCE(0x5D, 0x05, 0, 1, 0x02, 0x02), - ENTRANCE(0x5D, 0x06, 0, 1, 0x03, 0x03), ENTRANCE(0x5D, 0x06, 0, 1, 0x02, 0x02), - ENTRANCE(0x5D, 0x06, 0, 1, 0x03, 0x03), ENTRANCE(0x5D, 0x06, 0, 1, 0x02, 0x02), - ENTRANCE(0x5D, 0x07, 0, 1, 0x03, 0x03), ENTRANCE(0x5D, 0x07, 0, 1, 0x02, 0x02), - ENTRANCE(0x5D, 0x07, 0, 1, 0x03, 0x03), ENTRANCE(0x5D, 0x07, 0, 1, 0x02, 0x02), - ENTRANCE(0x5D, 0x08, 0, 1, 0x03, 0x03), ENTRANCE(0x5D, 0x08, 0, 1, 0x02, 0x02), - ENTRANCE(0x5D, 0x08, 0, 1, 0x03, 0x03), ENTRANCE(0x5D, 0x08, 0, 1, 0x02, 0x02), - ENTRANCE(0x43, 0x02, 0, 1, 0x0A, 0x0A), ENTRANCE(0x43, 0x02, 0, 1, 0x0A, 0x0A), - ENTRANCE(0x43, 0x02, 0, 1, 0x0A, 0x0A), ENTRANCE(0x43, 0x02, 0, 1, 0x0A, 0x0A), - ENTRANCE(0x44, 0x01, 0, 1, 0x02, 0x02), ENTRANCE(0x44, 0x01, 0, 1, 0x02, 0x02), - ENTRANCE(0x44, 0x01, 0, 1, 0x02, 0x02), ENTRANCE(0x44, 0x01, 0, 1, 0x02, 0x02), - ENTRANCE(0x5D, 0x09, 0, 1, 0x03, 0x03), ENTRANCE(0x5D, 0x09, 0, 1, 0x02, 0x02), - ENTRANCE(0x5D, 0x09, 0, 1, 0x03, 0x03), ENTRANCE(0x5D, 0x09, 0, 1, 0x02, 0x02), - ENTRANCE(0x5D, 0x0A, 0, 1, 0x03, 0x03), ENTRANCE(0x5D, 0x0A, 0, 1, 0x02, 0x02), - ENTRANCE(0x5D, 0x0A, 0, 1, 0x03, 0x03), ENTRANCE(0x5D, 0x0A, 0, 1, 0x02, 0x02), - ENTRANCE(0x5D, 0x0B, 0, 1, 0x03, 0x03), ENTRANCE(0x5D, 0x0B, 0, 1, 0x02, 0x02), - ENTRANCE(0x5D, 0x0B, 0, 1, 0x03, 0x03), ENTRANCE(0x5D, 0x0B, 0, 1, 0x02, 0x02), - ENTRANCE(0x5D, 0x0C, 0, 1, 0x03, 0x03), ENTRANCE(0x5D, 0x0C, 0, 1, 0x02, 0x02), - ENTRANCE(0x5D, 0x0C, 0, 1, 0x03, 0x03), ENTRANCE(0x5D, 0x0C, 0, 1, 0x02, 0x02), - ENTRANCE(0x63, 0x02, 0, 1, 0x03, 0x03), ENTRANCE(0x63, 0x02, 0, 1, 0x02, 0x02), - ENTRANCE(0x63, 0x02, 0, 1, 0x03, 0x03), ENTRANCE(0x63, 0x02, 0, 1, 0x02, 0x02), - ENTRANCE(0x63, 0x03, 0, 1, 0x03, 0x03), ENTRANCE(0x63, 0x03, 0, 1, 0x02, 0x02), - ENTRANCE(0x63, 0x03, 0, 1, 0x03, 0x03), ENTRANCE(0x63, 0x03, 0, 1, 0x02, 0x02), - ENTRANCE(0x42, 0x00, 0, 1, 0x02, 0x02), ENTRANCE(0x42, 0x00, 0, 1, 0x02, 0x02), - ENTRANCE(0x42, 0x00, 0, 1, 0x02, 0x02), ENTRANCE(0x42, 0x00, 0, 1, 0x02, 0x02), - ENTRANCE(0x56, 0x00, 0, 1, 0x02, 0x02), ENTRANCE(0x47, 0x00, 0, 1, 0x02, 0x02), - ENTRANCE(0x42, 0x00, 0, 1, 0x02, 0x02), ENTRANCE(0x42, 0x00, 0, 1, 0x02, 0x02), - ENTRANCE(0x42, 0x00, 0, 1, 0x02, 0x02), ENTRANCE(0x42, 0x00, 0, 1, 0x02, 0x02), - ENTRANCE(0x42, 0x00, 0, 1, 0x02, 0x02), ENTRANCE(0x06, 0x01, 1, 1, 0x02, 0x02), - ENTRANCE(0x06, 0x01, 1, 1, 0x02, 0x02), ENTRANCE(0x06, 0x01, 1, 1, 0x02, 0x02), - ENTRANCE(0x06, 0x01, 1, 1, 0x02, 0x02), ENTRANCE(0x36, 0x00, 0, 1, 0x04, 0x20), - ENTRANCE(0x36, 0x00, 0, 1, 0x04, 0x20), ENTRANCE(0x36, 0x00, 0, 1, 0x04, 0x20), - ENTRANCE(0x36, 0x00, 0, 1, 0x04, 0x20), ENTRANCE(0x2A, 0x00, 0, 1, 0x04, 0x20), - ENTRANCE(0x2A, 0x00, 0, 1, 0x04, 0x20), ENTRANCE(0x2A, 0x00, 0, 1, 0x04, 0x20), - ENTRANCE(0x2A, 0x00, 0, 1, 0x04, 0x20), ENTRANCE(0x13, 0x00, 1, 1, 0x02, 0x02), - ENTRANCE(0x13, 0x00, 1, 1, 0x02, 0x02), ENTRANCE(0x13, 0x00, 1, 1, 0x02, 0x02), - ENTRANCE(0x13, 0x00, 1, 1, 0x02, 0x02), ENTRANCE(0x15, 0x00, 1, 1, 0x02, 0x02), - ENTRANCE(0x15, 0x00, 1, 1, 0x02, 0x02), ENTRANCE(0x15, 0x00, 1, 1, 0x02, 0x02), - ENTRANCE(0x15, 0x00, 1, 1, 0x02, 0x02), ENTRANCE(0x57, 0x06, 0, 1, 0x04, 0x02), - ENTRANCE(0x57, 0x06, 0, 1, 0x04, 0x02), ENTRANCE(0x57, 0x06, 0, 1, 0x04, 0x02), - ENTRANCE(0x57, 0x06, 0, 1, 0x04, 0x02), ENTRANCE(0x3A, 0x00, 0, 1, 0x02, 0x20), - ENTRANCE(0x3A, 0x00, 0, 1, 0x02, 0x20), ENTRANCE(0x3A, 0x00, 0, 1, 0x02, 0x20), - ENTRANCE(0x3A, 0x00, 0, 1, 0x02, 0x20), ENTRANCE(0x51, 0x0E, 1, 1, 0x03, 0x03), - ENTRANCE(0x51, 0x0E, 1, 1, 0x03, 0x03), ENTRANCE(0x51, 0x0E, 1, 1, 0x03, 0x03), - ENTRANCE(0x51, 0x0E, 1, 1, 0x03, 0x03), ENTRANCE(0x3B, 0x00, 0, 1, 0x02, 0x02), - ENTRANCE(0x3B, 0x00, 0, 1, 0x02, 0x02), ENTRANCE(0x3B, 0x00, 0, 1, 0x02, 0x02), - ENTRANCE(0x3B, 0x00, 0, 1, 0x02, 0x02), ENTRANCE(0x3B, 0x00, 0, 1, 0x02, 0x02), - ENTRANCE(0x3B, 0x00, 0, 1, 0x02, 0x02), ENTRANCE(0x3B, 0x00, 0, 1, 0x02, 0x02), - ENTRANCE(0x3F, 0x00, 0, 1, 0x02, 0x26), ENTRANCE(0x3F, 0x00, 0, 1, 0x02, 0x26), - ENTRANCE(0x3F, 0x00, 0, 1, 0x02, 0x26), ENTRANCE(0x3F, 0x00, 0, 1, 0x02, 0x26), - ENTRANCE(0x43, 0x03, 0, 1, 0x02, 0x02), ENTRANCE(0x43, 0x03, 0, 1, 0x02, 0x02), - ENTRANCE(0x43, 0x03, 0, 1, 0x02, 0x02), ENTRANCE(0x43, 0x03, 0, 1, 0x02, 0x02), - ENTRANCE(0x43, 0x04, 0, 1, 0x02, 0x02), ENTRANCE(0x43, 0x04, 0, 1, 0x02, 0x02), - ENTRANCE(0x43, 0x04, 0, 1, 0x02, 0x02), ENTRANCE(0x43, 0x04, 0, 1, 0x02, 0x02), - ENTRANCE(0x58, 0x04, 0, 1, 0x2C, 0x2C), ENTRANCE(0x58, 0x04, 0, 1, 0x2C, 0x2C), - ENTRANCE(0x58, 0x04, 0, 1, 0x2C, 0x2C), ENTRANCE(0x58, 0x04, 0, 1, 0x2C, 0x2C), - ENTRANCE(0x1A, 0x02, 1, 1, 0x02, 0x02), ENTRANCE(0x1A, 0x02, 1, 1, 0x02, 0x02), - ENTRANCE(0x1A, 0x02, 1, 1, 0x02, 0x02), ENTRANCE(0x1A, 0x02, 1, 1, 0x02, 0x02), - ENTRANCE(0x1A, 0x03, 1, 1, 0x02, 0x02), ENTRANCE(0x1A, 0x03, 1, 1, 0x02, 0x02), - ENTRANCE(0x1A, 0x03, 1, 1, 0x02, 0x02), ENTRANCE(0x1A, 0x03, 1, 1, 0x02, 0x02), - ENTRANCE(0x1A, 0x04, 1, 1, 0x02, 0x02), ENTRANCE(0x1A, 0x04, 1, 1, 0x02, 0x02), - ENTRANCE(0x1A, 0x04, 1, 1, 0x02, 0x02), ENTRANCE(0x1A, 0x04, 1, 1, 0x02, 0x02), - ENTRANCE(0x55, 0x07, 0, 0, 0x04, 0x04), ENTRANCE(0x55, 0x07, 0, 0, 0x04, 0x04), - ENTRANCE(0x55, 0x07, 0, 0, 0x04, 0x04), ENTRANCE(0x55, 0x07, 0, 0, 0x04, 0x04), - ENTRANCE(0x55, 0x08, 0, 0, 0x04, 0x04), ENTRANCE(0x55, 0x08, 0, 0, 0x04, 0x04), - ENTRANCE(0x55, 0x08, 0, 0, 0x04, 0x04), ENTRANCE(0x55, 0x08, 0, 0, 0x04, 0x04), - ENTRANCE(0x5F, 0x02, 0, 1, 0x02, 0x02), ENTRANCE(0x5F, 0x02, 0, 1, 0x02, 0x02), - ENTRANCE(0x64, 0x02, 0, 1, 0x02, 0x02), ENTRANCE(0x64, 0x02, 0, 1, 0x02, 0x02), - ENTRANCE(0x5F, 0x02, 0, 1, 0x00, 0x00), ENTRANCE(0x52, 0x05, 0, 1, 0x04, 0x02), - ENTRANCE(0x52, 0x05, 0, 1, 0x04, 0x02), ENTRANCE(0x52, 0x05, 0, 1, 0x04, 0x02), - ENTRANCE(0x52, 0x05, 0, 1, 0x04, 0x02), ENTRANCE(0x52, 0x06, 0, 1, 0x04, 0x02), - ENTRANCE(0x52, 0x06, 0, 1, 0x04, 0x02), ENTRANCE(0x52, 0x06, 0, 1, 0x04, 0x02), - ENTRANCE(0x52, 0x06, 0, 1, 0x04, 0x02), ENTRANCE(0x52, 0x07, 0, 1, 0x04, 0x02), - ENTRANCE(0x52, 0x07, 0, 1, 0x04, 0x02), ENTRANCE(0x52, 0x07, 0, 1, 0x04, 0x02), - ENTRANCE(0x52, 0x07, 0, 1, 0x04, 0x02), ENTRANCE(0x52, 0x08, 0, 1, 0x04, 0x02), - ENTRANCE(0x52, 0x08, 0, 1, 0x04, 0x02), ENTRANCE(0x52, 0x08, 0, 1, 0x04, 0x02), - ENTRANCE(0x52, 0x08, 0, 1, 0x04, 0x02), ENTRANCE(0x53, 0x02, 0, 1, 0x04, 0x02), - ENTRANCE(0x53, 0x02, 0, 1, 0x04, 0x02), ENTRANCE(0x53, 0x02, 0, 1, 0x04, 0x02), - ENTRANCE(0x53, 0x02, 0, 1, 0x04, 0x02), ENTRANCE(0x53, 0x03, 0, 1, 0x03, 0x03), - ENTRANCE(0x53, 0x03, 0, 1, 0x03, 0x03), ENTRANCE(0x53, 0x03, 0, 1, 0x03, 0x03), - ENTRANCE(0x53, 0x03, 0, 1, 0x03, 0x03), ENTRANCE(0x53, 0x04, 0, 1, 0x03, 0x03), - ENTRANCE(0x53, 0x04, 0, 1, 0x03, 0x03), ENTRANCE(0x53, 0x04, 0, 1, 0x03, 0x03), - ENTRANCE(0x53, 0x04, 0, 1, 0x03, 0x03), ENTRANCE(0x53, 0x05, 0, 1, 0x03, 0x03), - ENTRANCE(0x53, 0x05, 0, 1, 0x03, 0x03), ENTRANCE(0x53, 0x05, 0, 1, 0x03, 0x03), - ENTRANCE(0x53, 0x05, 0, 1, 0x03, 0x03), ENTRANCE(0x5E, 0x01, 1, 1, 0x0E, 0x0E), - ENTRANCE(0x5E, 0x01, 1, 1, 0x0E, 0x0E), ENTRANCE(0x5E, 0x01, 1, 1, 0x0E, 0x0E), - ENTRANCE(0x5E, 0x01, 1, 1, 0x0E, 0x0E), ENTRANCE(0x5E, 0x02, 0, 1, 0x0E, 0x0E), - ENTRANCE(0x5E, 0x02, 0, 1, 0x0E, 0x0E), ENTRANCE(0x5E, 0x02, 0, 1, 0x0E, 0x0E), - ENTRANCE(0x5E, 0x02, 0, 1, 0x0E, 0x0E), ENTRANCE(0x3C, 0x00, 0, 1, 0x03, 0x03), - ENTRANCE(0x3C, 0x00, 0, 1, 0x03, 0x03), ENTRANCE(0x3C, 0x00, 0, 1, 0x03, 0x03), - ENTRANCE(0x3C, 0x00, 0, 1, 0x03, 0x03), ENTRANCE(0x3D, 0x00, 0, 1, 0x02, 0x02), - ENTRANCE(0x3D, 0x00, 0, 1, 0x02, 0x02), ENTRANCE(0x3D, 0x00, 0, 1, 0x02, 0x02), - ENTRANCE(0x3D, 0x00, 0, 1, 0x02, 0x02), ENTRANCE(0x3D, 0x00, 0, 1, 0x02, 0x02), - ENTRANCE(0x3D, 0x00, 0, 1, 0x02, 0x02), ENTRANCE(0x3D, 0x00, 0, 1, 0x02, 0x02), - ENTRANCE(0x63, 0x04, 0, 1, 0x04, 0x02), ENTRANCE(0x63, 0x04, 0, 1, 0x04, 0x02), - ENTRANCE(0x63, 0x04, 0, 1, 0x04, 0x02), ENTRANCE(0x63, 0x04, 0, 1, 0x04, 0x02), - ENTRANCE(0x2E, 0x00, 0, 1, 0x04, 0x20), ENTRANCE(0x2E, 0x00, 0, 1, 0x04, 0x20), - ENTRANCE(0x2E, 0x00, 0, 1, 0x04, 0x20), ENTRANCE(0x2E, 0x00, 0, 1, 0x04, 0x20), - ENTRANCE(0x2F, 0x00, 0, 1, 0x04, 0x04), ENTRANCE(0x2F, 0x00, 0, 1, 0x04, 0x04), - ENTRANCE(0x2F, 0x00, 0, 1, 0x04, 0x04), ENTRANCE(0x2F, 0x00, 0, 1, 0x04, 0x04), - ENTRANCE(0x30, 0x00, 0, 0, 0x04, 0x20), ENTRANCE(0x30, 0x00, 0, 0, 0x04, 0x20), - ENTRANCE(0x30, 0x00, 0, 1, 0x04, 0x20), ENTRANCE(0x30, 0x00, 0, 1, 0x04, 0x20), - ENTRANCE(0x31, 0x00, 0, 1, 0x04, 0x20), ENTRANCE(0x31, 0x00, 0, 1, 0x04, 0x20), - ENTRANCE(0x31, 0x00, 0, 1, 0x04, 0x20), ENTRANCE(0x31, 0x00, 0, 1, 0x04, 0x20), - ENTRANCE(0x1E, 0x04, 0, 1, 0x04, 0x02), ENTRANCE(0x1F, 0x04, 0, 1, 0x04, 0x02), - ENTRANCE(0x1E, 0x04, 0, 1, 0x04, 0x02), ENTRANCE(0x1F, 0x04, 0, 1, 0x04, 0x02), - ENTRANCE(0x32, 0x00, 0, 1, 0x02, 0x02), ENTRANCE(0x32, 0x00, 0, 1, 0x02, 0x02), - ENTRANCE(0x32, 0x00, 0, 1, 0x02, 0x02), ENTRANCE(0x32, 0x00, 0, 1, 0x02, 0x02), - ENTRANCE(0x59, 0x05, 0, 1, 0x03, 0x03), ENTRANCE(0x59, 0x05, 0, 1, 0x03, 0x03), - ENTRANCE(0x59, 0x05, 0, 1, 0x03, 0x03), ENTRANCE(0x59, 0x05, 0, 1, 0x03, 0x03), - ENTRANCE(0x35, 0x00, 0, 1, 0x04, 0x02), ENTRANCE(0x35, 0x00, 0, 1, 0x04, 0x02), - ENTRANCE(0x35, 0x00, 0, 1, 0x04, 0x02), ENTRANCE(0x35, 0x00, 0, 1, 0x04, 0x02), - ENTRANCE(0x37, 0x00, 0, 1, 0x04, 0x20), ENTRANCE(0x37, 0x00, 0, 1, 0x04, 0x20), - ENTRANCE(0x37, 0x00, 0, 1, 0x04, 0x20), ENTRANCE(0x37, 0x00, 0, 1, 0x04, 0x20), - ENTRANCE(0x39, 0x00, 0, 1, 0x04, 0x04), ENTRANCE(0x39, 0x00, 0, 1, 0x04, 0x04), - ENTRANCE(0x39, 0x00, 0, 1, 0x04, 0x04), ENTRANCE(0x39, 0x00, 0, 1, 0x04, 0x04), - ENTRANCE(0x5D, 0x0D, 0, 1, 0x03, 0x03), ENTRANCE(0x5D, 0x0D, 0, 1, 0x02, 0x02), - ENTRANCE(0x5D, 0x0D, 0, 1, 0x03, 0x03), ENTRANCE(0x5D, 0x0D, 0, 1, 0x02, 0x02), - ENTRANCE(0x5D, 0x0E, 0, 1, 0x03, 0x05), ENTRANCE(0x5D, 0x0E, 0, 1, 0x02, 0x04), - ENTRANCE(0x5D, 0x0E, 0, 1, 0x03, 0x05), ENTRANCE(0x5D, 0x0E, 0, 1, 0x02, 0x04), - ENTRANCE(0x5D, 0x0F, 1, 1, 0x0F, 0x0F), ENTRANCE(0x5D, 0x0F, 1, 1, 0x0F, 0x0F), - ENTRANCE(0x5D, 0x0F, 1, 1, 0x0F, 0x0F), ENTRANCE(0x5D, 0x0F, 1, 1, 0x0F, 0x0F), - ENTRANCE(0x5D, 0x10, 0, 1, 0x02, 0x02), ENTRANCE(0x5D, 0x10, 0, 1, 0x02, 0x02), - ENTRANCE(0x5D, 0x10, 0, 1, 0x02, 0x02), ENTRANCE(0x5D, 0x10, 0, 1, 0x02, 0x02), - ENTRANCE(0x5D, 0x11, 0, 1, 0x02, 0x02), ENTRANCE(0x5D, 0x11, 0, 1, 0x02, 0x02), - ENTRANCE(0x5D, 0x11, 0, 1, 0x02, 0x02), ENTRANCE(0x5D, 0x11, 0, 1, 0x02, 0x02), - ENTRANCE(0x20, 0x06, 0, 1, 0x04, 0x02), ENTRANCE(0x21, 0x06, 0, 1, 0x04, 0x02), - ENTRANCE(0x22, 0x06, 0, 1, 0x04, 0x02), ENTRANCE(0x22, 0x06, 0, 1, 0x04, 0x02), - ENTRANCE(0x20, 0x07, 0, 1, 0x04, 0x02), ENTRANCE(0x21, 0x07, 0, 1, 0x04, 0x02), - ENTRANCE(0x22, 0x07, 0, 1, 0x04, 0x02), ENTRANCE(0x22, 0x07, 0, 1, 0x04, 0x02), - ENTRANCE(0x1E, 0x02, 0, 1, 0x04, 0x02), ENTRANCE(0x1F, 0x02, 0, 1, 0x04, 0x02), - ENTRANCE(0x1E, 0x02, 0, 1, 0x03, 0x03), ENTRANCE(0x1F, 0x02, 0, 1, 0x02, 0x02), - ENTRANCE(0x58, 0x02, 0, 1, 0x02, 0x02), ENTRANCE(0x58, 0x02, 0, 1, 0x02, 0x02), - ENTRANCE(0x58, 0x02, 0, 1, 0x02, 0x02), ENTRANCE(0x58, 0x02, 0, 1, 0x02, 0x02), - ENTRANCE(0x57, 0x03, 0, 1, 0x03, 0x03), ENTRANCE(0x57, 0x03, 0, 1, 0x03, 0x03), - ENTRANCE(0x57, 0x03, 0, 1, 0x03, 0x03), ENTRANCE(0x57, 0x03, 0, 1, 0x03, 0x03), - ENTRANCE(0x57, 0x04, 0, 1, 0x04, 0x02), ENTRANCE(0x57, 0x04, 0, 1, 0x04, 0x02), - ENTRANCE(0x57, 0x04, 0, 1, 0x04, 0x02), ENTRANCE(0x57, 0x04, 0, 1, 0x04, 0x02), - ENTRANCE(0x5A, 0x04, 0, 1, 0x04, 0x02), ENTRANCE(0x5A, 0x04, 0, 1, 0x04, 0x02), - ENTRANCE(0x5A, 0x04, 0, 1, 0x04, 0x02), ENTRANCE(0x5A, 0x04, 0, 1, 0x04, 0x02), - ENTRANCE(0x59, 0x03, 0, 1, 0x03, 0x03), ENTRANCE(0x59, 0x03, 0, 1, 0x02, 0x02), - ENTRANCE(0x59, 0x03, 0, 1, 0x03, 0x03), ENTRANCE(0x59, 0x03, 0, 1, 0x02, 0x02), - ENTRANCE(0x59, 0x04, 0, 1, 0x02, 0x02), ENTRANCE(0x59, 0x04, 0, 1, 0x02, 0x02), - ENTRANCE(0x59, 0x04, 0, 1, 0x02, 0x02), ENTRANCE(0x59, 0x04, 0, 1, 0x02, 0x02), - ENTRANCE(0x0E, 0x04, 1, 1, 0x02, 0x02), ENTRANCE(0x0E, 0x04, 1, 1, 0x02, 0x02), - ENTRANCE(0x0E, 0x04, 1, 1, 0x02, 0x02), ENTRANCE(0x0E, 0x04, 1, 1, 0x02, 0x02), - ENTRANCE(0x0E, 0x05, 1, 1, 0x02, 0x02), ENTRANCE(0x0E, 0x05, 1, 1, 0x02, 0x02), - ENTRANCE(0x0E, 0x05, 1, 1, 0x02, 0x02), ENTRANCE(0x0E, 0x05, 1, 1, 0x02, 0x02), - ENTRANCE(0x0E, 0x06, 1, 1, 0x02, 0x02), ENTRANCE(0x0E, 0x06, 1, 1, 0x02, 0x02), - ENTRANCE(0x0E, 0x06, 1, 1, 0x02, 0x02), ENTRANCE(0x0E, 0x06, 1, 1, 0x02, 0x02), - ENTRANCE(0x30, 0x01, 0, 0, 0x04, 0x20), ENTRANCE(0x30, 0x01, 0, 0, 0x04, 0x20), - ENTRANCE(0x30, 0x01, 0, 1, 0x04, 0x20), ENTRANCE(0x30, 0x01, 0, 1, 0x04, 0x20), - ENTRANCE(0x30, 0x02, 0, 0, 0x04, 0x20), ENTRANCE(0x30, 0x02, 0, 0, 0x04, 0x20), - ENTRANCE(0x30, 0x02, 0, 1, 0x04, 0x20), ENTRANCE(0x30, 0x02, 0, 1, 0x04, 0x20), - ENTRANCE(0x06, 0x02, 0, 0, 0x02, 0x02), ENTRANCE(0x06, 0x02, 0, 0, 0x02, 0x02), - ENTRANCE(0x06, 0x02, 0, 0, 0x02, 0x02), ENTRANCE(0x06, 0x02, 0, 0, 0x02, 0x02), - ENTRANCE(0x06, 0x03, 0, 0, 0x02, 0x02), ENTRANCE(0x06, 0x03, 0, 0, 0x02, 0x02), - ENTRANCE(0x06, 0x03, 0, 0, 0x02, 0x02), ENTRANCE(0x06, 0x03, 0, 0, 0x02, 0x02), - ENTRANCE(0x06, 0x04, 0, 1, 0x02, 0x02), ENTRANCE(0x06, 0x04, 0, 1, 0x02, 0x02), - ENTRANCE(0x06, 0x04, 0, 1, 0x02, 0x02), ENTRANCE(0x06, 0x04, 0, 1, 0x02, 0x02), - ENTRANCE(0x62, 0x02, 0, 1, 0x04, 0x02), ENTRANCE(0x62, 0x02, 0, 1, 0x04, 0x02), - ENTRANCE(0x62, 0x02, 0, 1, 0x04, 0x02), ENTRANCE(0x62, 0x02, 0, 1, 0x04, 0x02), - ENTRANCE(0x4A, 0x00, 0, 1, 0x03, 0x03), ENTRANCE(0x4A, 0x00, 0, 1, 0x02, 0x02), - ENTRANCE(0x4A, 0x00, 0, 1, 0x03, 0x03), ENTRANCE(0x4A, 0x00, 0, 1, 0x02, 0x02), - ENTRANCE(0x4A, 0x00, 0, 1, 0x03, 0x03), ENTRANCE(0x4A, 0x00, 0, 1, 0x03, 0x03), - ENTRANCE(0x4A, 0x00, 0, 1, 0x03, 0x03), ENTRANCE(0x02, 0x01, 1, 1, 0x02, 0x02), - ENTRANCE(0x02, 0x01, 1, 1, 0x02, 0x02), ENTRANCE(0x02, 0x01, 1, 1, 0x02, 0x02), - ENTRANCE(0x02, 0x01, 1, 1, 0x02, 0x02), ENTRANCE(0x12, 0x00, 1, 0, 0x02, 0x02), - ENTRANCE(0x12, 0x00, 1, 0, 0x02, 0x02), ENTRANCE(0x12, 0x00, 1, 0, 0x02, 0x02), - ENTRANCE(0x12, 0x00, 1, 0, 0x02, 0x02), ENTRANCE(0x11, 0x00, 1, 0, 0x02, 0x02), - ENTRANCE(0x11, 0x00, 1, 0, 0x02, 0x02), ENTRANCE(0x11, 0x00, 1, 0, 0x02, 0x02), - ENTRANCE(0x11, 0x00, 1, 0, 0x02, 0x02), ENTRANCE(0x18, 0x00, 1, 1, 0x02, 0x02), - ENTRANCE(0x18, 0x00, 1, 1, 0x02, 0x02), ENTRANCE(0x18, 0x00, 1, 1, 0x02, 0x02), - ENTRANCE(0x18, 0x00, 1, 1, 0x02, 0x02), ENTRANCE(0x16, 0x00, 1, 1, 0x02, 0x02), - ENTRANCE(0x16, 0x00, 1, 1, 0x02, 0x02), ENTRANCE(0x16, 0x00, 1, 1, 0x02, 0x02), - ENTRANCE(0x16, 0x00, 1, 1, 0x02, 0x02), ENTRANCE(0x0A, 0x00, 0, 1, 0x02, 0x02), - ENTRANCE(0x0A, 0x00, 0, 1, 0x02, 0x02), ENTRANCE(0x0A, 0x00, 0, 1, 0x02, 0x02), - ENTRANCE(0x0A, 0x00, 0, 1, 0x02, 0x02), ENTRANCE(0x19, 0x00, 1, 1, 0x02, 0x02), - ENTRANCE(0x19, 0x00, 1, 1, 0x02, 0x02), ENTRANCE(0x19, 0x00, 1, 1, 0x02, 0x02), - ENTRANCE(0x19, 0x00, 1, 1, 0x02, 0x02), ENTRANCE(0x05, 0x01, 1, 1, 0x03, 0x02), - ENTRANCE(0x05, 0x01, 1, 1, 0x02, 0x02), ENTRANCE(0x05, 0x01, 1, 1, 0x03, 0x02), - ENTRANCE(0x05, 0x01, 1, 1, 0x02, 0x02), ENTRANCE(0x0A, 0x01, 1, 1, 0x02, 0x02), - ENTRANCE(0x0A, 0x01, 1, 1, 0x02, 0x02), ENTRANCE(0x0A, 0x01, 1, 1, 0x02, 0x02), - ENTRANCE(0x0A, 0x01, 1, 1, 0x02, 0x02), ENTRANCE(0x0A, 0x02, 0, 1, 0x02, 0x02), - ENTRANCE(0x0A, 0x02, 0, 1, 0x02, 0x02), ENTRANCE(0x0A, 0x02, 0, 1, 0x02, 0x02), - ENTRANCE(0x0A, 0x02, 0, 1, 0x02, 0x02), ENTRANCE(0x63, 0x05, 0, 1, 0x04, 0x02), - ENTRANCE(0x63, 0x05, 0, 1, 0x04, 0x02), ENTRANCE(0x63, 0x05, 0, 1, 0x04, 0x02), - ENTRANCE(0x63, 0x05, 0, 1, 0x04, 0x02), ENTRANCE(0x28, 0x00, 0, 1, 0x04, 0x04), - ENTRANCE(0x28, 0x00, 0, 1, 0x04, 0x04), ENTRANCE(0x28, 0x00, 0, 1, 0x04, 0x04), - ENTRANCE(0x28, 0x00, 0, 1, 0x04, 0x04), ENTRANCE(0x29, 0x00, 0, 1, 0x04, 0x04), - ENTRANCE(0x29, 0x00, 0, 1, 0x04, 0x04), ENTRANCE(0x29, 0x00, 0, 1, 0x04, 0x04), - ENTRANCE(0x29, 0x00, 0, 1, 0x04, 0x04), ENTRANCE(0x2B, 0x00, 0, 1, 0x04, 0x20), - ENTRANCE(0x2B, 0x00, 0, 1, 0x04, 0x20), ENTRANCE(0x2B, 0x00, 0, 1, 0x04, 0x20), - ENTRANCE(0x2B, 0x00, 0, 1, 0x04, 0x20), ENTRANCE(0x1A, 0x00, 1, 1, 0x02, 0x02), - ENTRANCE(0x1A, 0x00, 1, 1, 0x02, 0x02), ENTRANCE(0x1A, 0x00, 1, 1, 0x02, 0x02), - ENTRANCE(0x1A, 0x00, 1, 1, 0x02, 0x02), ENTRANCE(0x55, 0x09, 0, 0, 0x04, 0x04), - ENTRANCE(0x55, 0x09, 0, 0, 0x04, 0x04), ENTRANCE(0x55, 0x09, 0, 0, 0x04, 0x04), - ENTRANCE(0x55, 0x09, 0, 0, 0x04, 0x04), ENTRANCE(0x55, 0x0A, 0, 0, 0x04, 0x04), - ENTRANCE(0x55, 0x0A, 0, 0, 0x04, 0x04), ENTRANCE(0x55, 0x0A, 0, 0, 0x04, 0x04), - ENTRANCE(0x55, 0x0A, 0, 0, 0x04, 0x04), ENTRANCE(0x52, 0x09, 0, 1, 0x04, 0x04), - ENTRANCE(0x52, 0x09, 0, 1, 0x04, 0x04), ENTRANCE(0x52, 0x09, 0, 1, 0x04, 0x04), - ENTRANCE(0x52, 0x09, 0, 1, 0x04, 0x04), ENTRANCE(0x48, 0x00, 0, 1, 0x02, 0x26), - ENTRANCE(0x48, 0x00, 0, 1, 0x02, 0x26), ENTRANCE(0x48, 0x00, 0, 1, 0x02, 0x26), - ENTRANCE(0x48, 0x00, 0, 1, 0x02, 0x26), ENTRANCE(0x48, 0x01, 0, 1, 0x04, 0x20), - ENTRANCE(0x48, 0x01, 0, 1, 0x04, 0x20), ENTRANCE(0x48, 0x01, 0, 1, 0x04, 0x20), - ENTRANCE(0x48, 0x01, 0, 1, 0x04, 0x20), ENTRANCE(0x55, 0x0B, 0, 1, 0x04, 0x02), - ENTRANCE(0x55, 0x0B, 0, 1, 0x04, 0x02), ENTRANCE(0x55, 0x0B, 0, 1, 0x04, 0x02), - ENTRANCE(0x55, 0x0B, 0, 1, 0x04, 0x02), ENTRANCE(0x60, 0x04, 0, 1, 0x02, 0x02), - ENTRANCE(0x60, 0x04, 0, 1, 0x02, 0x02), ENTRANCE(0x60, 0x04, 0, 1, 0x02, 0x02), - ENTRANCE(0x60, 0x04, 0, 1, 0x02, 0x02), ENTRANCE(0x49, 0x00, 0, 1, 0x02, 0x20), - ENTRANCE(0x49, 0x00, 0, 1, 0x02, 0x20), ENTRANCE(0x49, 0x00, 0, 1, 0x02, 0x20), - ENTRANCE(0x49, 0x00, 0, 1, 0x02, 0x20), ENTRANCE(0x52, 0x0A, 0, 1, 0x04, 0x02), - ENTRANCE(0x52, 0x0A, 0, 1, 0x04, 0x02), ENTRANCE(0x52, 0x0A, 0, 1, 0x04, 0x02), - ENTRANCE(0x52, 0x0A, 0, 1, 0x04, 0x02), ENTRANCE(0x0D, 0x00, 0, 1, 0x04, 0x02), - ENTRANCE(0x0D, 0x00, 0, 1, 0x04, 0x02), ENTRANCE(0x0D, 0x00, 0, 1, 0x04, 0x02), - ENTRANCE(0x0D, 0x00, 0, 1, 0x04, 0x02), ENTRANCE(0x0D, 0x00, 0, 1, 0x04, 0x02), - ENTRANCE(0x0D, 0x00, 0, 1, 0x04, 0x02), ENTRANCE(0x0D, 0x00, 0, 1, 0x04, 0x02), - ENTRANCE(0x0D, 0x00, 0, 1, 0x04, 0x02), ENTRANCE(0x0D, 0x00, 0, 1, 0x04, 0x02), - ENTRANCE(0x0D, 0x00, 0, 1, 0x04, 0x02), ENTRANCE(0x0D, 0x00, 0, 1, 0x04, 0x02), - ENTRANCE(0x23, 0x01, 0, 1, 0x04, 0x02), ENTRANCE(0x24, 0x01, 0, 1, 0x04, 0x02), - ENTRANCE(0x25, 0x01, 0, 1, 0x04, 0x02), ENTRANCE(0x25, 0x01, 0, 1, 0x04, 0x02), - ENTRANCE(0x51, 0x0F, 0, 1, 0x05, 0x05), ENTRANCE(0x51, 0x0F, 0, 1, 0x04, 0x02), - ENTRANCE(0x51, 0x0F, 0, 1, 0x05, 0x05), ENTRANCE(0x51, 0x0F, 0, 1, 0x04, 0x02), - ENTRANCE(0x60, 0x05, 0, 1, 0x04, 0x02), ENTRANCE(0x60, 0x05, 0, 1, 0x04, 0x02), - ENTRANCE(0x60, 0x05, 0, 1, 0x04, 0x02), ENTRANCE(0x60, 0x05, 0, 1, 0x04, 0x02), - ENTRANCE(0x5F, 0x04, 0, 1, 0x03, 0x03), ENTRANCE(0x5F, 0x04, 0, 1, 0x02, 0x02), - ENTRANCE(0x64, 0x04, 0, 1, 0x02, 0x02), ENTRANCE(0x64, 0x04, 0, 1, 0x02, 0x02), - ENTRANCE(0x61, 0x03, 0, 1, 0x02, 0x02), ENTRANCE(0x61, 0x03, 0, 1, 0x02, 0x02), - ENTRANCE(0x61, 0x03, 0, 1, 0x02, 0x02), ENTRANCE(0x61, 0x03, 0, 1, 0x02, 0x02), - ENTRANCE(0x0C, 0x00, 0, 1, 0x02, 0x02), ENTRANCE(0x0C, 0x00, 0, 1, 0x02, 0x02), - ENTRANCE(0x0C, 0x00, 0, 1, 0x02, 0x02), ENTRANCE(0x0C, 0x00, 0, 1, 0x02, 0x02), - ENTRANCE(0x0C, 0x01, 0, 1, 0x02, 0x02), ENTRANCE(0x0C, 0x01, 0, 1, 0x02, 0x02), - ENTRANCE(0x0C, 0x01, 0, 1, 0x02, 0x02), ENTRANCE(0x0C, 0x01, 0, 1, 0x02, 0x02), - ENTRANCE(0x0C, 0x02, 0, 1, 0x02, 0x02), ENTRANCE(0x0C, 0x02, 0, 1, 0x02, 0x02), - ENTRANCE(0x0C, 0x02, 0, 1, 0x02, 0x02), ENTRANCE(0x0C, 0x02, 0, 1, 0x02, 0x02), - ENTRANCE(0x0C, 0x03, 0, 1, 0x02, 0x02), ENTRANCE(0x0C, 0x03, 0, 1, 0x02, 0x02), - ENTRANCE(0x0C, 0x03, 0, 1, 0x02, 0x02), ENTRANCE(0x0C, 0x03, 0, 1, 0x02, 0x02), - ENTRANCE(0x0C, 0x04, 0, 1, 0x02, 0x02), ENTRANCE(0x0C, 0x04, 0, 1, 0x02, 0x02), - ENTRANCE(0x0C, 0x04, 0, 1, 0x02, 0x02), ENTRANCE(0x0C, 0x04, 0, 1, 0x02, 0x02), - ENTRANCE(0x0C, 0x05, 0, 1, 0x02, 0x02), ENTRANCE(0x0C, 0x05, 0, 1, 0x02, 0x02), - ENTRANCE(0x0C, 0x05, 0, 1, 0x02, 0x02), ENTRANCE(0x0C, 0x05, 0, 1, 0x02, 0x02), - ENTRANCE(0x0C, 0x06, 0, 1, 0x02, 0x02), ENTRANCE(0x0C, 0x06, 0, 1, 0x02, 0x02), - ENTRANCE(0x0C, 0x06, 0, 1, 0x02, 0x02), ENTRANCE(0x0C, 0x06, 0, 1, 0x02, 0x02), - ENTRANCE(0x0C, 0x07, 0, 1, 0x02, 0x02), ENTRANCE(0x0C, 0x07, 0, 1, 0x02, 0x02), - ENTRANCE(0x0C, 0x07, 0, 1, 0x02, 0x02), ENTRANCE(0x0C, 0x07, 0, 1, 0x02, 0x02), - ENTRANCE(0x0C, 0x08, 0, 1, 0x02, 0x02), ENTRANCE(0x0C, 0x08, 0, 1, 0x02, 0x02), - ENTRANCE(0x0C, 0x08, 0, 1, 0x02, 0x02), ENTRANCE(0x0C, 0x08, 0, 1, 0x02, 0x02), - ENTRANCE(0x0C, 0x09, 0, 1, 0x02, 0x02), ENTRANCE(0x0C, 0x09, 0, 1, 0x02, 0x02), - ENTRANCE(0x0C, 0x09, 0, 1, 0x02, 0x02), ENTRANCE(0x0C, 0x09, 0, 1, 0x02, 0x02), - ENTRANCE(0x0C, 0x0A, 0, 1, 0x02, 0x02), ENTRANCE(0x0C, 0x0A, 0, 1, 0x02, 0x02), - ENTRANCE(0x0C, 0x0A, 0, 1, 0x02, 0x02), ENTRANCE(0x0C, 0x0A, 0, 1, 0x02, 0x02), - ENTRANCE(0x0C, 0x0B, 0, 1, 0x02, 0x02), ENTRANCE(0x0C, 0x0B, 0, 1, 0x02, 0x02), - ENTRANCE(0x0C, 0x0B, 0, 1, 0x02, 0x02), ENTRANCE(0x0C, 0x0B, 0, 1, 0x02, 0x02), - ENTRANCE(0x0E, 0x07, 1, 1, 0x02, 0x02), ENTRANCE(0x0E, 0x07, 1, 1, 0x02, 0x02), - ENTRANCE(0x0E, 0x07, 1, 1, 0x02, 0x02), ENTRANCE(0x0E, 0x07, 1, 1, 0x02, 0x02), - ENTRANCE(0x1A, 0x01, 1, 1, 0x02, 0x02), ENTRANCE(0x1A, 0x01, 1, 1, 0x02, 0x02), - ENTRANCE(0x1A, 0x01, 1, 1, 0x02, 0x02), ENTRANCE(0x1A, 0x01, 1, 1, 0x02, 0x02), - ENTRANCE(0x3B, 0x01, 0, 1, 0x02, 0x02), ENTRANCE(0x3B, 0x01, 0, 1, 0x02, 0x02), - ENTRANCE(0x3B, 0x01, 0, 1, 0x02, 0x02), ENTRANCE(0x3B, 0x01, 0, 1, 0x02, 0x02), - ENTRANCE(0x3B, 0x02, 0, 1, 0x02, 0x02), ENTRANCE(0x3B, 0x02, 0, 1, 0x02, 0x02), - ENTRANCE(0x3B, 0x02, 0, 1, 0x02, 0x02), ENTRANCE(0x3B, 0x02, 0, 1, 0x02, 0x02), - ENTRANCE(0x5B, 0x04, 0, 1, 0x02, 0x02), ENTRANCE(0x5B, 0x04, 0, 1, 0x02, 0x02), - ENTRANCE(0x5B, 0x04, 0, 1, 0x02, 0x02), ENTRANCE(0x5B, 0x04, 0, 1, 0x02, 0x02), - ENTRANCE(0x63, 0x06, 0, 0, 0x02, 0x26), ENTRANCE(0x63, 0x06, 0, 0, 0x02, 0x26), - ENTRANCE(0x63, 0x06, 0, 0, 0x02, 0x26), ENTRANCE(0x63, 0x06, 0, 0, 0x02, 0x26), - ENTRANCE(0x63, 0x07, 0, 0, 0x2E, 0x2E), ENTRANCE(0x63, 0x07, 0, 0, 0x2E, 0x2E), - ENTRANCE(0x63, 0x07, 0, 0, 0x2E, 0x2E), ENTRANCE(0x63, 0x07, 0, 0, 0x2E, 0x2E), - ENTRANCE(0x5B, 0x05, 0, 1, 0x02, 0x02), ENTRANCE(0x5B, 0x05, 0, 1, 0x02, 0x02), - ENTRANCE(0x5B, 0x05, 0, 1, 0x02, 0x02), ENTRANCE(0x5B, 0x05, 0, 1, 0x02, 0x02), - ENTRANCE(0x5B, 0x06, 0, 1, 0x2C, 0x2C), ENTRANCE(0x5B, 0x06, 0, 1, 0x2C, 0x2C), - ENTRANCE(0x5B, 0x06, 0, 1, 0x2C, 0x2C), ENTRANCE(0x5B, 0x06, 0, 1, 0x2C, 0x2C), - ENTRANCE(0x5B, 0x07, 0, 1, 0x2C, 0x2C), ENTRANCE(0x5B, 0x07, 0, 1, 0x2C, 0x2C), - ENTRANCE(0x5B, 0x07, 0, 1, 0x2C, 0x2C), ENTRANCE(0x5B, 0x07, 0, 1, 0x2C, 0x2C), - ENTRANCE(0x5B, 0x08, 0, 0, 0x02, 0x02), ENTRANCE(0x5B, 0x08, 0, 0, 0x02, 0x02), - ENTRANCE(0x5B, 0x08, 0, 0, 0x02, 0x02), ENTRANCE(0x5B, 0x08, 0, 0, 0x02, 0x02), - ENTRANCE(0x62, 0x03, 0, 1, 0x2C, 0x2C), ENTRANCE(0x62, 0x03, 0, 1, 0x2C, 0x2C), - ENTRANCE(0x62, 0x03, 0, 1, 0x2C, 0x2C), ENTRANCE(0x62, 0x03, 0, 1, 0x2C, 0x2C), - ENTRANCE(0x57, 0x05, 0, 1, 0x02, 0x02), ENTRANCE(0x57, 0x05, 0, 1, 0x02, 0x02), - ENTRANCE(0x57, 0x05, 0, 1, 0x02, 0x02), ENTRANCE(0x57, 0x05, 0, 1, 0x02, 0x02), - ENTRANCE(0x07, 0x03, 0, 1, 0x02, 0x02), ENTRANCE(0x07, 0x03, 0, 1, 0x02, 0x02), - ENTRANCE(0x07, 0x03, 0, 1, 0x02, 0x02), ENTRANCE(0x07, 0x03, 0, 1, 0x02, 0x02), - ENTRANCE(0x52, 0x0B, 0, 1, 0x04, 0x02), ENTRANCE(0x52, 0x0B, 0, 1, 0x04, 0x02), - ENTRANCE(0x52, 0x0B, 0, 1, 0x04, 0x02), ENTRANCE(0x52, 0x0B, 0, 1, 0x04, 0x02), - ENTRANCE(0x3B, 0x03, 0, 1, 0x02, 0x02), ENTRANCE(0x3B, 0x03, 0, 1, 0x02, 0x02), - ENTRANCE(0x3B, 0x03, 0, 1, 0x02, 0x02), ENTRANCE(0x3B, 0x03, 0, 1, 0x02, 0x02), - ENTRANCE(0x61, 0x04, 0, 1, 0x02, 0x02), ENTRANCE(0x61, 0x04, 0, 1, 0x02, 0x02), - ENTRANCE(0x61, 0x04, 0, 1, 0x02, 0x02), ENTRANCE(0x61, 0x04, 0, 1, 0x02, 0x02), - ENTRANCE(0x5F, 0x03, 0, 1, 0x03, 0x03), ENTRANCE(0x5F, 0x03, 0, 1, 0x02, 0x02), - ENTRANCE(0x64, 0x03, 0, 1, 0x02, 0x02), ENTRANCE(0x64, 0x03, 0, 1, 0x02, 0x02), - ENTRANCE(0x5F, 0x03, 0, 1, 0x00, 0x00), ENTRANCE(0x52, 0x0C, 0, 1, 0x04, 0x02), - ENTRANCE(0x52, 0x0C, 0, 1, 0x04, 0x02), ENTRANCE(0x52, 0x0C, 0, 1, 0x04, 0x02), - ENTRANCE(0x52, 0x0C, 0, 1, 0x04, 0x02), ENTRANCE(0x48, 0x02, 1, 1, 0x04, 0x20), - ENTRANCE(0x48, 0x02, 1, 1, 0x04, 0x20), ENTRANCE(0x48, 0x02, 1, 1, 0x04, 0x20), - ENTRANCE(0x48, 0x02, 1, 1, 0x04, 0x20), ENTRANCE(0x4B, 0x00, 0, 1, 0x04, 0x20), - ENTRANCE(0x4B, 0x00, 0, 1, 0x04, 0x20), ENTRANCE(0x4B, 0x00, 0, 1, 0x04, 0x20), - ENTRANCE(0x4B, 0x00, 0, 1, 0x04, 0x20), ENTRANCE(0x53, 0x06, 0, 1, 0x03, 0x03), - ENTRANCE(0x53, 0x06, 0, 1, 0x03, 0x03), ENTRANCE(0x53, 0x06, 0, 1, 0x03, 0x03), - ENTRANCE(0x53, 0x06, 0, 1, 0x03, 0x03), ENTRANCE(0x51, 0x10, 0, 1, 0x0B, 0x0B), - ENTRANCE(0x51, 0x10, 0, 1, 0x0B, 0x0B), ENTRANCE(0x51, 0x10, 0, 1, 0x0B, 0x0B), - ENTRANCE(0x51, 0x10, 0, 1, 0x0B, 0x0B), ENTRANCE(0x52, 0x0D, 0, 1, 0x03, 0x03), - ENTRANCE(0x52, 0x0D, 0, 1, 0x02, 0x02), ENTRANCE(0x52, 0x0D, 0, 1, 0x03, 0x03), - ENTRANCE(0x52, 0x0D, 0, 1, 0x02, 0x02), ENTRANCE(0x4F, 0x00, 0, 1, 0x03, 0x03), - ENTRANCE(0x4F, 0x00, 0, 1, 0x03, 0x03), ENTRANCE(0x4F, 0x00, 0, 1, 0x03, 0x03), - ENTRANCE(0x4F, 0x00, 0, 1, 0x03, 0x03), ENTRANCE(0x4F, 0x00, 0, 1, 0x03, 0x03), - ENTRANCE(0x1A, 0x06, 1, 1, 0x02, 0x02), ENTRANCE(0x1A, 0x06, 1, 1, 0x02, 0x02), - ENTRANCE(0x1A, 0x06, 1, 1, 0x02, 0x02), ENTRANCE(0x1A, 0x06, 1, 1, 0x02, 0x02), - ENTRANCE(0x66, 0x00, 0, 1, 0x02, 0x02), ENTRANCE(0x66, 0x00, 0, 1, 0x02, 0x02), - ENTRANCE(0x66, 0x00, 0, 1, 0x02, 0x02), ENTRANCE(0x66, 0x00, 0, 1, 0x02, 0x02), - ENTRANCE(0x1A, 0x07, 1, 1, 0x02, 0x02), ENTRANCE(0x1A, 0x07, 1, 1, 0x02, 0x02), - ENTRANCE(0x1A, 0x07, 1, 1, 0x02, 0x02), ENTRANCE(0x1A, 0x07, 1, 1, 0x02, 0x02), - ENTRANCE(0x32, 0x01, 0, 1, 0x02, 0x02), ENTRANCE(0x32, 0x01, 0, 1, 0x02, 0x02), - ENTRANCE(0x32, 0x01, 0, 1, 0x02, 0x02), ENTRANCE(0x32, 0x01, 0, 1, 0x02, 0x02), - ENTRANCE(0x2C, 0x01, 0, 1, 0x04, 0x20), ENTRANCE(0x2C, 0x01, 0, 1, 0x04, 0x20), - ENTRANCE(0x2C, 0x01, 0, 1, 0x04, 0x20), ENTRANCE(0x2C, 0x01, 0, 1, 0x04, 0x20), - ENTRANCE(0x33, 0x00, 0, 1, 0x04, 0x20), ENTRANCE(0x33, 0x00, 0, 1, 0x04, 0x20), - ENTRANCE(0x33, 0x00, 0, 1, 0x04, 0x20), ENTRANCE(0x33, 0x00, 0, 1, 0x04, 0x20), - ENTRANCE(0x0D, 0x01, 0, 0, 0x04, 0x02), ENTRANCE(0x0D, 0x01, 0, 0, 0x04, 0x02), - ENTRANCE(0x0D, 0x01, 0, 0, 0x04, 0x02), ENTRANCE(0x0D, 0x01, 0, 0, 0x04, 0x02), - ENTRANCE(0x0D, 0x02, 0, 1, 0x04, 0x02), ENTRANCE(0x0D, 0x02, 0, 1, 0x04, 0x02), - ENTRANCE(0x0D, 0x02, 0, 1, 0x04, 0x02), ENTRANCE(0x0D, 0x02, 0, 1, 0x04, 0x02), - ENTRANCE(0x0D, 0x03, 0, 1, 0x04, 0x02), ENTRANCE(0x0D, 0x03, 0, 1, 0x04, 0x02), - ENTRANCE(0x0D, 0x03, 0, 1, 0x04, 0x02), ENTRANCE(0x0D, 0x03, 0, 1, 0x04, 0x02), - ENTRANCE(0x0D, 0x04, 0, 1, 0x04, 0x02), ENTRANCE(0x0D, 0x04, 0, 1, 0x04, 0x02), - ENTRANCE(0x0D, 0x04, 0, 1, 0x04, 0x02), ENTRANCE(0x0D, 0x04, 0, 1, 0x04, 0x02), - ENTRANCE(0x0D, 0x05, 0, 1, 0x04, 0x02), ENTRANCE(0x0D, 0x05, 0, 1, 0x04, 0x02), - ENTRANCE(0x0D, 0x05, 0, 1, 0x04, 0x02), ENTRANCE(0x0D, 0x05, 0, 1, 0x04, 0x02), - ENTRANCE(0x0D, 0x06, 0, 1, 0x04, 0x02), ENTRANCE(0x0D, 0x06, 0, 1, 0x04, 0x02), - ENTRANCE(0x0D, 0x06, 0, 1, 0x04, 0x02), ENTRANCE(0x0D, 0x06, 0, 1, 0x04, 0x02), - ENTRANCE(0x0D, 0x07, 0, 1, 0x04, 0x02), ENTRANCE(0x0D, 0x07, 0, 1, 0x04, 0x02), - ENTRANCE(0x0D, 0x07, 0, 1, 0x04, 0x02), ENTRANCE(0x0D, 0x07, 0, 1, 0x04, 0x02), - ENTRANCE(0x50, 0x00, 0, 1, 0x04, 0x20), ENTRANCE(0x50, 0x00, 0, 1, 0x04, 0x20), - ENTRANCE(0x50, 0x00, 0, 1, 0x04, 0x20), ENTRANCE(0x50, 0x00, 0, 1, 0x04, 0x20), - ENTRANCE(0x52, 0x0E, 0, 1, 0x03, 0x03), ENTRANCE(0x52, 0x0E, 0, 1, 0x02, 0x02), - ENTRANCE(0x52, 0x0E, 0, 1, 0x03, 0x03), ENTRANCE(0x52, 0x0E, 0, 1, 0x02, 0x02), - ENTRANCE(0x63, 0x08, 0, 0, 0x20, 0x20), ENTRANCE(0x63, 0x08, 0, 0, 0x20, 0x20), - ENTRANCE(0x63, 0x08, 0, 0, 0x20, 0x20), ENTRANCE(0x63, 0x08, 0, 0, 0x20, 0x20), - ENTRANCE(0x63, 0x09, 0, 0, 0x02, 0x02), ENTRANCE(0x63, 0x09, 0, 0, 0x02, 0x02), - ENTRANCE(0x63, 0x09, 0, 0, 0x02, 0x02), ENTRANCE(0x63, 0x09, 0, 0, 0x02, 0x02), - ENTRANCE(0x57, 0x07, 0, 1, 0x2C, 0x2C), ENTRANCE(0x57, 0x07, 0, 1, 0x2C, 0x2C), - ENTRANCE(0x57, 0x07, 0, 1, 0x2C, 0x2C), ENTRANCE(0x57, 0x07, 0, 1, 0x2C, 0x2C), - ENTRANCE(0x61, 0x05, 0, 1, 0x02, 0x02), ENTRANCE(0x61, 0x05, 0, 1, 0x02, 0x02), - ENTRANCE(0x61, 0x05, 0, 1, 0x02, 0x02), ENTRANCE(0x61, 0x05, 0, 1, 0x02, 0x02), - ENTRANCE(0x53, 0x07, 0, 1, 0x03, 0x03), ENTRANCE(0x53, 0x07, 0, 1, 0x03, 0x03), - ENTRANCE(0x53, 0x07, 0, 1, 0x03, 0x03), ENTRANCE(0x53, 0x07, 0, 1, 0x03, 0x03), - ENTRANCE(0x0F, 0x00, 1, 1, 0x02, 0x02), ENTRANCE(0x0F, 0x00, 1, 1, 0x02, 0x02), - ENTRANCE(0x0F, 0x00, 1, 1, 0x02, 0x02), ENTRANCE(0x0F, 0x00, 1, 1, 0x02, 0x02), - ENTRANCE(0x0C, 0x0C, 0, 1, 0x02, 0x02), ENTRANCE(0x0C, 0x0C, 0, 1, 0x02, 0x02), - ENTRANCE(0x0C, 0x0C, 0, 1, 0x02, 0x02), ENTRANCE(0x0C, 0x0C, 0, 1, 0x02, 0x02), - ENTRANCE(0x41, 0x01, 0, 1, 0x02, 0x02), ENTRANCE(0x41, 0x01, 0, 1, 0x02, 0x02), - ENTRANCE(0x41, 0x01, 0, 1, 0x02, 0x02), ENTRANCE(0x41, 0x01, 0, 1, 0x02, 0x02), - ENTRANCE(0x3D, 0x01, 0, 1, 0x04, 0x04), ENTRANCE(0x3D, 0x01, 0, 1, 0x04, 0x04), - ENTRANCE(0x3D, 0x01, 0, 1, 0x04, 0x04), ENTRANCE(0x3D, 0x01, 0, 1, 0x04, 0x04), - ENTRANCE(0x5C, 0x07, 0, 1, 0x03, 0x03), ENTRANCE(0x5C, 0x07, 0, 1, 0x02, 0x02), - ENTRANCE(0x5C, 0x07, 0, 1, 0x03, 0x03), ENTRANCE(0x5C, 0x07, 0, 1, 0x02, 0x02), - ENTRANCE(0x53, 0x08, 0, 1, 0x03, 0x03), ENTRANCE(0x53, 0x08, 0, 1, 0x03, 0x03), - ENTRANCE(0x53, 0x08, 0, 1, 0x03, 0x03), ENTRANCE(0x53, 0x08, 0, 1, 0x03, 0x03), - ENTRANCE(0x03, 0x02, 0, 1, 0x02, 0x02), ENTRANCE(0x03, 0x02, 0, 1, 0x02, 0x02), - ENTRANCE(0x03, 0x02, 0, 1, 0x02, 0x02), ENTRANCE(0x03, 0x02, 0, 1, 0x02, 0x02), - ENTRANCE(0x3D, 0x02, 0, 1, 0x02, 0x02), ENTRANCE(0x3D, 0x02, 0, 1, 0x02, 0x02), - ENTRANCE(0x3D, 0x02, 0, 1, 0x02, 0x02), ENTRANCE(0x3D, 0x02, 0, 1, 0x02, 0x02), - ENTRANCE(0x43, 0x05, 0, 1, 0x02, 0x02), ENTRANCE(0x43, 0x05, 0, 1, 0x02, 0x02), - ENTRANCE(0x43, 0x05, 0, 1, 0x02, 0x02), ENTRANCE(0x43, 0x05, 0, 1, 0x02, 0x02), - ENTRANCE(0x43, 0x06, 0, 1, 0x02, 0x02), ENTRANCE(0x43, 0x06, 0, 1, 0x02, 0x02), - ENTRANCE(0x43, 0x06, 0, 1, 0x02, 0x02), ENTRANCE(0x43, 0x06, 0, 1, 0x02, 0x02), - ENTRANCE(0x51, 0x11, 0, 1, 0x03, 0x03), ENTRANCE(0x51, 0x11, 0, 1, 0x02, 0x02), - ENTRANCE(0x51, 0x11, 0, 1, 0x03, 0x03), ENTRANCE(0x51, 0x11, 0, 1, 0x02, 0x02), - ENTRANCE(0x3E, 0x01, 0, 1, 0x02, 0x02), ENTRANCE(0x3E, 0x01, 0, 1, 0x02, 0x02), - ENTRANCE(0x3E, 0x01, 0, 1, 0x02, 0x02), ENTRANCE(0x3E, 0x01, 0, 1, 0x02, 0x02), - ENTRANCE(0x3E, 0x02, 0, 1, 0x02, 0x02), ENTRANCE(0x3E, 0x02, 0, 1, 0x02, 0x02), - ENTRANCE(0x3E, 0x02, 0, 1, 0x02, 0x02), ENTRANCE(0x3E, 0x02, 0, 1, 0x02, 0x02), - ENTRANCE(0x3E, 0x03, 0, 1, 0x02, 0x02), ENTRANCE(0x3E, 0x03, 0, 1, 0x02, 0x02), - ENTRANCE(0x3E, 0x03, 0, 1, 0x02, 0x02), ENTRANCE(0x3E, 0x03, 0, 1, 0x02, 0x02), - ENTRANCE(0x3E, 0x04, 0, 1, 0x02, 0x02), ENTRANCE(0x3E, 0x04, 0, 1, 0x02, 0x02), - ENTRANCE(0x3E, 0x04, 0, 1, 0x02, 0x02), ENTRANCE(0x3E, 0x04, 0, 1, 0x02, 0x02), - ENTRANCE(0x3E, 0x05, 0, 1, 0x02, 0x03), ENTRANCE(0x3E, 0x05, 0, 1, 0x02, 0x03), - ENTRANCE(0x3E, 0x05, 0, 1, 0x02, 0x03), ENTRANCE(0x3E, 0x05, 0, 1, 0x02, 0x03), - ENTRANCE(0x3E, 0x06, 0, 1, 0x02, 0x02), ENTRANCE(0x3E, 0x06, 0, 1, 0x02, 0x02), - ENTRANCE(0x3E, 0x06, 0, 1, 0x02, 0x02), ENTRANCE(0x3E, 0x06, 0, 1, 0x02, 0x02), - ENTRANCE(0x3E, 0x07, 0, 1, 0x02, 0x02), ENTRANCE(0x3E, 0x07, 0, 1, 0x02, 0x02), - ENTRANCE(0x3E, 0x07, 0, 1, 0x02, 0x02), ENTRANCE(0x3E, 0x07, 0, 1, 0x02, 0x02), - ENTRANCE(0x3E, 0x08, 0, 1, 0x02, 0x02), ENTRANCE(0x3E, 0x08, 0, 1, 0x02, 0x02), - ENTRANCE(0x3E, 0x08, 0, 1, 0x02, 0x02), ENTRANCE(0x3E, 0x08, 0, 1, 0x02, 0x02), - ENTRANCE(0x3E, 0x09, 0, 1, 0x02, 0x02), ENTRANCE(0x3E, 0x09, 0, 1, 0x02, 0x02), - ENTRANCE(0x3E, 0x09, 0, 1, 0x02, 0x02), ENTRANCE(0x3E, 0x09, 0, 1, 0x02, 0x02), - ENTRANCE(0x3E, 0x0A, 0, 1, 0x02, 0x02), ENTRANCE(0x3E, 0x0A, 0, 1, 0x02, 0x02), - ENTRANCE(0x3E, 0x0A, 0, 1, 0x02, 0x02), ENTRANCE(0x3E, 0x0A, 0, 1, 0x02, 0x02), - ENTRANCE(0x3E, 0x0B, 0, 1, 0x02, 0x02), ENTRANCE(0x3E, 0x0B, 0, 1, 0x02, 0x02), - ENTRANCE(0x3E, 0x0B, 0, 1, 0x02, 0x02), ENTRANCE(0x3E, 0x0B, 0, 1, 0x02, 0x02), - ENTRANCE(0x3E, 0x0C, 0, 1, 0x02, 0x02), ENTRANCE(0x3E, 0x0C, 0, 1, 0x02, 0x02), - ENTRANCE(0x3E, 0x0C, 0, 1, 0x02, 0x02), ENTRANCE(0x3E, 0x0C, 0, 1, 0x02, 0x02), - ENTRANCE(0x37, 0x01, 0, 1, 0x04, 0x20), ENTRANCE(0x37, 0x01, 0, 1, 0x04, 0x20), - ENTRANCE(0x37, 0x01, 0, 1, 0x04, 0x20), ENTRANCE(0x37, 0x01, 0, 1, 0x04, 0x20), - ENTRANCE(0x08, 0x01, 0, 1, 0x04, 0x04), ENTRANCE(0x08, 0x01, 0, 1, 0x04, 0x04), - ENTRANCE(0x08, 0x01, 0, 1, 0x04, 0x04), ENTRANCE(0x08, 0x01, 0, 1, 0x04, 0x04), - ENTRANCE(0x4C, 0x01, 0, 1, 0x04, 0x20), ENTRANCE(0x4C, 0x01, 0, 1, 0x04, 0x20), - ENTRANCE(0x4C, 0x01, 0, 1, 0x04, 0x20), ENTRANCE(0x4C, 0x01, 0, 1, 0x04, 0x20), - ENTRANCE(0x63, 0x0A, 0, 1, 0x04, 0x02), ENTRANCE(0x63, 0x0A, 0, 1, 0x04, 0x02), - ENTRANCE(0x63, 0x0A, 0, 1, 0x04, 0x02), ENTRANCE(0x63, 0x0A, 0, 1, 0x04, 0x02), - ENTRANCE(0x09, 0x01, 0, 1, 0x02, 0x02), ENTRANCE(0x09, 0x01, 0, 1, 0x02, 0x02), - ENTRANCE(0x09, 0x01, 0, 1, 0x02, 0x02), ENTRANCE(0x09, 0x01, 0, 1, 0x02, 0x02), - ENTRANCE(0x52, 0x0F, 0, 1, 0x03, 0x03), ENTRANCE(0x52, 0x0F, 0, 1, 0x02, 0x02), - ENTRANCE(0x52, 0x0F, 0, 1, 0x03, 0x03), ENTRANCE(0x52, 0x0F, 0, 1, 0x02, 0x02), - ENTRANCE(0x5B, 0x09, 0, 0, 0x02, 0x02), ENTRANCE(0x5B, 0x09, 0, 0, 0x02, 0x02), - ENTRANCE(0x5B, 0x09, 0, 0, 0x02, 0x02), ENTRANCE(0x5B, 0x09, 0, 0, 0x02, 0x02), - ENTRANCE(0x4C, 0x02, 0, 1, 0x04, 0x20), ENTRANCE(0x4C, 0x02, 0, 1, 0x04, 0x20), - ENTRANCE(0x4C, 0x02, 0, 1, 0x04, 0x20), ENTRANCE(0x4C, 0x02, 0, 1, 0x04, 0x20), - ENTRANCE(0x55, 0x0C, 0, 1, 0x04, 0x02), ENTRANCE(0x55, 0x0C, 0, 1, 0x04, 0x02), - ENTRANCE(0x55, 0x0C, 0, 1, 0x04, 0x02), ENTRANCE(0x55, 0x0C, 0, 1, 0x04, 0x02), - ENTRANCE(0x17, 0x02, 1, 1, 0x02, 0x02), ENTRANCE(0x17, 0x02, 1, 1, 0x02, 0x02), - ENTRANCE(0x17, 0x02, 1, 1, 0x02, 0x02), ENTRANCE(0x17, 0x02, 1, 1, 0x02, 0x02), - ENTRANCE(0x4A, 0x01, 0, 0, 0x03, 0x03), ENTRANCE(0x4A, 0x01, 0, 0, 0x02, 0x02), - ENTRANCE(0x4A, 0x01, 0, 0, 0x03, 0x03), ENTRANCE(0x4A, 0x01, 0, 0, 0x02, 0x02), - ENTRANCE(0x43, 0x07, 0, 1, 0x02, 0x02), ENTRANCE(0x43, 0x07, 0, 1, 0x02, 0x02), - ENTRANCE(0x43, 0x07, 0, 1, 0x02, 0x02), ENTRANCE(0x43, 0x07, 0, 1, 0x02, 0x02), - ENTRANCE(0x5D, 0x12, 0, 1, 0x02, 0x02), ENTRANCE(0x5D, 0x12, 0, 1, 0x02, 0x02), - ENTRANCE(0x5D, 0x12, 0, 1, 0x02, 0x02), ENTRANCE(0x5D, 0x12, 0, 1, 0x02, 0x02), - ENTRANCE(0x3E, 0x0D, 0, 1, 0x02, 0x02), ENTRANCE(0x3E, 0x0D, 0, 1, 0x02, 0x02), - ENTRANCE(0x3E, 0x0D, 0, 1, 0x02, 0x02), ENTRANCE(0x3E, 0x0D, 0, 1, 0x02, 0x02), - ENTRANCE(0x56, 0x02, 0, 1, 0x12, 0x12), ENTRANCE(0x56, 0x02, 0, 1, 0x02, 0x02), - ENTRANCE(0x56, 0x02, 0, 1, 0x12, 0x12), ENTRANCE(0x56, 0x02, 0, 1, 0x02, 0x02), - ENTRANCE(0x57, 0x08, 0, 1, 0x02, 0x02), ENTRANCE(0x57, 0x08, 0, 1, 0x02, 0x02), - ENTRANCE(0x57, 0x08, 0, 1, 0x02, 0x02), ENTRANCE(0x57, 0x08, 0, 1, 0x02, 0x02), - ENTRANCE(0x56, 0x03, 0, 1, 0x03, 0x03), ENTRANCE(0x56, 0x03, 0, 1, 0x03, 0x03), - ENTRANCE(0x56, 0x03, 0, 1, 0x03, 0x03), ENTRANCE(0x56, 0x03, 0, 1, 0x03, 0x03), - ENTRANCE(0x57, 0x09, 0, 1, 0x03, 0x03), ENTRANCE(0x57, 0x09, 0, 1, 0x03, 0x03), - ENTRANCE(0x57, 0x09, 0, 1, 0x03, 0x03), ENTRANCE(0x57, 0x09, 0, 1, 0x03, 0x03), - ENTRANCE(0x5C, 0x08, 0, 1, 0x03, 0x03), ENTRANCE(0x5C, 0x08, 0, 1, 0x03, 0x03), - ENTRANCE(0x5C, 0x08, 0, 1, 0x03, 0x03), ENTRANCE(0x5C, 0x08, 0, 1, 0x03, 0x03), +#include "tables/entrance_table.h" }; +#undef DEFINE_ENTRANCE + //#define TITLED_SCENE(name, title, unk_10, config, unk_12) \ // { \ // (u32) _##name##SegmentRomStart, (u32)_##name##SegmentRomEnd, (u32)_##title##SegmentRomStart, \ @@ -858,24 +85,24 @@ Gfx sDefaultDisplayList[] = { }; // Computes next entrance index based on age and day time to set the fade out transition -void func_800994A0(PlayState* play) { - s16 computedEntranceIndex; +void Scene_SetTransitionForNextEntrance(PlayState* play) { + s16 entranceIndex; if (!IS_DAY) { if (!LINK_IS_ADULT) { - computedEntranceIndex = play->nextEntranceIndex + 1; + entranceIndex = play->nextEntranceIndex + 1; } else { - computedEntranceIndex = play->nextEntranceIndex + 3; + entranceIndex = play->nextEntranceIndex + 3; } } else { if (!LINK_IS_ADULT) { - computedEntranceIndex = play->nextEntranceIndex; + entranceIndex = play->nextEntranceIndex; } else { - computedEntranceIndex = play->nextEntranceIndex + 2; + entranceIndex = play->nextEntranceIndex + 2; } } - play->transitionType = gEntranceTable[computedEntranceIndex].field & 0x7F; // Fade out + play->transitionType = ENTRANCE_INFO_START_TRANS_TYPE(gEntranceTable[entranceIndex].field); // Fade out } // Scene Draw Config 0 diff --git a/soh/src/code/z_sram.c b/soh/src/code/z_sram.c index 1ce20abc3..7e122e373 100644 --- a/soh/src/code/z_sram.c +++ b/soh/src/code/z_sram.c @@ -38,6 +38,25 @@ void Sram_InitBossRushSave(void) { BossRush_InitSave(); } +static s16 sDungeonEntrances[] = { + ENTR_DEKU_TREE_0, // SCENE_DEKU_TREE + ENTR_DODONGOS_CAVERN_0, // SCENE_DODONGOS_CAVERN + ENTR_JABU_JABU_0, // SCENE_JABU_JABU + ENTR_FOREST_TEMPLE_0, // SCENE_FOREST_TEMPLE + ENTR_FIRE_TEMPLE_0, // SCENE_FIRE_TEMPLE + ENTR_WATER_TEMPLE_0, // SCENE_WATER_TEMPLE + ENTR_SPIRIT_TEMPLE_0, // SCENE_SPIRIT_TEMPLE + ENTR_SHADOW_TEMPLE_0, // SCENE_SHADOW_TEMPLE + ENTR_BOTTOM_OF_THE_WELL_0, // SCENE_BOTTOM_OF_THE_WELL + ENTR_ICE_CAVERN_0, // SCENE_ICE_CAVERN + ENTR_GANONS_TOWER_0, // SCENE_GANONS_TOWER + ENTR_GERUDO_TRAINING_GROUND_0, // SCENE_GERUDO_TRAINING_GROUND + ENTR_THIEVES_HIDEOUT_0, // SCENE_THIEVES_HIDEOUT + ENTR_INSIDE_GANONS_CASTLE_0, // SCENE_INSIDE_GANONS_CASTLE + ENTR_GANONS_TOWER_COLLAPSE_INTERIOR_0, // SCENE_GANONS_TOWER_COLLAPSE_INTERIOR + ENTR_INSIDE_GANONS_CASTLE_COLLAPSE_0, // SCENE_INSIDE_GANONS_CASTLE_COLLAPSE +}; + /** * Copy save currently on the buffer to Save Context and complete various tasks to open the save. * This includes: @@ -49,10 +68,6 @@ void Sram_InitBossRushSave(void) { * - Revert any trade items that spoil */ void Sram_OpenSave() { - static s16 dungeonEntrances[] = { - 0x0000, 0x0004, 0x0028, 0x0169, 0x0165, 0x0010, 0x0082, 0x0037, - 0x0098, 0x0088, 0x041B, 0x0008, 0x0486, 0x0467, 0x0179, 0x056C, - }; u16 i; u16 j; u8* ptr; @@ -76,45 +91,45 @@ void Sram_OpenSave() { case SCENE_GERUDO_TRAINING_GROUND: case SCENE_THIEVES_HIDEOUT: case SCENE_INSIDE_GANONS_CASTLE: - gSaveContext.entranceIndex = dungeonEntrances[gSaveContext.savedSceneNum]; + gSaveContext.entranceIndex = sDungeonEntrances[gSaveContext.savedSceneNum]; break; case SCENE_DEKU_TREE_BOSS: - gSaveContext.entranceIndex = 0; + gSaveContext.entranceIndex = ENTR_DEKU_TREE_0; break; case SCENE_DODONGOS_CAVERN_BOSS: - gSaveContext.entranceIndex = 4; + gSaveContext.entranceIndex = ENTR_DODONGOS_CAVERN_0; break; case SCENE_JABU_JABU_BOSS: - gSaveContext.entranceIndex = 0x28; + gSaveContext.entranceIndex = ENTR_JABU_JABU_0; break; case SCENE_FOREST_TEMPLE_BOSS: - gSaveContext.entranceIndex = 0x169; + gSaveContext.entranceIndex = ENTR_FOREST_TEMPLE_0; break; case SCENE_FIRE_TEMPLE_BOSS: - gSaveContext.entranceIndex = 0x165; + gSaveContext.entranceIndex = ENTR_FIRE_TEMPLE_0; break; case SCENE_WATER_TEMPLE_BOSS: - gSaveContext.entranceIndex = 0x10; + gSaveContext.entranceIndex = ENTR_WATER_TEMPLE_0; break; case SCENE_SPIRIT_TEMPLE_BOSS: - gSaveContext.entranceIndex = 0x82; + gSaveContext.entranceIndex = ENTR_SPIRIT_TEMPLE_0; break; case SCENE_SHADOW_TEMPLE_BOSS: - gSaveContext.entranceIndex = 0x37; + gSaveContext.entranceIndex = ENTR_SHADOW_TEMPLE_0; break; case SCENE_GANONS_TOWER_COLLAPSE_INTERIOR: case SCENE_INSIDE_GANONS_CASTLE_COLLAPSE: case SCENE_GANONDORF_BOSS: case SCENE_GANONS_TOWER_COLLAPSE_EXTERIOR: case SCENE_GANON_BOSS: - gSaveContext.entranceIndex = 0x41B; + gSaveContext.entranceIndex = ENTR_GANONS_TOWER_0; break; default: if (gSaveContext.savedSceneNum != SCENE_LINKS_HOUSE) { - gSaveContext.entranceIndex = (LINK_AGE_IN_YEARS == YEARS_CHILD) ? 0xBB : 0x5F4; + gSaveContext.entranceIndex = (LINK_AGE_IN_YEARS == YEARS_CHILD) ? ENTR_LINKS_HOUSE_0 : ENTR_TEMPLE_OF_TIME_7; } else { - gSaveContext.entranceIndex = 0xBB; + gSaveContext.entranceIndex = ENTR_LINKS_HOUSE_0; } break; } @@ -209,7 +224,7 @@ void Sram_InitSave(FileChooseContext* fileChooseCtx) { Sram_InitDebugSave(); } - gSaveContext.entranceIndex = 0xBB; + gSaveContext.entranceIndex = ENTR_LINKS_HOUSE_0; gSaveContext.linkAge = 1; gSaveContext.dayTime = 0x6AAB; gSaveContext.cutsceneIndex = 0xFFF1; diff --git a/soh/src/overlays/actors/ovl_Bg_Spot00_Hanebasi/z_bg_spot00_hanebasi.c b/soh/src/overlays/actors/ovl_Bg_Spot00_Hanebasi/z_bg_spot00_hanebasi.c index cee95f9b7..0fb728661 100644 --- a/soh/src/overlays/actors/ovl_Bg_Spot00_Hanebasi/z_bg_spot00_hanebasi.c +++ b/soh/src/overlays/actors/ovl_Bg_Spot00_Hanebasi/z_bg_spot00_hanebasi.c @@ -224,7 +224,7 @@ void BgSpot00Hanebasi_Update(Actor* thisx, PlayState* play) { Flags_SetEventChkInf(EVENTCHKINF_DRAWBRIDGE_OPENED_AFTER_ZELDA_FLED); this->actionFunc = BgSpot00Hanebasi_DoNothing; func_8002DF54(play, &player->actor, 8); - play->nextEntranceIndex = 0x00CD; + play->nextEntranceIndex = ENTR_HYRULE_FIELD_0; gSaveContext.nextCutsceneIndex = 0xFFF1; play->transitionTrigger = TRANS_TRIGGER_START; play->transitionType = TRANS_TYPE_FADE_BLACK_FAST; diff --git a/soh/src/overlays/actors/ovl_Boss_Ganon/z_boss_ganon.c b/soh/src/overlays/actors/ovl_Boss_Ganon/z_boss_ganon.c index 6a7a5a232..ebc244d74 100644 --- a/soh/src/overlays/actors/ovl_Boss_Ganon/z_boss_ganon.c +++ b/soh/src/overlays/actors/ovl_Boss_Ganon/z_boss_ganon.c @@ -1541,10 +1541,10 @@ void BossGanon_DeathAndTowerCutscene(BossGanon* this, PlayState* play) { play->transitionTrigger = TRANS_TRIGGER_START; if ((IS_RANDO && Randomizer_GetSettingValue(RSK_SKIP_TOWER_ESCAPE) || IS_BOSS_RUSH)) { Flags_SetEventChkInf(EVENTCHKINF_WATCHED_GANONS_CASTLE_COLLAPSE_CAUGHT_BY_GERUDO); - play->nextEntranceIndex = 0x517; + play->nextEntranceIndex = ENTR_GANON_BOSS_0; } else { - play->nextEntranceIndex = 0x43F; + play->nextEntranceIndex = ENTR_GANONS_TOWER_COLLAPSE_EXTERIOR_0; } play->transitionType = TRANS_TYPE_FADE_WHITE_FAST; } diff --git a/soh/src/overlays/actors/ovl_Boss_Ganon2/z_boss_ganon2.c b/soh/src/overlays/actors/ovl_Boss_Ganon2/z_boss_ganon2.c index 6c3949418..5ec12f093 100644 --- a/soh/src/overlays/actors/ovl_Boss_Ganon2/z_boss_ganon2.c +++ b/soh/src/overlays/actors/ovl_Boss_Ganon2/z_boss_ganon2.c @@ -1856,7 +1856,7 @@ void func_8090120C(BossGanon2* this, PlayState* play) { break; } case 20: - play->nextEntranceIndex = 0x6B; + play->nextEntranceIndex = ENTR_CHAMBER_OF_THE_SAGES_0; gSaveContext.nextCutsceneIndex = 0xFFF2; play->transitionTrigger = TRANS_TRIGGER_START; play->transitionType = TRANS_TYPE_FADE_WHITE; diff --git a/soh/src/overlays/actors/ovl_Demo_Effect/z_demo_effect.c b/soh/src/overlays/actors/ovl_Demo_Effect/z_demo_effect.c index 7125984e2..149c176c7 100644 --- a/soh/src/overlays/actors/ovl_Demo_Effect/z_demo_effect.c +++ b/soh/src/overlays/actors/ovl_Demo_Effect/z_demo_effect.c @@ -332,7 +332,7 @@ void DemoEffect_Init(Actor* thisx, PlayState* play2) { break; case DEMO_EFFECT_GOD_LGT_NAYRU: - if (gSaveContext.entranceIndex == 0x013D) { + if (gSaveContext.entranceIndex == ENTR_DEATH_MOUNTAIN_TRAIL_0) { Actor_SetScale(&this->actor, 1.0f); } else { Actor_SetScale(&this->actor, 0.1f); @@ -353,7 +353,7 @@ void DemoEffect_Init(Actor* thisx, PlayState* play2) { break; case DEMO_EFFECT_GOD_LGT_FARORE: - if (gSaveContext.entranceIndex == 0x00EE) { + if (gSaveContext.entranceIndex == ENTR_KOKIRI_FOREST_0) { Actor_SetScale(&this->actor, 2.4f); } else { Actor_SetScale(&this->actor, 0.1f); @@ -635,7 +635,7 @@ void DemoEffect_UpdateGetItem(DemoEffect* this, PlayState* play) { Actor_SetScale(thisx, 0.20f); - if (gSaveContext.entranceIndex == 0x0053 || (IS_RANDO && gSaveContext.entranceIndex == 0x05F4)) { + if (gSaveContext.entranceIndex == ENTR_TEMPLE_OF_TIME_0 || (IS_RANDO && gSaveContext.entranceIndex == ENTR_TEMPLE_OF_TIME_7)) { switch (play->csCtx.npcActions[this->csActionId]->action) { case 2: DemoEffect_MedalSparkle(this, play, 0); @@ -647,8 +647,8 @@ void DemoEffect_UpdateGetItem(DemoEffect* this, PlayState* play) { } switch (play->csCtx.npcActions[this->csActionId]->action) { case 2: - if (gSaveContext.entranceIndex == 0x0053 || - (IS_RANDO && gSaveContext.entranceIndex == 0x05F4)) { + if (gSaveContext.entranceIndex == ENTR_TEMPLE_OF_TIME_0 || + (IS_RANDO && gSaveContext.entranceIndex == ENTR_TEMPLE_OF_TIME_7)) { Audio_PlayActorSound2(thisx, NA_SE_EV_MEDAL_APPEAR_L - SFX_FLAG); } else { func_800788CC(NA_SE_EV_MEDAL_APPEAR_S - SFX_FLAG); @@ -663,8 +663,8 @@ void DemoEffect_UpdateGetItem(DemoEffect* this, PlayState* play) { if (this->getItem.drawId != GID_ARROW_LIGHT) { this->actor.shape.rot.y += this->getItem.rotation; } - if (gSaveContext.entranceIndex == 0x0053 || - (IS_RANDO && gSaveContext.entranceIndex == 0x05F4)) { + if (gSaveContext.entranceIndex == ENTR_TEMPLE_OF_TIME_0 || + (IS_RANDO && gSaveContext.entranceIndex == ENTR_TEMPLE_OF_TIME_7)) { Audio_PlayActorSound2(thisx, NA_SE_EV_MEDAL_APPEAR_L - SFX_FLAG); } else { func_800788CC(NA_SE_EV_MEDAL_APPEAR_S - SFX_FLAG); @@ -703,7 +703,7 @@ void DemoEffect_InitTimeWarp(DemoEffect* this, PlayState* play) { Actor_SetScale(&this->actor, 84 * 0.001f); } } else if (gSaveContext.sceneSetupIndex == 5 || gSaveContext.sceneSetupIndex == 4 || - (gSaveContext.entranceIndex == 0x0324 && !((Flags_GetEventChkInf(EVENTCHKINF_TIME_TRAVELED_TO_ADULT))))) { + (gSaveContext.entranceIndex == ENTR_TEMPLE_OF_TIME_4 && !((Flags_GetEventChkInf(EVENTCHKINF_TIME_TRAVELED_TO_ADULT))))) { SkelCurve_SetAnim(&this->skelCurve, &gTimeWarpAnim, 1.0f, 59.0f, 59.0f, 0.0f); SkelCurve_Update(play, &this->skelCurve); this->updateFunc = DemoEffect_UpdateTimeWarpReturnFromChamberOfSages; @@ -766,7 +766,7 @@ void DemoEffect_UpdateTimeWarpReturnFromChamberOfSages(DemoEffect* this, PlaySta this->timeWarp.shrinkTimer++; if (this->timeWarp.shrinkTimer > 250) { - if (gSaveContext.entranceIndex == 0x0324) { + if (gSaveContext.entranceIndex == ENTR_TEMPLE_OF_TIME_4) { Flags_SetEventChkInf(EVENTCHKINF_TIME_TRAVELED_TO_ADULT); } @@ -858,7 +858,7 @@ void DemoEffect_UpdateTriforceSpot(DemoEffect* this, PlayState* play) { } } - if (gSaveContext.entranceIndex == 0x00A0 && gSaveContext.sceneSetupIndex == 6 && + if (gSaveContext.entranceIndex == ENTR_CUTSCENE_MAP_0 && gSaveContext.sceneSetupIndex == 6 && play->csCtx.frames == 143) { Audio_PlayActorSound2(&this->actor, NA_SE_IT_DM_RING_EXPLOSION); } @@ -1153,7 +1153,7 @@ void DemoEffect_UpdateGodLgtDin(DemoEffect* this, PlayState* play) { } } - if (gSaveContext.entranceIndex == 0x00A0) { + if (gSaveContext.entranceIndex == ENTR_CUTSCENE_MAP_0) { switch (gSaveContext.sceneSetupIndex) { case 4: if (play->csCtx.frames == 288) { @@ -1208,7 +1208,7 @@ void DemoEffect_UpdateGodLgtNayru(DemoEffect* this, PlayState* play) { } } - if (gSaveContext.entranceIndex == 0x00A0) { + if (gSaveContext.entranceIndex == ENTR_CUTSCENE_MAP_0) { switch (gSaveContext.sceneSetupIndex) { case 4: if (play->csCtx.frames == 298) { @@ -1230,7 +1230,7 @@ void DemoEffect_UpdateGodLgtNayru(DemoEffect* this, PlayState* play) { } } - if (gSaveContext.entranceIndex == 0x013D && gSaveContext.sceneSetupIndex == 4) { + if (gSaveContext.entranceIndex == ENTR_DEATH_MOUNTAIN_TRAIL_0 && gSaveContext.sceneSetupIndex == 4) { if (play->csCtx.frames == 72) { Audio_PlayActorSound2(&this->actor, NA_SE_IT_DM_FLYING_GOD_DASH); } @@ -1268,7 +1268,7 @@ void DemoEffect_UpdateGodLgtFarore(DemoEffect* this, PlayState* play) { func_800F3F3C(3); } - if (gSaveContext.entranceIndex == 0x00A0) { + if (gSaveContext.entranceIndex == ENTR_CUTSCENE_MAP_0) { switch (gSaveContext.sceneSetupIndex) { case 4: if (play->csCtx.frames == 315) { @@ -1614,15 +1614,15 @@ void DemoEffect_UpdateJewelChild(DemoEffect* this, PlayState* play) { return; default: DemoEffect_MoveToCsEndpoint(this, play, this->csActionId, 0); - if (gSaveContext.entranceIndex == 0x0053 || - (IS_RANDO && gSaveContext.entranceIndex == 0x05F4)) { + if (gSaveContext.entranceIndex == ENTR_TEMPLE_OF_TIME_0 || + (IS_RANDO && gSaveContext.entranceIndex == ENTR_TEMPLE_OF_TIME_7)) { DemoEffect_MoveJewelSplit(&thisx->world, this); } break; } } - if (gSaveContext.entranceIndex == 0x0053 || (IS_RANDO && gSaveContext.entranceIndex == 0x05F4)) { + if (gSaveContext.entranceIndex == ENTR_TEMPLE_OF_TIME_0 || (IS_RANDO && gSaveContext.entranceIndex == ENTR_TEMPLE_OF_TIME_7)) { if (!Flags_GetEventChkInf(EVENTCHKINF_OPENED_THE_DOOR_OF_TIME)) { hasCmdAction = play->csCtx.state && play->csCtx.npcActions[this->csActionId]; if (!hasCmdAction) { @@ -1859,7 +1859,7 @@ void DemoEffect_DrawGodLgt(Actor* thisx, PlayState* play) { OPEN_DISPS(play->state.gfxCtx); if (!DemoEffect_CheckCsAction(this, play, 2)) { - if (gSaveContext.entranceIndex == 0x00A0) { + if (gSaveContext.entranceIndex == ENTR_CUTSCENE_MAP_0) { if (gSaveContext.sceneSetupIndex == 4) { if (play->csCtx.frames <= 680) { func_80078914(&this->actor.projectedPos, NA_SE_EV_GOD_FLYING - SFX_FLAG); @@ -2021,7 +2021,7 @@ void DemoEffect_DrawTriforceSpot(Actor* thisx, PlayState* play) { u32 frames = play->gameplayFrames; OPEN_DISPS(play->state.gfxCtx); - if (gSaveContext.entranceIndex != 0x0400 || play->csCtx.frames < 885) { + if (gSaveContext.entranceIndex != ENTR_CASTLE_COURTYARD_ZELDA_0 || play->csCtx.frames < 885) { Gfx_SetupDL_25Xlu(play->state.gfxCtx); if (this->triforceSpot.lightColumnOpacity > 0) { @@ -2137,7 +2137,7 @@ void DemoEffect_DrawTimeWarp(Actor* thisx, PlayState* play) { u8 effectType = (this->actor.params & 0x00FF); if (effectType == DEMO_EFFECT_TIMEWARP_TIMEBLOCK_LARGE || effectType == DEMO_EFFECT_TIMEWARP_TIMEBLOCK_SMALL || - Flags_GetEnv(play, 1) || gSaveContext.sceneSetupIndex >= 4 || gSaveContext.entranceIndex == 0x0324) { + Flags_GetEnv(play, 1) || gSaveContext.sceneSetupIndex >= 4 || gSaveContext.entranceIndex == ENTR_TEMPLE_OF_TIME_4) { OPEN_DISPS(gfxCtx); POLY_XLU_DISP = Gfx_SetupDL(POLY_XLU_DISP, 25); Matrix_Scale(2.0f, 2.0f, 2.0f, MTXMODE_APPLY); diff --git a/soh/src/overlays/actors/ovl_Demo_Im/z_demo_im.c b/soh/src/overlays/actors/ovl_Demo_Im/z_demo_im.c index 9111db025..4ddeec155 100644 --- a/soh/src/overlays/actors/ovl_Demo_Im/z_demo_im.c +++ b/soh/src/overlays/actors/ovl_Demo_Im/z_demo_im.c @@ -869,9 +869,9 @@ void func_80986B2C(PlayState* play) { // In entrance rando have impa bring link back to the front of castle grounds if (IS_RANDO && Randomizer_GetSettingValue(RSK_SHUFFLE_OVERWORLD_ENTRANCES)) { - play->nextEntranceIndex = 0x0138; + play->nextEntranceIndex = ENTR_HYRULE_CASTLE_0; } else { - play->nextEntranceIndex = 0xCD; + play->nextEntranceIndex = ENTR_HYRULE_FIELD_0; } play->transitionType = TRANS_TYPE_CIRCLE(TCA_STARBURST, TCC_BLACK, TCS_FAST); play->transitionTrigger = TRANS_TRIGGER_START; @@ -918,9 +918,9 @@ void GivePlayerRandoRewardImpa(Actor* impa, PlayState* play, RandomizerCheck che gSaveContext.nextTransitionType = TRANS_TYPE_FADE_WHITE; // In entrance rando have impa bring link back to the front of castle grounds if (Randomizer_GetSettingValue(RSK_SHUFFLE_OVERWORLD_ENTRANCES)) { - play->nextEntranceIndex = 0x0138; + play->nextEntranceIndex = ENTR_HYRULE_CASTLE_0; } else { - play->nextEntranceIndex = 0x0594; + play->nextEntranceIndex = ENTR_HYRULE_FIELD_17; } gSaveContext.nextCutsceneIndex = 0; } diff --git a/soh/src/overlays/actors/ovl_Demo_Kankyo/z_demo_kankyo.c b/soh/src/overlays/actors/ovl_Demo_Kankyo/z_demo_kankyo.c index daa843d16..89628cc34 100644 --- a/soh/src/overlays/actors/ovl_Demo_Kankyo/z_demo_kankyo.c +++ b/soh/src/overlays/actors/ovl_Demo_Kankyo/z_demo_kankyo.c @@ -549,7 +549,7 @@ void DemoKankyo_DrawRain(Actor* thisx, PlayState* play) { switch (this->unk_150[i].unk_22) { case 0: func_80989B54(thisx, play, i); - if (gSaveContext.entranceIndex == 0x00A0) { // Cutscene Map + if (gSaveContext.entranceIndex == ENTR_CUTSCENE_MAP_0) { // Cutscene Map this->unk_150[i].unk_0.y = Rand_ZeroOne() * 500.0f; } else { this->unk_150[i].unk_0.y = Rand_ZeroOne() * -500.0f; @@ -558,16 +558,16 @@ void DemoKankyo_DrawRain(Actor* thisx, PlayState* play) { break; case 1: temp_f12_2 = play->view.eye.y + (dy / norm) * 150.0f; - if (gSaveContext.entranceIndex == 0x00A0) { // Cutscene Map + if (gSaveContext.entranceIndex == ENTR_CUTSCENE_MAP_0) { // Cutscene Map this->unk_150[i].unk_0.y -= this->unk_150[i].unk_18; } else { this->unk_150[i].unk_0.y += this->unk_150[i].unk_18; } - if (gSaveContext.entranceIndex == 0x00A0) { // Cutscene Map + if (gSaveContext.entranceIndex == ENTR_CUTSCENE_MAP_0) { // Cutscene Map if (this->unk_150[i].unk_C.y + this->unk_150[i].unk_0.y < temp_f12_2 - 300.0f) { this->unk_150[i].unk_22++; } - } else if (gSaveContext.entranceIndex == 0x00CD) { // Hyrule Field + } else if (gSaveContext.entranceIndex == ENTR_HYRULE_FIELD_0) { // Hyrule Field if (temp_f12_2 + 300.0f < this->unk_150[i].unk_C.y + this->unk_150[i].unk_0.y) { this->unk_150[i].unk_22++; } @@ -586,12 +586,12 @@ void DemoKankyo_DrawRain(Actor* thisx, PlayState* play) { Matrix_Translate(this->unk_150[i].unk_C.x + this->unk_150[i].unk_0.x, this->unk_150[i].unk_C.y + this->unk_150[i].unk_0.y, this->unk_150[i].unk_C.z + this->unk_150[i].unk_0.z, MTXMODE_NEW); - if (gSaveContext.entranceIndex != 0x00A0) { // Cutscene Map + if (gSaveContext.entranceIndex != ENTR_CUTSCENE_MAP_0) { // Cutscene Map Matrix_RotateX(M_PI, MTXMODE_APPLY); } gDPPipeSync(POLY_XLU_DISP++); - if (gSaveContext.entranceIndex == 0x00CD) { // Hyrule Field + if (gSaveContext.entranceIndex == ENTR_HYRULE_FIELD_0) { // Hyrule Field gDPSetPrimColor(POLY_XLU_DISP++, 0, 0, 255, 255, 255, 255); gDPSetEnvColor(POLY_XLU_DISP++, 255, 255, 0, 255); } else { diff --git a/soh/src/overlays/actors/ovl_Door_Ana/z_door_ana.c b/soh/src/overlays/actors/ovl_Door_Ana/z_door_ana.c index 8cb0f0cde..f3c601fa1 100644 --- a/soh/src/overlays/actors/ovl_Door_Ana/z_door_ana.c +++ b/soh/src/overlays/actors/ovl_Door_Ana/z_door_ana.c @@ -57,9 +57,10 @@ static ColliderCylinderInit sCylinderInit = { }; // array of entrance table entries to grotto destinations -static s16 entrances[] = { - 0x036D, 0x003F, 0x0598, 0x059C, 0x05A0, 0x05A4, 0x05A8, 0x05AC, - 0x05B0, 0x05B4, 0x05B8, 0x05BC, 0x05C0, 0x05C4, 0x05FC, +static s16 sGrottoEntrances[] = { + ENTR_FAIRYS_FOUNTAIN_0, ENTR_GROTTOS_0, ENTR_GROTTOS_1, ENTR_GROTTOS_2, ENTR_GROTTOS_3, + ENTR_GROTTOS_4, ENTR_GROTTOS_5, ENTR_GROTTOS_6, ENTR_GROTTOS_7, ENTR_GROTTOS_8, + ENTR_GROTTOS_9, ENTR_GROTTOS_10, ENTR_GROTTOS_11, ENTR_GROTTOS_12, ENTR_GROTTOS_13, }; void DoorAna_SetupAction(DoorAna* this, DoorAnaActionFunc actionFunc) { @@ -143,7 +144,7 @@ void DoorAna_WaitOpen(DoorAna* this, PlayState* play) { if (destinationIdx < 0) { destinationIdx = this->actor.home.rot.z + 1; } - play->nextEntranceIndex = entrances[destinationIdx]; + play->nextEntranceIndex = sGrottoEntrances[destinationIdx]; // In ER, load the correct entrance based on the grotto link is falling into if (IS_RANDO && Randomizer_GetSettingValue(RSK_SHUFFLE_ENTRANCES)) { diff --git a/soh/src/overlays/actors/ovl_Door_Warp1/z_door_warp1.c b/soh/src/overlays/actors/ovl_Door_Warp1/z_door_warp1.c index b260b57c9..5ea64e232 100644 --- a/soh/src/overlays/actors/ovl_Door_Warp1/z_door_warp1.c +++ b/soh/src/overlays/actors/ovl_Door_Warp1/z_door_warp1.c @@ -177,11 +177,11 @@ void DoorWarp1_SetupWarp(DoorWarp1* this, PlayState* play) { DoorWarp1_SetupAction(this, DoorWarp1_AwaitClearFlag); break; case WARP_DESTINATION: - if ((!(gSaveContext.entranceIndex == 0x608 || // sacred forest meadow - gSaveContext.entranceIndex == 0x564 || // death mountain crater - gSaveContext.entranceIndex == 0x60C || // lake hylia - gSaveContext.entranceIndex == 0x610 || // desert colossus - gSaveContext.entranceIndex == 0x580) && // graveyard + if ((!(gSaveContext.entranceIndex == ENTR_SACRED_FOREST_MEADOW_3 || // sacred forest meadow + gSaveContext.entranceIndex == ENTR_DEATH_MOUNTAIN_CRATER_5 || // death mountain crater + gSaveContext.entranceIndex == ENTR_LAKE_HYLIA_9 || // lake hylia + gSaveContext.entranceIndex == ENTR_DESERT_COLOSSUS_8 || // desert colossus + gSaveContext.entranceIndex == ENTR_GRAVEYARD_8) && // graveyard gSaveContext.sceneSetupIndex < 4) || (GET_PLAYER(play)->actor.params & 0xF00) != 0x200) { Actor_Kill(&this->actor); @@ -283,7 +283,7 @@ void DoorWarp1_SetupPurpleCrystal(DoorWarp1* this, PlayState* play) { this->unk_1BC = 1.f; this->actor.shape.yOffset = 800.0f; - if (gSaveContext.entranceIndex != 0x53) { + if (gSaveContext.entranceIndex != ENTR_TEMPLE_OF_TIME_0) { this->actor.scale.x = 0.0499f; this->actor.scale.y = 0.077f; this->actor.scale.z = 0.09f; @@ -574,15 +574,15 @@ void DoorWarp1_ChildWarpOut(DoorWarp1* this, PlayState* play) { Flags_SetEventChkInf(EVENTCHKINF_USED_DODONGOS_CAVERN_BLUE_WARP); Flags_SetRandomizerInf(RAND_INF_DUNGEONS_DONE_DODONGOS_CAVERN); if (IS_RANDO) { - play->nextEntranceIndex = 0x47A; + play->nextEntranceIndex = ENTR_DEATH_MOUNTAIN_TRAIL_5; gSaveContext.nextCutsceneIndex = 0; } else { Item_Give(play, ITEM_GORON_RUBY); - play->nextEntranceIndex = 0x13D; + play->nextEntranceIndex = ENTR_DEATH_MOUNTAIN_TRAIL_0; gSaveContext.nextCutsceneIndex = 0xFFF1; } } else { - play->nextEntranceIndex = 0x47A; + play->nextEntranceIndex = ENTR_DEATH_MOUNTAIN_TRAIL_5; gSaveContext.nextCutsceneIndex = 0; } } else if (play->sceneNum == SCENE_DEKU_TREE_BOSS) { @@ -591,21 +591,21 @@ void DoorWarp1_ChildWarpOut(DoorWarp1* this, PlayState* play) { Flags_SetEventChkInf(EVENTCHKINF_USED_DEKU_TREE_BLUE_WARP); Flags_SetRandomizerInf(RAND_INF_DUNGEONS_DONE_DEKU_TREE); if (IS_RANDO) { - play->nextEntranceIndex = 0x0457; + play->nextEntranceIndex = ENTR_KOKIRI_FOREST_11; gSaveContext.nextCutsceneIndex = 0; // Skip Mido complaining about dead Deku tree Flags_SetEventChkInf(EVENTCHKINF_SPOKE_TO_MIDO_AFTER_DEKU_TREES_DEATH); } else { Item_Give(play, ITEM_KOKIRI_EMERALD); - play->nextEntranceIndex = 0xEE; + play->nextEntranceIndex = ENTR_KOKIRI_FOREST_0; gSaveContext.nextCutsceneIndex = 0xFFF1; } } else { - play->nextEntranceIndex = 0x457; + play->nextEntranceIndex = ENTR_KOKIRI_FOREST_11; gSaveContext.nextCutsceneIndex = 0; } } else if (play->sceneNum == SCENE_JABU_JABU_BOSS) { - play->nextEntranceIndex = 0x10E; + play->nextEntranceIndex = ENTR_ZORAS_FOUNTAIN_0; gSaveContext.nextCutsceneIndex = 0; } @@ -708,11 +708,11 @@ void DoorWarp1_RutoWarpOut(DoorWarp1* this, PlayState* play) { Flags_SetRandomizerInf(RAND_INF_DUNGEONS_DONE_JABU_JABUS_BELLY); if (IS_RANDO) { - play->nextEntranceIndex = 0x10E; + play->nextEntranceIndex = ENTR_ZORAS_FOUNTAIN_0; gSaveContext.nextCutsceneIndex = 0; } else { Item_Give(play, ITEM_ZORA_SAPPHIRE); - play->nextEntranceIndex = 0x10E; + play->nextEntranceIndex = ENTR_ZORAS_FOUNTAIN_0; gSaveContext.nextCutsceneIndex = 0xFFF0; } @@ -834,19 +834,19 @@ void DoorWarp1_AdultWarpOut(DoorWarp1* this, PlayState* play) { Flags_SetRandomizerInf(RAND_INF_DUNGEONS_DONE_FOREST_TEMPLE); if (IS_RANDO) { - play->nextEntranceIndex = 0x608; + play->nextEntranceIndex = ENTR_SACRED_FOREST_MEADOW_3; gSaveContext.nextCutsceneIndex = 0; } else { Item_Give(play, ITEM_MEDALLION_FOREST); - play->nextEntranceIndex = 0x6B; + play->nextEntranceIndex = ENTR_CHAMBER_OF_THE_SAGES_0; gSaveContext.nextCutsceneIndex = 0; gSaveContext.chamberCutsceneNum = CHAMBER_CS_FOREST; } } else { if (!LINK_IS_ADULT) { - play->nextEntranceIndex = 0x600; + play->nextEntranceIndex = ENTR_SACRED_FOREST_MEADOW_2; } else { - play->nextEntranceIndex = 0x608; + play->nextEntranceIndex = ENTR_SACRED_FOREST_MEADOW_3; } gSaveContext.nextCutsceneIndex = 0; } @@ -856,20 +856,20 @@ void DoorWarp1_AdultWarpOut(DoorWarp1* this, PlayState* play) { Flags_SetRandomizerInf(RAND_INF_DUNGEONS_DONE_FIRE_TEMPLE); if (IS_RANDO) { - play->nextEntranceIndex = 0x564; + play->nextEntranceIndex = ENTR_DEATH_MOUNTAIN_CRATER_5; gSaveContext.nextCutsceneIndex = 0; // Change Death Mountain cloud since we aren't warping to the cutscene Flags_SetEventChkInf(EVENTCHKINF_DEATH_MOUNTAIN_ERUPTED); } else { Item_Give(play, ITEM_MEDALLION_FIRE); - play->nextEntranceIndex = 0xDB; + play->nextEntranceIndex = ENTR_KAKARIKO_VILLAGE_0; gSaveContext.nextCutsceneIndex = 0xFFF3; } } else { if (!LINK_IS_ADULT) { - play->nextEntranceIndex = 0x4F6; + play->nextEntranceIndex = ENTR_DEATH_MOUNTAIN_CRATER_4; } else { - play->nextEntranceIndex = 0x564; + play->nextEntranceIndex = ENTR_DEATH_MOUNTAIN_CRATER_5; } gSaveContext.nextCutsceneIndex = 0; } @@ -879,21 +879,21 @@ void DoorWarp1_AdultWarpOut(DoorWarp1* this, PlayState* play) { Flags_SetRandomizerInf(RAND_INF_DUNGEONS_DONE_WATER_TEMPLE); if (IS_RANDO) { - play->nextEntranceIndex = 0x60C; + play->nextEntranceIndex = ENTR_LAKE_HYLIA_9; gSaveContext.nextCutsceneIndex = 0; // Fill Lake Hylia since we aren't warping to the cutscene Flags_SetEventChkInf(EVENTCHKINF_RAISED_LAKE_HYLIA_WATER); } else { Item_Give(play, ITEM_MEDALLION_WATER); - play->nextEntranceIndex = 0x6B; + play->nextEntranceIndex = ENTR_CHAMBER_OF_THE_SAGES_0; gSaveContext.nextCutsceneIndex = 0; gSaveContext.chamberCutsceneNum = CHAMBER_CS_WATER; } } else { if (!LINK_IS_ADULT) { - play->nextEntranceIndex = 0x604; + play->nextEntranceIndex = ENTR_LAKE_HYLIA_8; } else { - play->nextEntranceIndex = 0x60C; + play->nextEntranceIndex = ENTR_LAKE_HYLIA_9; } gSaveContext.nextCutsceneIndex = 0; } @@ -902,19 +902,19 @@ void DoorWarp1_AdultWarpOut(DoorWarp1* this, PlayState* play) { Flags_SetRandomizerInf(RAND_INF_DUNGEONS_DONE_SPIRIT_TEMPLE); if (IS_RANDO) { - play->nextEntranceIndex = 0x610; + play->nextEntranceIndex = ENTR_DESERT_COLOSSUS_8; gSaveContext.nextCutsceneIndex = 0; } else { Item_Give(play, ITEM_MEDALLION_SPIRIT); - play->nextEntranceIndex = 0x6B; + play->nextEntranceIndex = ENTR_CHAMBER_OF_THE_SAGES_0; gSaveContext.nextCutsceneIndex = 0; gSaveContext.chamberCutsceneNum = CHAMBER_CS_SPIRIT; } } else { if (!LINK_IS_ADULT) { - play->nextEntranceIndex = 0x1F1; + play->nextEntranceIndex = ENTR_DESERT_COLOSSUS_5; } else { - play->nextEntranceIndex = 0x610; + play->nextEntranceIndex = ENTR_DESERT_COLOSSUS_8; } gSaveContext.nextCutsceneIndex = 0; } @@ -923,19 +923,19 @@ void DoorWarp1_AdultWarpOut(DoorWarp1* this, PlayState* play) { Flags_SetRandomizerInf(RAND_INF_DUNGEONS_DONE_SHADOW_TEMPLE); if (IS_RANDO) { - play->nextEntranceIndex = 0x580; + play->nextEntranceIndex = ENTR_GRAVEYARD_8; gSaveContext.nextCutsceneIndex = 0; } else { Item_Give(play, ITEM_MEDALLION_SHADOW); - play->nextEntranceIndex = 0x6B; + play->nextEntranceIndex = ENTR_CHAMBER_OF_THE_SAGES_0; gSaveContext.nextCutsceneIndex = 0; gSaveContext.chamberCutsceneNum = CHAMBER_CS_SHADOW; } } else { if (!LINK_IS_ADULT) { - play->nextEntranceIndex = 0x568; + play->nextEntranceIndex = ENTR_GRAVEYARD_7; } else { - play->nextEntranceIndex = 0x580; + play->nextEntranceIndex = ENTR_GRAVEYARD_8; } gSaveContext.nextCutsceneIndex = 0; } diff --git a/soh/src/overlays/actors/ovl_En_Box/z_en_box.c b/soh/src/overlays/actors/ovl_En_Box/z_en_box.c index 9e8705c33..e4cccb501 100644 --- a/soh/src/overlays/actors/ovl_En_Box/z_en_box.c +++ b/soh/src/overlays/actors/ovl_En_Box/z_en_box.c @@ -449,7 +449,7 @@ void EnBox_WaitOpen(EnBox* this, PlayState* play) { // treasure chest game rando if (Randomizer_GetSettingValue(RSK_SHUFFLE_CHEST_MINIGAME)) { - if (IS_RANDO && play->sceneNum == 16 && (this->dyna.actor.params & 0x60) != 0x20) { + if (IS_RANDO && play->sceneNum == SCENE_TREASURE_BOX_SHOP && (this->dyna.actor.params & 0x60) != 0x20) { if((this->dyna.actor.params & 0xF) < 2) { Flags_SetCollectible(play, 0x1B); } @@ -477,7 +477,7 @@ void EnBox_WaitOpen(EnBox* this, PlayState* play) { // RANDOTODO treasure chest game rando if (Randomizer_GetSettingValue(RSK_SHUFFLE_CHEST_MINIGAME)) { - if (IS_RANDO && play->sceneNum == 16 && (this->dyna.actor.params & 0x60) != 0x20) { + if (IS_RANDO && play->sceneNum == SCENE_TREASURE_BOX_SHOP && (this->dyna.actor.params & 0x60) != 0x20) { if((this->dyna.actor.params & 0xF) < 2) { if(Flags_GetCollectible(play, 0x1B)) { sItem = blueRupee; diff --git a/soh/src/overlays/actors/ovl_En_Du/z_en_du.c b/soh/src/overlays/actors/ovl_En_Du/z_en_du.c index acd64e308..fdca797cc 100644 --- a/soh/src/overlays/actors/ovl_En_Du/z_en_du.c +++ b/soh/src/overlays/actors/ovl_En_Du/z_en_du.c @@ -299,7 +299,7 @@ void EnDu_Init(Actor* thisx, PlayState* play) { play->csCtx.segment = SEGMENTED_TO_VIRTUAL(gGoronCityDarunia01Cs); gSaveContext.cutsceneTrigger = 1; EnDu_SetupAction(this, func_809FE890); - } else if (play->sceneNum == 4) { + } else if (play->sceneNum == SCENE_FIRE_TEMPLE) { EnDu_SetupAction(this, func_809FE638); } else if (!LINK_IS_ADULT) { EnDu_SetupAction(this, func_809FE3C0); diff --git a/soh/src/overlays/actors/ovl_En_Ex_Item/z_en_ex_item.c b/soh/src/overlays/actors/ovl_En_Ex_Item/z_en_ex_item.c index 8d8c2c543..a3a196e31 100644 --- a/soh/src/overlays/actors/ovl_En_Ex_Item/z_en_ex_item.c +++ b/soh/src/overlays/actors/ovl_En_Ex_Item/z_en_ex_item.c @@ -244,7 +244,7 @@ void EnExItem_WaitForObject(EnExItem* this, PlayState* play) { break; } } else { - if (play->sceneNum == 16) { + if (play->sceneNum == SCENE_TREASURE_BOX_SHOP) { this->giDrawId = GetChestGameRandoGiDrawId(play->roomCtx.curRoom.num, GID_RUPEE_GREEN, play); } } diff --git a/soh/src/overlays/actors/ovl_En_Ge1/z_en_ge1.c b/soh/src/overlays/actors/ovl_En_Ge1/z_en_ge1.c index 5e3341260..1ad8f4867 100644 --- a/soh/src/overlays/actors/ovl_En_Ge1/z_en_ge1.c +++ b/soh/src/overlays/actors/ovl_En_Ge1/z_en_ge1.c @@ -262,11 +262,11 @@ void EnGe1_KickPlayer(EnGe1* this, PlayState* play) { func_8006D074(play); if ((INV_CONTENT(ITEM_HOOKSHOT) == ITEM_NONE) || (INV_CONTENT(ITEM_LONGSHOT) == ITEM_NONE)) { - play->nextEntranceIndex = 0x1A5; + play->nextEntranceIndex = ENTR_GERUDO_VALLEY_1; } else if (Flags_GetEventChkInf(EVENTCHKINF_WATCHED_GANONS_CASTLE_COLLAPSE_CAUGHT_BY_GERUDO)) { // Caught previously - play->nextEntranceIndex = 0x5F8; + play->nextEntranceIndex = ENTR_GERUDOS_FORTRESS_18; } else { - play->nextEntranceIndex = 0x3B4; + play->nextEntranceIndex = ENTR_GERUDOS_FORTRESS_17; } if (IS_RANDO) { @@ -654,7 +654,7 @@ void EnGe1_BeginGame_Archery(EnGe1* this, PlayState* play) { this->actionFunc = EnGe1_TalkTooPoor_Archery; } else { Rupees_ChangeBy(-20); - play->nextEntranceIndex = 0x129; + play->nextEntranceIndex = ENTR_GERUDOS_FORTRESS_0; gSaveContext.nextCutsceneIndex = 0xFFF0; play->transitionType = TRANS_TYPE_CIRCLE(TCA_STARBURST, TCC_BLACK, TCS_FAST); play->transitionTrigger = TRANS_TRIGGER_START; diff --git a/soh/src/overlays/actors/ovl_En_Ge2/z_en_ge2.c b/soh/src/overlays/actors/ovl_En_Ge2/z_en_ge2.c index b59d8b8bc..01e0e0176 100644 --- a/soh/src/overlays/actors/ovl_En_Ge2/z_en_ge2.c +++ b/soh/src/overlays/actors/ovl_En_Ge2/z_en_ge2.c @@ -252,11 +252,11 @@ void EnGe2_CaptureClose(EnGe2* this, PlayState* play) { func_8006D074(play); if ((INV_CONTENT(ITEM_HOOKSHOT) == ITEM_NONE) || (INV_CONTENT(ITEM_LONGSHOT) == ITEM_NONE)) { - play->nextEntranceIndex = 0x1A5; + play->nextEntranceIndex = ENTR_GERUDO_VALLEY_1; } else if (Flags_GetEventChkInf(EVENTCHKINF_WATCHED_GANONS_CASTLE_COLLAPSE_CAUGHT_BY_GERUDO)) { - play->nextEntranceIndex = 0x5F8; + play->nextEntranceIndex = ENTR_GERUDOS_FORTRESS_18; } else { - play->nextEntranceIndex = 0x3B4; + play->nextEntranceIndex = ENTR_GERUDOS_FORTRESS_17; } if (IS_RANDO) { @@ -282,11 +282,11 @@ void EnGe2_CaptureCharge(EnGe2* this, PlayState* play) { func_8006D074(play); if ((INV_CONTENT(ITEM_HOOKSHOT) == ITEM_NONE) || (INV_CONTENT(ITEM_LONGSHOT) == ITEM_NONE)) { - play->nextEntranceIndex = 0x1A5; + play->nextEntranceIndex = ENTR_GERUDO_VALLEY_1; } else if (Flags_GetEventChkInf(EVENTCHKINF_WATCHED_GANONS_CASTLE_COLLAPSE_CAUGHT_BY_GERUDO)) { - play->nextEntranceIndex = 0x5F8; + play->nextEntranceIndex = ENTR_GERUDOS_FORTRESS_18; } else { - play->nextEntranceIndex = 0x3B4; + play->nextEntranceIndex = ENTR_GERUDOS_FORTRESS_17; } if (IS_RANDO) { diff --git a/soh/src/overlays/actors/ovl_En_GeldB/z_en_geldb.c b/soh/src/overlays/actors/ovl_En_GeldB/z_en_geldb.c index 757d0b68c..4ed0e52ee 100644 --- a/soh/src/overlays/actors/ovl_En_GeldB/z_en_geldb.c +++ b/soh/src/overlays/actors/ovl_En_GeldB/z_en_geldb.c @@ -1568,11 +1568,11 @@ void EnGeldB_Draw(Actor* thisx, PlayState* play) { this->timer--; if (this->timer == 0) { if ((INV_CONTENT(ITEM_HOOKSHOT) == ITEM_NONE) || (INV_CONTENT(ITEM_LONGSHOT) == ITEM_NONE)) { - play->nextEntranceIndex = 0x1A5; + play->nextEntranceIndex = ENTR_GERUDO_VALLEY_1; } else if (Flags_GetEventChkInf(EVENTCHKINF_WATCHED_GANONS_CASTLE_COLLAPSE_CAUGHT_BY_GERUDO)) { - play->nextEntranceIndex = 0x5F8; + play->nextEntranceIndex = ENTR_GERUDOS_FORTRESS_18; } else { - play->nextEntranceIndex = 0x3B4; + play->nextEntranceIndex = ENTR_GERUDOS_FORTRESS_17; } if (IS_RANDO) { diff --git a/soh/src/overlays/actors/ovl_En_Heishi1/z_en_heishi1.c b/soh/src/overlays/actors/ovl_En_Heishi1/z_en_heishi1.c index dd5105d87..ed924dd3c 100644 --- a/soh/src/overlays/actors/ovl_En_Heishi1/z_en_heishi1.c +++ b/soh/src/overlays/actors/ovl_En_Heishi1/z_en_heishi1.c @@ -366,7 +366,7 @@ void EnHeishi1_Kick(EnHeishi1* this, PlayState* play) { Message_CloseTextbox(play); if (!this->loadStarted) { Flags_SetEventChkInf(EVENTCHKINF_CAUGHT_BY_CASTLE_GUARDS); - play->nextEntranceIndex = 0x4FA; + play->nextEntranceIndex = ENTR_HYRULE_CASTLE_3; play->transitionTrigger = TRANS_TRIGGER_START; this->loadStarted = true; sHeishi1PlayerIsCaught = false; diff --git a/soh/src/overlays/actors/ovl_En_Heishi3/z_en_heishi3.c b/soh/src/overlays/actors/ovl_En_Heishi3/z_en_heishi3.c index ab4027796..3ccc932ca 100644 --- a/soh/src/overlays/actors/ovl_En_Heishi3/z_en_heishi3.c +++ b/soh/src/overlays/actors/ovl_En_Heishi3/z_en_heishi3.c @@ -206,7 +206,7 @@ void func_80A55D00(EnHeishi3* this, PlayState* play) { if ((Message_GetState(&play->msgCtx) == TEXT_STATE_EVENT) && Message_ShouldAdvance(play) && (this->respawnFlag == 0)) { Flags_SetEventChkInf(EVENTCHKINF_CAUGHT_BY_CASTLE_GUARDS); - play->nextEntranceIndex = 0x47E; // Hyrule Castle from Guard Capture (outside) + play->nextEntranceIndex = ENTR_HYRULE_CASTLE_4; // Hyrule Castle from Guard Capture (outside) play->transitionTrigger = TRANS_TRIGGER_START; this->respawnFlag = 1; play->transitionType = TRANS_TYPE_CIRCLE(TCA_STARBURST, TCC_WHITE, TCS_FAST); diff --git a/soh/src/overlays/actors/ovl_En_Heishi4/z_en_heishi4.c b/soh/src/overlays/actors/ovl_En_Heishi4/z_en_heishi4.c index eb6e47ebe..391d7dc5d 100644 --- a/soh/src/overlays/actors/ovl_En_Heishi4/z_en_heishi4.c +++ b/soh/src/overlays/actors/ovl_En_Heishi4/z_en_heishi4.c @@ -358,9 +358,9 @@ void EnHeishi4_MarketSneak(EnHeishi4* this, PlayState* play) { switch (play->msgCtx.choiceIndex) { case 0: //yes if (IS_RANDO && Randomizer_GetSettingValue(RSK_SHUFFLE_OVERWORLD_ENTRANCES) != RO_GENERIC_OFF){ - play->nextEntranceIndex = Entrance_OverrideNextIndex(0x01FD); // Market Entrance -> HF + play->nextEntranceIndex = Entrance_OverrideNextIndex(ENTR_HYRULE_FIELD_7); // Market Entrance -> HF } else { - play->nextEntranceIndex = 0x00CD; // HF Near bridge (OoT cutscene entrance) to not fall in the water + play->nextEntranceIndex = ENTR_HYRULE_FIELD_0; // HF Near bridge (OoT cutscene entrance) to not fall in the water } play->transitionTrigger = TRANS_TRIGGER_START; play->transitionType = TRANS_TYPE_CIRCLE(TCA_STARBURST, TCC_WHITE, TCS_FAST); diff --git a/soh/src/overlays/actors/ovl_En_Holl/z_en_holl.c b/soh/src/overlays/actors/ovl_En_Holl/z_en_holl.c index f08b1f252..f996cdd5d 100644 --- a/soh/src/overlays/actors/ovl_En_Holl/z_en_holl.c +++ b/soh/src/overlays/actors/ovl_En_Holl/z_en_holl.c @@ -77,7 +77,7 @@ void EnHoll_SetupAction(EnHoll* this, EnHollActionFunc func) { } s32 EnHoll_IsKokiriSetup8() { - return gSaveContext.entranceIndex == 0x00EE && gSaveContext.sceneSetupIndex == 8; + return gSaveContext.entranceIndex == ENTR_KOKIRI_FOREST_0 && gSaveContext.sceneSetupIndex == 8; } void EnHoll_ChooseAction(EnHoll* this) { diff --git a/soh/src/overlays/actors/ovl_En_Horse/z_en_horse.c b/soh/src/overlays/actors/ovl_En_Horse/z_en_horse.c index 4024c2004..d8192be6c 100644 --- a/soh/src/overlays/actors/ovl_En_Horse/z_en_horse.c +++ b/soh/src/overlays/actors/ovl_En_Horse/z_en_horse.c @@ -2509,7 +2509,7 @@ void EnHorse_UpdateHorsebackArchery(EnHorse* this, PlayState* play) { if (this->hbaFlags & 1 || this->hbaTimer >= 46) { if (sp20 != 1 && gSaveContext.minigameState != 3) { gSaveContext.cutsceneIndex = 0; - play->nextEntranceIndex = 0x3B0; + play->nextEntranceIndex = ENTR_GERUDOS_FORTRESS_16; play->transitionTrigger = TRANS_TRIGGER_START; play->transitionType = TRANS_TYPE_CIRCLE(TCA_NORMAL, TCC_BLACK, TCS_FAST); } @@ -3581,7 +3581,7 @@ void EnHorse_Update(Actor* thisx, PlayState* play2) { this->cyl1.base.atFlags &= ~1; } - if (gSaveContext.entranceIndex != 343 || gSaveContext.sceneSetupIndex != 9) { + if (gSaveContext.entranceIndex != ENTR_LON_LON_RANCH_0 || gSaveContext.sceneSetupIndex != 9) { if (this->dustFlags & 1) { this->dustFlags &= ~1; func_800287AC(play, &this->frontRightHoof, &dustVel, &dustAcc, EnHorse_RandInt(100) + 200, diff --git a/soh/src/overlays/actors/ovl_En_Horse_Game_Check/z_en_horse_game_check.c b/soh/src/overlays/actors/ovl_En_Horse_Game_Check/z_en_horse_game_check.c index 179e4de75..0935eac86 100644 --- a/soh/src/overlays/actors/ovl_En_Horse_Game_Check/z_en_horse_game_check.c +++ b/soh/src/overlays/actors/ovl_En_Horse_Game_Check/z_en_horse_game_check.c @@ -110,7 +110,7 @@ s32 EnHorseGameCheck_DestroyIngoRace(EnHorseGameCheckBase* base, PlayState* play void EnHorseGameCheck_FinishIngoRace(EnHorseGameCheckIngoRace* this, PlayState* play) { gSaveContext.cutsceneIndex = 0; if (this->result == INGORACE_PLAYER_WIN) { - play->nextEntranceIndex = 0x4CE; + play->nextEntranceIndex = ENTR_LON_LON_RANCH_7; if (gSaveContext.eventInf[0] & 0x40) { gSaveContext.eventInf[0] = (gSaveContext.eventInf[0] & ~0xF) | 6; gSaveContext.eventInf[0] = (gSaveContext.eventInf[0] & ~0x8000) | 0x8000; @@ -123,7 +123,7 @@ void EnHorseGameCheck_FinishIngoRace(EnHorseGameCheckIngoRace* this, PlayState* play->transitionType = TRANS_TYPE_CIRCLE(TCA_STARBURST, TCC_WHITE, TCS_FAST); } } else { - play->nextEntranceIndex = 0x558; + play->nextEntranceIndex = ENTR_LON_LON_RANCH_8; gSaveContext.eventInf[0] = (gSaveContext.eventInf[0] & ~0xF) | 3; play->transitionType = TRANS_TYPE_CIRCLE(TCA_NORMAL, TCC_BLACK, TCS_FAST); gSaveContext.eventInf[0] = (gSaveContext.eventInf[0] & ~0x8000) | 0x8000; @@ -293,21 +293,21 @@ s32 EnHorseGameCheck_DestroyMalonRace(EnHorseGameCheckBase* base, PlayState* pla void EnHorseGameCheck_FinishMalonRace(EnHorseGameCheckMalonRace* this, PlayState* play) { if ((this->result == MALONRACE_SUCCESS) || (this->result == MALONRACE_TIME_UP)) { gSaveContext.cutsceneIndex = 0; - play->nextEntranceIndex = 0x4CE; + play->nextEntranceIndex = ENTR_LON_LON_RANCH_7; play->transitionType = TRANS_TYPE_CIRCLE(TCA_STARBURST, TCC_WHITE, TCS_FAST); play->transitionTrigger = TRANS_TRIGGER_START; } else if (this->result == MALONRACE_FAILURE) { gSaveContext.timer1Value = 240; gSaveContext.timer1State = 0xF; gSaveContext.cutsceneIndex = 0; - play->nextEntranceIndex = 0x4CE; + play->nextEntranceIndex = ENTR_LON_LON_RANCH_7; play->transitionType = TRANS_TYPE_CIRCLE(TCA_STARBURST, TCC_WHITE, TCS_FAST); play->transitionTrigger = TRANS_TRIGGER_START; } else { // "not supported" osSyncPrintf("En_HGC_Spot20_Ta_end():対応せず\n"); gSaveContext.cutsceneIndex = 0; - play->nextEntranceIndex = 0x157; + play->nextEntranceIndex = ENTR_LON_LON_RANCH_0; play->transitionType = TRANS_TYPE_CIRCLE(TCA_STARBURST, TCC_WHITE, TCS_FAST); play->transitionTrigger = TRANS_TRIGGER_START; } diff --git a/soh/src/overlays/actors/ovl_En_Horse_Link_Child/z_en_horse_link_child.c b/soh/src/overlays/actors/ovl_En_Horse_Link_Child/z_en_horse_link_child.c index d8d558855..b502a11e4 100644 --- a/soh/src/overlays/actors/ovl_En_Horse_Link_Child/z_en_horse_link_child.c +++ b/soh/src/overlays/actors/ovl_En_Horse_Link_Child/z_en_horse_link_child.c @@ -352,7 +352,7 @@ void func_80A6A068(EnHorseLinkChild* this, PlayState* play) { player = GET_PLAYER(play); distFromLink = Actor_WorldDistXZToActor(&this->actor, &player->actor); - if (gSaveContext.entranceIndex == 0x2AE) { + if (gSaveContext.entranceIndex == ENTR_LON_LON_RANCH_1) { Audio_PlaySoundGeneral(NA_SE_EV_KID_HORSE_NEIGH, &this->actor.projectedPos, 4, &D_801333E0, &D_801333E0, &D_801333E8); func_80A6A724(this); diff --git a/soh/src/overlays/actors/ovl_En_In/z_en_in.c b/soh/src/overlays/actors/ovl_En_In/z_en_in.c index c55d44926..dd8b52fcc 100644 --- a/soh/src/overlays/actors/ovl_En_In/z_en_in.c +++ b/soh/src/overlays/actors/ovl_En_In/z_en_in.c @@ -426,7 +426,7 @@ void func_80A79AB4(EnIn* this, PlayState* play) { } void func_80A79BAC(EnIn* this, PlayState* play, s32 index, u32 transitionType) { - s16 entrances[] = { 0x0558, 0x04CA, 0x0157 }; + s16 entrances[] = { ENTR_LON_LON_RANCH_8, ENTR_LON_LON_RANCH_6, ENTR_LON_LON_RANCH_0 }; play->nextEntranceIndex = entrances[index]; if (index == 2) { @@ -870,7 +870,7 @@ void func_80A7AEF0(EnIn* this, PlayState* play) { pos.z += 90.0f * Math_CosS(this->actor.shape.rot.y); yaw = Math_Vec3f_Yaw(&pos, &player->actor.world.pos); if (ABS(yaw) > 0x4000) { - play->nextEntranceIndex = 0x0476; + play->nextEntranceIndex = ENTR_HYRULE_FIELD_15; play->transitionTrigger = TRANS_TRIGGER_START; play->transitionType = TRANS_TYPE_FADE_WHITE_FAST; this->actionFunc = func_80A7B018; diff --git a/soh/src/overlays/actors/ovl_En_Ishi/z_en_ishi.c b/soh/src/overlays/actors/ovl_En_Ishi/z_en_ishi.c index b933aec84..af10aa086 100644 --- a/soh/src/overlays/actors/ovl_En_Ishi/z_en_ishi.c +++ b/soh/src/overlays/actors/ovl_En_Ishi/z_en_ishi.c @@ -334,7 +334,7 @@ void EnIshi_Init(Actor* thisx, PlayState* play) { // block child Link from reaching the Fire Temple entrance. if (type == ROCK_LARGE && IS_RANDO && Randomizer_GetSettingValue(RSK_SHUFFLE_DUNGEON_ENTRANCES) != RO_DUNGEON_ENTRANCE_SHUFFLE_OFF && - play->sceneNum == 0x061) { // Death Mountain Creater + play->sceneNum == SCENE_DEATH_MOUNTAIN_CRATER) { // Death Mountain Creater Actor_Kill(&this->actor); } EnIshi_SetupWait(this); diff --git a/soh/src/overlays/actors/ovl_En_Jsjutan/z_en_jsjutan.c b/soh/src/overlays/actors/ovl_En_Jsjutan/z_en_jsjutan.c index 926787cc3..9140023ce 100644 --- a/soh/src/overlays/actors/ovl_En_Jsjutan/z_en_jsjutan.c +++ b/soh/src/overlays/actors/ovl_En_Jsjutan/z_en_jsjutan.c @@ -151,7 +151,7 @@ void func_80A89A6C(EnJsjutan* this, PlayState* play) { i = 1; // Credits scene. The magic carpet man is friends with the bean guy and the lakeside professor. - if ((gSaveContext.entranceIndex == 0x157) && (gSaveContext.sceneSetupIndex == 8)) { + if ((gSaveContext.entranceIndex == ENTR_LON_LON_RANCH_0) && (gSaveContext.sceneSetupIndex == 8)) { isInCreditsScene = true; actorProfessor = play->actorCtx.actorLists[ACTORCAT_NPC].head; diff --git a/soh/src/overlays/actors/ovl_En_Ma1/z_en_ma1.c b/soh/src/overlays/actors/ovl_En_Ma1/z_en_ma1.c index a53da16c7..8a11eb668 100644 --- a/soh/src/overlays/actors/ovl_En_Ma1/z_en_ma1.c +++ b/soh/src/overlays/actors/ovl_En_Ma1/z_en_ma1.c @@ -490,7 +490,7 @@ void func_80AA1150(EnMa1* this, PlayState* play) { if (play->msgCtx.ocarinaMode == OCARINA_MODE_03) { if (!IS_RANDO) { - play->nextEntranceIndex = 0x157; + play->nextEntranceIndex = ENTR_LON_LON_RANCH_0; gSaveContext.nextCutsceneIndex = 0xFFF1; play->transitionType = TRANS_TYPE_CIRCLE(TCA_WAVE, TCC_WHITE, TCS_FAST); play->transitionTrigger = TRANS_TRIGGER_START; diff --git a/soh/src/overlays/actors/ovl_En_Ma3/z_en_ma3.c b/soh/src/overlays/actors/ovl_En_Ma3/z_en_ma3.c index 703154fed..5280f583e 100644 --- a/soh/src/overlays/actors/ovl_En_Ma3/z_en_ma3.c +++ b/soh/src/overlays/actors/ovl_En_Ma3/z_en_ma3.c @@ -115,7 +115,7 @@ s16 func_80AA2BD4(PlayState* play, Actor* thisx) { switch (Message_GetState(&play->msgCtx)) { case TEXT_STATE_EVENT: if (Message_ShouldAdvance(play)) { - play->nextEntranceIndex = 0x157; + play->nextEntranceIndex = ENTR_LON_LON_RANCH_0; gSaveContext.nextCutsceneIndex = 0xFFF0; play->transitionType = TRANS_TYPE_CIRCLE(TCA_STARBURST, TCC_BLACK, TCS_FAST); play->transitionTrigger = TRANS_TRIGGER_START; diff --git a/soh/src/overlays/actors/ovl_En_Ms/z_en_ms.c b/soh/src/overlays/actors/ovl_En_Ms/z_en_ms.c index 8c4f78a0c..b1d453f00 100644 --- a/soh/src/overlays/actors/ovl_En_Ms/z_en_ms.c +++ b/soh/src/overlays/actors/ovl_En_Ms/z_en_ms.c @@ -191,7 +191,7 @@ void EnMs_Update(Actor* thisx, PlayState* play) { SkelAnime_Update(&this->skelAnime); this->actionFunc(this, play); - if (gSaveContext.entranceIndex == 0x157 && gSaveContext.sceneSetupIndex == 8) { // ride carpet if in credits + if (gSaveContext.entranceIndex == ENTR_LON_LON_RANCH_0 && gSaveContext.sceneSetupIndex == 8) { // ride carpet if in credits Actor_MoveForward(&this->actor); osSyncPrintf("OOOHHHHHH %f\n", this->actor.velocity.y); Actor_UpdateBgCheckInfo(play, &this->actor, 0.0f, 0.0f, 0.0f, 4); diff --git a/soh/src/overlays/actors/ovl_En_Ossan/z_en_ossan.c b/soh/src/overlays/actors/ovl_En_Ossan/z_en_ossan.c index 1ea46ba87..b0d03430a 100644 --- a/soh/src/overlays/actors/ovl_En_Ossan/z_en_ossan.c +++ b/soh/src/overlays/actors/ovl_En_Ossan/z_en_ossan.c @@ -948,9 +948,9 @@ void EnOssan_State_StartConversation(EnOssan* this, PlayState* play, Player* pla case OSSAN_HAPPY_STATE_ANGRY: // In ER, handle happy mask throwing link out with not enough rupees if (IS_RANDO && Randomizer_GetSettingValue(RSK_SHUFFLE_ENTRANCES)) { - play->nextEntranceIndex = Entrance_OverrideNextIndex(0x1D1); + play->nextEntranceIndex = Entrance_OverrideNextIndex(ENTR_MARKET_DAY_9); } else { - play->nextEntranceIndex = 0x1D1; + play->nextEntranceIndex = ENTR_MARKET_DAY_9; } play->transitionTrigger = TRANS_TRIGGER_START; play->transitionType = TRANS_TYPE_CIRCLE(TCA_STARBURST, TCC_WHITE, TCS_FAST); diff --git a/soh/src/overlays/actors/ovl_En_Owl/z_en_owl.c b/soh/src/overlays/actors/ovl_En_Owl/z_en_owl.c index e9b997ef6..303c58819 100644 --- a/soh/src/overlays/actors/ovl_En_Owl/z_en_owl.c +++ b/soh/src/overlays/actors/ovl_En_Owl/z_en_owl.c @@ -963,9 +963,9 @@ void func_80ACC00C(EnOwl* this, PlayState* play) { osSyncPrintf(VT_RST); if (IS_RANDO) { if (Randomizer_GetSettingValue(RSK_SHUFFLE_OWL_DROPS)) { - play->nextEntranceIndex = Entrance_OverrideNextIndex(0x027E); + play->nextEntranceIndex = Entrance_OverrideNextIndex(ENTR_HYRULE_FIELD_9); } else { - play->nextEntranceIndex = 0x027E; + play->nextEntranceIndex = ENTR_HYRULE_FIELD_9; } play->transitionTrigger = TRANS_TRIGGER_START; play->transitionType = TRANS_TYPE_FADE_BLACK; @@ -978,9 +978,9 @@ void func_80ACC00C(EnOwl* this, PlayState* play) { case 9: if (IS_RANDO) { if (Randomizer_GetSettingValue(RSK_SHUFFLE_OWL_DROPS)) { - play->nextEntranceIndex = Entrance_OverrideNextIndex(0x0554); + play->nextEntranceIndex = Entrance_OverrideNextIndex(ENTR_KAKARIKO_VILLAGE_14); } else { - play->nextEntranceIndex = 0x0554; + play->nextEntranceIndex = ENTR_KAKARIKO_VILLAGE_14; } play->transitionTrigger = TRANS_TRIGGER_START; play->transitionType = TRANS_TYPE_FADE_BLACK; diff --git a/soh/src/overlays/actors/ovl_En_Ta/z_en_ta.c b/soh/src/overlays/actors/ovl_En_Ta/z_en_ta.c index 87b200e17..0eb3e9095 100644 --- a/soh/src/overlays/actors/ovl_En_Ta/z_en_ta.c +++ b/soh/src/overlays/actors/ovl_En_Ta/z_en_ta.c @@ -669,7 +669,7 @@ void func_80B15424(EnTa* this, PlayState* play) { func_80B15308(this); if ((Message_GetState(&play->msgCtx) == TEXT_STATE_EVENT) && Message_ShouldAdvance(play)) { - play->nextEntranceIndex = 0x5E4; + play->nextEntranceIndex = ENTR_LON_LON_BUILDINGS_2; if (gSaveContext.eventInf[0] & 0x100) { play->transitionType = TRANS_TYPE_CIRCLE(TCA_STARBURST, TCC_WHITE, TCS_FAST); diff --git a/soh/src/overlays/actors/ovl_En_Wonder_Talk/z_en_wonder_talk.c b/soh/src/overlays/actors/ovl_En_Wonder_Talk/z_en_wonder_talk.c index 98a6a01b5..930db68d4 100644 --- a/soh/src/overlays/actors/ovl_En_Wonder_Talk/z_en_wonder_talk.c +++ b/soh/src/overlays/actors/ovl_En_Wonder_Talk/z_en_wonder_talk.c @@ -142,7 +142,7 @@ void func_80B3943C(EnWonderTalk* this, PlayState* play) { if ((Actor_ProcessTalkRequest(&this->actor, play))) { if (this->unk_156 != TEXT_STATE_DONE) { // not if we're rando'd in the temple of time talking to the altar - if(!(IS_RANDO && play->sceneNum == 67)) { + if(!(IS_RANDO && play->sceneNum == SCENE_TEMPLE_OF_TIME)) { this->actionFunc = func_80B395F0; } } else { diff --git a/soh/src/overlays/actors/ovl_En_Wonder_Talk2/z_en_wonder_talk2.c b/soh/src/overlays/actors/ovl_En_Wonder_Talk2/z_en_wonder_talk2.c index 509d66027..2b90e1ff7 100644 --- a/soh/src/overlays/actors/ovl_En_Wonder_Talk2/z_en_wonder_talk2.c +++ b/soh/src/overlays/actors/ovl_En_Wonder_Talk2/z_en_wonder_talk2.c @@ -257,13 +257,13 @@ void func_80B3A4F8(EnWonderTalk2* this, PlayState* play) { if (IS_RANDO) { // Scenes for which all of this type of wonder talk should be skipped. switch (play->sceneNum) { - case 0x0007: // Shadow Temple + case SCENE_SHADOW_TEMPLE: // Shadow Temple randoSkipText = true; break; - case 0x000B: // Gerudo Training Grounds + case SCENE_GERUDO_TRAINING_GROUND: // Gerudo Training Grounds randoSkipText = true; break; - case 0x000C: // Inside Gerudo Fortress + case SCENE_THIEVES_HIDEOUT: // Inside Gerudo Fortress randoSkipText = true; break; default: diff --git a/soh/src/overlays/actors/ovl_En_Zl4/z_en_zl4.c b/soh/src/overlays/actors/ovl_En_Zl4/z_en_zl4.c index 56efc9c81..08c3857e0 100644 --- a/soh/src/overlays/actors/ovl_En_Zl4/z_en_zl4.c +++ b/soh/src/overlays/actors/ovl_En_Zl4/z_en_zl4.c @@ -402,7 +402,7 @@ void EnZl4_Init(Actor* thisx, PlayState* play) { Animation_ChangeByInfo(&this->skelAnime, sAnimationInfo, ZL4_ANIM_0); this->actionFunc = EnZl4_Idle; } else { - if (gSaveContext.entranceIndex != 0x5F0) { + if (gSaveContext.entranceIndex != ENTR_CASTLE_COURTYARD_ZELDA_1) { Animation_ChangeByInfo(&this->skelAnime, sAnimationInfo, ZL4_ANIM_21); this->csState = ZL4_CS_WAIT; this->talkState = 0; @@ -798,7 +798,7 @@ s32 EnZl4_CsAskName(EnZl4* this, PlayState* play) { this->talkTimer2++; if (this->talkTimer2 == 130) { play->msgCtx.msgMode = MSGMODE_PAUSED; - play->nextEntranceIndex = 0xA0; + play->nextEntranceIndex = ENTR_CUTSCENE_MAP_0; gSaveContext.nextCutsceneIndex = 0xFFF7; play->transitionTrigger = TRANS_TRIGGER_START; play->transitionType = TRANS_TYPE_FADE_WHITE; diff --git a/soh/src/overlays/actors/ovl_Item_Etcetera/z_item_etcetera.c b/soh/src/overlays/actors/ovl_Item_Etcetera/z_item_etcetera.c index 189f9cfe7..b12d7b4b0 100644 --- a/soh/src/overlays/actors/ovl_Item_Etcetera/z_item_etcetera.c +++ b/soh/src/overlays/actors/ovl_Item_Etcetera/z_item_etcetera.c @@ -229,7 +229,7 @@ void ItemEtcetera_DrawThroughLens(Actor* thisx, PlayState* play) { func_8002EBCC(&this->actor, play, 0); func_8002ED80(&this->actor, play, 0); - if(IS_RANDO && play->sceneNum == 16) { + if(IS_RANDO && play->sceneNum == SCENE_TREASURE_BOX_SHOP) { GetItemEntry randoGetItem = GetChestGameRandoGetItem(this->actor.room, this->giDrawId, play); EnItem00_CustomItemsParticles(&this->actor, play, randoGetItem); if (randoGetItem.itemId != ITEM_NONE) { diff --git a/soh/src/overlays/actors/ovl_Item_Ocarina/z_item_ocarina.c b/soh/src/overlays/actors/ovl_Item_Ocarina/z_item_ocarina.c index eb0c4c4ce..a9cd36446 100644 --- a/soh/src/overlays/actors/ovl_Item_Ocarina/z_item_ocarina.c +++ b/soh/src/overlays/actors/ovl_Item_Ocarina/z_item_ocarina.c @@ -176,7 +176,7 @@ void ItemOcarina_StartSoTCutscene(ItemOcarina* this, PlayState* play) { play->transitionTrigger = TRANS_TRIGGER_START; play->transitionType = TRANS_TYPE_FADE_WHITE; gSaveContext.nextTransitionType = TRANS_TYPE_FADE_WHITE; - play->nextEntranceIndex = 0x050F; + play->nextEntranceIndex = ENTR_HYRULE_FIELD_16; gSaveContext.nextCutsceneIndex = 0; } } diff --git a/soh/src/overlays/actors/ovl_Object_Kankyo/z_object_kankyo.c b/soh/src/overlays/actors/ovl_Object_Kankyo/z_object_kankyo.c index e5d1410ea..eefaf9c0c 100644 --- a/soh/src/overlays/actors/ovl_Object_Kankyo/z_object_kankyo.c +++ b/soh/src/overlays/actors/ovl_Object_Kankyo/z_object_kankyo.c @@ -158,22 +158,22 @@ void ObjectKankyo_Init(Actor* thisx, PlayState* play) { } if (gSaveContext.cutsceneTrigger != 0) { - if (gSaveContext.entranceIndex == 0x0538) { + if (gSaveContext.entranceIndex == ENTR_INSIDE_GANONS_CASTLE_2) { this->effects[0].size = 0.1f; } - if (gSaveContext.entranceIndex == 0x053C) { + if (gSaveContext.entranceIndex == ENTR_INSIDE_GANONS_CASTLE_3) { this->effects[1].size = 0.1f; } - if (gSaveContext.entranceIndex == 0x0540) { + if (gSaveContext.entranceIndex == ENTR_INSIDE_GANONS_CASTLE_4) { this->effects[2].size = 0.1f; } - if (gSaveContext.entranceIndex == 0x0544) { + if (gSaveContext.entranceIndex == ENTR_INSIDE_GANONS_CASTLE_5) { this->effects[3].size = 0.1f; } - if (gSaveContext.entranceIndex == 0x0548) { + if (gSaveContext.entranceIndex == ENTR_INSIDE_GANONS_CASTLE_6) { this->effects[4].size = 0.1f; } - if (gSaveContext.entranceIndex == 0x054C) { + if (gSaveContext.entranceIndex == ENTR_INSIDE_GANONS_CASTLE_7) { this->effects[5].size = 0.1f; } } @@ -247,7 +247,7 @@ void ObjectKankyo_Fairies(ObjectKankyo* this, PlayState* play) { } if (play->envCtx.unk_EE[3] < 64 && - (gSaveContext.entranceIndex != 0x00EE || gSaveContext.sceneSetupIndex != 4 || play->envCtx.unk_EE[3])) { + (gSaveContext.entranceIndex != ENTR_KOKIRI_FOREST_0 || gSaveContext.sceneSetupIndex != 4 || play->envCtx.unk_EE[3])) { play->envCtx.unk_EE[3] += 16; } diff --git a/soh/src/overlays/actors/ovl_player_actor/z_player.c b/soh/src/overlays/actors/ovl_player_actor/z_player.c index 14cbac00f..fe551de75 100644 --- a/soh/src/overlays/actors/ovl_player_actor/z_player.c +++ b/soh/src/overlays/actors/ovl_player_actor/z_player.c @@ -3903,7 +3903,7 @@ s32 func_808382DC(Player* this, PlayState* play) { if (sp68) { Play_TriggerRespawn(play); - func_800994A0(play); + Scene_SetTransitionForNextEntrance(play); } else { // Special case for getting crushed in Forest Temple's Checkboard Ceiling Hall or Shadow Temple's // Falling Spike Trap Room, to respawn the player in a specific place @@ -4204,24 +4204,58 @@ s32 func_80838FB8(PlayState* play, Player* this) { return 0; } -s16 D_808544F8[] = { - 0x045B, // DMT from Magic Fairy Fountain - 0x0482, // DMC from Double Defense Fairy Fountain - 0x0340, // Hyrule Castle from Dins Fire Fairy Fountain - 0x044B, // Kakariko from Potion Shop - 0x02A2, // Market (child day) from Potion Shop - 0x0201, // Kakariko from Bazaar - 0x03B8, // Market (child day) from Bazaar - 0x04EE, // Kakariko from House of Skulltulas - 0x03C0, // Back Alley (day) from Bombchu Shop - 0x0463, // Kakariko from Shooting Gallery - 0x01CD, // Market (child day) from Shooting Gallery - 0x0394, // Zoras Fountain from Farores Wind Fairy Fountain - 0x0340, // Hyrule Castle from Dins Fire Fairy Fountain - 0x057C, // Desert Colossus from Nayrus Love Fairy Fountain +/** + * The actual entrances each "return entrance" value can map to. + * This is used by scenes that are shared between locations, like child/adult Shooting Gallery or Great Fairy Fountains. + * + * This 1D array is split into groups of entrances. + * The start of each group is indexed by `sReturnEntranceGroupIndices` values. + * The resulting groups are then indexed by the spawn value. + * + * The spawn value (`PlayState.spawn`) is set to a different value depending on the entrance used to enter the + * scene, which allows these dynamic "return entrances" to link back to the previous scene. + * + * Note: grottos and normal fairy fountains use `ENTR_RETURN_GROTTO` + */ +s16 sReturnEntranceGroupData[] = { + // ENTR_RETURN_GREAT_FAIRYS_FOUNTAIN_MAGIC + /* 0 */ ENTR_DEATH_MOUNTAIN_TRAIL_4, // from Magic Fairy Fountain + /* 1 */ ENTR_DEATH_MOUNTAIN_CRATER_3, // from Double Magic Fairy Fountain + /* 2 */ ENTR_HYRULE_CASTLE_2, // from Double Defense Fairy Fountain (as adult) + + // ENTR_RETURN_2 + /* 3 */ ENTR_KAKARIKO_VILLAGE_9, // from Potion Shop in Kakariko + /* 4 */ ENTR_MARKET_DAY_5, // from Potion Shop in Market + + // ENTR_RETURN_BAZAAR + /* 5 */ ENTR_KAKARIKO_VILLAGE_3, + /* 6 */ ENTR_MARKET_DAY_6, + + // ENTR_RETURN_4 + /* 7 */ ENTR_KAKARIKO_VILLAGE_11, // from House of Skulltulas + /* 8 */ ENTR_BACK_ALLEY_DAY_2, // from Bombchu Shop + + // ENTR_RETURN_SHOOTING_GALLERY + /* 9 */ ENTR_KAKARIKO_VILLAGE_10, + /* 10 */ ENTR_MARKET_DAY_8, + + // ENTR_RETURN_GREAT_FAIRYS_FOUNTAIN_SPELLS + /* 11 */ ENTR_ZORAS_FOUNTAIN_5, // from Farores Wind Fairy Fountain + /* 12 */ ENTR_HYRULE_CASTLE_2, // from Dins Fire Fairy Fountain (as child) + /* 13 */ ENTR_DESERT_COLOSSUS_7, // from Nayrus Love Fairy Fountain }; -u8 D_80854514[] = { 11, 9, 3, 5, 7, 0 }; +/** + * The values are indices into `sReturnEntranceGroupData` marking the start of each group + */ +u8 sReturnEntranceGroupIndices[] = { + 11, // ENTR_RETURN_GREAT_FAIRYS_FOUNTAIN_SPELLS + 9, // ENTR_RETURN_SHOOTING_GALLERY + 3, // ENTR_RETURN_2 + 5, // ENTR_RETURN_BAZAAR + 7, // ENTR_RETURN_4 + 0, // ENTR_RETURN_GREAT_FAIRYS_FOUNTAIN_MAGIC +}; s32 func_80839034(PlayState* play, Player* this, CollisionPoly* poly, u32 bgId) { s32 sp3C; @@ -4247,7 +4281,7 @@ s32 func_80839034(PlayState* play, Player* this, CollisionPoly* poly, u32 bgId) if (sp3C == 0) { Play_TriggerVoidOut(play); - func_800994A0(play); + Scene_SetTransitionForNextEntrance(play); } else { play->nextEntranceIndex = play->setupExitList[sp3C - 1]; @@ -4256,21 +4290,21 @@ s32 func_80839034(PlayState* play, Player* this, CollisionPoly* poly, u32 bgId) play->nextEntranceIndex = Entrance_OverrideNextIndex(play->nextEntranceIndex); } - if (play->nextEntranceIndex == 0x7FFF) { + if (play->nextEntranceIndex == ENTR_RETURN_GROTTO) { gSaveContext.respawnFlag = 2; play->nextEntranceIndex = gSaveContext.respawn[RESPAWN_MODE_RETURN].entranceIndex; play->transitionType = TRANS_TYPE_FADE_WHITE; gSaveContext.nextTransitionType = TRANS_TYPE_FADE_WHITE; - } else if (play->nextEntranceIndex >= 0x7FF9) { + } else if (play->nextEntranceIndex >= ENTR_RETURN_YOUSEI_IZUMI_YOKO) { // handle dynamic exits if (IS_RANDO) { - play->nextEntranceIndex = Entrance_OverrideDynamicExit(D_80854514[play->nextEntranceIndex - 0x7FF9] + play->curSpawn); + play->nextEntranceIndex = Entrance_OverrideDynamicExit(sReturnEntranceGroupIndices[play->nextEntranceIndex - ENTR_RETURN_YOUSEI_IZUMI_YOKO] + play->curSpawn); } else { play->nextEntranceIndex = - D_808544F8[D_80854514[play->nextEntranceIndex - 0x7FF9] + play->curSpawn]; + sReturnEntranceGroupData[sReturnEntranceGroupIndices[play->nextEntranceIndex - ENTR_RETURN_YOUSEI_IZUMI_YOKO] + play->curSpawn]; } - func_800994A0(play); + Scene_SetTransitionForNextEntrance(play); } else { if (SurfaceType_GetSlope(&play->colCtx, poly, bgId) == 2) { gSaveContext.respawn[RESPAWN_MODE_DOWN].entranceIndex = play->nextEntranceIndex; @@ -4278,7 +4312,7 @@ s32 func_80839034(PlayState* play, Player* this, CollisionPoly* poly, u32 bgId) gSaveContext.respawnFlag = -2; } gSaveContext.retainWeatherMode = 1; - func_800994A0(play); + Scene_SetTransitionForNextEntrance(play); } play->transitionTrigger = TRANS_TRIGGER_START; } @@ -9702,7 +9736,7 @@ void Player_Init(Actor* thisx, PlayState* play2) { if (gSaveContext.showTitleCard) { if ((gSaveContext.sceneSetupIndex < 4) && (gEntranceTable[((void)0, gSaveContext.entranceIndex) + ((void)0, gSaveContext.sceneSetupIndex)].field & - 0x4000) && + ENTRANCE_INFO_DISPLAY_TITLE_CARD_FLAG) && ((play->sceneNum != SCENE_DODONGOS_CAVERN) || (Flags_GetEventChkInf(EVENTCHKINF_ENTERED_DODONGOS_CAVERN))) && ((play->sceneNum != SCENE_BOMBCHU_SHOP) || (Flags_GetEventChkInf(EVENTCHKINF_USED_DODONGOS_CAVERN_BLUE_WARP)))) { TitleCard_InitPlaceName(play, &play->actorCtx.titleCtx, this->giObjectSegment, 160, 120, 144, @@ -12843,7 +12877,7 @@ s32 func_8084DFF4(PlayState* play, Player* this) { } else { if (Message_GetState(&play->msgCtx) == TEXT_STATE_CLOSING) { if (this->getItemId == GI_GAUNTLETS_SILVER && !IS_RANDO) { - play->nextEntranceIndex = 0x0123; + play->nextEntranceIndex = ENTR_DESERT_COLOSSUS_0; play->transitionTrigger = TRANS_TRIGGER_START; gSaveContext.nextCutsceneIndex = 0xFFF1; play->transitionType = TRANS_TYPE_SANDSTORM_END; @@ -12915,7 +12949,14 @@ void func_8084E368(Player* this, PlayState* play) { func_8084AEEC(this, &this->linearVelocity, 0.0f, this->actor.shape.rot.y); } -static s16 D_808549D4[] = { 0x0600, 0x04F6, 0x0604, 0x01F1, 0x0568, 0x05F4 }; +static s16 sWarpSongEntrances[] = { + ENTR_SACRED_FOREST_MEADOW_2, + ENTR_DEATH_MOUNTAIN_CRATER_4, + ENTR_LAKE_HYLIA_8, + ENTR_DESERT_COLOSSUS_5, + ENTR_GRAVEYARD_7, + ENTR_TEMPLE_OF_TIME_7, +}; void func_8084E3C4(Player* this, PlayState* play) { if (LinkAnimation_Update(play, &this->skelAnime)) { @@ -12949,7 +12990,7 @@ void func_8084E3C4(Player* this, PlayState* play) { this->stateFlags2 &= ~(PLAYER_STATE2_NEAR_OCARINA_ACTOR | PLAYER_STATE2_ATTEMPT_PLAY_FOR_ACTOR | PLAYER_STATE2_PLAY_FOR_ACTOR); this->unk_6A8 = NULL; } else if (play->msgCtx.ocarinaMode == OCARINA_MODE_02) { - gSaveContext.respawn[RESPAWN_MODE_RETURN].entranceIndex = D_808549D4[play->msgCtx.lastPlayedSong]; + gSaveContext.respawn[RESPAWN_MODE_RETURN].entranceIndex = sWarpSongEntrances[play->msgCtx.lastPlayedSong]; gSaveContext.respawn[RESPAWN_MODE_RETURN].playerParams = 0x5FF; gSaveContext.respawn[RESPAWN_MODE_RETURN].data = play->msgCtx.lastPlayedSong; @@ -13565,7 +13606,7 @@ void func_8084F88C(Player* this, PlayState* play) { if (this->unk_84F != 0) { if (play->sceneNum == SCENE_ICE_CAVERN) { Play_TriggerRespawn(play); - play->nextEntranceIndex = 0x0088; + play->nextEntranceIndex = ENTR_ICE_CAVERN_0; } else if (this->unk_84F < 0) { Play_TriggerRespawn(play); // In ER, handle DMT and other special void outs to respawn from last entrance from grotto diff --git a/soh/src/overlays/gamestates/ovl_file_choose/z_file_choose.c b/soh/src/overlays/gamestates/ovl_file_choose/z_file_choose.c index 3f1c8ff44..57ba2c230 100644 --- a/soh/src/overlays/gamestates/ovl_file_choose/z_file_choose.c +++ b/soh/src/overlays/gamestates/ovl_file_choose/z_file_choose.c @@ -2966,7 +2966,7 @@ void FileChoose_LoadGame(GameState* thisx) { Randomizer_LoadMasterQuestDungeons(""); Randomizer_LoadEntranceOverrides("", true); - gSaveContext.respawn[0].entranceIndex = -1; + gSaveContext.respawn[0].entranceIndex = ENTR_LOAD_OPENING; gSaveContext.respawnFlag = 0; gSaveContext.seqId = (u8)NA_BGM_DISABLED; gSaveContext.natureAmbienceId = 0xFF; @@ -3035,7 +3035,7 @@ void FileChoose_LoadGame(GameState* thisx) { // the entrance index is -1 from shuffle overwarld spawn if (Randomizer_GetSettingValue(RSK_SHUFFLE_ENTRANCES) && ((!CVarGetInteger("gRememberSaveLocation", 0) || gSaveContext.savedSceneNum == SCENE_FAIRYS_FOUNTAIN || gSaveContext.savedSceneNum == SCENE_GROTTOS) || - (CVarGetInteger("gRememberSaveLocation", 0) && Randomizer_GetSettingValue(RSK_SHUFFLE_OVERWORLD_SPAWNS) && gSaveContext.entranceIndex == -1))) { + (CVarGetInteger("gRememberSaveLocation", 0) && Randomizer_GetSettingValue(RSK_SHUFFLE_OVERWORLD_SPAWNS) && gSaveContext.entranceIndex == ENTR_LOAD_OPENING))) { Entrance_SetSavewarpEntrance(); } } diff --git a/soh/src/overlays/gamestates/ovl_select/z_select.c b/soh/src/overlays/gamestates/ovl_select/z_select.c index 4453c8e58..fe273dd41 100644 --- a/soh/src/overlays/gamestates/ovl_select/z_select.c +++ b/soh/src/overlays/gamestates/ovl_select/z_select.c @@ -68,7 +68,7 @@ void Select_LoadGame(SelectContext* this, s32 entranceIndex) { } gSaveContext.respawnFlag = 0; - gSaveContext.respawn[RESPAWN_MODE_DOWN].entranceIndex = -1; + gSaveContext.respawn[RESPAWN_MODE_DOWN].entranceIndex = ENTR_LOAD_OPENING; gSaveContext.seqId = (u8)NA_BGM_DISABLED; gSaveContext.natureAmbienceId = 0xFF; gSaveContext.showTitleCard = true; @@ -118,7 +118,7 @@ void Select_Grotto_LoadGame(SelectContext* this, s32 grottoIndex) { } gSaveContext.respawnFlag = 0; - gSaveContext.respawn[RESPAWN_MODE_DOWN].entranceIndex = -1; + gSaveContext.respawn[RESPAWN_MODE_DOWN].entranceIndex = ENTR_LOAD_OPENING; gSaveContext.seqId = (u8)NA_BGM_DISABLED; gSaveContext.natureAmbienceId = 0xFF; gSaveContext.showTitleCard = true; @@ -128,488 +128,488 @@ void Select_Grotto_LoadGame(SelectContext* this, s32 grottoIndex) { } static SceneSelectEntry sScenes[] = { - { " 1:SPOT00", " 1:Hyrule Field", " 1:Hylianische Steppe", " 1:Plaine d'Hyrule", Select_LoadGame, 0x00CD }, - { " 2:SPOT01", " 2:Kakariko Village", " 2:Kakariko", " 2:Village Cocorico", Select_LoadGame, 0x00DB }, - { " 3:SPOT02", " 3:Graveyard", " 3:Friedhof", " 3:Cimetiere", Select_LoadGame, 0x00E4 }, - { " 4:SPOT03", " 4:Zora's River", " 4:Zora-Fluss", " 4:Riviere Zora", Select_LoadGame, 0x00EA }, - { " 5:SPOT04", " 5:Kokiri Forest", " 5:Kokiri-Wald", " 5:Foret Kokiri", Select_LoadGame, 0x00EE }, - { " 6:SPOT05", " 6:Sacred Forest Meadow", " 6:Heilige Lichtung", " 6:Bosquet Sacre", Select_LoadGame, 0x00FC }, - { " 7:SPOT06", " 7:Lake Hylia", " 7:Hylia-See", " 7:Lac Hylia", Select_LoadGame, 0x0102 }, - { " 8:SPOT07", " 8:Zora's Domain", " 8:Zoras Reich", " 8:Domaine Zora", Select_LoadGame, 0x0108 }, - { " 9:SPOT08", " 9:Zora's Fountain", " 9:Zoras Quelle", " 9:Fontaine Zora", Select_LoadGame, 0x010E }, - { "10:SPOT09", "10:Gerudo Valley", "10:Gerudotal", "10:Vallee Gerudo", Select_LoadGame, 0x0117 }, - { "11:SPOT10", "11:Lost Woods", "11:Verlorene Waelder", "11:Bois Perdus", Select_LoadGame, 0x011E }, - { "12:SPOT11", "12:Desert Colossus", "12:Wuestenkoloss", "12:Colosse du Desert", Select_LoadGame, 0x0123 }, - { "13:SPOT12", "13:Gerudo's Fortress", "13:Gerudo-Festung", "13:Forteresse Gerudo", Select_LoadGame, 0x0129 }, - { "14:SPOT13", "14:Haunted Wasteland", "14:Gespensterwueste", "14:Desert Hante", Select_LoadGame, 0x0130 }, - { "15:SPOT15", "15:Hyrule Castle", "15:Schloss Hyrule", "15:Chateau d'Hyrule", Select_LoadGame, 0x0138 }, - { "16:SPOT16", "16:Death Mountain Trail", "16:Pfad zum Todesberg", "16:Chemin du Peril", Select_LoadGame, 0x013D }, - { "17:SPOT17", "17:Death Mountain Crater", "17:Todeskrater", "17:Cratere du Peril", Select_LoadGame, 0x0147 }, - { "18:SPOT18", "18:Goron City", "18:Goronia", "18:Village Goron", Select_LoadGame, 0x014D }, - { "19:SPOT20", "19:Lon Lon Ranch", "19:Lon Lon-Farm", "19:Ranch Lon Lon", Select_LoadGame, 0x0157 }, - { "20:" GFXP_HIRAGANA "トキノマ", "20:Temple Of Time", "20:Zitadelle der Zeit", "20:Temple du Temps", Select_LoadGame, 0x0053 }, - { "21:" GFXP_HIRAGANA "ケンジャノマ", "21:Chamber of Sages", "21:Halle der Weisen", "21:Sanctuaire des Sages", Select_LoadGame, 0x006B }, - { "22:" GFXP_HIRAGANA "シャテキジョウ", "22:Shooting Gallery", "22:Schiessbude ", "22:Jeu d'adresse", Select_LoadGame, 0x003B }, - { "23:" GFXP_KATAKANA "ハイラル" GFXP_HIRAGANA "ニワ" GFXP_KATAKANA "ゲーム", "23:Castle Courtyard Game", "23:Burghof - Wachen", "23:Cour du Chateau (Infilration)", Select_LoadGame, 0x007A }, - { "24:" GFXP_HIRAGANA "ハカシタトビコミアナ", "24:Grave 1", "24:Grab 1", "24:Tombe 1", Select_LoadGame, 0x031C }, - { "25:" GFXP_HIRAGANA "ハカシタトビコミアナ 2", "25:Grave 2", "25:Grab 2", "25:Tombe 2", Select_LoadGame, 0x004B }, - { "26:" GFXP_HIRAGANA "オウケ ノ ハカアナ", "26:Royal Family's Tomb", "26:Koenigsgrab", "26:Tombe Royale", Select_LoadGame, 0x002D }, - { "27:" GFXP_HIRAGANA "ダイヨウセイノイズミ", "27:Great Fairy's Fountain (Upgrades)", "27:Feen-Quelle (Upgrades)", "27:Fontaine Royale des Fees (Amel.)", Select_LoadGame, 0x0315 }, - { "28:" GFXP_HIRAGANA "トビコミ ヨウセイ アナ", "28:Fairy's Fountain (Grotto)", "28:Feen-Brunnen (Grotte)", "28:Fontaines des Fees (Grotte)", Select_LoadGame, 0x036D }, - { "29:" GFXP_HIRAGANA "マホウセキ ヨウセイノイズミ", "29:Great Fairy's Fountain (Magic)", "29:Feen-Quelle (Magie)", "29:Fontaine Royale des Fees (Magie)", Select_LoadGame, 0x0371 }, - { "30:" GFXP_KATAKANA "ガノン" GFXP_HIRAGANA "サイシュウセン", "30:Ganon's Tower - Collapsing", "30:Ganons Turm - Einsturz", "30:Tour de Ganon - Effondrement", Select_LoadGame, 0x043F }, - { "31:" GFXP_KATAKANA "ハイラル" GFXP_HIRAGANA "ナカニワ", "31:Castle Courtyard", "31:Burghof - Zelda", "31:Cour du Chateau", Select_LoadGame, 0x0400 }, - { "32:" GFXP_HIRAGANA "ツリボリ", "32:Fishing Pond", "32:Fischweiher", "32:Etang", Select_LoadGame, 0x045F }, - { "33:" GFXP_KATAKANA "ボムチュウボーリング", "33:Bombchu Bowling Alley", "33:Minenbowlingbahn", "33:Bowling Teigneux", Select_LoadGame, 0x0507 }, - { "34:" GFXP_KATAKANA "ロンロン" GFXP_HIRAGANA "ボクジョウ ソウコ 1", "34:Lon Lon Ranch House", "34:Lon Lon-Farm Haus", "34:Maison du Ranch Lon Lon", Select_LoadGame, 0x004F }, - { "35:" GFXP_KATAKANA "ロンロン" GFXP_HIRAGANA "ボクジョウ ソウコ 2", "35:Lon Lon Ranch Silo", "35:Lon Lon-Farm Silo", "35:Silo du Ranch Lon Lon", Select_LoadGame, 0x05D0 }, - { "36:" GFXP_HIRAGANA "ミハリ ゴヤ", "36:Guard House", "36:Wachposten", "36:Maison de Garde", Select_LoadGame, 0x007E }, - { "37:" GFXP_HIRAGANA "マホウ ノ クスリヤ", "37:Potion Shop", "37:Magie-Laden", "37:Apothicaire", Select_LoadGame, 0x0072 }, - { "38:" GFXP_HIRAGANA "タカラバコヤ", "38:Treasure Chest Game", "38:Trhenlotterie", "38:Chasse aux Tresors", Select_LoadGame, 0x0063 }, - { "39:" GFXP_HIRAGANA "キン " GFXP_KATAKANA "スタルチュラ ハウス", "39:House Of Skulltula", "39:Skulltulas Haus", "39:Maison des Skulltulas", Select_LoadGame, 0x0550 }, - { "40:" GFXP_HIRAGANA "ジョウカマチ イリグチ", "40:Entrance to Market", "40:Eingang zum Marktplatz", "40:Entree de la Place du Marche", Select_LoadGame, 0x0033 }, - { "41:" GFXP_HIRAGANA "ジョウカマチ", "41:Market", "41:Marktplatz", "41:Place du Marche", Select_LoadGame, 0x00B1 }, - { "42:" GFXP_HIRAGANA "ウラロジ", "42:Back Alley", "42:Seitenstrasse", "42:Ruelle", Select_LoadGame, 0x00AD }, - { "43:" GFXP_HIRAGANA "トキノシンデン マエ", "43:Temple of Time Exterior", "43:Vor der Zitadelle der Zeit", "43:Exterieur du Temple du Temps", Select_LoadGame, 0x0171 }, - { "44:" GFXP_HIRAGANA "リンクノイエ", "44:Link's House", "44:Links Haus", "44:Cabane de Link", Select_LoadGame, 0x00BB }, - { "45:" GFXP_KATAKANA "カカリコ" GFXP_HIRAGANA "ムラノナガヤ", "45:Kakariko House 1", "45:Kakariko Haus 1", "45:Maison du Village Cocorico 1", Select_LoadGame, 0x02FD }, - { "46:" GFXP_HIRAGANA "ウラロジノ イエ", "46:Back Alley House 1", "46:Seitenstrasse Haus 1", "46:Maison de la Ruelle 1", Select_LoadGame, 0x043B }, - { "47:" GFXP_HIRAGANA "コキリノムラ モノシリキョウダイノイエ", "47:House of the Know-it-All Brothers", "47:Haus der Allwissenden Brueder", "47:Cabane des Freres Je-Sais-Tout", Select_LoadGame, 0x00C9 }, - { "48:" GFXP_HIRAGANA "コキリノムラ フタゴノイエ", "48:House of Twins", "48:Haus der Zwillinge", "48:Cabane des Jumeaux", Select_LoadGame, 0x009C }, - { "49:" GFXP_HIRAGANA "コキリノムラ " GFXP_KATAKANA "ミド" GFXP_HIRAGANA "ノイエ", "49:Mido's House", "49:Midos Haus", "49:Cabane du Grand Mido", Select_LoadGame, 0x0433 }, - { "50:" GFXP_HIRAGANA "コキリノムラ " GFXP_KATAKANA "サリア" GFXP_HIRAGANA "ノイエ", "50:Saria's House", "50:Salias Haus", "50:Cabane de Saria", Select_LoadGame, 0x0437 }, - { "51:" GFXP_HIRAGANA "ウマゴヤ", "51:Stable", "51:Stall", "51:Etable", Select_LoadGame, 0x02F9 }, - { "52:" GFXP_HIRAGANA "ハカモリノイエ", "52:Grave Keeper's Hut", "52:Huette des Totengraebers", "52:Cabane du Fossoyeur", Select_LoadGame, 0x030D }, - { "53:" GFXP_HIRAGANA "ウラロジ イヌオバサンノイエ", "53:Dog Lady's House", "53:Haus der Hunde-Dame", "53:Maison de la Dame du Chien", Select_LoadGame, 0x0398 }, - { "54:" GFXP_HIRAGANA "カカリコムラ " GFXP_KATAKANA "インパ" GFXP_HIRAGANA "ノイエ", "54:Impa's House", "54:Impas Haus", "54:Maison d'Impa", Select_LoadGame, 0x039C }, - { "55:" GFXP_KATAKANA "ハイリア" GFXP_HIRAGANA " ケンキュウジョ", "55:Lakeside Laboratory", "55:Hylia-See Laboratorium", "55:Laboratoire du Lac", Select_LoadGame, 0x0043 }, - { "56:" GFXP_KATAKANA "テント", "56:Running Man's Tent", "56:Zelt des Rennlaeufers", "56:Tente du Marathonien", Select_LoadGame, 0x03A0 }, - { "57:" GFXP_HIRAGANA "タテノミセ", "57:Bazaar", "57:Basar", "57:Bazar", Select_LoadGame, 0x00B7 }, - { "58:" GFXP_HIRAGANA "コキリゾクノミセ", "58:Kokiri Shop", "58:Kokiri-Laden", "58:Boutique Kokiri", Select_LoadGame, 0x00C1 }, - { "59:" GFXP_KATAKANA "ゴロン" GFXP_HIRAGANA "ノミセ", "59:Goron Shop", "59:Goronen-Laden", "59:Boutique Goron", Select_LoadGame, 0x037C }, - { "60:" GFXP_KATAKANA "ゾーラ" GFXP_HIRAGANA "ノミセ", "60:Zora Shop", "60:Zora-Laden", "60:Boutique Zora", Select_LoadGame, 0x0380 }, - { "61:" GFXP_KATAKANA "カカリコ" GFXP_HIRAGANA "ムラ クスリヤ", "61:Closed Shop", "61:Geschlossener Laden", "61:Boutique Fermee", Select_LoadGame, 0x0384 }, - { "62:" GFXP_HIRAGANA "ジョウカマチ クスリヤ", "62:Potion Shop", "62:Magie-Laden", "62:Apothicaire (Boutique)", Select_LoadGame, 0x0388 }, - { "63:" GFXP_HIRAGANA "ウラロジ ヨルノミセ", "63:Bombchu Shop", "63:Krabbelminen-Laden", "63:Boutique de Missiles Teigneux", Select_LoadGame, 0x0390 }, - { "64:" GFXP_HIRAGANA "オメンヤ", "64:Happy Mask Shop", "64:Maskenhaendler", "64:Foire aux Masques", Select_LoadGame, 0x0530 }, - { "65:" GFXP_KATAKANA "ゲルド" GFXP_HIRAGANA "ノシュウレンジョウ", "65:Gerudo Training Ground", "65:Gerudo-Arena", "65:Gymnase Gerudo", Select_LoadGame, 0x0008 }, - { "66:" GFXP_HIRAGANA "ヨウセイノキノ " GFXP_KATAKANA "ダンジョン", "66:Inside the Deku Tree", "66:Im Deku-Baum", "66:Arbre Mojo", Select_LoadGame, 0x0000 }, - { "67:" GFXP_HIRAGANA "ヨウセイノキノ " GFXP_KATAKANA "ダンジョン ボス", "67:Gohma's Lair", "67:Gohmas Verlies", "67:Repaire de Gohma", Select_LoadGame, 0x040F }, - { "68:" GFXP_KATAKANA "ドドンゴ ダンジョン", "68:Dodongo's Cavern", "68:Dodongos Hoehle", "68:Caverne Dodongo", Select_LoadGame, 0x0004 }, - { "69:" GFXP_KATAKANA "ドドンゴ ダンジョン ボス", "69:King Dodongo's Lair", "69:King Dodongos Verlies", "69:Repaire du Roi Dodongo", Select_LoadGame, 0x040B }, - { "70:" GFXP_HIRAGANA "キョダイギョ " GFXP_KATAKANA "ダンジョン", "70:Inside Jabu-Jabu's Belly", "70:Jabu-Jabus Bauch", "70:Ventre de Jabu-Jabu", Select_LoadGame, 0x0028 }, - { "71:" GFXP_HIRAGANA "キョダイギョ " GFXP_KATAKANA "ダンジョン ボス", "71:Barinade's Lair", "71:Barinades Verlies", "71:Repaire de Barinade", Select_LoadGame, 0x0301 }, - { "72:" GFXP_HIRAGANA "モリノシンデン", "72:Forest Temple", "72:Waldtempel", "72:Temple de la Foret", Select_LoadGame, 0x0169 }, - { "73:" GFXP_HIRAGANA "モリノシンデン " GFXP_KATAKANA "ボス", "73:Phantom Ganon's Lair", "73:Phantom-Ganons Verlies", "73:Repaire de Ganon Spectral", Select_LoadGame, 0x000C }, - { "74:" GFXP_HIRAGANA "イドシタ " GFXP_KATAKANA "ダンジョン", "74:Bottom of the Well", "74:Grund des Brunnens", "74:Puits", Select_LoadGame, 0x0098 }, - { "75:" GFXP_HIRAGANA "ハカシタ " GFXP_KATAKANA "ダンジョン", "75:Shadow Temple", "75:Schattentempel", "75:Temple de l'Ombre", Select_LoadGame, 0x0037 }, - { "76:" GFXP_HIRAGANA "ハカシタ " GFXP_KATAKANA "ダンジョン ボス", "76:Bongo Bongo's Lair", "76:Bongo Bongos Verlies", "76:Repaire de Bongo Bongo", Select_LoadGame, 0x0413 }, - { "77:" GFXP_HIRAGANA "ヒノシンデン", "77:Fire Temple", "77:Feuertempel", "77:Temple du Feu", Select_LoadGame, 0x0165 }, - { "78:" GFXP_HIRAGANA "ヒノシンデン " GFXP_KATAKANA "ボス", "78:Volvagia's Lair", "78:Volvagias Verlies", "78:Repaire de Volcania", Select_LoadGame, 0x0305 }, - { "79:" GFXP_HIRAGANA "ミズノシンデン", "79:Water Temple", "79:Wassertempel", "79:Temple de l'Eau", Select_LoadGame, 0x0010 }, - { "80:" GFXP_HIRAGANA "ミズノシンデン " GFXP_KATAKANA "ボス", "80:Morpha's Lair", "80:Morphas Verlies", "80:Repaire de Morpha", Select_LoadGame, 0x0417 }, - { "81:" GFXP_HIRAGANA "ジャシンゾウ " GFXP_KATAKANA "ダンジョン", "81:Spirit Temple", "81:Geistertempel", "81:Temple de l'Esprit", Select_LoadGame, 0x0082 }, - { "82:" GFXP_HIRAGANA "ジャシンゾウ " GFXP_KATAKANA "ダンジョン アイアンナック", "82:Iron Knuckle's Lair", "82:Eisenprinz' Verlies", "82:Repaire du Hache Viande", Select_LoadGame, 0x008D }, - { "83:" GFXP_HIRAGANA "ジャシンゾウ " GFXP_KATAKANA "ダンジョン ボス", "83:Twinrova's Lair", "83:Killa Ohmaz' Verlies", "83:Repaire du Duo Malefique", Select_LoadGame, 0x05EC }, - { "84:" GFXP_KATAKANA "ガノン" GFXP_HIRAGANA "ノトウ", "84:Stairs to Ganondorf's Lair", "84:Treppen zu Ganondorfs Verlies", "84:Repaire de Ganondorf (Escaliers)", Select_LoadGame, 0x041B }, - { "85:" GFXP_KATAKANA "ガノン" GFXP_HIRAGANA "ノトウ" GFXP_KATAKANA "ボス", "85:Ganondorf's Lair", "85:Ganondorfs Verlies", "85:Repaire de Ganondorf", Select_LoadGame, 0x041F }, - { "86:" GFXP_HIRAGANA "コオリノドウクツ", "86:Ice Cavern", "86:Eishoehle", "86:Caverne Polaire", Select_LoadGame, 0x0088 }, - { "87:" GFXP_HIRAGANA "ハカシタ" GFXP_KATAKANA "リレー", "87:Dampe Grave Relay Game", "87:Boris' Grab Staffellauf", "87:Tombe d'Igor", Select_LoadGame, 0x044F }, - { "88:" GFXP_KATAKANA "ガノン" GFXP_HIRAGANA "チカ " GFXP_KATAKANA "ダンジョン", "88:Inside Ganon's Castle", "88:In Ganons Schloss", "88:Tour de Ganon", Select_LoadGame, 0x0467 }, - { "89:" GFXP_KATAKANA "ガノン" GFXP_HIRAGANA "サイシュウセン " GFXP_KATAKANA "デモ & バトル", "89:Ganon's Lair", "89:Ganons Verlies", "89:Repaire de Ganon", Select_LoadGame, 0x0517 }, - { "90:" GFXP_KATAKANA "ガノン" GFXP_HIRAGANA "ノトウ ソノゴ 1", "90:Escaping Ganon's Castle 1", "90:Flucht aus Ganons Schloss 1", "90:Fuite du Chateau de Ganon 1", Select_LoadGame, 0x0179 }, - { "91:" GFXP_KATAKANA "ガノン" GFXP_HIRAGANA "ノトウ ソノゴ 2", "91:Escaping Ganon's Castle 2", "91:Flucht aus Ganons Schloss 2", "91:Fuite du Chateau de Ganon 2", Select_LoadGame, 0x01B5 }, - { "92:" GFXP_KATAKANA "ガノン" GFXP_HIRAGANA "ノトウ ソノゴ 3", "92:Escaping Ganon's Castle 3", "92:Flucht aus Ganons Schloss 3", "92:Fuite du Chateau de Ganon 3", Select_LoadGame, 0x03DC }, - { "93:" GFXP_KATAKANA "ガノン" GFXP_HIRAGANA "ノトウ ソノゴ 4", "93:Escaping Ganon's Castle 4", "93:Flucht aus Ganons Schloss 4", "93:Fuite du Chateau de Ganon 4", Select_LoadGame, 0x03E4 }, - { "94:" GFXP_KATAKANA "ガノン" GFXP_HIRAGANA "チカ ソノゴ", "94:Escaping Ganon's Castle 5", "94:Flucht aus Ganons Schloss 5", "94:Fuite du Chateau de Ganon 5", Select_LoadGame, 0x056C }, - { "95:" GFXP_KATAKANA "ゲルド" GFXP_HIRAGANA "ツウロ 1-2", "95:Thieves' Hideout 1-2", "95:Diebesversteck 1-2", "95:Repaire des Voleurs 1-2", Select_LoadGame, 0x0486 }, - { "96:" GFXP_KATAKANA "ゲルド" GFXP_HIRAGANA "ツウロ 3-4 9-10", "96:Thieves' Hideout 3-4 9-10", "96:Diebesversteck 3-4 9-10", "96:Repaire des Voleurs 3-4 9-10", Select_LoadGame, 0x048E }, - { "97:" GFXP_KATAKANA "ゲルド" GFXP_HIRAGANA "ツウロ 5-6", "97:Thieves' Hideout 5-6", "97:Diebesversteck 5-6", "97:Repaire des Voleurs 5-6", Select_LoadGame, 0x0496 }, - { "98:" GFXP_KATAKANA "ゲルド" GFXP_HIRAGANA "ツウロ 7-8", "98:Thieves' Hideout 7-8", "98:Diebesversteck 7-8", "98:Repaire des Voleurs 7-8", Select_LoadGame, 0x049E }, - { "99:" GFXP_KATAKANA "ゲルド" GFXP_HIRAGANA "ツウロ 11-12", "99:Thieves' Hideout 11-12", "99:Diebesversteck 11-12", "99:Repaire des Voleurs 11-12", Select_LoadGame, 0x04AE }, - { "100:" GFXP_KATAKANA "ゲルド" GFXP_HIRAGANA "ツウロ 13", "100:Thieves' Hideout 13", "100:Diebesversteck 13", "100:Repaire des Voleurs 13", Select_LoadGame, 0x0570 }, - { "101:" GFXP_HIRAGANA "カクシトビコミアナ 0", "101:Grotto 0", "101:Grotte 0", "101:Grotte 0", Select_LoadGame, 0x003F }, - { "102:" GFXP_HIRAGANA "カクシトビコミアナ 1", "102:Grotto 1", "102:Grotte 1", "102:Grotte 1", Select_LoadGame, 0x0598 }, - { "103:" GFXP_HIRAGANA "カクシトビコミアナ 2", "103:Grotto 2", "103:Grotte 2", "103:Grotte 2", Select_LoadGame, 0x059C }, - { "104:" GFXP_HIRAGANA "カクシトビコミアナ 3", "104:Grotto 3", "104:Grotte 3", "104:Grotte 3", Select_LoadGame, 0x05A0 }, - { "105:" GFXP_HIRAGANA "カクシトビコミアナ 4", "105:Grotto 4", "105:Grotte 4", "105:Grotte 4", Select_LoadGame, 0x05A4 }, - { "106:" GFXP_HIRAGANA "カクシトビコミアナ 5", "106:Grotto 5", "106:Grotte 5", "106:Grotte 5", Select_LoadGame, 0x05A8 }, - { "107:" GFXP_HIRAGANA "カクシトビコミアナ 6", "107:Grotto 6", "107:Grotte 6", "107:Grotte 6", Select_LoadGame, 0x05AC }, - { "108:" GFXP_HIRAGANA "カクシトビコミアナ 7", "108:Grotto 7", "108:Grotte 7", "108:Grotte 7", Select_LoadGame, 0x05B0 }, - { "109:" GFXP_HIRAGANA "カクシトビコミアナ 8", "109:Grotto 8", "109:Grotte 8", "109:Grotte 8", Select_LoadGame, 0x05B4 }, - { "110:" GFXP_HIRAGANA "カクシトビコミアナ 9", "110:Grotto 9", "110:Grotte 9", "110:Grotte 9", Select_LoadGame, 0x05B8 }, - { "111:" GFXP_HIRAGANA "カクシトビコミアナ 10", "111:Grotto 10", "111:Grotte 10", "111:Grotte 10", Select_LoadGame, 0x05BC }, - { "112:" GFXP_HIRAGANA "カクシトビコミアナ 11", "112:Grotto 11", "112:Grotte 11", "112:Grotte 11", Select_LoadGame, 0x05C0 }, - { "113:" GFXP_HIRAGANA "カクシトビコミアナ 12", "113:Grotto 12", "113:Grotte 12", "113:Grotte 12", Select_LoadGame, 0x05C4 }, - { "114:" GFXP_HIRAGANA "カクシトビコミアナ 13", "114:Grotto 13", "114:Grotte 13", "114:Grotte 13", Select_LoadGame, 0x05FC }, - { "115:" GFXP_KATAKANA "ハイラル デモ", "115:Goddess Cutscene Environment", "115:Goettinnen Cutscene Umgebung", "115:Carte de la scene des Deesses", Select_LoadGame, 0x00A0 }, - { "116:" GFXP_HIRAGANA "ベッシツ (タカラバコ" GFXP_KATAKANA "ワープ)", "116:Test Room", "116:Test Raum", "116:Salle de Test", Select_LoadGame, 0x0520 }, - { "117:" GFXP_HIRAGANA "ササ" GFXP_KATAKANA "テスト", "117:SRD Map", "117:SRD Karte", "117:Carte SRD", Select_LoadGame, 0x0018 }, - { "118:" GFXP_KATAKANA "テストマップ", "118:Test Map", "118:Test Karte", "118:Carte de Test", Select_LoadGame, 0x0094 }, - { "119:" GFXP_KATAKANA "テストルーム", "119:Treasure Chest Warp", "119:Schatzkisten Teleport", "119:Coffres debug", Select_LoadGame, 0x0024 }, - { "120:" GFXP_HIRAGANA "チュウ" GFXP_KATAKANA "スタロフォス" GFXP_HIRAGANA "ベヤ", "120:Stalfos Miniboss Room", "120:Stalfos-Ritter Miniboss Raum", "120:Salle de Miniboss Stalfos", Select_LoadGame, 0x001C }, - { "121:" GFXP_KATAKANA "ボススタロフォス" GFXP_HIRAGANA "ベヤ", "121:Stalfos Boss Room", "121:Stalfos-Ritter Boss Raum", "121:Salle de Boss Stalfos", Select_LoadGame, 0x0020 }, - { "122:Sutaru", "122:Dark Link Room", "122:Schwarzer Link Raum", "122:Salle de Dark Link", Select_LoadGame, 0x0047 }, - { "123:jikkenjyou", "123:Shooting Gallery Duplicate", "123:Schiessbude (Duplikat)", "123:Jeu d'adresse (Duplicata)", Select_LoadGame, 0x02EA }, - { "124:depth" GFXP_KATAKANA "テスト", "124:depth test", "124:Tiefen Test", "124:Test de Profondeur", Select_LoadGame, 0x00B6 }, - { "125:" GFXP_KATAKANA "ハイラル" GFXP_HIRAGANA "ニワ" GFXP_KATAKANA "ゲーム2", "125:Hyrule Garden Game (Broken)", "125:Burghof - Wachen-Minispiel (Kaputt)", "125:Cour du Chateau (Non fonctionnel)", Select_LoadGame, 0x0076 }, - { "title", "title", "Titelbildschirm", "Ecran-titre", Select_LoadTitle, 0x0000 }, + { " 1:SPOT00", " 1:Hyrule Field", " 1:Hylianische Steppe", " 1:Plaine d'Hyrule", Select_LoadGame, ENTR_HYRULE_FIELD_0 }, + { " 2:SPOT01", " 2:Kakariko Village", " 2:Kakariko", " 2:Village Cocorico", Select_LoadGame, ENTR_KAKARIKO_VILLAGE_0 }, + { " 3:SPOT02", " 3:Graveyard", " 3:Friedhof", " 3:Cimetiere", Select_LoadGame, ENTR_GRAVEYARD_0 }, + { " 4:SPOT03", " 4:Zora's River", " 4:Zora-Fluss", " 4:Riviere Zora", Select_LoadGame, ENTR_ZORAS_RIVER_0 }, + { " 5:SPOT04", " 5:Kokiri Forest", " 5:Kokiri-Wald", " 5:Foret Kokiri", Select_LoadGame, ENTR_KOKIRI_FOREST_0 }, + { " 6:SPOT05", " 6:Sacred Forest Meadow", " 6:Heilige Lichtung", " 6:Bosquet Sacre", Select_LoadGame, ENTR_SACRED_FOREST_MEADOW_0 }, + { " 7:SPOT06", " 7:Lake Hylia", " 7:Hylia-See", " 7:Lac Hylia", Select_LoadGame, ENTR_LAKE_HYLIA_0 }, + { " 8:SPOT07", " 8:Zora's Domain", " 8:Zoras Reich", " 8:Domaine Zora", Select_LoadGame, ENTR_ZORAS_DOMAIN_0 }, + { " 9:SPOT08", " 9:Zora's Fountain", " 9:Zoras Quelle", " 9:Fontaine Zora", Select_LoadGame, ENTR_ZORAS_FOUNTAIN_0 }, + { "10:SPOT09", "10:Gerudo Valley", "10:Gerudotal", "10:Vallee Gerudo", Select_LoadGame, ENTR_GERUDO_VALLEY_0 }, + { "11:SPOT10", "11:Lost Woods", "11:Verlorene Waelder", "11:Bois Perdus", Select_LoadGame, ENTR_LOST_WOODS_0 }, + { "12:SPOT11", "12:Desert Colossus", "12:Wuestenkoloss", "12:Colosse du Desert", Select_LoadGame, ENTR_DESERT_COLOSSUS_0 }, + { "13:SPOT12", "13:Gerudo's Fortress", "13:Gerudo-Festung", "13:Forteresse Gerudo", Select_LoadGame, ENTR_GERUDOS_FORTRESS_0 }, + { "14:SPOT13", "14:Haunted Wasteland", "14:Gespensterwueste", "14:Desert Hante", Select_LoadGame, ENTR_HAUNTED_WASTELAND_0 }, + { "15:SPOT15", "15:Hyrule Castle", "15:Schloss Hyrule", "15:Chateau d'Hyrule", Select_LoadGame, ENTR_HYRULE_CASTLE_0 }, + { "16:SPOT16", "16:Death Mountain Trail", "16:Pfad zum Todesberg", "16:Chemin du Peril", Select_LoadGame, ENTR_DEATH_MOUNTAIN_TRAIL_0 }, + { "17:SPOT17", "17:Death Mountain Crater", "17:Todeskrater", "17:Cratere du Peril", Select_LoadGame, ENTR_DEATH_MOUNTAIN_CRATER_0 }, + { "18:SPOT18", "18:Goron City", "18:Goronia", "18:Village Goron", Select_LoadGame, ENTR_GORON_CITY_0 }, + { "19:SPOT20", "19:Lon Lon Ranch", "19:Lon Lon-Farm", "19:Ranch Lon Lon", Select_LoadGame, ENTR_LON_LON_RANCH_0 }, + { "20:" GFXP_HIRAGANA "トキノマ", "20:Temple Of Time", "20:Zitadelle der Zeit", "20:Temple du Temps", Select_LoadGame, ENTR_TEMPLE_OF_TIME_0 }, + { "21:" GFXP_HIRAGANA "ケンジャノマ", "21:Chamber of Sages", "21:Halle der Weisen", "21:Sanctuaire des Sages", Select_LoadGame, ENTR_CHAMBER_OF_THE_SAGES_0 }, + { "22:" GFXP_HIRAGANA "シャテキジョウ", "22:Shooting Gallery", "22:Schiessbude ", "22:Jeu d'adresse", Select_LoadGame, ENTR_SHOOTING_GALLERY_0 }, + { "23:" GFXP_KATAKANA "ハイラル" GFXP_HIRAGANA "ニワ" GFXP_KATAKANA "ゲーム", "23:Castle Courtyard Game", "23:Burghof - Wachen", "23:Cour du Chateau (Infilration)", Select_LoadGame, ENTR_CASTLE_COURTYARD_GUARDS_DAY_0 }, + { "24:" GFXP_HIRAGANA "ハカシタトビコミアナ", "24:Grave 1", "24:Grab 1", "24:Tombe 1", Select_LoadGame, ENTR_REDEAD_GRAVE_0 }, + { "25:" GFXP_HIRAGANA "ハカシタトビコミアナ 2", "25:Grave 2", "25:Grab 2", "25:Tombe 2", Select_LoadGame, ENTR_GRAVE_WITH_FAIRYS_FOUNTAIN_0 }, + { "26:" GFXP_HIRAGANA "オウケ ノ ハカアナ", "26:Royal Family's Tomb", "26:Koenigsgrab", "26:Tombe Royale", Select_LoadGame, ENTR_ROYAL_FAMILYS_TOMB_0 }, + { "27:" GFXP_HIRAGANA "ダイヨウセイノイズミ", "27:Great Fairy's Fountain (Upgrades)", "27:Feen-Quelle (Upgrades)", "27:Fontaine Royale des Fees (Amel.)", Select_LoadGame, ENTR_GREAT_FAIRYS_FOUNTAIN_MAGIC_0 }, + { "28:" GFXP_HIRAGANA "トビコミ ヨウセイ アナ", "28:Fairy's Fountain (Grotto)", "28:Feen-Brunnen (Grotte)", "28:Fontaines des Fees (Grotte)", Select_LoadGame, ENTR_FAIRYS_FOUNTAIN_0 }, + { "29:" GFXP_HIRAGANA "マホウセキ ヨウセイノイズミ", "29:Great Fairy's Fountain (Magic)", "29:Feen-Quelle (Magie)", "29:Fontaine Royale des Fees (Magie)", Select_LoadGame, ENTR_GREAT_FAIRYS_FOUNTAIN_SPELLS_0 }, + { "30:" GFXP_KATAKANA "ガノン" GFXP_HIRAGANA "サイシュウセン", "30:Ganon's Tower - Collapsing", "30:Ganons Turm - Einsturz", "30:Tour de Ganon - Effondrement", Select_LoadGame, ENTR_GANONS_TOWER_COLLAPSE_EXTERIOR_0 }, + { "31:" GFXP_KATAKANA "ハイラル" GFXP_HIRAGANA "ナカニワ", "31:Castle Courtyard", "31:Burghof - Zelda", "31:Cour du Chateau", Select_LoadGame, ENTR_CASTLE_COURTYARD_ZELDA_0 }, + { "32:" GFXP_HIRAGANA "ツリボリ", "32:Fishing Pond", "32:Fischweiher", "32:Etang", Select_LoadGame, ENTR_FISHING_POND_0 }, + { "33:" GFXP_KATAKANA "ボムチュウボーリング", "33:Bombchu Bowling Alley", "33:Minenbowlingbahn", "33:Bowling Teigneux", Select_LoadGame, ENTR_BOMBCHU_BOWLING_ALLEY_0 }, + { "34:" GFXP_KATAKANA "ロンロン" GFXP_HIRAGANA "ボクジョウ ソウコ 1", "34:Lon Lon Ranch House", "34:Lon Lon-Farm Haus", "34:Maison du Ranch Lon Lon", Select_LoadGame, ENTR_LON_LON_BUILDINGS_0 }, + { "35:" GFXP_KATAKANA "ロンロン" GFXP_HIRAGANA "ボクジョウ ソウコ 2", "35:Lon Lon Ranch Silo", "35:Lon Lon-Farm Silo", "35:Silo du Ranch Lon Lon", Select_LoadGame, ENTR_LON_LON_BUILDINGS_1 }, + { "36:" GFXP_HIRAGANA "ミハリ ゴヤ", "36:Guard House", "36:Wachposten", "36:Maison de Garde", Select_LoadGame, ENTR_MARKET_GUARD_HOUSE_0 }, + { "37:" GFXP_HIRAGANA "マホウ ノ クスリヤ", "37:Potion Shop", "37:Magie-Laden", "37:Apothicaire", Select_LoadGame, ENTR_POTION_SHOP_GRANNY_0 }, + { "38:" GFXP_HIRAGANA "タカラバコヤ", "38:Treasure Chest Game", "38:Trhenlotterie", "38:Chasse aux Tresors", Select_LoadGame, ENTR_TREASURE_BOX_SHOP_0 }, + { "39:" GFXP_HIRAGANA "キン " GFXP_KATAKANA "スタルチュラ ハウス", "39:House Of Skulltula", "39:Skulltulas Haus", "39:Maison des Skulltulas", Select_LoadGame, ENTR_HOUSE_OF_SKULLTULA_0 }, + { "40:" GFXP_HIRAGANA "ジョウカマチ イリグチ", "40:Entrance to Market", "40:Eingang zum Marktplatz", "40:Entree de la Place du Marche", Select_LoadGame, ENTR_MARKET_ENTRANCE_DAY_0 }, + { "41:" GFXP_HIRAGANA "ジョウカマチ", "41:Market", "41:Marktplatz", "41:Place du Marche", Select_LoadGame, ENTR_MARKET_DAY_0 }, + { "42:" GFXP_HIRAGANA "ウラロジ", "42:Back Alley", "42:Seitenstrasse", "42:Ruelle", Select_LoadGame, ENTR_BACK_ALLEY_DAY_0 }, + { "43:" GFXP_HIRAGANA "トキノシンデン マエ", "43:Temple of Time Exterior", "43:Vor der Zitadelle der Zeit", "43:Exterieur du Temple du Temps", Select_LoadGame, ENTR_TEMPLE_OF_TIME_EXTERIOR_DAY_0 }, + { "44:" GFXP_HIRAGANA "リンクノイエ", "44:Link's House", "44:Links Haus", "44:Cabane de Link", Select_LoadGame, ENTR_LINKS_HOUSE_0 }, + { "45:" GFXP_KATAKANA "カカリコ" GFXP_HIRAGANA "ムラノナガヤ", "45:Kakariko House 1", "45:Kakariko Haus 1", "45:Maison du Village Cocorico 1", Select_LoadGame, ENTR_KAKARIKO_CENTER_GUEST_HOUSE_0 }, + { "46:" GFXP_HIRAGANA "ウラロジノ イエ", "46:Back Alley House 1", "46:Seitenstrasse Haus 1", "46:Maison de la Ruelle 1", Select_LoadGame, ENTR_BACK_ALLEY_HOUSE_0 }, + { "47:" GFXP_HIRAGANA "コキリノムラ モノシリキョウダイノイエ", "47:House of the Know-it-All Brothers", "47:Haus der Allwissenden Brueder", "47:Cabane des Freres Je-Sais-Tout", Select_LoadGame, ENTR_KNOW_IT_ALL_BROS_HOUSE_0 }, + { "48:" GFXP_HIRAGANA "コキリノムラ フタゴノイエ", "48:House of Twins", "48:Haus der Zwillinge", "48:Cabane des Jumeaux", Select_LoadGame, ENTR_TWINS_HOUSE_0 }, + { "49:" GFXP_HIRAGANA "コキリノムラ " GFXP_KATAKANA "ミド" GFXP_HIRAGANA "ノイエ", "49:Mido's House", "49:Midos Haus", "49:Cabane du Grand Mido", Select_LoadGame, ENTR_MIDOS_HOUSE_0 }, + { "50:" GFXP_HIRAGANA "コキリノムラ " GFXP_KATAKANA "サリア" GFXP_HIRAGANA "ノイエ", "50:Saria's House", "50:Salias Haus", "50:Cabane de Saria", Select_LoadGame, ENTR_SARIAS_HOUSE_0 }, + { "51:" GFXP_HIRAGANA "ウマゴヤ", "51:Stable", "51:Stall", "51:Etable", Select_LoadGame, ENTR_STABLE_0 }, + { "52:" GFXP_HIRAGANA "ハカモリノイエ", "52:Grave Keeper's Hut", "52:Huette des Totengraebers", "52:Cabane du Fossoyeur", Select_LoadGame, ENTR_GRAVEKEEPERS_HUT_0 }, + { "53:" GFXP_HIRAGANA "ウラロジ イヌオバサンノイエ", "53:Dog Lady's House", "53:Haus der Hunde-Dame", "53:Maison de la Dame du Chien", Select_LoadGame, ENTR_DOG_LADY_HOUSE_0 }, + { "54:" GFXP_HIRAGANA "カカリコムラ " GFXP_KATAKANA "インパ" GFXP_HIRAGANA "ノイエ", "54:Impa's House", "54:Impas Haus", "54:Maison d'Impa", Select_LoadGame, ENTR_IMPAS_HOUSE_0 }, + { "55:" GFXP_KATAKANA "ハイリア" GFXP_HIRAGANA " ケンキュウジョ", "55:Lakeside Laboratory", "55:Hylia-See Laboratorium", "55:Laboratoire du Lac", Select_LoadGame, ENTR_LAKESIDE_LABORATORY_0 }, + { "56:" GFXP_KATAKANA "テント", "56:Running Man's Tent", "56:Zelt des Rennlaeufers", "56:Tente du Marathonien", Select_LoadGame, ENTR_CARPENTERS_TENT_0 }, + { "57:" GFXP_HIRAGANA "タテノミセ", "57:Bazaar", "57:Basar", "57:Bazar", Select_LoadGame, ENTR_BAZAAR_0 }, + { "58:" GFXP_HIRAGANA "コキリゾクノミセ", "58:Kokiri Shop", "58:Kokiri-Laden", "58:Boutique Kokiri", Select_LoadGame, ENTR_KOKIRI_SHOP_0 }, + { "59:" GFXP_KATAKANA "ゴロン" GFXP_HIRAGANA "ノミセ", "59:Goron Shop", "59:Goronen-Laden", "59:Boutique Goron", Select_LoadGame, ENTR_GORON_SHOP_0 }, + { "60:" GFXP_KATAKANA "ゾーラ" GFXP_HIRAGANA "ノミセ", "60:Zora Shop", "60:Zora-Laden", "60:Boutique Zora", Select_LoadGame, ENTR_ZORA_SHOP_0 }, + { "61:" GFXP_KATAKANA "カカリコ" GFXP_HIRAGANA "ムラ クスリヤ", "61:Closed Shop", "61:Geschlossener Laden", "61:Boutique Fermee", Select_LoadGame, ENTR_POTION_SHOP_KAKARIKO_0 }, + { "62:" GFXP_HIRAGANA "ジョウカマチ クスリヤ", "62:Potion Shop", "62:Magie-Laden", "62:Apothicaire (Boutique)", Select_LoadGame, ENTR_POTION_SHOP_MARKET_0 }, + { "63:" GFXP_HIRAGANA "ウラロジ ヨルノミセ", "63:Bombchu Shop", "63:Krabbelminen-Laden", "63:Boutique de Missiles Teigneux", Select_LoadGame, ENTR_BOMBCHU_SHOP_0 }, + { "64:" GFXP_HIRAGANA "オメンヤ", "64:Happy Mask Shop", "64:Maskenhaendler", "64:Foire aux Masques", Select_LoadGame, ENTR_HAPPY_MASK_SHOP_0 }, + { "65:" GFXP_KATAKANA "ゲルド" GFXP_HIRAGANA "ノシュウレンジョウ", "65:Gerudo Training Ground", "65:Gerudo-Arena", "65:Gymnase Gerudo", Select_LoadGame, ENTR_GERUDO_TRAINING_GROUND_0 }, + { "66:" GFXP_HIRAGANA "ヨウセイノキノ " GFXP_KATAKANA "ダンジョン", "66:Inside the Deku Tree", "66:Im Deku-Baum", "66:Arbre Mojo", Select_LoadGame, ENTR_DEKU_TREE_0 }, + { "67:" GFXP_HIRAGANA "ヨウセイノキノ " GFXP_KATAKANA "ダンジョン ボス", "67:Gohma's Lair", "67:Gohmas Verlies", "67:Repaire de Gohma", Select_LoadGame, ENTR_DEKU_TREE_BOSS_0 }, + { "68:" GFXP_KATAKANA "ドドンゴ ダンジョン", "68:Dodongo's Cavern", "68:Dodongos Hoehle", "68:Caverne Dodongo", Select_LoadGame, ENTR_DODONGOS_CAVERN_0 }, + { "69:" GFXP_KATAKANA "ドドンゴ ダンジョン ボス", "69:King Dodongo's Lair", "69:King Dodongos Verlies", "69:Repaire du Roi Dodongo", Select_LoadGame, ENTR_DODONGOS_CAVERN_BOSS_0 }, + { "70:" GFXP_HIRAGANA "キョダイギョ " GFXP_KATAKANA "ダンジョン", "70:Inside Jabu-Jabu's Belly", "70:Jabu-Jabus Bauch", "70:Ventre de Jabu-Jabu", Select_LoadGame, ENTR_JABU_JABU_0 }, + { "71:" GFXP_HIRAGANA "キョダイギョ " GFXP_KATAKANA "ダンジョン ボス", "71:Barinade's Lair", "71:Barinades Verlies", "71:Repaire de Barinade", Select_LoadGame, ENTR_JABU_JABU_BOSS_0 }, + { "72:" GFXP_HIRAGANA "モリノシンデン", "72:Forest Temple", "72:Waldtempel", "72:Temple de la Foret", Select_LoadGame, ENTR_FOREST_TEMPLE_0 }, + { "73:" GFXP_HIRAGANA "モリノシンデン " GFXP_KATAKANA "ボス", "73:Phantom Ganon's Lair", "73:Phantom-Ganons Verlies", "73:Repaire de Ganon Spectral", Select_LoadGame, ENTR_FOREST_TEMPLE_BOSS_0 }, + { "74:" GFXP_HIRAGANA "イドシタ " GFXP_KATAKANA "ダンジョン", "74:Bottom of the Well", "74:Grund des Brunnens", "74:Puits", Select_LoadGame, ENTR_BOTTOM_OF_THE_WELL_0 }, + { "75:" GFXP_HIRAGANA "ハカシタ " GFXP_KATAKANA "ダンジョン", "75:Shadow Temple", "75:Schattentempel", "75:Temple de l'Ombre", Select_LoadGame, ENTR_SHADOW_TEMPLE_0 }, + { "76:" GFXP_HIRAGANA "ハカシタ " GFXP_KATAKANA "ダンジョン ボス", "76:Bongo Bongo's Lair", "76:Bongo Bongos Verlies", "76:Repaire de Bongo Bongo", Select_LoadGame, ENTR_SHADOW_TEMPLE_BOSS_0 }, + { "77:" GFXP_HIRAGANA "ヒノシンデン", "77:Fire Temple", "77:Feuertempel", "77:Temple du Feu", Select_LoadGame, ENTR_FIRE_TEMPLE_0 }, + { "78:" GFXP_HIRAGANA "ヒノシンデン " GFXP_KATAKANA "ボス", "78:Volvagia's Lair", "78:Volvagias Verlies", "78:Repaire de Volcania", Select_LoadGame, ENTR_FIRE_TEMPLE_BOSS_0 }, + { "79:" GFXP_HIRAGANA "ミズノシンデン", "79:Water Temple", "79:Wassertempel", "79:Temple de l'Eau", Select_LoadGame, ENTR_WATER_TEMPLE_0 }, + { "80:" GFXP_HIRAGANA "ミズノシンデン " GFXP_KATAKANA "ボス", "80:Morpha's Lair", "80:Morphas Verlies", "80:Repaire de Morpha", Select_LoadGame, ENTR_WATER_TEMPLE_BOSS_0 }, + { "81:" GFXP_HIRAGANA "ジャシンゾウ " GFXP_KATAKANA "ダンジョン", "81:Spirit Temple", "81:Geistertempel", "81:Temple de l'Esprit", Select_LoadGame, ENTR_SPIRIT_TEMPLE_0 }, + { "82:" GFXP_HIRAGANA "ジャシンゾウ " GFXP_KATAKANA "ダンジョン アイアンナック", "82:Iron Knuckle's Lair", "82:Eisenprinz' Verlies", "82:Repaire du Hache Viande", Select_LoadGame, ENTR_SPIRIT_TEMPLE_BOSS_0 }, + { "83:" GFXP_HIRAGANA "ジャシンゾウ " GFXP_KATAKANA "ダンジョン ボス", "83:Twinrova's Lair", "83:Killa Ohmaz' Verlies", "83:Repaire du Duo Malefique", Select_LoadGame, ENTR_SPIRIT_TEMPLE_BOSS_2 }, + { "84:" GFXP_KATAKANA "ガノン" GFXP_HIRAGANA "ノトウ", "84:Stairs to Ganondorf's Lair", "84:Treppen zu Ganondorfs Verlies", "84:Repaire de Ganondorf (Escaliers)", Select_LoadGame, ENTR_GANONS_TOWER_0 }, + { "85:" GFXP_KATAKANA "ガノン" GFXP_HIRAGANA "ノトウ" GFXP_KATAKANA "ボス", "85:Ganondorf's Lair", "85:Ganondorfs Verlies", "85:Repaire de Ganondorf", Select_LoadGame, ENTR_GANONDORF_BOSS_0 }, + { "86:" GFXP_HIRAGANA "コオリノドウクツ", "86:Ice Cavern", "86:Eishoehle", "86:Caverne Polaire", Select_LoadGame, ENTR_ICE_CAVERN_0 }, + { "87:" GFXP_HIRAGANA "ハカシタ" GFXP_KATAKANA "リレー", "87:Dampe Grave Relay Game", "87:Boris' Grab Staffellauf", "87:Tombe d'Igor", Select_LoadGame, ENTR_WINDMILL_AND_DAMPES_GRAVE_0 }, + { "88:" GFXP_KATAKANA "ガノン" GFXP_HIRAGANA "チカ " GFXP_KATAKANA "ダンジョン", "88:Inside Ganon's Castle", "88:In Ganons Schloss", "88:Tour de Ganon", Select_LoadGame, ENTR_INSIDE_GANONS_CASTLE_0 }, + { "89:" GFXP_KATAKANA "ガノン" GFXP_HIRAGANA "サイシュウセン " GFXP_KATAKANA "デモ & バトル", "89:Ganon's Lair", "89:Ganons Verlies", "89:Repaire de Ganon", Select_LoadGame, ENTR_GANON_BOSS_0 }, + { "90:" GFXP_KATAKANA "ガノン" GFXP_HIRAGANA "ノトウ ソノゴ 1", "90:Escaping Ganon's Castle 1", "90:Flucht aus Ganons Schloss 1", "90:Fuite du Chateau de Ganon 1", Select_LoadGame, ENTR_GANONS_TOWER_COLLAPSE_INTERIOR_0 }, + { "91:" GFXP_KATAKANA "ガノン" GFXP_HIRAGANA "ノトウ ソノゴ 2", "91:Escaping Ganon's Castle 2", "91:Flucht aus Ganons Schloss 2", "91:Fuite du Chateau de Ganon 2", Select_LoadGame, ENTR_GANONS_TOWER_COLLAPSE_INTERIOR_2 }, + { "92:" GFXP_KATAKANA "ガノン" GFXP_HIRAGANA "ノトウ ソノゴ 3", "92:Escaping Ganon's Castle 3", "92:Flucht aus Ganons Schloss 3", "92:Fuite du Chateau de Ganon 3", Select_LoadGame, ENTR_GANONS_TOWER_COLLAPSE_INTERIOR_4 }, + { "93:" GFXP_KATAKANA "ガノン" GFXP_HIRAGANA "ノトウ ソノゴ 4", "93:Escaping Ganon's Castle 4", "93:Flucht aus Ganons Schloss 4", "93:Fuite du Chateau de Ganon 4", Select_LoadGame, ENTR_GANONS_TOWER_COLLAPSE_INTERIOR_6 }, + { "94:" GFXP_KATAKANA "ガノン" GFXP_HIRAGANA "チカ ソノゴ", "94:Escaping Ganon's Castle 5", "94:Flucht aus Ganons Schloss 5", "94:Fuite du Chateau de Ganon 5", Select_LoadGame, ENTR_INSIDE_GANONS_CASTLE_COLLAPSE_0 }, + { "95:" GFXP_KATAKANA "ゲルド" GFXP_HIRAGANA "ツウロ 1-2", "95:Thieves' Hideout 1-2", "95:Diebesversteck 1-2", "95:Repaire des Voleurs 1-2", Select_LoadGame, ENTR_THIEVES_HIDEOUT_0 }, + { "96:" GFXP_KATAKANA "ゲルド" GFXP_HIRAGANA "ツウロ 3-4 9-10", "96:Thieves' Hideout 3-4 9-10", "96:Diebesversteck 3-4 9-10", "96:Repaire des Voleurs 3-4 9-10", Select_LoadGame, ENTR_THIEVES_HIDEOUT_2 }, + { "97:" GFXP_KATAKANA "ゲルド" GFXP_HIRAGANA "ツウロ 5-6", "97:Thieves' Hideout 5-6", "97:Diebesversteck 5-6", "97:Repaire des Voleurs 5-6", Select_LoadGame, ENTR_THIEVES_HIDEOUT_4 }, + { "98:" GFXP_KATAKANA "ゲルド" GFXP_HIRAGANA "ツウロ 7-8", "98:Thieves' Hideout 7-8", "98:Diebesversteck 7-8", "98:Repaire des Voleurs 7-8", Select_LoadGame, ENTR_THIEVES_HIDEOUT_6 }, + { "99:" GFXP_KATAKANA "ゲルド" GFXP_HIRAGANA "ツウロ 11-12", "99:Thieves' Hideout 11-12", "99:Diebesversteck 11-12", "99:Repaire des Voleurs 11-12", Select_LoadGame, ENTR_THIEVES_HIDEOUT_10 }, + { "100:" GFXP_KATAKANA "ゲルド" GFXP_HIRAGANA "ツウロ 13", "100:Thieves' Hideout 13", "100:Diebesversteck 13", "100:Repaire des Voleurs 13", Select_LoadGame, ENTR_THIEVES_HIDEOUT_12 }, + { "101:" GFXP_HIRAGANA "カクシトビコミアナ 0", "101:Grotto 0", "101:Grotte 0", "101:Grotte 0", Select_LoadGame, ENTR_GROTTOS_0 }, + { "102:" GFXP_HIRAGANA "カクシトビコミアナ 1", "102:Grotto 1", "102:Grotte 1", "102:Grotte 1", Select_LoadGame, ENTR_GROTTOS_1 }, + { "103:" GFXP_HIRAGANA "カクシトビコミアナ 2", "103:Grotto 2", "103:Grotte 2", "103:Grotte 2", Select_LoadGame, ENTR_GROTTOS_2 }, + { "104:" GFXP_HIRAGANA "カクシトビコミアナ 3", "104:Grotto 3", "104:Grotte 3", "104:Grotte 3", Select_LoadGame, ENTR_GROTTOS_3 }, + { "105:" GFXP_HIRAGANA "カクシトビコミアナ 4", "105:Grotto 4", "105:Grotte 4", "105:Grotte 4", Select_LoadGame, ENTR_GROTTOS_4 }, + { "106:" GFXP_HIRAGANA "カクシトビコミアナ 5", "106:Grotto 5", "106:Grotte 5", "106:Grotte 5", Select_LoadGame, ENTR_GROTTOS_5 }, + { "107:" GFXP_HIRAGANA "カクシトビコミアナ 6", "107:Grotto 6", "107:Grotte 6", "107:Grotte 6", Select_LoadGame, ENTR_GROTTOS_6 }, + { "108:" GFXP_HIRAGANA "カクシトビコミアナ 7", "108:Grotto 7", "108:Grotte 7", "108:Grotte 7", Select_LoadGame, ENTR_GROTTOS_7 }, + { "109:" GFXP_HIRAGANA "カクシトビコミアナ 8", "109:Grotto 8", "109:Grotte 8", "109:Grotte 8", Select_LoadGame, ENTR_GROTTOS_8 }, + { "110:" GFXP_HIRAGANA "カクシトビコミアナ 9", "110:Grotto 9", "110:Grotte 9", "110:Grotte 9", Select_LoadGame, ENTR_GROTTOS_9 }, + { "111:" GFXP_HIRAGANA "カクシトビコミアナ 10", "111:Grotto 10", "111:Grotte 10", "111:Grotte 10", Select_LoadGame, ENTR_GROTTOS_10 }, + { "112:" GFXP_HIRAGANA "カクシトビコミアナ 11", "112:Grotto 11", "112:Grotte 11", "112:Grotte 11", Select_LoadGame, ENTR_GROTTOS_11 }, + { "113:" GFXP_HIRAGANA "カクシトビコミアナ 12", "113:Grotto 12", "113:Grotte 12", "113:Grotte 12", Select_LoadGame, ENTR_GROTTOS_12 }, + { "114:" GFXP_HIRAGANA "カクシトビコミアナ 13", "114:Grotto 13", "114:Grotte 13", "114:Grotte 13", Select_LoadGame, ENTR_GROTTOS_13 }, + { "115:" GFXP_KATAKANA "ハイラル デモ", "115:Goddess Cutscene Environment", "115:Goettinnen Cutscene Umgebung", "115:Carte de la scene des Deesses", Select_LoadGame, ENTR_CUTSCENE_MAP_0 }, + { "116:" GFXP_HIRAGANA "ベッシツ (タカラバコ" GFXP_KATAKANA "ワープ)", "116:Test Room", "116:Test Raum", "116:Salle de Test", Select_LoadGame, ENTR_BESITU_0 }, + { "117:" GFXP_HIRAGANA "ササ" GFXP_KATAKANA "テスト", "117:SRD Map", "117:SRD Karte", "117:Carte SRD", Select_LoadGame, ENTR_SASATEST_0 }, + { "118:" GFXP_KATAKANA "テストマップ", "118:Test Map", "118:Test Karte", "118:Carte de Test", Select_LoadGame, ENTR_TEST01_0 }, + { "119:" GFXP_KATAKANA "テストルーム", "119:Treasure Chest Warp", "119:Schatzkisten Teleport", "119:Coffres debug", Select_LoadGame, ENTR_TESTROOM_0 }, + { "120:" GFXP_HIRAGANA "チュウ" GFXP_KATAKANA "スタロフォス" GFXP_HIRAGANA "ベヤ", "120:Stalfos Miniboss Room", "120:Stalfos-Ritter Miniboss Raum", "120:Salle de Miniboss Stalfos", Select_LoadGame, ENTR_SYOTES_0 }, + { "121:" GFXP_KATAKANA "ボススタロフォス" GFXP_HIRAGANA "ベヤ", "121:Stalfos Boss Room", "121:Stalfos-Ritter Boss Raum", "121:Salle de Boss Stalfos", Select_LoadGame, ENTR_SYOTES2_0 }, + { "122:Sutaru", "122:Dark Link Room", "122:Schwarzer Link Raum", "122:Salle de Dark Link", Select_LoadGame, ENTR_SUTARU_0 }, + { "123:jikkenjyou", "123:Shooting Gallery Duplicate", "123:Schiessbude (Duplikat)", "123:Jeu d'adresse (Duplicata)", Select_LoadGame, ENTR_TEST_SHOOTING_GALLERY_0 }, + { "124:depth" GFXP_KATAKANA "テスト", "124:depth test", "124:Tiefen Test", "124:Test de Profondeur", Select_LoadGame, ENTR_DEPTH_TEST_0 }, + { "125:" GFXP_KATAKANA "ハイラル" GFXP_HIRAGANA "ニワ" GFXP_KATAKANA "ゲーム2", "125:Hyrule Garden Game (Broken)", "125:Burghof - Wachen-Minispiel (Kaputt)", "125:Cour du Chateau (Non fonctionnel)", Select_LoadGame, ENTR_HAIRAL_NIWA2_0 }, + { "title", "title", "Titelbildschirm", "Ecran-titre", Select_LoadTitle, 0 }, }; static BetterSceneSelectEntry sBetterScenes[] = { { " 1:Hyrule Field", " 1:Hylianische Steppe", " 1:Plaine d'Hyrule", Select_LoadGame, 8, { - { "Near Drawbridge", "Nahe der Zugbruecke", "Pres du Pont-levis", 0x00CD, 0 }, - { "From Drawbridge", "Von der Zugbruecke", "Depuis le Pont-levis", 0x01FD, 0 }, - { "From Kakariko Village", "Von Kakariko", "Depuis le Village Cocorico", 0x017D, 0 }, - { "From Zora River", "Vom Zora-Fluss", "Depuis la Riviere Zora", 0x0181, 0 }, - { "From Lost Woods", "Von den verlorenen Waeldern", "Depuis les Bois Perdus", 0x0185, 0 }, - { "From Lake Hylia", "Vom Hylia-See", "Depuis le Lac Hylia", 0x0189, 0 }, - { "From Gerudo Valley", "Vom Gerudotal", "Depuis la Vallee Gerudo", 0x018D, 0 }, - { "From Lon Lon Ranch", "Von der Lon Lon-Farm", "Depuis le Ranch Lon Lon", 0x01F9, 0 }, + { "Near Drawbridge", "Nahe der Zugbruecke", "Pres du Pont-levis", ENTR_HYRULE_FIELD_0, 0 }, + { "From Drawbridge", "Von der Zugbruecke", "Depuis le Pont-levis", ENTR_HYRULE_FIELD_7, 0 }, + { "From Kakariko Village", "Von Kakariko", "Depuis le Village Cocorico", ENTR_HYRULE_FIELD_1, 0 }, + { "From Zora River", "Vom Zora-Fluss", "Depuis la Riviere Zora", ENTR_HYRULE_FIELD_2, 0 }, + { "From Lost Woods", "Von den verlorenen Waeldern", "Depuis les Bois Perdus", ENTR_HYRULE_FIELD_3, 0 }, + { "From Lake Hylia", "Vom Hylia-See", "Depuis le Lac Hylia", ENTR_HYRULE_FIELD_4, 0 }, + { "From Gerudo Valley", "Vom Gerudotal", "Depuis la Vallee Gerudo", ENTR_HYRULE_FIELD_5, 0 }, + { "From Lon Lon Ranch", "Von der Lon Lon-Farm", "Depuis le Ranch Lon Lon", ENTR_HYRULE_FIELD_6, 0 }, }}, { " 2:Kokiri Forest", " 2:Kokiri-Wald", " 2:Foret Kokiri", Select_LoadGame, 9, { - { "From Links House", "Von Links Haus", "Depuis la Cabane de Link", 0x0211, 0 }, - { "From Bridge", "Von der Bruecke", "Depuis le Pont", 0x020D, 0 }, - { "From Lost Woods", "Von den verlorenen Waeldern", "Depuis les Bois Perdus", 0x0286, 0 }, - { "From Deku Tree", "Vom Deku-Baum", "Depuis l'Arbre Mojo", 0x0209, 0 }, - { "From Kokiri Shop", "Vom Kokiri-Laden", "Depuis la Boutique Kokiri", 0x0266, 0 }, - { "From Know-It-All Brothers House", "Vom Haus der Allwissenden Brueder", "Depuis la Cabane des Freres Je-Sais-Tout", 0x026A, 0 }, - { "From Twins House", "Vom Haus der Zwillinge", "Depuis la Cabane des Jumeaux", 0x033C, 0 }, - { "From Midos House", "Von Midos Haus", "Depuis la Cabane du Grand Mido", 0x0443, 0 }, - { "From Sarias House", "Von Salias Haus", "Depuis la Cabane de Saria", 0x0447, 0 }, + { "From Links House", "Von Links Haus", "Depuis la Cabane de Link", ENTR_KOKIRI_FOREST_3, 0 }, + { "From Bridge", "Von der Bruecke", "Depuis le Pont", ENTR_KOKIRI_FOREST_2, 0 }, + { "From Lost Woods", "Von den verlorenen Waeldern", "Depuis les Bois Perdus", ENTR_KOKIRI_FOREST_6, 0 }, + { "From Deku Tree", "Vom Deku-Baum", "Depuis l'Arbre Mojo", ENTR_KOKIRI_FOREST_1, 0 }, + { "From Kokiri Shop", "Vom Kokiri-Laden", "Depuis la Boutique Kokiri", ENTR_KOKIRI_FOREST_4, 0 }, + { "From Know-It-All Brothers House", "Vom Haus der Allwissenden Brueder", "Depuis la Cabane des Freres Je-Sais-Tout", ENTR_KOKIRI_FOREST_5, 0 }, + { "From Twins House", "Vom Haus der Zwillinge", "Depuis la Cabane des Jumeaux", ENTR_KOKIRI_FOREST_8, 0 }, + { "From Midos House", "Von Midos Haus", "Depuis la Cabane du Grand Mido", ENTR_KOKIRI_FOREST_9, 0 }, + { "From Sarias House", "Von Salias Haus", "Depuis la Cabane de Saria", ENTR_KOKIRI_FOREST_10, 0 }, }}, { " 3:Kokiri Buildings", " 3:Kokiri Gebaeude", " 3:Cabanes des Kokiris", Select_LoadGame, 6, { - { "Links Bed", "Links Bett", "Lit de Link", 0x00BB, 0 }, - { "Kokiri Shop", "Kokiri-Laden", "Boutique Kokiri", 0x00C1, 0 }, - { "Twins House", "Haus der Zwillinge", "Cabane des Jumeaux", 0x009C, 0 }, - { "Know-It-All Brothers House", "Haus der Allwissenden Brueder", "Cabane des Freres Je-Sais-Tout", 0x00C9, 0 }, - { "Midos House", "Midos Haus", "Cabane du Grand Mido", 0x0433, 0 }, - { "Sarias House", "Salias Haus", "Cabane de Sara", 0x0437, 0 }, + { "Links Bed", "Links Bett", "Lit de Link", ENTR_LINKS_HOUSE_0, 0 }, + { "Kokiri Shop", "Kokiri-Laden", "Boutique Kokiri", ENTR_KOKIRI_SHOP_0, 0 }, + { "Twins House", "Haus der Zwillinge", "Cabane des Jumeaux", ENTR_TWINS_HOUSE_0, 0 }, + { "Know-It-All Brothers House", "Haus der Allwissenden Brueder", "Cabane des Freres Je-Sais-Tout", ENTR_KNOW_IT_ALL_BROS_HOUSE_0, 0 }, + { "Midos House", "Midos Haus", "Cabane du Grand Mido", ENTR_MIDOS_HOUSE_0, 0 }, + { "Sarias House", "Salias Haus", "Cabane de Sara", ENTR_SARIAS_HOUSE_0, 0 }, }}, { " 4:Lost Woods", " 4:Verlorene Waelder", " 4:Bois Perdus", Select_LoadGame, 5, { - { "From Kokiri Forest", "Vom Kokiri-Wald", "Depuis la Foret Kokiri", 0x011E, 0 }, - { "From Sacred Meadow", "Von der Waldlichtung", "Depuis le Bosquet Sacre", 0x01A9, 0 }, - { "From Goron City", "Vom Goronia", "Depuis le Village Goron", 0x04D6, 0 }, - { "From Zora River", "Vom Zora-Fluss", "Depuis la Riviere Zora", 0x04DA, 0 }, - { "Bridge", "Bruecke", "Pont", 0x05E0, 0 }, + { "From Kokiri Forest", "Vom Kokiri-Wald", "Depuis la Foret Kokiri", ENTR_LOST_WOODS_0, 0 }, + { "From Sacred Meadow", "Von der Waldlichtung", "Depuis le Bosquet Sacre", ENTR_LOST_WOODS_1, 0 }, + { "From Goron City", "Vom Goronia", "Depuis le Village Goron", ENTR_LOST_WOODS_6, 0 }, + { "From Zora River", "Vom Zora-Fluss", "Depuis la Riviere Zora", ENTR_LOST_WOODS_7, 0 }, + { "Bridge", "Bruecke", "Pont", ENTR_LOST_WOODS_9, 0 }, }}, { " 5:Sacred Forest Meadow", " 5:Waldlichtung", " 5:Bosquet Sacre", Select_LoadGame, 3, { - { "From Lost Woods", "Von den Verlorenen Waeldern", "Depuis les Bois Perdus", 0x00FC, 0 }, - { "From Forest Temple", "Vom Waldtempel", "Depuis le Temple de la Foret", 0x0215, 0 }, - { "Minuet of Forest Warp", "Menuett des Waldes Teleport", "Teleporteur du Menuet des Bois", 0x0600, 0 }, + { "From Lost Woods", "Von den Verlorenen Waeldern", "Depuis les Bois Perdus", ENTR_SACRED_FOREST_MEADOW_0, 0 }, + { "From Forest Temple", "Vom Waldtempel", "Depuis le Temple de la Foret", ENTR_SACRED_FOREST_MEADOW_1, 0 }, + { "Minuet of Forest Warp", "Menuett des Waldes Teleport", "Teleporteur du Menuet des Bois", ENTR_SACRED_FOREST_MEADOW_2, 0 }, }}, { " 6:Castle Town Entrance", " 6:Eingang zum Marktplatz", " 6:Entree du Bourg d'Hyrule", Select_LoadGame, 3, { - { "From Hyrule Field", "Von der Hylianischen Steppe", "Depuis la Plaine d'Hyrule", 0x0276, 0 }, - { "From Market", "Vom Marktplatz", "Depuis la Place du Marche", 0x0033, 0 }, - { "From Pot House", "Vom Wachposten", "Depuis la Maison des Jarres", 0x026E, 0 }, + { "From Hyrule Field", "Von der Hylianischen Steppe", "Depuis la Plaine d'Hyrule", ENTR_MARKET_ENTRANCE_DAY_1, 0 }, + { "From Market", "Vom Marktplatz", "Depuis la Place du Marche", ENTR_MARKET_ENTRANCE_DAY_0, 0 }, + { "From Pot House", "Vom Wachposten", "Depuis la Maison des Jarres", ENTR_MARKET_ENTRANCE_DAY_2, 0 }, }}, { " 7:Market", " 7:Marktplatz", " 7:Place du Marche", Select_LoadGame, 11, { - { "From Castle Town Entrance", "Vom Eingang zum Marktplatz", "Depuis l'Entree du Bourg d'Hyrule", 0x00B1, 0 }, - { "From Shooting Gallery", "Von der Schiessbude", "Depuis le Jeu d'adresse", 0x01CD, 0 }, - { "From Happy Mask Shop", "Vom Maskenhaendler", "Depuis la Foire aux Masques", 0x01D1, 0 }, - { "From Treasure Box Minigame", "Von der Truhenlotterie", "Depuis le Bowling Teigneux", 0x01D5, 0 }, - { "From Castle", "Vom Schloss", "Depuis le Chateau d'Hyrule", 0x025A, 0 }, - { "From Temple of Time", "Von der Zitadelle der Zeit", "Depuis le Temple du Temps", 0x025E, 0 }, - { "From Back Alley (Right)", "Von der Seitenstrasse (Rechts)", "Depuis la Ruelle (Droite)", 0x0262, 0 }, - { "From Back Alley (Left)", "Von der Seitenstrasse (Links)", "Depuis la Ruelle (Gauche)", 0x029E, 0 }, - { "From Potion Shop", "Vom Magie-Laden", "Depuis l'Apothicaire", 0x02A2, 0 }, - { "From Bazaar Shop", "Vom Basar", "Depuis le Bazar", 0x03B8, 0 }, - { "From Bomchu Bowling Minigame", "Von der Minenbowlingbahn", "Depuis le Bowling Teigneux", 0x03BC, 0 }, + { "From Castle Town Entrance", "Vom Eingang zum Marktplatz", "Depuis l'Entree du Bourg d'Hyrule", ENTR_MARKET_DAY_0, 0 }, + { "From Shooting Gallery", "Von der Schiessbude", "Depuis le Jeu d'adresse", ENTR_MARKET_DAY_8, 0 }, + { "From Happy Mask Shop", "Vom Maskenhaendler", "Depuis la Foire aux Masques", ENTR_MARKET_DAY_9, 0 }, + { "From Treasure Box Minigame", "Von der Truhenlotterie", "Depuis le Bowling Teigneux", ENTR_MARKET_DAY_10, 0 }, + { "From Castle", "Vom Schloss", "Depuis le Chateau d'Hyrule", ENTR_MARKET_DAY_1, 0 }, + { "From Temple of Time", "Von der Zitadelle der Zeit", "Depuis le Temple du Temps", ENTR_MARKET_DAY_2, 0 }, + { "From Back Alley (Right)", "Von der Seitenstrasse (Rechts)", "Depuis la Ruelle (Droite)", ENTR_MARKET_DAY_3, 0 }, + { "From Back Alley (Left)", "Von der Seitenstrasse (Links)", "Depuis la Ruelle (Gauche)", ENTR_MARKET_DAY_4, 0 }, + { "From Potion Shop", "Vom Magie-Laden", "Depuis l'Apothicaire", ENTR_MARKET_DAY_5, 0 }, + { "From Bazaar Shop", "Vom Basar", "Depuis le Bazar", ENTR_MARKET_DAY_6, 0 }, + { "From Bomchu Bowling Minigame", "Von der Minenbowlingbahn", "Depuis le Bowling Teigneux", ENTR_MARKET_DAY_7, 0 }, }}, { " 8:Castle Town Alley", " 8:Seitenstrasse", " 8:Ruelle du Bourg d'Hyrule", Select_LoadGame, 5, { - { "From Market (Right)", "Vom Marktplatz (Rechts)", "Depuis la Place du Marche (Droite)", 0x00AD, 0 }, - { "From Market (Left)", "Vom Marktplatz (Links)", "Depuis la Place du Marche (Gauche)", 0x029A, 0 }, - { "From Alley House", "Vom Seitenstrassenhaus", "Depuis la Maison de la Ruelle", 0x0067, 0 }, - { "From Dog House", "Vom Haus der Hunde-Dame", "Depuis la Maison du Chien", 0x038C, 0 }, - { "From Bombchu Shop", "Vom Krabbelminen-Laden", "Depuis le Magasin de Missiles", 0x03C0, 0 }, + { "From Market (Right)", "Vom Marktplatz (Rechts)", "Depuis la Place du Marche (Droite)", ENTR_BACK_ALLEY_DAY_0, 0 }, + { "From Market (Left)", "Vom Marktplatz (Links)", "Depuis la Place du Marche (Gauche)", ENTR_BACK_ALLEY_DAY_1, 0 }, + { "From Alley House", "Vom Seitenstrassenhaus", "Depuis la Maison de la Ruelle", ENTR_BACK_ALLEY_DAY_3, 0 }, + { "From Dog House", "Vom Haus der Hunde-Dame", "Depuis la Maison du Chien", ENTR_BACK_ALLEY_DAY_4, 0 }, + { "From Bombchu Shop", "Vom Krabbelminen-Laden", "Depuis le Magasin de Missiles", ENTR_BACK_ALLEY_DAY_2, 0 }, }}, { " 9:Castle Town Buildings", " 9:Marktplatz Gebaeude", " 9:Batiments du Bourg d'Hyrule", Select_LoadGame, 10, { - { "Pot House", "Wachposten", "Maison des Jarres", 0x007E, 0 }, - { "Shooting Gallery Minigame", "Schiessbude", "Jeu d'adresse", 0x016D, 0 }, - { "Treasure Box Minigame", "Truhenlotterie", "Chasse aux Tresors", 0x0063, 0 }, - { "Potion Shop", "Magie-Laden", "Apothicaire", 0x0388, 0 }, - { "Bombchu Bowling Minigame", "Minenbowlingbahn", "Bowling Teigneux", 0x0507, 0 }, - { "Bazaar Shop", "Basar", "Bazar", 0x052C, 0 }, - { "Happy Mask Shop", "Maskenhaendler", "Foire aux Masques", 0x0530, 0 }, - { "Bombchu Shop", "Krabbelminen-Laden", "Boutique de Missiles", 0x0528, 0 }, - { "Dog House", "Haus der Hunde-Dame", "Maison du Chien", 0x0398, 0 }, - { "Alley House", "Seitenstrassenhaus", "Maison de la Ruelle", 0x043B, 0 }, + { "Pot House", "Wachposten", "Maison des Jarres", ENTR_MARKET_GUARD_HOUSE_0, 0 }, + { "Shooting Gallery Minigame", "Schiessbude", "Jeu d'adresse", ENTR_SHOOTING_GALLERY_1, 0 }, + { "Treasure Box Minigame", "Truhenlotterie", "Chasse aux Tresors", ENTR_TREASURE_BOX_SHOP_0, 0 }, + { "Potion Shop", "Magie-Laden", "Apothicaire", ENTR_POTION_SHOP_MARKET_0, 0 }, + { "Bombchu Bowling Minigame", "Minenbowlingbahn", "Bowling Teigneux", ENTR_BOMBCHU_BOWLING_ALLEY_0, 0 }, + { "Bazaar Shop", "Basar", "Bazar", ENTR_BAZAAR_1, 0 }, + { "Happy Mask Shop", "Maskenhaendler", "Foire aux Masques", ENTR_HAPPY_MASK_SHOP_0, 0 }, + { "Bombchu Shop", "Krabbelminen-Laden", "Boutique de Missiles", ENTR_BOMBCHU_SHOP_1, 0 }, + { "Dog House", "Haus der Hunde-Dame", "Maison du Chien", ENTR_DOG_LADY_HOUSE_0, 0 }, + { "Alley House", "Seitenstrassenhaus", "Maison de la Ruelle", ENTR_BACK_ALLEY_HOUSE_0, 0 }, }}, { "10:Temple of Time", "10:Zitadelle der Zeit", "10:Temple du Temps", Select_LoadGame, 5, { - { "From Outside", "Von draussen", "Depuis l'Entree", 0x053, 0 }, - { "From Master Sword Pedestal", "Vom Master-Schwert Podest", "Depuis le Piedestal de l'Epee de Legende", 0x02CA, 0 }, - { "Prelude of Light Warp", "Kantate des Lichts Teleport", "Teleporteur du Prelude de la Lumiere", 0x05F4, 0 }, - { "Outside Temple of Time - From Market", "Vor der Zitadelle der Zeit - Vom Marktplatz", "Exterieur du Temple - Depuis la Place du Marche", 0x0171, 0 }, - { "Outside Temple of Time - From Temple of Time", "Vor der Zitadelle der Zeit - Von der Zitadelle der Zeit", "Exterieur du Temple - Depuis le Temple", 0x0472, 0 }, + { "From Outside", "Von draussen", "Depuis l'Entree", ENTR_TEMPLE_OF_TIME_0, 0 }, + { "From Master Sword Pedestal", "Vom Master-Schwert Podest", "Depuis le Piedestal de l'Epee de Legende", ENTR_TEMPLE_OF_TIME_2, 0 }, + { "Prelude of Light Warp", "Kantate des Lichts Teleport", "Teleporteur du Prelude de la Lumiere", ENTR_TEMPLE_OF_TIME_7, 0 }, + { "Outside Temple of Time - From Market", "Vor der Zitadelle der Zeit - Vom Marktplatz", "Exterieur du Temple - Depuis la Place du Marche", ENTR_TEMPLE_OF_TIME_EXTERIOR_DAY_0, 0 }, + { "Outside Temple of Time - From Temple of Time", "Vor der Zitadelle der Zeit - Von der Zitadelle der Zeit", "Exterieur du Temple - Depuis le Temple", ENTR_TEMPLE_OF_TIME_EXTERIOR_DAY_1, 0 }, }}, { "11:Hyrule Castle", "11:Schloss Hyrule", "11:Chateau d'Hyrule", Select_LoadGame, 5, { - { "From Market", "Vom Marktplatz", "Depuis la Place du Marche", 0x0138, 0 }, - { "From Castle Courtyard", "Vom Burghof", "Depuis la Cour du Chateau", 0x023D, 0 }, - { "From Great Fairy", "Von der Feen-Quelle", "Depuis la Grande Fee", 0x0340, 0 }, - { "From Courtyard Guard Capture", "Von Wachen-Festnahme", "Depuis la capture d'un Garde de la Cour", 0x04FA, 0 }, - { "Great Fairy", "Feen-Quelle", "Grande Fee", 0x04C2, 0 }, + { "From Market", "Vom Marktplatz", "Depuis la Place du Marche", ENTR_HYRULE_CASTLE_0, 0 }, + { "From Castle Courtyard", "Vom Burghof", "Depuis la Cour du Chateau", ENTR_HYRULE_CASTLE_1, 0 }, + { "From Great Fairy", "Von der Feen-Quelle", "Depuis la Grande Fee", ENTR_HYRULE_CASTLE_2, 0 }, + { "From Courtyard Guard Capture", "Von Wachen-Festnahme", "Depuis la capture d'un Garde de la Cour", ENTR_HYRULE_CASTLE_3, 0 }, + { "Great Fairy", "Feen-Quelle", "Grande Fee", ENTR_GREAT_FAIRYS_FOUNTAIN_MAGIC_2, 0 }, }}, { "12:Hyrule Castle Courtyard", "12:Burghof", "12:Cour du Chateau", Select_LoadGame, 3, { - { "From Crawlspace", "Vom Kriechtunnel", "Depuis l'Entree", 0x007A, 0 }, - { "From Zelda", "Von Zelda", "Depuis Zelda", 0x0296, 0 }, - { "Zeldas Courtyard", "Zeldas Burghof", "Depuis la Cour de Zelda", 0x0400, 0 }, + { "From Crawlspace", "Vom Kriechtunnel", "Depuis l'Entree", ENTR_CASTLE_COURTYARD_GUARDS_DAY_0, 0 }, + { "From Zelda", "Von Zelda", "Depuis Zelda", ENTR_CASTLE_COURTYARD_GUARDS_DAY_1, 0 }, + { "Zeldas Courtyard", "Zeldas Burghof", "Depuis la Cour de Zelda", ENTR_CASTLE_COURTYARD_ZELDA_0, 0 }, }}, { "13:Lon Lon Ranch", "13:Lon Lon-Farm", "13:Ranch Lon Lon", Select_LoadGame, 4, { - { "From Hyrule Field", "Von der Hylianischen Steppe", "Depuis la Plaine d'Hyrule", 0x0157, 0 }, - { "From Ranch House", "Vom Farmhaus", "Depuis la Maison du Ranch", 0x0378, 0 }, - { "From Stables", "Vom Stall", "Depuis l'Etable", 0x042F, 0 }, - { "Epona Song Cutscene", "Eponas Song Cutscene", "Cinematique du Chant d'Epona", 0x02AE, 0 }, + { "From Hyrule Field", "Von der Hylianischen Steppe", "Depuis la Plaine d'Hyrule", ENTR_LON_LON_RANCH_0, 0 }, + { "From Ranch House", "Vom Farmhaus", "Depuis la Maison du Ranch", ENTR_LON_LON_RANCH_4, 0 }, + { "From Stables", "Vom Stall", "Depuis l'Etable", ENTR_LON_LON_RANCH_5, 0 }, + { "Epona Song Cutscene", "Eponas Song Cutscene", "Cinematique du Chant d'Epona", ENTR_LON_LON_RANCH_1, 0 }, }}, { "14:Lon Lon Ranch Buildings", "14:Lon Lon-Farm Gebaeude", "14:Batiments du Ranch Lon Lon", Select_LoadGame, 3, { - { "Ranch House", "Farmhaus", "Maison du Ranch", 0x004F, 0 }, - { "Stables", "Stall", "Etable du Ranch", 0x02F9, 0 }, - { "Back Tower", "Silo", "Silo du Ranch", 0x05D0, 0 }, + { "Ranch House", "Farmhaus", "Maison du Ranch", ENTR_LON_LON_BUILDINGS_0, 0 }, + { "Stables", "Stall", "Etable du Ranch", ENTR_STABLE_0, 0 }, + { "Back Tower", "Silo", "Silo du Ranch", ENTR_LON_LON_BUILDINGS_1, 0 }, }}, { "15:Kakariko Village", "15:Kakariko", "15:Village Cocorico", Select_LoadGame, 15, { - { "From Hyrule Field", "Von der Hylianischen Steppe", "Depuis la Plaine d'Hyrule", 0x00DB, 0 }, - { "From Death Mountain", "Vom Todesberg", "Depuis le Mont du Peril", 0x0191, 0 }, - { "From Graveyard", "Vom Friedhof", "Depuis le Cimetiere", 0x0195, 0 }, - { "From Bazaar", "Vom Basar", "Depuis le Bazar", 0x0201, 0 }, - { "From Bottom of Well", "Vom Grund des Brunnens", "Depuis le Puits", 0x02A6, 0 }, - { "From Boss House", "Vom Haus des Bosses", "Depuis la Maison du Boss", 0x0349, 0 }, - { "From Potion Shop", "Vom Magie-Laden", "Depuis l'Apothicaire", 0x044B, 0 }, - { "From Potion Shop (Back Entrance)", "Vom Magie-Laden (Hintereingang)", "Depuis l'Apothicaire (Entree Arriere)", 0x04FF, 0 }, - { "From Grannys Potion Shop", "Von Omas Magie-Laden", "Depuis l'Apothicaire (Vieille Femme)", 0x034D, 0 }, - { "From Impas House", "Von Impas Haus", "Depuis la Maison d'Impa", 0x0345, 0 }, - { "From Impas House (Cow)", "Von Impas Haus (Kuh)", "Depuis la Maison d'Impa (Vache)", 0x05DC, 0 }, - { "From Windmill", "Von der Windmuehle", "Depuis le Moulin", 0x0351, 0 }, - { "From Shooting Gallery", "Von der Schiessbude", "Depuis le Jeu d'adresse", 0x0463, 0 }, - { "From Skulltula House", "Vom Skulltula Haus", "Depuis la Maison des Skulltulas", 0x04EE, 0 }, - { "Owl Drop Spot from Death Mountain", "Eulen-Absetzpunkt vom Todesberg", "Point de chute du Hibou depuis le Mont du Peril", 0x0554, 0 }, + { "From Hyrule Field", "Von der Hylianischen Steppe", "Depuis la Plaine d'Hyrule", ENTR_KAKARIKO_VILLAGE_0, 0 }, + { "From Death Mountain", "Vom Todesberg", "Depuis le Mont du Peril", ENTR_KAKARIKO_VILLAGE_1, 0 }, + { "From Graveyard", "Vom Friedhof", "Depuis le Cimetiere", ENTR_KAKARIKO_VILLAGE_2, 0 }, + { "From Bazaar", "Vom Basar", "Depuis le Bazar", ENTR_KAKARIKO_VILLAGE_3, 0 }, + { "From Bottom of Well", "Vom Grund des Brunnens", "Depuis le Puits", ENTR_KAKARIKO_VILLAGE_4, 0 }, + { "From Boss House", "Vom Haus des Bosses", "Depuis la Maison du Boss", ENTR_KAKARIKO_VILLAGE_6, 0 }, + { "From Potion Shop", "Vom Magie-Laden", "Depuis l'Apothicaire", ENTR_KAKARIKO_VILLAGE_9, 0 }, + { "From Potion Shop (Back Entrance)", "Vom Magie-Laden (Hintereingang)", "Depuis l'Apothicaire (Entree Arriere)", ENTR_KAKARIKO_VILLAGE_12, 0 }, + { "From Grannys Potion Shop", "Von Omas Magie-Laden", "Depuis l'Apothicaire (Vieille Femme)", ENTR_KAKARIKO_VILLAGE_7, 0 }, + { "From Impas House", "Von Impas Haus", "Depuis la Maison d'Impa", ENTR_KAKARIKO_VILLAGE_5, 0 }, + { "From Impas House (Cow)", "Von Impas Haus (Kuh)", "Depuis la Maison d'Impa (Vache)", ENTR_KAKARIKO_VILLAGE_15, 0 }, + { "From Windmill", "Von der Windmuehle", "Depuis le Moulin", ENTR_KAKARIKO_VILLAGE_8, 0 }, + { "From Shooting Gallery", "Von der Schiessbude", "Depuis le Jeu d'adresse", ENTR_KAKARIKO_VILLAGE_10, 0 }, + { "From Skulltula House", "Vom Skulltula Haus", "Depuis la Maison des Skulltulas", ENTR_KAKARIKO_VILLAGE_11, 0 }, + { "Owl Drop Spot from Death Mountain", "Eulen-Absetzpunkt vom Todesberg", "Point de chute du Hibou depuis le Mont du Peril", ENTR_KAKARIKO_VILLAGE_14, 0 }, }}, { "16:Kakariko Buildings", "16:Kakariko Gebaeude", "16:Batiments du Village Cocorico", Select_LoadGame, 9, { - { "Shooting Gallery Minigame", "Schiessbude", "Jeu d'adresse", 0x003B, 0 }, - { "Grannys Potion Shop", "Omas Magie-Laden", "Apothicaire (Vieille Femme)", 0x0072, 0 }, - { "Bazaar Shop", "Basar", "Bazar", 0x00B7, 0 }, - { "Potion Shop", "Magie-Laden", "Apothicaire", 0x0384, 0 }, - { "Impas House", "Impas Haus", "Maison d'Impa", 0x039C, 0 }, - { "Impas House (Near Cow)", "Impas Haus (Kuh)", "Maison d'Impa (Vache)", 0x05C8, 0 }, - { "Boss House", "Haus des Bosses", "Maison du Boss", 0x02FD, 0 }, - { "Windmill", "Windmuehle", "Moulin", 0x0453, 0 }, - { "Skulltula House", "Skulltula Haus", "Maison des SKulltulas", 0x0550, 0 }, + { "Shooting Gallery Minigame", "Schiessbude", "Jeu d'adresse", ENTR_SHOOTING_GALLERY_0, 0 }, + { "Grannys Potion Shop", "Omas Magie-Laden", "Apothicaire (Vieille Femme)", ENTR_POTION_SHOP_GRANNY_0, 0 }, + { "Bazaar Shop", "Basar", "Bazar", ENTR_BAZAAR_0, 0 }, + { "Potion Shop", "Magie-Laden", "Apothicaire", ENTR_POTION_SHOP_KAKARIKO_0, 0 }, + { "Impas House", "Impas Haus", "Maison d'Impa", ENTR_IMPAS_HOUSE_0, 0 }, + { "Impas House (Near Cow)", "Impas Haus (Kuh)", "Maison d'Impa (Vache)", ENTR_IMPAS_HOUSE_1, 0 }, + { "Boss House", "Haus des Bosses", "Maison du Boss", ENTR_KAKARIKO_CENTER_GUEST_HOUSE_0, 0 }, + { "Windmill", "Windmuehle", "Moulin", ENTR_WINDMILL_AND_DAMPES_GRAVE_1, 0 }, + { "Skulltula House", "Skulltula Haus", "Maison des SKulltulas", ENTR_HOUSE_OF_SKULLTULA_0, 0 }, }}, { "17:Graveyard", "17:Friedhof", "17:Cimetiere", Select_LoadGame, 9, { - { "From Kakariko", "Von Kakariko", "Depuis l'Apothicaire", 0x00E4, 0 }, - { "From Shadow Temple", "Vom Schattentempel", "Depuis le Temple de l'Ombre", 0x0205, 0 }, - { "From Gravekeepers Hut", "Von der Huette des Totengraebers", "Depuis la Cabane du Fossoyeur", 0x0355, 0 }, - { "From Dampes Grave", "Von Boris' Grab", "Depuis la Tombe d'Igor", 0x0359, 0 }, - { "From Shield Grave", "Vom Schild-Grab", "Depuis la Tombe au Bouclier", 0x035D, 0 }, - { "From Redead Grave", "Vom Zombie-Grab", "Depuis la Tombe au Effrois", 0x0361, 0 }, - { "From Royal Familys Tomb", "Vom Koenigsgrab", "Depuis la Tombe Royale", 0x050B, 0 }, - { "Inside Dampe's Hut", "Huette des Totengraebers", "A l'interieur de la Cabane du Fossoyeur", 0x030D, 0 }, - { "Nocturne of Shadow Warp", "Nocturne des Schattens Teleport", "Teleporteur du Nocturne de l'Ombre", 0x0568, 0 }, + { "From Kakariko", "Von Kakariko", "Depuis l'Apothicaire", ENTR_GRAVEYARD_0, 0 }, + { "From Shadow Temple", "Vom Schattentempel", "Depuis le Temple de l'Ombre", ENTR_GRAVEYARD_1, 0 }, + { "From Gravekeepers Hut", "Von der Huette des Totengraebers", "Depuis la Cabane du Fossoyeur", ENTR_GRAVEYARD_2, 0 }, + { "From Dampes Grave", "Von Boris' Grab", "Depuis la Tombe d'Igor", ENTR_GRAVEYARD_3, 0 }, + { "From Shield Grave", "Vom Schild-Grab", "Depuis la Tombe au Bouclier", ENTR_GRAVEYARD_4, 0 }, + { "From Redead Grave", "Vom Zombie-Grab", "Depuis la Tombe au Effrois", ENTR_GRAVEYARD_5, 0 }, + { "From Royal Familys Tomb", "Vom Koenigsgrab", "Depuis la Tombe Royale", ENTR_GRAVEYARD_6, 0 }, + { "Inside Dampe's Hut", "Huette des Totengraebers", "A l'interieur de la Cabane du Fossoyeur", ENTR_GRAVEKEEPERS_HUT_0, 0 }, + { "Nocturne of Shadow Warp", "Nocturne des Schattens Teleport", "Teleporteur du Nocturne de l'Ombre", ENTR_GRAVEYARD_7, 0 }, }}, { "18:Graves", "18:Graeber", "18:Tombes", Select_LoadGame, 5, { - { "Dampes Grave Minigame", "Boris' Grab-Minispiel", "Tour du Cimetiere d'Igor", 0x044F, 0 }, - { "Royal Familys Tomb", "Koenigsgrab", "Tombe Royale", 0x002D, 0 }, - { "Royal Familys Tomb, Suns Song Cutscene", "Koenigsgrab, Hymne der Sonne Cutscene", "Tombe Royale, Cinematique du Chant du Soleil", 0x0574, 0 }, - { "Treasure Chest Grave", "Schatzkisten Grab", "Tombe au Coffre", 0x004B, 0 }, - { "ReDead Grave", "Zombie Grab", "Tombe au Effrois", 0x031C, 0 }, + { "Dampes Grave Minigame", "Boris' Grab-Minispiel", "Tour du Cimetiere d'Igor", ENTR_WINDMILL_AND_DAMPES_GRAVE_0, 0 }, + { "Royal Familys Tomb", "Koenigsgrab", "Tombe Royale", ENTR_ROYAL_FAMILYS_TOMB_0, 0 }, + { "Royal Familys Tomb, Suns Song Cutscene", "Koenigsgrab, Hymne der Sonne Cutscene", "Tombe Royale, Cinematique du Chant du Soleil", ENTR_ROYAL_FAMILYS_TOMB_1, 0 }, + { "Treasure Chest Grave", "Schatzkisten Grab", "Tombe au Coffre", ENTR_GRAVE_WITH_FAIRYS_FOUNTAIN_0, 0 }, + { "ReDead Grave", "Zombie Grab", "Tombe au Effrois", ENTR_REDEAD_GRAVE_0, 0 }, }}, { "19:Death Mountain Trail", "19:Gebirgspfad", "19:Mont du Peril", Select_LoadGame, 6, { - { "From Kakariko Village", "Von Kakariko", "Depuis le Village Cocorico", 0x013D, 0 }, - { "From Goron City", "Von Goronia", "Depuis le Village Goron", 0x01B9, 0 }, - { "From Death Mountain Crater", "Vom Todeskrater", "Depuis le Cratere du Peril", 0x01BD, 0 }, - { "From Dodongos Cavern", "Von Dodongos Hoehle", "Depuis la Caverne Dodongo", 0x0242, 0 }, - { "From Great Fairy", "Von der Feen-Quelle", "Depuis la Grande Fee", 0x045B, 0 }, - { "Great Fairy", "Feen-Quelle", "Grande Fee", 0x0315, 0 }, + { "From Kakariko Village", "Von Kakariko", "Depuis le Village Cocorico", ENTR_DEATH_MOUNTAIN_TRAIL_0, 0 }, + { "From Goron City", "Von Goronia", "Depuis le Village Goron", ENTR_DEATH_MOUNTAIN_TRAIL_1, 0 }, + { "From Death Mountain Crater", "Vom Todeskrater", "Depuis le Cratere du Peril", ENTR_DEATH_MOUNTAIN_TRAIL_2, 0 }, + { "From Dodongos Cavern", "Von Dodongos Hoehle", "Depuis la Caverne Dodongo", ENTR_DEATH_MOUNTAIN_TRAIL_3, 0 }, + { "From Great Fairy", "Von der Feen-Quelle", "Depuis la Grande Fee", ENTR_DEATH_MOUNTAIN_TRAIL_4, 0 }, + { "Great Fairy", "Feen-Quelle", "Grande Fee", ENTR_GREAT_FAIRYS_FOUNTAIN_MAGIC_0, 0 }, }}, { "20:Goron City", "20:Goronia", "20:Village Goron", Select_LoadGame, 5, { - { "From Death Mountain Trail", "Vom Gebirgspfad", "Depuis le Mont du Peril", 0x014D, 0 }, - { "From Death Mountain Crater", "Vom Todeskrater", "Depuis le Cratere du Peril", 0x01C1, 0 }, - { "From Goron City Shop", "Vom Goronen-Laden", "Depuis la Boutique Goron", 0x03FC, 0 }, - { "From Lost Woods", "Von den Verlorenen Waeldern", "Depuis les Bois Perdus", 0x04E2, 0 }, - { "Goron City Shop", "Goronen-Laden", "Boutique Goron", 0x037C, 0 }, + { "From Death Mountain Trail", "Vom Gebirgspfad", "Depuis le Mont du Peril", ENTR_GORON_CITY_0, 0 }, + { "From Death Mountain Crater", "Vom Todeskrater", "Depuis le Cratere du Peril", ENTR_GORON_CITY_1, 0 }, + { "From Goron City Shop", "Vom Goronen-Laden", "Depuis la Boutique Goron", ENTR_GORON_CITY_2, 0 }, + { "From Lost Woods", "Von den Verlorenen Waeldern", "Depuis les Bois Perdus", ENTR_GORON_CITY_3, 0 }, + { "Goron City Shop", "Goronen-Laden", "Boutique Goron", ENTR_GORON_SHOP_0, 0 }, }}, { "21:Death Mountain Crater", "21:Todeskrater", "21:Cratere du Peril", Select_LoadGame, 6, { - { "From Death Mountain Trail", "Vom Gebirgspfad", "Depuis le Mont du Peril", 0x0147, 0 }, - { "From Goron City", "Von Goronia", "Depuis le Village Goron", 0x0246, 0 }, - { "From Fire Temple", "Vom Feuertempel", "Depuis le Temple du Feu", 0x024A, 0 }, - { "From Fairy Fountain", "Von der Feen-Quelle", "Depuis la Fontaine des Fees", 0x0482, 0 }, - { "Great Fairy", "Feen-Quelle", "Depuis la Grande Fee", 0x04BE, 0 }, - { "Bolero of Fire Warp", "Bolero des Feuers Teleport", "Teleporteur du Bolero du Feu", 0x04F6, 0 }, + { "From Death Mountain Trail", "Vom Gebirgspfad", "Depuis le Mont du Peril", ENTR_DEATH_MOUNTAIN_CRATER_0, 0 }, + { "From Goron City", "Von Goronia", "Depuis le Village Goron", ENTR_DEATH_MOUNTAIN_CRATER_1, 0 }, + { "From Fire Temple", "Vom Feuertempel", "Depuis le Temple du Feu", ENTR_DEATH_MOUNTAIN_CRATER_2, 0 }, + { "From Fairy Fountain", "Von der Feen-Quelle", "Depuis la Fontaine des Fees", ENTR_DEATH_MOUNTAIN_CRATER_3, 0 }, + { "Great Fairy", "Feen-Quelle", "Depuis la Grande Fee", ENTR_GREAT_FAIRYS_FOUNTAIN_MAGIC_1, 0 }, + { "Bolero of Fire Warp", "Bolero des Feuers Teleport", "Teleporteur du Bolero du Feu", ENTR_DEATH_MOUNTAIN_CRATER_4, 0 }, }}, { "22:Zora River", "22:Zora-Fluss", "22:Riviere Zora", Select_LoadGame, 3, { - { "From Hyrule Field", "Von der Hylianischen Steppe", "Depuis la Plaine d'Hyrule", 0x00EA, 0 }, - { "From Zoras Domain", "Von Zoras Reich", "Depuis le Domaine Zora", 0x019D, 0 }, - { "From Lost Woods", "Von den Verlorenen Waeldern", "Depuis les Bois Perdus", 0x01DD, 0 }, + { "From Hyrule Field", "Von der Hylianischen Steppe", "Depuis la Plaine d'Hyrule", ENTR_ZORAS_RIVER_0, 0 }, + { "From Zoras Domain", "Von Zoras Reich", "Depuis le Domaine Zora", ENTR_ZORAS_RIVER_2, 0 }, + { "From Lost Woods", "Von den Verlorenen Waeldern", "Depuis les Bois Perdus", ENTR_ZORAS_RIVER_4, 0 }, }}, { "23:Zoras Domain", "23:Zoras Reich", "23:Domaine Zora", Select_LoadGame, 5, { - { "From Zora River", "Vom Zora-Fluss", "Depuis la Riviere Zora", 0x0108, 0 }, - { "From Zoras Fountain", "Von Zoras Quelle", "Depuis la Fontaine Zora", 0x01A1, 0 }, - { "From Lake Hylia", "Vom Hylia-See", "Depuis le Lac Hylia", 0x0328, 0 }, - { "From Zora Shop", "Vom Zora-Laden", "Depuis la Boutique Zora", 0x03C4, 0 }, - { "Zora Shop", "Zora-Laden", "Boutique Zora", 0x0380, 0 }, + { "From Zora River", "Vom Zora-Fluss", "Depuis la Riviere Zora", ENTR_ZORAS_DOMAIN_0, 0 }, + { "From Zoras Fountain", "Von Zoras Quelle", "Depuis la Fontaine Zora", ENTR_ZORAS_DOMAIN_1, 0 }, + { "From Lake Hylia", "Vom Hylia-See", "Depuis le Lac Hylia", ENTR_ZORAS_DOMAIN_4, 0 }, + { "From Zora Shop", "Vom Zora-Laden", "Depuis la Boutique Zora", ENTR_ZORAS_DOMAIN_2, 0 }, + { "Zora Shop", "Zora-Laden", "Boutique Zora", ENTR_ZORA_SHOP_0, 0 }, }}, { "24:Zoras Fountain", "24:Zoras Quelle", "24:Fontaine Zora", Select_LoadGame, 5, { - { "From Zoras Domain", "Von Zoras Reich", "Depuis le Domaine Zora", 0x0225, 0 }, - { "From Jabu Jabu", "Von Jabu-Jabu", "Depuis Jabu-Jabu", 0x0221, 0 }, - { "From Ice Cavern", "Von der Eishoehle", "Depuis la Caverne Polaire", 0x03D4, 0 }, - { "From Fairy Fountain", "Von der Feen-Quelle", "Depuis la Fontaine des Fees", 0x0394, 0 }, - { "Great Fairy", "Feen-Quelle", "Grande Fee", 0x0371, 0 }, + { "From Zoras Domain", "Von Zoras Reich", "Depuis le Domaine Zora", ENTR_ZORAS_FOUNTAIN_2, 0 }, + { "From Jabu Jabu", "Von Jabu-Jabu", "Depuis Jabu-Jabu", ENTR_ZORAS_FOUNTAIN_1, 0 }, + { "From Ice Cavern", "Von der Eishoehle", "Depuis la Caverne Polaire", ENTR_ZORAS_FOUNTAIN_3, 0 }, + { "From Fairy Fountain", "Von der Feen-Quelle", "Depuis la Fontaine des Fees", ENTR_ZORAS_FOUNTAIN_5, 0 }, + { "Great Fairy", "Feen-Quelle", "Grande Fee", ENTR_GREAT_FAIRYS_FOUNTAIN_SPELLS_0, 0 }, }}, { "25:Lake Hylia", "25:Hylia-See", "25:Lac Hylia", Select_LoadGame, 7, { - { "From Hyrule Field", "Von der Hylianischen Steppe", "Depuis la Plaine d'Hyrule", 0x0102, 0 }, - { "From Gerudo Valley", "Vom Gerudotal", "Depuis la Vallee Gerudo", 0x0219, 0 }, - { "From Water Temple", "Vom Wassertempel", "Depuis le Temple de l'Eau", 0x021D, 0 }, - { "From Fishing Pond", "Vom Fischweiher", "Depuis l'Etang", 0x0309, 0 }, - { "From Laboratory", "Vom Laboratorium", "Depuis le Laboratoire du Lac", 0x03CC, 0 }, - { "From Zoras Domain", "Von Zoras Reich", "Depuis le Domaine Zora", 0x0560, 0 }, - { "Serenade Of Water Warp", "Serenade des Wassers Teleport", "Teleporteur de la Serenade de l'Eau", 0x0604, 0 }, + { "From Hyrule Field", "Von der Hylianischen Steppe", "Depuis la Plaine d'Hyrule", ENTR_LAKE_HYLIA_0, 0 }, + { "From Gerudo Valley", "Vom Gerudotal", "Depuis la Vallee Gerudo", ENTR_LAKE_HYLIA_1, 0 }, + { "From Water Temple", "Vom Wassertempel", "Depuis le Temple de l'Eau", ENTR_LAKE_HYLIA_2, 0 }, + { "From Fishing Pond", "Vom Fischweiher", "Depuis l'Etang", ENTR_LAKE_HYLIA_6, 0 }, + { "From Laboratory", "Vom Laboratorium", "Depuis le Laboratoire du Lac", ENTR_LAKE_HYLIA_4, 0 }, + { "From Zoras Domain", "Von Zoras Reich", "Depuis le Domaine Zora", ENTR_LAKE_HYLIA_7, 0 }, + { "Serenade Of Water Warp", "Serenade des Wassers Teleport", "Teleporteur de la Serenade de l'Eau", ENTR_LAKE_HYLIA_8, 0 }, }}, { "26:Lake Hylia Buildings", "26:Hylia-See Gebaeude", "26:Batiments du Lac Hylia", Select_LoadGame, 2, { - { "Laboratory", "Laboratorium", "Laboratoire du Lac", 0x0043, 0 }, - { "Fishing Pond Minigame", "Fischweiher", "Etang", 0x045F, 0 }, + { "Laboratory", "Laboratorium", "Laboratoire du Lac", ENTR_LAKESIDE_LABORATORY_0, 0 }, + { "Fishing Pond Minigame", "Fischweiher", "Etang", ENTR_FISHING_POND_0, 0 }, }}, { "27:Gerudo Valley", "27:Gerudotal", "27:Vallee Gerudo", Select_LoadGame, 5, { - { "From Hyrule Field", "Von der Hylianischen Steppe", "Depuis la Plaine d'Hyrule", 0x0117, 0 }, - { "From Gerudo Fortress", "Von der Gerudo-Festung", "Depuis la Forteresse Gerudo", 0x022D, 0 }, - { "From Carpenter's Tent", "Vom Zelt der Zimmerleute", "Depuis la Tente du Charpentier", 0x03D0, 0 }, - { "Carpenter's Tent/ Running Man Minigame", "Zelt der Zimmerleute/ Rennlaeufer Minispiel", "Tente du Charpentier/ Marathonien", 0x03A0, 0 }, - { "Thrown out of Fortress", "Aus der Festung geworfen", "Expulse de la Forteresse", 0x01A5, 0 }, + { "From Hyrule Field", "Von der Hylianischen Steppe", "Depuis la Plaine d'Hyrule", ENTR_GERUDO_VALLEY_0, 0 }, + { "From Gerudo Fortress", "Von der Gerudo-Festung", "Depuis la Forteresse Gerudo", ENTR_GERUDO_VALLEY_3, 0 }, + { "From Carpenter's Tent", "Vom Zelt der Zimmerleute", "Depuis la Tente du Charpentier", ENTR_GERUDO_VALLEY_4, 0 }, + { "Carpenter's Tent/ Running Man Minigame", "Zelt der Zimmerleute/ Rennlaeufer Minispiel", "Tente du Charpentier/ Marathonien", ENTR_CARPENTERS_TENT_0, 0 }, + { "Thrown out of Fortress", "Aus der Festung geworfen", "Expulse de la Forteresse", ENTR_GERUDO_VALLEY_1, 0 }, }}, { "28:Gerudo Fortress", "28:Gerudo-Festung", "28:Forteresse Gerudo", Select_LoadGame, 18, { - { "From Gerudo Valley", "Vom Gerudotal", "Depuis la Vallee Gerudo", 0x0129, 0 }, - { "From Gerudo Training Grounds", "Von der Gerudo-Arena", "Depuis le Gymnase Gerudo", 0x03A8, 0 }, - { "From Haunted Wasteland", "Von der Gespensterwueste", "Depuis le Desert Hante", 0x03AC, 0 }, - { "Horseback Riding Minigame", "Bogen zu Pferde Minispiel", "Archerie Montee", 0x03B0, 0 }, - { "Gerudo Fortress Jail", "Gerudo-Festung Gefaengnis", "Prison de la Forteresse Gerudo", 0x03B4, 0 }, - { "From Thieves Hideout (1)", "Vom Diebesversteck (1)", "Depuis le Repaire des Voleurs (1)", 0x0231, 0 }, - { "From Thieves Hideout (2)", "Vom Diebesversteck (2)", "Depuis le Repaire des Voleurs (2)", 0x0235, 0 }, - { "From Thieves Hideout (3)", "Vom Diebesversteck (3)", "Depuis le Repaire des Voleurs (3)", 0x0239, 0 }, - { "From Thieves Hideout (4)", "Vom Diebesversteck (4)", "Depuis le Repaire des Voleurs (4)", 0x02AA, 0 }, - { "From Thieves Hideout (5)", "Vom Diebesversteck (5)", "Depuis le Repaire des Voleurs (5)", 0x02BA, 0 }, - { "From Thieves Hideout (6)", "Vom Diebesversteck (6)", "Depuis le Repaire des Voleurs (6)", 0x02BE, 0 }, - { "From Thieves Hideout (7)", "Vom Diebesversteck (7)", "Depuis le Repaire des Voleurs (7)", 0x02C2, 0 }, - { "From Thieves Hideout (8)", "Vom Diebesversteck (8)", "Depuis le Repaire des Voleurs (8)", 0x02C6, 0 }, - { "From Thieves Hideout (9)", "Vom Diebesversteck (9)", "Depuis le Repaire des Voleurs (9)", 0x02D2, 0 }, - { "From Thieves Hideout (10)", "Vom Diebesversteck (10)", "Depuis le Repaire des Voleurs (10)", 0x02D6, 0 }, - { "From Thieves Hideout (11)", "Vom Diebesversteck (11)", "Depuis le Repaire des Voleurs (11)", 0x02DA, 0 }, - { "From Thieves Hideout (12)", "Vom Diebesversteck (12)", "Depuis le Repaire des Voleurs (12)", 0x02DE, 0 }, - { "From Thieves Hideout (13)", "Vom Diebesversteck (13)", "Depuis le Repaire des Voleurs (13)", 0x03A4, 0 }, + { "From Gerudo Valley", "Vom Gerudotal", "Depuis la Vallee Gerudo", ENTR_GERUDOS_FORTRESS_0, 0 }, + { "From Gerudo Training Grounds", "Von der Gerudo-Arena", "Depuis le Gymnase Gerudo", ENTR_GERUDOS_FORTRESS_14, 0 }, + { "From Haunted Wasteland", "Von der Gespensterwueste", "Depuis le Desert Hante", ENTR_GERUDOS_FORTRESS_15, 0 }, + { "Horseback Riding Minigame", "Bogen zu Pferde Minispiel", "Archerie Montee", ENTR_GERUDOS_FORTRESS_16, 0 }, + { "Gerudo Fortress Jail", "Gerudo-Festung Gefaengnis", "Prison de la Forteresse Gerudo", ENTR_GERUDOS_FORTRESS_17, 0 }, + { "From Thieves Hideout (1)", "Vom Diebesversteck (1)", "Depuis le Repaire des Voleurs (1)", ENTR_GERUDOS_FORTRESS_1, 0 }, + { "From Thieves Hideout (2)", "Vom Diebesversteck (2)", "Depuis le Repaire des Voleurs (2)", ENTR_GERUDOS_FORTRESS_2, 0 }, + { "From Thieves Hideout (3)", "Vom Diebesversteck (3)", "Depuis le Repaire des Voleurs (3)", ENTR_GERUDOS_FORTRESS_3, 0 }, + { "From Thieves Hideout (4)", "Vom Diebesversteck (4)", "Depuis le Repaire des Voleurs (4)", ENTR_GERUDOS_FORTRESS_4, 0 }, + { "From Thieves Hideout (5)", "Vom Diebesversteck (5)", "Depuis le Repaire des Voleurs (5)", ENTR_GERUDOS_FORTRESS_5, 0 }, + { "From Thieves Hideout (6)", "Vom Diebesversteck (6)", "Depuis le Repaire des Voleurs (6)", ENTR_GERUDOS_FORTRESS_6, 0 }, + { "From Thieves Hideout (7)", "Vom Diebesversteck (7)", "Depuis le Repaire des Voleurs (7)", ENTR_GERUDOS_FORTRESS_7, 0 }, + { "From Thieves Hideout (8)", "Vom Diebesversteck (8)", "Depuis le Repaire des Voleurs (8)", ENTR_GERUDOS_FORTRESS_8, 0 }, + { "From Thieves Hideout (9)", "Vom Diebesversteck (9)", "Depuis le Repaire des Voleurs (9)", ENTR_GERUDOS_FORTRESS_9, 0 }, + { "From Thieves Hideout (10)", "Vom Diebesversteck (10)", "Depuis le Repaire des Voleurs (10)", ENTR_GERUDOS_FORTRESS_10, 0 }, + { "From Thieves Hideout (11)", "Vom Diebesversteck (11)", "Depuis le Repaire des Voleurs (11)", ENTR_GERUDOS_FORTRESS_11, 0 }, + { "From Thieves Hideout (12)", "Vom Diebesversteck (12)", "Depuis le Repaire des Voleurs (12)", ENTR_GERUDOS_FORTRESS_12, 0 }, + { "From Thieves Hideout (13)", "Vom Diebesversteck (13)", "Depuis le Repaire des Voleurs (13)", ENTR_GERUDOS_FORTRESS_13, 0 }, }}, { "29:Thieves Hideout", "29:Diebesversteck", "29:Repaire des Voleurs", Select_LoadGame, 13, { - { "From Gerudo Fortress (1)", "Von der Gerudo-Festung (1)", "Depuis la Forteresse Gerudo (1)", 0x0486, 0 }, - { "From Gerudo Fortress (2)", "Von der Gerudo-Festung (2)", "Depuis la Forteresse Gerudo (2)", 0x048A, 0 }, - { "From Gerudo Fortress (3)", "Von der Gerudo-Festung (3)", "Depuis la Forteresse Gerudo (3)", 0x048E, 0 }, - { "From Gerudo Fortress (4)", "Von der Gerudo-Festung (4)", "Depuis la Forteresse Gerudo (4)", 0x0492, 0 }, - { "From Gerudo Fortress (5)", "Von der Gerudo-Festung (5)", "Depuis la Forteresse Gerudo (5)", 0x0496, 0 }, - { "From Gerudo Fortress (6)", "Von der Gerudo-Festung (6)", "Depuis la Forteresse Gerudo (6)", 0x049A, 0 }, - { "From Gerudo Fortress (7)", "Von der Gerudo-Festung (7)", "Depuis la Forteresse Gerudo (7)", 0x049E, 0 }, - { "From Gerudo Fortress (8)", "Von der Gerudo-Festung (8)", "Depuis la Forteresse Gerudo (8)", 0x04A2, 0 }, - { "From Gerudo Fortress (9)", "Von der Gerudo-Festung (9)", "Depuis la Forteresse Gerudo (9)", 0x04A6, 0 }, - { "From Gerudo Fortress (10)", "Von der Gerudo-Festung (10)", "Depuis la Forteresse Gerudo (10)", 0x04AA, 0 }, - { "From Gerudo Fortress (11)", "Von der Gerudo-Festung (11)", "Depuis la Forteresse Gerudo (11)", 0x04AE, 0 }, - { "From Gerudo Fortress (12)", "Von der Gerudo-Festung (12)", "Depuis la Forteresse Gerudo (12)", 0x04B2, 0 }, - { "From Gerudo Fortress (13)", "Von der Gerudo-Festung (13)", "Depuis la Forteresse Gerudo (13)", 0x0570, 0 }, + { "From Gerudo Fortress (1)", "Von der Gerudo-Festung (1)", "Depuis la Forteresse Gerudo (1)", ENTR_THIEVES_HIDEOUT_0, 0 }, + { "From Gerudo Fortress (2)", "Von der Gerudo-Festung (2)", "Depuis la Forteresse Gerudo (2)", ENTR_THIEVES_HIDEOUT_1, 0 }, + { "From Gerudo Fortress (3)", "Von der Gerudo-Festung (3)", "Depuis la Forteresse Gerudo (3)", ENTR_THIEVES_HIDEOUT_2, 0 }, + { "From Gerudo Fortress (4)", "Von der Gerudo-Festung (4)", "Depuis la Forteresse Gerudo (4)", ENTR_THIEVES_HIDEOUT_3, 0 }, + { "From Gerudo Fortress (5)", "Von der Gerudo-Festung (5)", "Depuis la Forteresse Gerudo (5)", ENTR_THIEVES_HIDEOUT_4, 0 }, + { "From Gerudo Fortress (6)", "Von der Gerudo-Festung (6)", "Depuis la Forteresse Gerudo (6)", ENTR_THIEVES_HIDEOUT_5, 0 }, + { "From Gerudo Fortress (7)", "Von der Gerudo-Festung (7)", "Depuis la Forteresse Gerudo (7)", ENTR_THIEVES_HIDEOUT_6, 0 }, + { "From Gerudo Fortress (8)", "Von der Gerudo-Festung (8)", "Depuis la Forteresse Gerudo (8)", ENTR_THIEVES_HIDEOUT_7, 0 }, + { "From Gerudo Fortress (9)", "Von der Gerudo-Festung (9)", "Depuis la Forteresse Gerudo (9)", ENTR_THIEVES_HIDEOUT_8, 0 }, + { "From Gerudo Fortress (10)", "Von der Gerudo-Festung (10)", "Depuis la Forteresse Gerudo (10)", ENTR_THIEVES_HIDEOUT_9, 0 }, + { "From Gerudo Fortress (11)", "Von der Gerudo-Festung (11)", "Depuis la Forteresse Gerudo (11)", ENTR_THIEVES_HIDEOUT_10, 0 }, + { "From Gerudo Fortress (12)", "Von der Gerudo-Festung (12)", "Depuis la Forteresse Gerudo (12)", ENTR_THIEVES_HIDEOUT_11, 0 }, + { "From Gerudo Fortress (13)", "Von der Gerudo-Festung (13)", "Depuis la Forteresse Gerudo (13)", ENTR_THIEVES_HIDEOUT_12, 0 }, }}, { "30:Haunted Wasteland", "30:Geisterwueste", "30:Desert Hante", Select_LoadGame, 2, { - { "From Gerudo Fortress", "Von der Gerudo-Festung", "Depuis la Forteresse Gerudo", 0x0130, 0 }, - { "From Desert Colossus", "Vom Wuestenkoloss", "Depuis le Colosse du Desert", 0x0365, 0 }, + { "From Gerudo Fortress", "Von der Gerudo-Festung", "Depuis la Forteresse Gerudo", ENTR_HAUNTED_WASTELAND_0, 0 }, + { "From Desert Colossus", "Vom Wuestenkoloss", "Depuis le Colosse du Desert", ENTR_HAUNTED_WASTELAND_1, 0 }, }}, { "31:Desert Colossus", "31:Wuestenkoloss", "31:Colosse du Desert", Select_LoadGame, 7, { - { "From Haunted Wasteland", "Von der Geisterwueste", "Depuis le Desert Hante", 0x0123, 0 }, - { "From Spirit Temple", "Vom Geistertempel", "Depuis le Temple de l'Esprit", 0x01E1, 0 }, - { "From Spirit Temple (Left Hand)", "Vom Geistertempel (Linke Hand)", "Depuis le Temple de l'Esprit (Main Gauche)", 0x01E5, 0 }, - { "From Spirit Temple (Right Hand)", "Vom Geistertempel (Rechte Hand)", "Depuis le Temple de l'Esprit (Main Droite)", 0x01E9, 0 }, - { "From Fairy Fountain", "Von der Feen-Quelle", "Depuis la Fontaine des Fees", 0x057C, 0 }, - { "Great Fairy", "Feen-Quelle", "Grande Fee", 0x0588, 0 }, - { "Requiem of Spirit Warp", "Requiem der Geister Teleport", "Teleporteur du Requiem de l'Esprit", 0x01F1, 0 }, + { "From Haunted Wasteland", "Von der Geisterwueste", "Depuis le Desert Hante", ENTR_DESERT_COLOSSUS_0, 0 }, + { "From Spirit Temple", "Vom Geistertempel", "Depuis le Temple de l'Esprit", ENTR_DESERT_COLOSSUS_1, 0 }, + { "From Spirit Temple (Left Hand)", "Vom Geistertempel (Linke Hand)", "Depuis le Temple de l'Esprit (Main Gauche)", ENTR_DESERT_COLOSSUS_2, 0 }, + { "From Spirit Temple (Right Hand)", "Vom Geistertempel (Rechte Hand)", "Depuis le Temple de l'Esprit (Main Droite)", ENTR_DESERT_COLOSSUS_3, 0 }, + { "From Fairy Fountain", "Von der Feen-Quelle", "Depuis la Fontaine des Fees", ENTR_DESERT_COLOSSUS_7, 0 }, + { "Great Fairy", "Feen-Quelle", "Grande Fee", ENTR_GREAT_FAIRYS_FOUNTAIN_SPELLS_2, 0 }, + { "Requiem of Spirit Warp", "Requiem der Geister Teleport", "Teleporteur du Requiem de l'Esprit", ENTR_DESERT_COLOSSUS_5, 0 }, }}, { "32:Deku Tree", "32:Deku-Baum", "32:Arbre Mojo", Select_LoadGame, 3, { - { "Entrance", "Eingang", "Entree", 0x0000, 1 }, - { "From Gohma's Lair", "Vom Gohma Kampf", "Depuis le Repaire de Gohma", 0x0252, 1 }, - { "Gohma's Lair", "Gohma Kampf", "Repaire de Gohma", 0x040F, 0 }, + { "Entrance", "Eingang", "Entree", ENTR_DEKU_TREE_0, 1 }, + { "From Gohma's Lair", "Vom Gohma Kampf", "Depuis le Repaire de Gohma", ENTR_DEKU_TREE_1, 1 }, + { "Gohma's Lair", "Gohma Kampf", "Repaire de Gohma", ENTR_DEKU_TREE_BOSS_0, 0 }, }}, { "33:Dodongos Cavern", "33:Dodongos Hoehle", "33:Caverne Dodongo", Select_LoadGame, 3, { - { "Entrance", "Eingang", "Entree", 0x0004, 1 }, - { "From King Dodongo", "Von King Dodongo", "Depuis le Repaire du Roi Dodongo", 0x00C5, 1 }, - { "King Dodongo's Lair", "King Dodongo Kampf", "Repaire du Roi Dodongo", 0x040B, 0 }, + { "Entrance", "Eingang", "Entree", ENTR_DODONGOS_CAVERN_0, 1 }, + { "From King Dodongo", "Von King Dodongo", "Depuis le Repaire du Roi Dodongo", ENTR_DODONGOS_CAVERN_1, 1 }, + { "King Dodongo's Lair", "King Dodongo Kampf", "Repaire du Roi Dodongo", ENTR_DODONGOS_CAVERN_BOSS_0, 0 }, }}, { "34:Jabu Jabu", "34:Jabu-Jabu", "34:Jabu-Jabu", Select_LoadGame, 2, { - { "Entrance", "Eingang", "Entree", 0x0028, 1 }, - { "Barinade's Lair", "Barinade Kampf", "Repaire de Barinade", 0x0301, 0 }, + { "Entrance", "Eingang", "Entree", ENTR_JABU_JABU_0, 1 }, + { "Barinade's Lair", "Barinade Kampf", "Repaire de Barinade", ENTR_JABU_JABU_BOSS_0, 0 }, }}, { "35:Forest Temple", "35:Waldtempel", "35:Temple de la Foret", Select_LoadGame, 4, { - { "Entrance", "Eingang", "Entree", 0x0169, 1 }, - { "Crushing Room", "Der Fallende Decke Raum", "Salle de Broyage", 0x0584, 1 }, - { "Before Phantom Ganon", "Vor Phantom-Ganon", "Avant Ganon Spectral", 0x024E, 1 }, - { "Phantom Ganon's Lair", "Phantom-Ganon Kampf", "Repaire de Ganon Spectral", 0x000C, 0 }, + { "Entrance", "Eingang", "Entree", ENTR_FOREST_TEMPLE_0, 1 }, + { "Crushing Room", "Der Fallende Decke Raum", "Salle de Broyage", ENTR_FOREST_TEMPLE_2, 1 }, + { "Before Phantom Ganon", "Vor Phantom-Ganon", "Avant Ganon Spectral", ENTR_FOREST_TEMPLE_1, 1 }, + { "Phantom Ganon's Lair", "Phantom-Ganon Kampf", "Repaire de Ganon Spectral", ENTR_FOREST_TEMPLE_BOSS_0, 0 }, }}, { "36:Fire Temple", "36:Feuertempel", "36:Temple du Feu", Select_LoadGame, 3, { - { "Entrance", "Eingang", "Entrance", 0x0165, 1 }, - { "Before Volvagia", "Vor Volvagia", "Avant Volvagia", 0x0175, 1 }, - { "Volvagia's Lair", "Volvagia Kampf", "Repaire de Volcania", 0x0305, 0 }, + { "Entrance", "Eingang", "Entrance", ENTR_FIRE_TEMPLE_0, 1 }, + { "Before Volvagia", "Vor Volvagia", "Avant Volvagia", ENTR_FIRE_TEMPLE_1, 1 }, + { "Volvagia's Lair", "Volvagia Kampf", "Repaire de Volcania", ENTR_FIRE_TEMPLE_BOSS_0, 0 }, }}, { "37:Water Temple", "37:Wassertempel", "37:Temple de l'Eau", Select_LoadGame, 2, { - { "Entrance", "Eingang", "Entree", 0x0010, 1 }, - { "Morpha's Lair", "Morpha Kampf", "Repaire de Morpha", 0x0417, 0 }, + { "Entrance", "Eingang", "Entree", ENTR_WATER_TEMPLE_0, 1 }, + { "Morpha's Lair", "Morpha Kampf", "Repaire de Morpha", ENTR_WATER_TEMPLE_BOSS_0, 0 }, }}, { "38:Shadow Temple", "38:Schattentempel", "38:Temple de l'Ombre", Select_LoadGame, 3, { - { "Entrance", "Eingang", "Entree", 0x0037, 1 }, - { "Outside Bongo Bongo", "Vor Bongo Bongo", "Avant Bongo Bongo", 0x02B2, 1 }, - { "Bongo Bongo's Lair", "Bongo Bongo Kampf", "Repaire de Bongo Bongo", 0x0413, 1 }, + { "Entrance", "Eingang", "Entree", ENTR_SHADOW_TEMPLE_0, 1 }, + { "Outside Bongo Bongo", "Vor Bongo Bongo", "Avant Bongo Bongo", ENTR_SHADOW_TEMPLE_1, 1 }, + { "Bongo Bongo's Lair", "Bongo Bongo Kampf", "Repaire de Bongo Bongo", ENTR_SHADOW_TEMPLE_BOSS_0, 1 }, }}, { "39:Spirit Temple", "39:Geistertempel", "39:Temple de l'Esprit", Select_LoadGame, 6, { - { "Entrance", "Eingang", "Entree", 0x0082, 1 }, - { "From Left Hand", "Von der linken Hand", "Depuis la Main Gauche", 0x03F0, 1 }, - { "From Right Hand", "Von der rechten Hand", "Depuis la Main Droite", 0x03F4, 1 }, - { "Before Twinrova", "Vor den Killa Ohmaz", "Avant le Duo Malefique", 0x02F5, 1 }, - { "Nabooru Fight", "Naboru Kampf", "Combat contre Nabooru", 0x008D, 0 }, - { "Twinrova's Lair", "Killa Ohmaz Kampf", "Repaire du Duo Malefique", 0x05EC, 0 }, + { "Entrance", "Eingang", "Entree", ENTR_SPIRIT_TEMPLE_0, 1 }, + { "From Left Hand", "Von der linken Hand", "Depuis la Main Gauche", ENTR_SPIRIT_TEMPLE_2, 1 }, + { "From Right Hand", "Von der rechten Hand", "Depuis la Main Droite", ENTR_SPIRIT_TEMPLE_3, 1 }, + { "Before Twinrova", "Vor den Killa Ohmaz", "Avant le Duo Malefique", ENTR_SPIRIT_TEMPLE_1, 1 }, + { "Nabooru Fight", "Naboru Kampf", "Combat contre Nabooru", ENTR_SPIRIT_TEMPLE_BOSS_0, 0 }, + { "Twinrova's Lair", "Killa Ohmaz Kampf", "Repaire du Duo Malefique", ENTR_SPIRIT_TEMPLE_BOSS_2, 0 }, }}, { "40:Ganons Castle", "40:Ganons Schloss", "40:Chateau de Ganon", Select_LoadGame, 9, { - { "Entrance", "Eingang", "Entree", 0x0467, 1 }, - { "From Tower", "Vom Tower", "Depuis la Tour", 0x0534, 1 }, - { "Stairs to Lair - From Castle", "Stufen zum Verlies - Vom Schloss", "Escaliers vers Repaire - Depuis le Chateau", 0x041B, 0 }, - { "Stairs to Lair - From Ganondorf's Lair", "Stufen zum Verlies - Von Ganondorfs Verlies", "Escaliers vers Repaire - Depuis le Repaire de Ganondorf", 0x0427, 0 }, - { "Ganondorf's Lair", "Ganondorfs Verlies", "Repaire de Ganondorf", 0x041F, 0 }, - { "Ganondorf Defeated", "Ganondorf Besiegt", "Ganondorf Vaincu", 0x01C9, 0 }, - { "Ganondorf Defeated (2)", "Ganondorf Besiegt (2)", "Ganondorf Vaincu (2)", 0x04BA, 0 }, - { "Ganon's Lair", "Ganon Kampf", "Repaire de Ganon", 0x0517, 0 }, - { "Ganon Death Cutscene", "Ganon Todes Cutscene", "Cinematique de la Mort de Ganon", 0x043F, 0 }, + { "Entrance", "Eingang", "Entree", ENTR_INSIDE_GANONS_CASTLE_0, 1 }, + { "From Tower", "Vom Tower", "Depuis la Tour", ENTR_INSIDE_GANONS_CASTLE_1, 1 }, + { "Stairs to Lair - From Castle", "Stufen zum Verlies - Vom Schloss", "Escaliers vers Repaire - Depuis le Chateau", ENTR_GANONS_TOWER_0, 0 }, + { "Stairs to Lair - From Ganondorf's Lair", "Stufen zum Verlies - Von Ganondorfs Verlies", "Escaliers vers Repaire - Depuis le Repaire de Ganondorf", ENTR_GANONS_TOWER_1, 0 }, + { "Ganondorf's Lair", "Ganondorfs Verlies", "Repaire de Ganondorf", ENTR_GANONDORF_BOSS_0, 0 }, + { "Ganondorf Defeated", "Ganondorf Besiegt", "Ganondorf Vaincu", ENTR_GANONS_TOWER_COLLAPSE_EXTERIOR_5, 0 }, + { "Ganondorf Defeated (2)", "Ganondorf Besiegt (2)", "Ganondorf Vaincu (2)", ENTR_GANONS_TOWER_COLLAPSE_EXTERIOR_1, 0 }, + { "Ganon's Lair", "Ganon Kampf", "Repaire de Ganon", ENTR_GANON_BOSS_0, 0 }, + { "Ganon Death Cutscene", "Ganon Todes Cutscene", "Cinematique de la Mort de Ganon", ENTR_GANONS_TOWER_COLLAPSE_EXTERIOR_0, 0 }, }}, { "41:Bottom of the Well", "41:Grund des Brunnens", "41:Puits", Select_LoadGame, 1, { - { "Entrance", "Eingang", "Entree", 0x0098, 1 }, + { "Entrance", "Eingang", "Entree", ENTR_BOTTOM_OF_THE_WELL_0, 1 }, }}, { "42:Ice Cavern", "42:Eishoehle", "42:Caverne Polaire", Select_LoadGame, 1, { - { "Entrance", "Eingang", "Entree", 0x0088, 1 }, + { "Entrance", "Eingang", "Entree", ENTR_ICE_CAVERN_0, 1 }, }}, { "43:Gerudo Training Grounds", "43:Gerudo-Arena", "43:Gymnase Gerudo", Select_LoadGame, 1, { - { "Entrance", "Eingang", "Entree", 0x0008, 1 }, + { "Entrance", "Eingang", "Entree", ENTR_GERUDO_TRAINING_GROUND_0, 1 }, }}, { "44:Warps", "44:Teleportpunkte", "44:Teleporteurs", Select_LoadGame, 6, { - { "Prelude of Light Warp", "Kantate des Lichts Teleport", "Teleporteur du Prelude de la Lumiere", 0x05F4, 0 }, - { "Minuet of Forest Warp", "Menuett des Waldes Teleport", "Teleporteur du Menuet des Bois", 0x0600, 0 }, - { "Bolero of Fire Warp", "Bolero des Feuers Teleport", "Teleporteur du Bolero du Feu", 0x04F6, 0 }, - { "Serenade Of Water Warp", "Serenade des Wassers Teleport", "Teleporteur de la Serenade de l'Eau", 0x0604, 0 }, - { "Nocturne of Shadow Warp", "Nocturne des Schattens Teleport", "Teleporteur du Nocturne de l'Ombre", 0x0568, 0 }, - { "Requiem of Spirit Warp", "Requiem der Geister Teleport", "Teleporteur du Requiem de l'Esprit", 0x01F1, 0 }, + { "Prelude of Light Warp", "Kantate des Lichts Teleport", "Teleporteur du Prelude de la Lumiere", ENTR_TEMPLE_OF_TIME_7, 0 }, + { "Minuet of Forest Warp", "Menuett des Waldes Teleport", "Teleporteur du Menuet des Bois", ENTR_SACRED_FOREST_MEADOW_2, 0 }, + { "Bolero of Fire Warp", "Bolero des Feuers Teleport", "Teleporteur du Bolero du Feu", ENTR_DEATH_MOUNTAIN_CRATER_4, 0 }, + { "Serenade Of Water Warp", "Serenade des Wassers Teleport", "Teleporteur de la Serenade de l'Eau", ENTR_LAKE_HYLIA_8, 0 }, + { "Nocturne of Shadow Warp", "Nocturne des Schattens Teleport", "Teleporteur du Nocturne de l'Ombre", ENTR_GRAVEYARD_7, 0 }, + { "Requiem of Spirit Warp", "Requiem der Geister Teleport", "Teleporteur du Requiem de l'Esprit", ENTR_DESERT_COLOSSUS_5, 0 }, }}, { "45:Shops", "45:Laeden", "45:Boutiques", Select_LoadGame, 9, { - { "Kokiri Shop", "Kokiri-Laden", "Boutique Kokiri", 0x00C1 }, - { "Potion Shop (Market)", "Magie-Laden (Marktplatz)", "Apothicaire (Place du Marche)", 0x0388, 0 }, - { "Bazaar Shop (Market)", "Basar (Marktplatz)", "Bazar (Place du Marche)", 0x052C, 0 }, - { "Happy Mask Shop", "Maskenhaendler", "Foire aux Masques", 0x0530, 0 }, - { "Bombchu Shop", "Krabbelminen-Laden", "Boutique de Missiles", 0x0528, 0 }, - { "Bazaar Shop (Kakariko)", "Basar (Kakariko)", "Bazar (Village Cocorico)", 0x00B7, 0 }, - { "Potion Shop (Kakariko)", "Magie-Laden (Kakariko)", "Apothicaire (Village Cocorico)", 0x0384, 0 }, - { "Goron City Shop", "Goronen-Laden", "Boutique Goron", 0x037C, 0 }, - { "Zora Shop", "Zora-Laden", "Boutique Zora", 0x0380, 0 }, + { "Kokiri Shop", "Kokiri-Laden", "Boutique Kokiri", ENTR_KOKIRI_SHOP_0 }, + { "Potion Shop (Market)", "Magie-Laden (Marktplatz)", "Apothicaire (Place du Marche)", ENTR_POTION_SHOP_MARKET_0, 0 }, + { "Bazaar Shop (Market)", "Basar (Marktplatz)", "Bazar (Place du Marche)", ENTR_BAZAAR_1, 0 }, + { "Happy Mask Shop", "Maskenhaendler", "Foire aux Masques", ENTR_HAPPY_MASK_SHOP_0, 0 }, + { "Bombchu Shop", "Krabbelminen-Laden", "Boutique de Missiles", ENTR_BOMBCHU_SHOP_1, 0 }, + { "Bazaar Shop (Kakariko)", "Basar (Kakariko)", "Bazar (Village Cocorico)", ENTR_BAZAAR_0, 0 }, + { "Potion Shop (Kakariko)", "Magie-Laden (Kakariko)", "Apothicaire (Village Cocorico)", ENTR_POTION_SHOP_KAKARIKO_0, 0 }, + { "Goron City Shop", "Goronen-Laden", "Boutique Goron", ENTR_GORON_SHOP_0, 0 }, + { "Zora Shop", "Zora-Laden", "Boutique Zora", ENTR_ZORA_SHOP_0, 0 }, }}, { "46:Great Fairies", "46:Feen-Quellen", "46:Grandes Fees", Select_LoadGame, 6, { - { "Hyrule Castle (Child)", "Schloss Hyrule (Kind)", "Chateau d'Hyrule (Enfant)", 0x0578, 0 }, - { "Hyrule Castle (Adult)", "Schloss Hyrule (Erwachsener)", "Chateau d'Hyrule (Adult)", 0x04C2, 0 }, - { "Death Mountain Trail", "Gebirgspfad", "Mont du Peril", 0x0315, 0 }, - { "Death Mountain Crater", "Todeskrater", "Cratere du Peril", 0x04BE, 0 }, - { "Zoras Fountain", "Zoras Quelle", "Fontaine Zora", 0x0371, 0 }, - { "Desert Colossus", "Wuestenkoloss", "Colosse du Desert", 0x0588, 0 }, + { "Hyrule Castle (Child)", "Schloss Hyrule (Kind)", "Chateau d'Hyrule (Enfant)", ENTR_GREAT_FAIRYS_FOUNTAIN_SPELLS_1, 0 }, + { "Hyrule Castle (Adult)", "Schloss Hyrule (Erwachsener)", "Chateau d'Hyrule (Adult)", ENTR_GREAT_FAIRYS_FOUNTAIN_MAGIC_2, 0 }, + { "Death Mountain Trail", "Gebirgspfad", "Mont du Peril", ENTR_GREAT_FAIRYS_FOUNTAIN_MAGIC_0, 0 }, + { "Death Mountain Crater", "Todeskrater", "Cratere du Peril", ENTR_GREAT_FAIRYS_FOUNTAIN_MAGIC_1, 0 }, + { "Zoras Fountain", "Zoras Quelle", "Fontaine Zora", ENTR_GREAT_FAIRYS_FOUNTAIN_SPELLS_0, 0 }, + { "Desert Colossus", "Wuestenkoloss", "Colosse du Desert", ENTR_GREAT_FAIRYS_FOUNTAIN_SPELLS_2, 0 }, }}, { "47:Chest Grottos", "47:Truhen Grotten", "47:Grottes a Coffres", Select_Grotto_LoadGame, 11, { { "Kokiri Forest (Song of Storms)", "Kokiri-Wald (Hymne des Sturms)", "Foret Kokiri (Chant des Tempetes)", 0x00, 0 }, @@ -646,48 +646,48 @@ static BetterSceneSelectEntry sBetterScenes[] = { { "Flooded Grotto (Hyrule Field)", "Geflutete Grotte (Hylianische Steppe)", "Grotte Inondee (Plaine d'Hyrule)", 0x1B, 0 }, }}, { "50:Debug (Use with caution)", "50:Debug (Mit Vorsicht benutzen)", "50:Debug (A utiliser avec prudence)", Select_LoadGame, 10, { - { "Test Room", "Test Raum", "Salle de Test", 0x0520, 0 }, - { "SRD Map", "SRD Karte", "Carte SRD", 0x0018, 0 }, - { "Test Map", "Test Karte", "Carte de Test", 0x0094, 0 }, - { "Treasure Chest Warp", "Schatzkisten Teleport", "Salle de Test - Objets", 0x0024, 0 }, - { "Stalfos Miniboss Room", "Stalfos-Ritter Miniboss Raum", "Salle du Minoboss Stalfos", 0x001C, 0 }, - { "Stalfos Boss Room", "Stalfos-Ritter Boss Raum", "Salle de Boss Stalfos", 0x001C, 0 }, - { "Dark Link Room", "Schwarzer Link Raum", "Salle de Dark Link", 0x0047, 0 }, - { "Shooting Gallery Duplicate", "Schiessbude (Duplikat)", "Jeu d'Adresse (Duplicata)", 0x02EA, 0 }, - { "Depth Test", "Tiefen Test", "Test de Profondeur", 0x00B6, 0 }, - { "Hyrule Garden Game (Broken)", "Burghof - Wachen-Minispiel (Kaputt)", "Cour du chateau (Non Fonctionnel)", 0x0076, 0 }, + { "Test Room", "Test Raum", "Salle de Test", ENTR_BESITU_0, 0 }, + { "SRD Map", "SRD Karte", "Carte SRD", ENTR_SASATEST_0, 0 }, + { "Test Map", "Test Karte", "Carte de Test", ENTR_TEST01_0, 0 }, + { "Treasure Chest Warp", "Schatzkisten Teleport", "Salle de Test - Objets", ENTR_TESTROOM_0, 0 }, + { "Stalfos Miniboss Room", "Stalfos-Ritter Miniboss Raum", "Salle du Minoboss Stalfos", ENTR_SYOTES_0, 0 }, + { "Stalfos Boss Room", "Stalfos-Ritter Boss Raum", "Salle de Boss Stalfos", ENTR_SYOTES2_0, 0 }, + { "Dark Link Room", "Schwarzer Link Raum", "Salle de Dark Link", ENTR_SUTARU_0, 0 }, + { "Shooting Gallery Duplicate", "Schiessbude (Duplikat)", "Jeu d'Adresse (Duplicata)", ENTR_TEST_SHOOTING_GALLERY_0, 0 }, + { "Depth Test", "Tiefen Test", "Test de Profondeur", ENTR_DEPTH_TEST_0, 0 }, + { "Hyrule Garden Game (Broken)", "Burghof - Wachen-Minispiel (Kaputt)", "Cour du chateau (Non Fonctionnel)", ENTR_HAIRAL_NIWA2_0, 0 }, }}, }; static BetterSceneSelectGrottoData sBetterGrottos[] = { - { 0x003F, 0x00EE, 0, 0x2C, 0x55, { -504.0, 380.0, -1224.0 }}, // Kokiri Forest -> KF Storms Grotto - { 0x003F, 0x04D6, 2, 0x14, 0x5B, { 922.0, 0.0, -933.0 }}, // Lost Woods -> LW Near Shortcuts Grotto - { 0x05B4, 0x00FC, 0, 0xED, 0x56, { -201.0, 0.0, 1906.0 }}, // SFM Entryway -> SFM Wolfos Grotto - { 0x003F, 0x00CD, 0, 0x00, 0x51, { -1428.0, 0.0, 790.0 }}, // Hyrule Field -> HF Near Market Grotto - { 0x003F, 0x0189, 0, 0x03, 0x51, { -4026.0, -700.0, 13858.0 }}, // Hyrule Field -> HF Open Grotto - { 0x003F, 0x0189, 0, 0x22, 0x51, { -259.0, -500.0, 12356.0 }}, // Hyrule Field -> HF Southeast Grotto - { 0x003F, 0x034D, 0, 0x28, 0x52, { 861.0, 80.0, -253.0 }}, // Kak Backyard -> Kak Open Grotto - { 0x05A0, 0x034D, 0, 0xE7, 0x52, { -400.0, 0.0, 408.0 }}, // Kakariko Village -> Kak Redead Grotto - { 0x003F, 0x01B9, 0, 0x57, 0x60, { -389.0, 1386.0, -1202.0 }}, // Death Mountain -> DMT Storms Grotto - { 0x003F, 0x0147, 1, 0x7A, 0x61, { 50.0, 1233.0, 1776.0 }}, // DMC Upper Nearby -> DMC Upper Grotto - { 0x003F, 0x019D, 0, 0x29, 0x54, { 369.0, 570.0, 128.0 }}, // Zora River -> ZR Open Grotto - { 0x059C, 0x0189, 0, 0xE6, 0x51, { -5002.0, -700.0, 13823.0 }}, // Hyrule Field -> HF Inside Fence Grotto - { 0x05A4, 0x0246, 1, 0xF9, 0x61, { -1703.0, 722.0, -481.0 }}, // DMC Lower Nearby -> DMC Hammer Grotto - { 0x05A4, 0x014D, 3, 0xFB, 0x62, { 1091.0, 580.0, -1192.0 }}, // GC Grotto Platform -> GC Grotto - { 0x05A4, 0x05D4, 0, 0xFC, 0x63, { 1798.0, 0.0, 1498.0 }}, // Lon Lon Ranch -> LLR Grotto - { 0x05A4, 0x021D, 0, 0xEF, 0x57, { -3044.0, -1033.0, 6070.0 }}, // Lake Hylia -> LH Grotto - { 0x05B0, 0x01A9, 8, 0xF5, 0x5B, { 677.0, 0.0, -2515.0 }}, // LW Beyond Mido -> LW Scrubs Grotto - { 0x05BC, 0x00EA, 0, 0xEB, 0x54, { -1632.0, 100.0, -123.0 }}, // Zora River -> ZR Storms Grotto - { 0x05BC, 0x0215, 0, 0xEE, 0x56, { 317.0, 480.0, -2303.0 }}, // Sacred Forest Meadow -> SFM Storms Grotto - { 0x05BC, 0x03D0, 0, 0xF0, 0x5A, { -1321.0, 15.0, -968.0 }}, // GV Fortress Side -> GV Storms Grotto - { 0x05BC, 0x01F1, 0, 0xFD, 0x5C, { 71.0, -32.0, -1303.0 }}, // Desert Colossus -> Colossus Grotto - { 0x05C4, 0x04D6, 6, 0xF3, 0x5B, { 75.0, -20.0, -1596.0 }}, // LW Beyond Mido -> Deku Theater - { 0x0598, 0x017D, 0, 0xE5, 0x51, { 2059.0, 20.0, -174.0 }}, // Hyrule Field -> HF Near Kak Grotto - { 0x05B8, 0x023D, 0, 0xF6, 0x5F, { 986.0, 1571.0, 837.0 }}, // Hyrule Castle Grounds -> HC Storms Grotto - { 0x05A8, 0x018D, 0, 0xE4, 0x51, { -7873.0, -300.0, 6916.0 }}, // Hyrule Field -> HF Cow Grotto - { 0x05FC, 0x01B9, 0, 0xF8, 0x60, { -678.0, 1946.0, -284.0 }}, // Death Mountain Summit -> DMT Cow Grotto - { 0x05AC, 0x0117, 0, 0xF2, 0x5A, { 271.0, -555.0, 1465.0 }}, // GV Grotto Ledge -> GV Octorok Grotto - { 0x05C0, 0x00CD, 0, 0xE1, 0x51, { -4945.0, -300.0, 2841.0 }}, // Hyrule Field -> HF Tektite Grotto + { ENTR_GROTTOS_0, ENTR_KOKIRI_FOREST_0, 0, 0x2C, SCENE_KOKIRI_FOREST, { -504.0, 380.0, -1224.0 }}, // Kokiri Forest -> KF Storms Grotto + { ENTR_GROTTOS_0, ENTR_LOST_WOODS_6, 2, 0x14, SCENE_LOST_WOODS, { 922.0, 0.0, -933.0 }}, // Lost Woods -> LW Near Shortcuts Grotto + { ENTR_GROTTOS_8, ENTR_SACRED_FOREST_MEADOW_0, 0, 0xED, SCENE_SACRED_FOREST_MEADOW, { -201.0, 0.0, 1906.0 }}, // SFM Entryway -> SFM Wolfos Grotto + { ENTR_GROTTOS_0, ENTR_HYRULE_FIELD_0, 0, 0x00, SCENE_HYRULE_FIELD, { -1428.0, 0.0, 790.0 }}, // Hyrule Field -> HF Near Market Grotto + { ENTR_GROTTOS_0, ENTR_HYRULE_FIELD_4, 0, 0x03, SCENE_HYRULE_FIELD, { -4026.0, -700.0, 13858.0 }}, // Hyrule Field -> HF Open Grotto + { ENTR_GROTTOS_0, ENTR_HYRULE_FIELD_4, 0, 0x22, SCENE_HYRULE_FIELD, { -259.0, -500.0, 12356.0 }}, // Hyrule Field -> HF Southeast Grotto + { ENTR_GROTTOS_0, ENTR_KAKARIKO_VILLAGE_7, 0, 0x28, SCENE_KAKARIKO_VILLAGE, { 861.0, 80.0, -253.0 }}, // Kak Backyard -> Kak Open Grotto + { ENTR_GROTTOS_3, ENTR_KAKARIKO_VILLAGE_7, 0, 0xE7, SCENE_KAKARIKO_VILLAGE, { -400.0, 0.0, 408.0 }}, // Kakariko Village -> Kak Redead Grotto + { ENTR_GROTTOS_0, ENTR_DEATH_MOUNTAIN_TRAIL_1, 0, 0x57, SCENE_DEATH_MOUNTAIN_TRAIL, { -389.0, 1386.0, -1202.0 }}, // Death Mountain -> DMT Storms Grotto + { ENTR_GROTTOS_0, ENTR_DEATH_MOUNTAIN_CRATER_0, 1, 0x7A, SCENE_DEATH_MOUNTAIN_CRATER, { 50.0, 1233.0, 1776.0 }}, // DMC Upper Nearby -> DMC Upper Grotto + { ENTR_GROTTOS_0, ENTR_ZORAS_RIVER_2, 0, 0x29, SCENE_ZORAS_RIVER, { 369.0, 570.0, 128.0 }}, // Zora River -> ZR Open Grotto + { ENTR_GROTTOS_2, ENTR_HYRULE_FIELD_4, 0, 0xE6, SCENE_HYRULE_FIELD, { -5002.0, -700.0, 13823.0 }}, // Hyrule Field -> HF Inside Fence Grotto + { ENTR_GROTTOS_4, ENTR_DEATH_MOUNTAIN_CRATER_1, 1, 0xF9, SCENE_DEATH_MOUNTAIN_CRATER, { -1703.0, 722.0, -481.0 }}, // DMC Lower Nearby -> DMC Hammer Grotto + { ENTR_GROTTOS_4, ENTR_GORON_CITY_0, 3, 0xFB, SCENE_GORON_CITY, { 1091.0, 580.0, -1192.0 }}, // GC Grotto Platform -> GC Grotto + { ENTR_GROTTOS_4, ENTR_LON_LON_RANCH_10, 0, 0xFC, SCENE_LON_LON_RANCH, { 1798.0, 0.0, 1498.0 }}, // Lon Lon Ranch -> LLR Grotto + { ENTR_GROTTOS_4, ENTR_LAKE_HYLIA_2, 0, 0xEF, SCENE_LAKE_HYLIA, { -3044.0, -1033.0, 6070.0 }}, // Lake Hylia -> LH Grotto + { ENTR_GROTTOS_7, ENTR_LOST_WOODS_1, 8, 0xF5, SCENE_LOST_WOODS, { 677.0, 0.0, -2515.0 }}, // LW Beyond Mido -> LW Scrubs Grotto + { ENTR_GROTTOS_10, ENTR_ZORAS_RIVER_0, 0, 0xEB, SCENE_ZORAS_RIVER, { -1632.0, 100.0, -123.0 }}, // Zora River -> ZR Storms Grotto + { ENTR_GROTTOS_10, ENTR_SACRED_FOREST_MEADOW_1, 0, 0xEE, SCENE_SACRED_FOREST_MEADOW, { 317.0, 480.0, -2303.0 }}, // Sacred Forest Meadow -> SFM Storms Grotto + { ENTR_GROTTOS_10, ENTR_GERUDO_VALLEY_4, 0, 0xF0, SCENE_GERUDO_VALLEY, { -1321.0, 15.0, -968.0 }}, // GV Fortress Side -> GV Storms Grotto + { ENTR_GROTTOS_10, ENTR_DESERT_COLOSSUS_5, 0, 0xFD, SCENE_DESERT_COLOSSUS, { 71.0, -32.0, -1303.0 }}, // Desert Colossus -> Colossus Grotto + { ENTR_GROTTOS_12, ENTR_LOST_WOODS_6, 6, 0xF3, SCENE_LOST_WOODS, { 75.0, -20.0, -1596.0 }}, // LW Beyond Mido -> Deku Theater + { ENTR_GROTTOS_1, ENTR_HYRULE_FIELD_1, 0, 0xE5, SCENE_HYRULE_FIELD, { 2059.0, 20.0, -174.0 }}, // Hyrule Field -> HF Near Kak Grotto + { ENTR_GROTTOS_9, ENTR_HYRULE_CASTLE_1, 0, 0xF6, SCENE_HYRULE_CASTLE, { 986.0, 1571.0, 837.0 }}, // Hyrule Castle Grounds -> HC Storms Grotto + { ENTR_GROTTOS_5, ENTR_HYRULE_FIELD_5, 0, 0xE4, SCENE_HYRULE_FIELD, { -7873.0, -300.0, 6916.0 }}, // Hyrule Field -> HF Cow Grotto + { ENTR_GROTTOS_13, ENTR_DEATH_MOUNTAIN_TRAIL_1, 0, 0xF8, SCENE_DEATH_MOUNTAIN_TRAIL, { -678.0, 1946.0, -284.0 }}, // Death Mountain Summit -> DMT Cow Grotto + { ENTR_GROTTOS_6, ENTR_GERUDO_VALLEY_0, 0, 0xF2, SCENE_GERUDO_VALLEY, { 271.0, -555.0, 1465.0 }}, // GV Grotto Ledge -> GV Octorok Grotto + { ENTR_GROTTOS_11, ENTR_HYRULE_FIELD_0, 0, 0xE1, SCENE_HYRULE_FIELD, { -4945.0, -300.0, 2841.0 }}, // Hyrule Field -> HF Tektite Grotto }; void Select_UpdateMenu(SelectContext* this) { diff --git a/soh/src/overlays/misc/ovl_kaleido_scope/z_kaleido_scope_PAL.c b/soh/src/overlays/misc/ovl_kaleido_scope/z_kaleido_scope_PAL.c index 382b19b13..8fe817f2f 100644 --- a/soh/src/overlays/misc/ovl_kaleido_scope/z_kaleido_scope_PAL.c +++ b/soh/src/overlays/misc/ovl_kaleido_scope/z_kaleido_scope_PAL.c @@ -4216,48 +4216,48 @@ void KaleidoScope_Update(PlayState* play) Play_SaveSceneFlags(play); switch (gSaveContext.entranceIndex) { - case 0x0000: - case 0x0004: - case 0x0028: - case 0x0169: - case 0x0165: - case 0x0010: - case 0x0082: - case 0x0037: - case 0x041B: - case 0x0008: - case 0x0088: - case 0x0486: - case 0x0098: - case 0x0467: - case 0x0179: + case ENTR_DEKU_TREE_0: + case ENTR_DODONGOS_CAVERN_0: + case ENTR_JABU_JABU_0: + case ENTR_FOREST_TEMPLE_0: + case ENTR_FIRE_TEMPLE_0: + case ENTR_WATER_TEMPLE_0: + case ENTR_SPIRIT_TEMPLE_0: + case ENTR_SHADOW_TEMPLE_0: + case ENTR_GANONS_TOWER_0: + case ENTR_GERUDO_TRAINING_GROUND_0: + case ENTR_ICE_CAVERN_0: + case ENTR_THIEVES_HIDEOUT_0: + case ENTR_BOTTOM_OF_THE_WELL_0: + case ENTR_INSIDE_GANONS_CASTLE_0: + case ENTR_GANONS_TOWER_COLLAPSE_INTERIOR_0: break; - case 0x040F: - gSaveContext.entranceIndex = 0x0000; + case ENTR_DEKU_TREE_BOSS_0: + gSaveContext.entranceIndex = ENTR_DEKU_TREE_0; break; - case 0x040B: - gSaveContext.entranceIndex = 0x0004; + case ENTR_DODONGOS_CAVERN_BOSS_0: + gSaveContext.entranceIndex = ENTR_DODONGOS_CAVERN_0; break; - case 0x0301: - gSaveContext.entranceIndex = 0x0028; + case ENTR_JABU_JABU_BOSS_0: + gSaveContext.entranceIndex = ENTR_JABU_JABU_0; break; - case 0x000C: - gSaveContext.entranceIndex = 0x0169; + case ENTR_FOREST_TEMPLE_BOSS_0: + gSaveContext.entranceIndex = ENTR_FOREST_TEMPLE_0; break; - case 0x0305: - gSaveContext.entranceIndex = 0x0165; + case ENTR_FIRE_TEMPLE_BOSS_0: + gSaveContext.entranceIndex = ENTR_FIRE_TEMPLE_0; break; - case 0x0417: - gSaveContext.entranceIndex = 0x0010; + case ENTR_WATER_TEMPLE_BOSS_0: + gSaveContext.entranceIndex = ENTR_WATER_TEMPLE_0; break; - case 0x008D: - gSaveContext.entranceIndex = 0x0082; + case ENTR_SPIRIT_TEMPLE_BOSS_0: + gSaveContext.entranceIndex = ENTR_SPIRIT_TEMPLE_0; break; - case 0x0413: - gSaveContext.entranceIndex = 0x0037; + case ENTR_SHADOW_TEMPLE_BOSS_0: + gSaveContext.entranceIndex = ENTR_SHADOW_TEMPLE_0; break; - case 0x041F: - gSaveContext.entranceIndex = 0x041B; + case ENTR_GANONDORF_BOSS_0: + gSaveContext.entranceIndex = ENTR_GANONS_TOWER_0; break; } From 34556e40d6a3d102d9ad27ed906ce863895b73aa Mon Sep 17 00:00:00 2001 From: aMannus Date: Sun, 19 Nov 2023 20:45:09 +0100 Subject: [PATCH 014/113] Clean up Triforce Hunt U16's and GBK (#3355) * Clean up Triforce Hunt U16's and GBK * Apply suggestions from code review --- .../Enhancements/debugger/debugSaveEditor.cpp | 2 +- .../Enhancements/debugger/debugSaveEditor.h | 1 + soh/soh/Enhancements/mods.cpp | 20 +++++++++++-------- soh/soh/Enhancements/randomizer/draw.cpp | 6 +++--- .../Enhancements/randomizer/randomizer.cpp | 6 +++--- .../Enhancements/randomizer/randomizer_inf.h | 1 + soh/src/code/z_draw.c | 2 +- soh/src/code/z_parameter.c | 1 + 8 files changed, 23 insertions(+), 16 deletions(-) diff --git a/soh/soh/Enhancements/debugger/debugSaveEditor.cpp b/soh/soh/Enhancements/debugger/debugSaveEditor.cpp index 9af4eadb7..b357363ac 100644 --- a/soh/soh/Enhancements/debugger/debugSaveEditor.cpp +++ b/soh/soh/Enhancements/debugger/debugSaveEditor.cpp @@ -515,7 +515,7 @@ void DrawInfoTab() { UIWidgets::InsertHelpHoverText("Z-Targeting behavior"); if (IS_RANDO && OTRGlobals::Instance->gRandomizer->GetRandoSettingValue(RSK_TRIFORCE_HUNT)) { - ImGui::InputScalar("Triforce Pieces", ImGuiDataType_U16, &gSaveContext.triforcePiecesCollected); + ImGui::InputScalar("Triforce Pieces", ImGuiDataType_U8, &gSaveContext.triforcePiecesCollected); UIWidgets::InsertHelpHoverText("Currently obtained Triforce Pieces. For Triforce Hunt."); } diff --git a/soh/soh/Enhancements/debugger/debugSaveEditor.h b/soh/soh/Enhancements/debugger/debugSaveEditor.h index 42c9c91c0..01557efef 100644 --- a/soh/soh/Enhancements/debugger/debugSaveEditor.h +++ b/soh/soh/Enhancements/debugger/debugSaveEditor.h @@ -505,6 +505,7 @@ const std::vector flagTables = { { RAND_INF_CHILD_FISHING, "RAND_INF_CHILD_FISHING" }, { RAND_INF_ADULT_FISHING, "RAND_INF_ADULT_FISHING" }, { RAND_INF_10_BIG_POES, "RAND_INF_10_BIG_POES" }, + { RAND_INF_GRANT_GANONS_BOSSKEY, "RAND_INF_GRANT_GANONS_BOSSKEY" }, } }, }; diff --git a/soh/soh/Enhancements/mods.cpp b/soh/soh/Enhancements/mods.cpp index 45933b9a6..e9d62f63c 100644 --- a/soh/soh/Enhancements/mods.cpp +++ b/soh/soh/Enhancements/mods.cpp @@ -644,16 +644,19 @@ void RegisterTriforceHunt() { triforcePieceScale = 0.0f; GameInteractor::State::TriforceHuntPieceGiven = 0; } + } + }); +} - uint8_t currentPieces = gSaveContext.triforcePiecesCollected; - uint8_t requiredPieces = OTRGlobals::Instance->gRandomizer->GetRandoSettingValue(RSK_TRIFORCE_HUNT_PIECES_REQUIRED); - - // Give Boss Key when player loads back into the savefile. - if (currentPieces >= requiredPieces && gPlayState->transitionTrigger != TRANS_TRIGGER_START && - (1 << 0 & gSaveContext.inventory.dungeonItems[SCENE_GANONS_TOWER]) == 0) { - GetItemEntry getItemEntry = ItemTableManager::Instance->RetrieveItemEntry(MOD_RANDOMIZER, RG_GANONS_CASTLE_BOSS_KEY); +void RegisterGrantGanonsBossKey() { + GameInteractor::Instance->RegisterGameHook([]() { + // Triforce Hunt needs the check if the player isn't being teleported to the credits scene. + if (!GameInteractor::IsGameplayPaused() && + Flags_GetRandomizerInf(RAND_INF_GRANT_GANONS_BOSSKEY) && gPlayState->transitionTrigger != TRANS_TRIGGER_START && + (1 << 0 & gSaveContext.inventory.dungeonItems[SCENE_GANONS_TOWER]) == 0) { + GetItemEntry getItemEntry = + ItemTableManager::Instance->RetrieveItemEntry(MOD_RANDOMIZER, RG_GANONS_CASTLE_BOSS_KEY); GiveItemEntryWithoutActor(gPlayState, getItemEntry); - } } }); } @@ -1076,6 +1079,7 @@ void InitMods() { RegisterMenuPathFix(); RegisterMirrorModeHandler(); RegisterTriforceHunt(); + RegisterGrantGanonsBossKey(); RegisterEnemyDefeatCounts(); RegisterAltTrapTypes(); RegisterRandomizerSheikSpawn(); diff --git a/soh/soh/Enhancements/randomizer/draw.cpp b/soh/soh/Enhancements/randomizer/draw.cpp index eacc62725..570ac5801 100644 --- a/soh/soh/Enhancements/randomizer/draw.cpp +++ b/soh/soh/Enhancements/randomizer/draw.cpp @@ -214,7 +214,7 @@ extern "C" void Randomizer_DrawTriforcePiece(PlayState* play, GetItemEntry getIt Gfx_SetupDL_25Xlu(play->state.gfxCtx); - uint16_t current = gSaveContext.triforcePiecesCollected; + uint8_t current = gSaveContext.triforcePiecesCollected; Matrix_Scale(0.035f, 0.035f, 0.035f, MTXMODE_APPLY); @@ -238,8 +238,8 @@ extern "C" void Randomizer_DrawTriforcePieceGI(PlayState* play, GetItemEntry get Gfx_SetupDL_25Xlu(play->state.gfxCtx); - uint16_t current = gSaveContext.triforcePiecesCollected; - uint16_t required = OTRGlobals::Instance->gRandomizer->GetRandoSettingValue(RSK_TRIFORCE_HUNT_PIECES_REQUIRED); + uint8_t current = gSaveContext.triforcePiecesCollected; + uint8_t required = OTRGlobals::Instance->gRandomizer->GetRandoSettingValue(RSK_TRIFORCE_HUNT_PIECES_REQUIRED); Matrix_Scale(triforcePieceScale, triforcePieceScale, triforcePieceScale, MTXMODE_APPLY); diff --git a/soh/soh/Enhancements/randomizer/randomizer.cpp b/soh/soh/Enhancements/randomizer/randomizer.cpp index f879be4b8..6f5dafae9 100644 --- a/soh/soh/Enhancements/randomizer/randomizer.cpp +++ b/soh/soh/Enhancements/randomizer/randomizer.cpp @@ -5548,9 +5548,9 @@ void CreateTriforcePieceMessages() { CustomMessage Randomizer::GetTriforcePieceMessage() { // Item is only given after the textbox, so reflect that inside the textbox. - uint16_t current = gSaveContext.triforcePiecesCollected + 1; - uint16_t required = OTRGlobals::Instance->gRandomizer->GetRandoSettingValue(RSK_TRIFORCE_HUNT_PIECES_REQUIRED); - uint16_t remaining = required - current; + uint8_t current = gSaveContext.triforcePiecesCollected + 1; + uint8_t required = OTRGlobals::Instance->gRandomizer->GetRandoSettingValue(RSK_TRIFORCE_HUNT_PIECES_REQUIRED); + uint8_t remaining = required - current; float percentageCollected = (float)current / (float)required; uint8_t messageIndex; diff --git a/soh/soh/Enhancements/randomizer/randomizer_inf.h b/soh/soh/Enhancements/randomizer/randomizer_inf.h index 33c206b47..8d4ec9801 100644 --- a/soh/soh/Enhancements/randomizer/randomizer_inf.h +++ b/soh/soh/Enhancements/randomizer/randomizer_inf.h @@ -159,6 +159,7 @@ typedef enum { RAND_INF_CHILD_FISHING, RAND_INF_ADULT_FISHING, RAND_INF_10_BIG_POES, + RAND_INF_GRANT_GANONS_BOSSKEY, // If you add anything to this list, you need to update the size of randomizerInf in z64save.h to be ceil(RAND_INF_MAX / 16) diff --git a/soh/src/code/z_draw.c b/soh/src/code/z_draw.c index cb28a498e..e9ab95398 100644 --- a/soh/src/code/z_draw.c +++ b/soh/src/code/z_draw.c @@ -1043,7 +1043,7 @@ void GetItem_DrawTriforcePiece(PlayState* play, s16 drawId) { Matrix_Scale(0.035f, 0.035f, 0.035f, MTXMODE_APPLY); - uint16_t index = gSaveContext.triforcePiecesCollected % 3; + uint8_t index = gSaveContext.triforcePiecesCollected % 3; Gfx* triforcePieceDL; switch (index) { diff --git a/soh/src/code/z_parameter.c b/soh/src/code/z_parameter.c index 8d98535df..04e806ede 100644 --- a/soh/src/code/z_parameter.c +++ b/soh/src/code/z_parameter.c @@ -2605,6 +2605,7 @@ u16 Randomizer_Item_Give(PlayState* play, GetItemEntry giEntry) { if (gSaveContext.triforcePiecesCollected == Randomizer_GetSettingValue(RSK_TRIFORCE_HUNT_PIECES_REQUIRED)) { gSaveContext.sohStats.itemTimestamp[TIMESTAMP_TRIFORCE_COMPLETED] = GAMEPLAYSTAT_TOTAL_TIME; gSaveContext.sohStats.gameComplete = 1; + Flags_SetRandomizerInf(RAND_INF_GRANT_GANONS_BOSSKEY); Play_PerformSave(play); GameInteractor_SetTriforceHuntCreditsWarpActive(true); } From 76e90c0928a01d75e70a5a382d46439bff1b6575 Mon Sep 17 00:00:00 2001 From: briaguya <70942617+briaguya-ai@users.noreply.github.com> Date: Mon, 20 Nov 2023 05:02:15 -0800 Subject: [PATCH 015/113] Controllers (#3378) * lay some groundwork * use custom window (which is currently identical to the LUS window) * start making it shippy * start moving stuff out of gamecontroleditor * clean up shouldrumble * include the other way * wii u * latest lus main * notch snap angle buttons * buttons on all the sliders * just use a hidden id * handle debug for port 2 and rename tabs so everything fits * button line buttons look better * padding fixed * clang format * bump to latest LUS main * big buttons * just default the analog stick options to open for now * fix wii u build * bonus: make it all scale-aware * clang format * fix horizontal scrolling * fix all +/- buttons * keyboard set defaults * axis threshold helper text * bonus: test rumble button * clang format * fix otrexporter submodule * bump to latest lus main --- libultraship | 2 +- .../controls/GameControlEditor.cpp | 76 +- .../controls/SohInputEditorWindow.cpp | 1902 +++++++++++++++++ .../controls/SohInputEditorWindow.h | 86 + soh/soh/OTRGlobals.cpp | 53 +- soh/soh/OTRGlobals.h | 3 + 6 files changed, 2037 insertions(+), 85 deletions(-) create mode 100644 soh/soh/Enhancements/controls/SohInputEditorWindow.cpp create mode 100644 soh/soh/Enhancements/controls/SohInputEditorWindow.h diff --git a/libultraship b/libultraship index f717dd265..1b41afa9e 160000 --- a/libultraship +++ b/libultraship @@ -1 +1 @@ -Subproject commit f717dd265aff2eff359de26915d8ad4e498ffdaf +Subproject commit 1b41afa9eaedb19a9073f5dd1eca2cda4dea59c8 diff --git a/soh/soh/Enhancements/controls/GameControlEditor.cpp b/soh/soh/Enhancements/controls/GameControlEditor.cpp index 935935c48..3783f8b60 100644 --- a/soh/soh/Enhancements/controls/GameControlEditor.cpp +++ b/soh/soh/Enhancements/controls/GameControlEditor.cpp @@ -14,6 +14,8 @@ #include #include +#include "macros.h" + #include "../../UIWidgets.hpp" namespace GameControlEditor { @@ -214,16 +216,6 @@ namespace GameControlEditor { ImGui::EndTable(); } - // CurrentPort is indexed started at 1 here due to the Generic tab, instead of 0 like in InputEditorWindow - // Therefore CurrentPort - 1 must always be used inside this function instead of CurrentPort - void DrawCustomButtons() { - auto inputEditorWindow = std::reinterpret_pointer_cast(LUS::Context::GetInstance()->GetWindow()->GetGui()->GetGuiWindow("Input Editor")); - inputEditorWindow->DrawControllerSelect(CurrentPort - 1); - - inputEditorWindow->DrawButton("Modifier 1", BTN_MODIFIER1, CurrentPort - 1, &BtnReading); - inputEditorWindow->DrawButton("Modifier 2", BTN_MODIFIER2, CurrentPort - 1, &BtnReading); - } - void DrawCameraControlPanel(GameControlEditorWindow* window) { if (!ImGui::CollapsingHeader("Camera Controls")) { return; @@ -329,70 +321,14 @@ namespace GameControlEditor { window->EndGroupPanelPublic(0); } - void DrawLEDControlPanel(GameControlEditorWindow* window) { - window->BeginGroupPanelPublic("LED Colors", ImGui::GetContentRegionAvail()); - static const char* ledSources[] = { "Original Tunic Colors", "Cosmetics Tunic Colors", "Health Colors", - "Original Navi Targeting Colors", "Cosmetics Navi Targeting Colors", "Custom" }; - UIWidgets::PaddedText("Source"); - UIWidgets::EnhancementCombobox("gLedColorSource", ledSources, LED_SOURCE_TUNIC_ORIGINAL); - DrawHelpIcon("Health\n- Red when health critical (13-20% depending on max health)\n- Yellow when health < 40%. Green otherwise.\n\n" \ - "Tunics: colors will mirror currently equipped tunic, whether original or the current values in Cosmetics Editor.\n\n" \ - "Custom: single, solid color"); - if (CVarGetInteger("gLedColorSource", 1) == LED_SOURCE_CUSTOM) { - UIWidgets::Spacer(3); - auto port1Color = CVarGetColor24("gLedPort1Color", { 255, 255, 255 }); - ImVec4 colorVec = { port1Color.r / 255.0f, port1Color.g / 255.0f, port1Color.b / 255.0f, 1.0f }; - if (ImGui::ColorEdit3("", (float*)&colorVec, ImGuiColorEditFlags_NoInputs | ImGuiColorEditFlags_NoLabel)) { - Color_RGB8 color; - color.r = colorVec.x * 255.0; - color.g = colorVec.y * 255.0; - color.b = colorVec.z * 255.0; - - CVarSetColor24("gLedPort1Color", color); - LUS::Context::GetInstance()->GetWindow()->GetGui()->SaveConsoleVariablesOnNextTick(); - } - ImGui::SameLine(); - ImGui::Text("Custom Color"); - } - UIWidgets::PaddedEnhancementSliderFloat("Brightness: %d%%", "##LED_Brightness", "gLedBrightness", - 0.0f, 1.0f, "", 1.0f, true, true); - DrawHelpIcon("Sets the brightness of controller LEDs. 0% brightness = LEDs off."); - UIWidgets::PaddedEnhancementCheckbox("Critical Health Override", "gLedCriticalOverride", true, true, - CVarGetInteger("gLedColorSource", LED_SOURCE_TUNIC_ORIGINAL) == LED_SOURCE_HEALTH, "Override redundant for health source.", - UIWidgets::CheckboxGraphics::Cross, true); - DrawHelpIcon("Shows red color when health is critical, otherwise displays according to color source."); - window->EndGroupPanelPublic(0); - } void GameControlEditorWindow::DrawElement() { ImGui::SetNextWindowSize(ImVec2(465, 430), ImGuiCond_FirstUseEver); if (ImGui::Begin("Game Controls Configuration", &mIsVisible)) { - ImGui::BeginTabBar("##CustomControllers"); - if (ImGui::BeginTabItem("Generic")) { - CurrentPort = 0; - ImGui::EndTabItem(); - } - - for (int i = 1; i <= 4; i++) { - if (ImGui::BeginTabItem(StringHelper::Sprintf("Port %d", i).c_str())) { - CurrentPort = i; - ImGui::EndTabItem(); - } - } - - ImGui::EndTabBar(); - - if (CurrentPort == 0) { - DrawOcarinaControlPanel(this); - DrawCameraControlPanel(this); - DrawDpadControlPanel(this); - DrawMiscControlPanel(this); - } else { - DrawCustomButtons(); - if (CurrentPort == 1 && LUS::Context::GetInstance()->GetControlDeck()->GetDeviceFromPortIndex(0)->CanSetLed()) { - DrawLEDControlPanel(this); - } - } + DrawOcarinaControlPanel(this); + DrawCameraControlPanel(this); + DrawDpadControlPanel(this); + DrawMiscControlPanel(this); } ImGui::End(); } diff --git a/soh/soh/Enhancements/controls/SohInputEditorWindow.cpp b/soh/soh/Enhancements/controls/SohInputEditorWindow.cpp new file mode 100644 index 000000000..ae8e8cc27 --- /dev/null +++ b/soh/soh/Enhancements/controls/SohInputEditorWindow.cpp @@ -0,0 +1,1902 @@ +#include "SohInputEditorWindow.h" +#include +#include "soh/OTRGlobals.h" +#include "../../UIWidgets.hpp" +#include "z64.h" +#ifndef __WIIU__ +#include "controller/controldevice/controller/mapping/sdl/SDLAxisDirectionToButtonMapping.h" +#endif + +#define SCALE_IMGUI_SIZE(value) ((value / 13.0f) * ImGui::GetFontSize()) + +SohInputEditorWindow::~SohInputEditorWindow() { +} + +void SohInputEditorWindow::InitElement() { + mGameInputBlockTimer = INT32_MAX; + mMappingInputBlockTimer = INT32_MAX; + mRumbleTimer = INT32_MAX; + mRumbleMappingToTest = nullptr; + mInputEditorPopupOpen = false; + + mButtonsBitmasks = { BTN_A, BTN_B, BTN_START, BTN_L, BTN_R, BTN_Z, BTN_CUP, BTN_CDOWN, BTN_CLEFT, BTN_CRIGHT }; + mDpadBitmasks = { BTN_DUP, BTN_DDOWN, BTN_DLEFT, BTN_DRIGHT }; + mModifierButtonsBitmasks = { BTN_MODIFIER1, BTN_MODIFIER2 }; +} + +#define INPUT_EDITOR_WINDOW_GAME_INPUT_BLOCK_ID 95237929 +void SohInputEditorWindow::UpdateElement() { + if (mRumbleTimer != INT32_MAX) { + mRumbleTimer--; + if (mRumbleMappingToTest != nullptr) { + mRumbleMappingToTest->StartRumble(); + } + if (mRumbleTimer <= 0) { + if (mRumbleMappingToTest != nullptr) { + mRumbleMappingToTest->StopRumble(); + } + mRumbleTimer = INT32_MAX; + mRumbleMappingToTest = nullptr; + } + } + + if (mInputEditorPopupOpen && ImGui::IsPopupOpen("", ImGuiPopupFlags_AnyPopupId)) { + LUS::Context::GetInstance()->GetControlDeck()->BlockGameInput(INPUT_EDITOR_WINDOW_GAME_INPUT_BLOCK_ID); + + // continue to block input for a third of a second after getting the mapping + mGameInputBlockTimer = ImGui::GetIO().Framerate / 3; + + if (mMappingInputBlockTimer != INT32_MAX) { + mMappingInputBlockTimer--; + if (mMappingInputBlockTimer <= 0) { + mMappingInputBlockTimer = INT32_MAX; + } + } + + LUS::Context::GetInstance()->GetWindow()->GetGui()->BlockImGuiGamepadNavigation(); + } else { + if (mGameInputBlockTimer != INT32_MAX) { + mGameInputBlockTimer--; + if (mGameInputBlockTimer <= 0) { + LUS::Context::GetInstance()->GetControlDeck()->UnblockGameInput( + INPUT_EDITOR_WINDOW_GAME_INPUT_BLOCK_ID); + mGameInputBlockTimer = INT32_MAX; + } + } + + if (LUS::Context::GetInstance()->GetWindow()->GetGui()->ImGuiGamepadNavigationEnabled()) { + mMappingInputBlockTimer = ImGui::GetIO().Framerate / 3; + } else { + mMappingInputBlockTimer = INT32_MAX; + } + + LUS::Context::GetInstance()->GetWindow()->GetGui()->UnblockImGuiGamepadNavigation(); + } +} + +void SohInputEditorWindow::DrawAnalogPreview(const char* label, ImVec2 stick, float deadzone, bool gyro) { + ImGui::BeginChild(label, ImVec2(gyro ? SCALE_IMGUI_SIZE(78) : SCALE_IMGUI_SIZE(96), SCALE_IMGUI_SIZE(85)), false); + ImGui::SetCursorPos(ImVec2(ImGui::GetCursorPos().x + gyro ? SCALE_IMGUI_SIZE(10) : SCALE_IMGUI_SIZE(18), + ImGui::GetCursorPos().y + gyro ? SCALE_IMGUI_SIZE(10) : 0)); + ImDrawList* drawList = ImGui::GetWindowDrawList(); + + const ImVec2 cursorScreenPosition = ImGui::GetCursorScreenPos(); + + // Draw the border box + float borderSquareLeft = cursorScreenPosition.x + SCALE_IMGUI_SIZE(2.0f); + float borderSquareTop = cursorScreenPosition.y + SCALE_IMGUI_SIZE(2.0f); + float borderSquareSize = SCALE_IMGUI_SIZE(65.0f); + drawList->AddRect(ImVec2(borderSquareLeft, borderSquareTop), + ImVec2(borderSquareLeft + borderSquareSize, borderSquareTop + borderSquareSize), + ImColor(100, 100, 100, 255), 0.0f, 0, 1.5f); + + // Draw the gate background + float cardinalRadius = SCALE_IMGUI_SIZE(22.5f); + float diagonalRadius = SCALE_IMGUI_SIZE(22.5f * (69.0f / 85.0f)); + + ImVec2 joystickCenterpoint = ImVec2(cursorScreenPosition.x + cardinalRadius + SCALE_IMGUI_SIZE(12), + cursorScreenPosition.y + cardinalRadius + SCALE_IMGUI_SIZE(11)); + drawList->AddQuadFilled(joystickCenterpoint, + ImVec2(joystickCenterpoint.x - diagonalRadius, joystickCenterpoint.y + diagonalRadius), + ImVec2(joystickCenterpoint.x, joystickCenterpoint.y + cardinalRadius), + ImVec2(joystickCenterpoint.x + diagonalRadius, joystickCenterpoint.y + diagonalRadius), + ImColor(130, 130, 130, 255)); + drawList->AddQuadFilled(joystickCenterpoint, + ImVec2(joystickCenterpoint.x + diagonalRadius, joystickCenterpoint.y + diagonalRadius), + ImVec2(joystickCenterpoint.x + cardinalRadius, joystickCenterpoint.y), + ImVec2(joystickCenterpoint.x + diagonalRadius, joystickCenterpoint.y - diagonalRadius), + ImColor(130, 130, 130, 255)); + drawList->AddQuadFilled(joystickCenterpoint, + ImVec2(joystickCenterpoint.x + diagonalRadius, joystickCenterpoint.y - diagonalRadius), + ImVec2(joystickCenterpoint.x, joystickCenterpoint.y - cardinalRadius), + ImVec2(joystickCenterpoint.x - diagonalRadius, joystickCenterpoint.y - diagonalRadius), + ImColor(130, 130, 130, 255)); + drawList->AddQuadFilled(joystickCenterpoint, + ImVec2(joystickCenterpoint.x - diagonalRadius, joystickCenterpoint.y - diagonalRadius), + ImVec2(joystickCenterpoint.x - cardinalRadius, joystickCenterpoint.y), + ImVec2(joystickCenterpoint.x - diagonalRadius, joystickCenterpoint.y + diagonalRadius), + ImColor(130, 130, 130, 255)); + + // Draw the joystick position indicator + ImVec2 joystickIndicatorDistanceFromCenter = ImVec2(0, 0); + if ((stick.x * stick.x + stick.y * stick.y) > (deadzone * deadzone)) { + joystickIndicatorDistanceFromCenter = + ImVec2((stick.x * (cardinalRadius / 85.0f)), -(stick.y * (cardinalRadius / 85.0f))); + } + float indicatorRadius = SCALE_IMGUI_SIZE(5.0f); + drawList->AddCircleFilled(ImVec2(joystickCenterpoint.x + joystickIndicatorDistanceFromCenter.x, + joystickCenterpoint.y + joystickIndicatorDistanceFromCenter.y), + indicatorRadius, ImColor(34, 51, 76, 255), 7); + + if (!gyro) { + ImGui::SetCursorPos( + ImVec2(ImGui::GetCursorPos().x - SCALE_IMGUI_SIZE(8), ImGui::GetCursorPos().y + SCALE_IMGUI_SIZE(72))); + ImGui::Text("X:%3d, Y:%3d", static_cast(stick.x), static_cast(stick.y)); + } + ImGui::EndChild(); +} + +#define CHIP_COLOR_N64_GREY ImVec4(0.4f, 0.4f, 0.4f, 1.0f) +#define CHIP_COLOR_N64_BLUE ImVec4(0.176f, 0.176f, 0.5f, 1.0f) +#define CHIP_COLOR_N64_GREEN ImVec4(0.0f, 0.294f, 0.0f, 1.0f) +#define CHIP_COLOR_N64_YELLOW ImVec4(0.5f, 0.314f, 0.0f, 1.0f) +#define CHIP_COLOR_N64_RED ImVec4(0.392f, 0.0f, 0.0f, 1.0f) + +#define BUTTON_COLOR_KEYBOARD_BEIGE ImVec4(0.651f, 0.482f, 0.357f, 0.5f) +#define BUTTON_COLOR_KEYBOARD_BEIGE_HOVERED ImVec4(0.651f, 0.482f, 0.357f, 1.0f) + +#define BUTTON_COLOR_GAMEPAD_BLUE ImVec4(0.0f, 0.255f, 0.976f, 0.5f) +#define BUTTON_COLOR_GAMEPAD_BLUE_HOVERED ImVec4(0.0f, 0.255f, 0.976f, 1.0f) + +#define BUTTON_COLOR_GAMEPAD_RED ImVec4(0.976f, 0.0f, 0.094f, 0.5f) +#define BUTTON_COLOR_GAMEPAD_RED_HOVERED ImVec4(0.976f, 0.0f, 0.094f, 1.0f) + +#define BUTTON_COLOR_GAMEPAD_ORANGE ImVec4(0.976f, 0.376f, 0.0f, 0.5f) +#define BUTTON_COLOR_GAMEPAD_ORANGE_HOVERED ImVec4(0.976f, 0.376f, 0.0f, 1.0f) + +#define BUTTON_COLOR_GAMEPAD_GREEN ImVec4(0.0f, 0.5f, 0.0f, 0.5f) +#define BUTTON_COLOR_GAMEPAD_GREEN_HOVERED ImVec4(0.0f, 0.5f, 0.0f, 1.0f) + +#define BUTTON_COLOR_GAMEPAD_PURPLE ImVec4(0.431f, 0.369f, 0.706f, 0.5f) +#define BUTTON_COLOR_GAMEPAD_PURPLE_HOVERED ImVec4(0.431f, 0.369f, 0.706f, 1.0f) + +void SohInputEditorWindow::GetButtonColorsForLUSDeviceIndex(LUS::LUSDeviceIndex lusIndex, ImVec4& buttonColor, + ImVec4& buttonHoveredColor) { + switch (lusIndex) { + case LUS::LUSDeviceIndex::Keyboard: + buttonColor = BUTTON_COLOR_KEYBOARD_BEIGE; + buttonHoveredColor = BUTTON_COLOR_KEYBOARD_BEIGE_HOVERED; + break; + case LUS::LUSDeviceIndex::Blue: + buttonColor = BUTTON_COLOR_GAMEPAD_BLUE; + buttonHoveredColor = BUTTON_COLOR_GAMEPAD_BLUE_HOVERED; + break; + case LUS::LUSDeviceIndex::Red: + buttonColor = BUTTON_COLOR_GAMEPAD_RED; + buttonHoveredColor = BUTTON_COLOR_GAMEPAD_RED_HOVERED; + break; + case LUS::LUSDeviceIndex::Orange: + buttonColor = BUTTON_COLOR_GAMEPAD_ORANGE; + buttonHoveredColor = BUTTON_COLOR_GAMEPAD_ORANGE_HOVERED; + break; + case LUS::LUSDeviceIndex::Green: + buttonColor = BUTTON_COLOR_GAMEPAD_GREEN; + buttonHoveredColor = BUTTON_COLOR_GAMEPAD_GREEN_HOVERED; + break; + default: + buttonColor = BUTTON_COLOR_GAMEPAD_PURPLE; + buttonHoveredColor = BUTTON_COLOR_GAMEPAD_PURPLE_HOVERED; + } +} + +void SohInputEditorWindow::DrawInputChip(const char* buttonName, ImVec4 color = CHIP_COLOR_N64_GREY) { + ImGui::BeginDisabled(); + ImGui::PushStyleColor(ImGuiCol_Button, color); + ImGui::Button(buttonName, ImVec2(SCALE_IMGUI_SIZE(50.0f), 0)); + ImGui::PopStyleColor(); + ImGui::EndDisabled(); +} + +void SohInputEditorWindow::DrawButtonLineAddMappingButton(uint8_t port, uint16_t bitmask) { + ImGui::PushStyleVar(ImGuiStyleVar_ButtonTextAlign, ImVec2(1.0f, 0.5f)); + auto popupId = StringHelper::Sprintf("addButtonMappingPopup##%d-%d", port, bitmask); + if (ImGui::Button(StringHelper::Sprintf("%s###addButtonMappingButton%d-%d", ICON_FA_PLUS, port, bitmask).c_str(), + ImVec2(SCALE_IMGUI_SIZE(20.0f), 0.0f))) { + ImGui::OpenPopup(popupId.c_str()); + }; + ImGui::PopStyleVar(); + + if (ImGui::BeginPopup(popupId.c_str())) { + mInputEditorPopupOpen = true; + ImGui::Text("Press any button,\nmove any axis,\nor press any key\nto add mapping"); + if (ImGui::Button("Cancel")) { + mInputEditorPopupOpen = false; + ImGui::CloseCurrentPopup(); + } + // todo: figure out why optional params (using id = "" in the definition) wasn't working + if (mMappingInputBlockTimer == INT32_MAX && LUS::Context::GetInstance() + ->GetControlDeck() + ->GetControllerByPort(port) + ->GetButton(bitmask) + ->AddOrEditButtonMappingFromRawPress(bitmask, "")) { + mInputEditorPopupOpen = false; + ImGui::CloseCurrentPopup(); + } + ImGui::EndPopup(); + } +} + +void SohInputEditorWindow::DrawButtonLineEditMappingButton(uint8_t port, uint16_t bitmask, std::string id) { + auto mapping = LUS::Context::GetInstance() + ->GetControlDeck() + ->GetControllerByPort(port) + ->GetButton(bitmask) + ->GetButtonMappingById(id); + if (mapping == nullptr) { + return; + } + + ImGui::PushStyleVar(ImGuiStyleVar_ButtonTextAlign, ImVec2(0.0f, 0.5f)); + std::string icon = ""; + switch (mapping->GetMappingType()) { + case MAPPING_TYPE_GAMEPAD: + icon = ICON_FA_GAMEPAD; + break; + case MAPPING_TYPE_KEYBOARD: + icon = ICON_FA_KEYBOARD_O; + break; + case MAPPING_TYPE_UNKNOWN: + icon = ICON_FA_BUG; + break; + } + auto buttonColor = ImGui::GetStyleColorVec4(ImGuiCol_Button); + auto buttonHoveredColor = ImGui::GetStyleColorVec4(ImGuiCol_ButtonHovered); + auto physicalInputDisplayName = + StringHelper::Sprintf("%s %s", icon.c_str(), mapping->GetPhysicalInputName().c_str()); + GetButtonColorsForLUSDeviceIndex(mapping->GetLUSDeviceIndex(), buttonColor, buttonHoveredColor); + ImGui::PushStyleColor(ImGuiCol_Button, buttonColor); + ImGui::PushStyleColor(ImGuiCol_ButtonHovered, buttonHoveredColor); + auto popupId = StringHelper::Sprintf("editButtonMappingPopup##%s", id.c_str()); + if (ImGui::Button( + StringHelper::Sprintf("%s###editButtonMappingButton%s", physicalInputDisplayName.c_str(), id.c_str()) + .c_str(), + ImVec2(ImGui::CalcTextSize(physicalInputDisplayName.c_str()).x + SCALE_IMGUI_SIZE(12.0f), 0.0f))) { + ImGui::OpenPopup(popupId.c_str()); + } + if (ImGui::IsItemHovered(ImGuiHoveredFlags_DelayNormal | ImGuiHoveredFlags_NoSharedDelay)) { + ImGui::SetTooltip(mapping->GetPhysicalDeviceName().c_str()); + } + ImGui::PopStyleColor(); + ImGui::PopStyleColor(); + + if (ImGui::BeginPopup(popupId.c_str())) { + mInputEditorPopupOpen = true; + ImGui::Text("Press any button,\nmove any axis,\nor press any key\nto edit mapping"); + if (ImGui::Button("Cancel")) { + mInputEditorPopupOpen = false; + ImGui::CloseCurrentPopup(); + } + if (mMappingInputBlockTimer == INT32_MAX && LUS::Context::GetInstance() + ->GetControlDeck() + ->GetControllerByPort(port) + ->GetButton(bitmask) + ->AddOrEditButtonMappingFromRawPress(bitmask, id)) { + mInputEditorPopupOpen = false; + ImGui::CloseCurrentPopup(); + } + ImGui::EndPopup(); + } + + ImGui::PopStyleVar(); + ImGui::SameLine(0, 0); + +#ifndef __WIIU__ + auto sdlAxisDirectionToButtonMapping = std::dynamic_pointer_cast(mapping); + auto indexMapping = LUS::Context::GetInstance() + ->GetControlDeck() + ->GetDeviceIndexMappingManager() + ->GetDeviceIndexMappingFromLUSDeviceIndex(mapping->GetLUSDeviceIndex()); + auto sdlIndexMapping = std::dynamic_pointer_cast(indexMapping); + + if (sdlIndexMapping != nullptr && sdlAxisDirectionToButtonMapping != nullptr) { + ImGui::PushStyleVar(ImGuiStyleVar_ButtonTextAlign, ImVec2(0.0f, 0.5f)); + auto buttonColor = ImGui::GetStyleColorVec4(ImGuiCol_Button); + auto buttonHoveredColor = ImGui::GetStyleColorVec4(ImGuiCol_ButtonHovered); + GetButtonColorsForLUSDeviceIndex(mapping->GetLUSDeviceIndex(), buttonColor, buttonHoveredColor); + ImGui::PushStyleColor(ImGuiCol_Button, buttonColor); + ImGui::PushStyleColor(ImGuiCol_ButtonHovered, buttonHoveredColor); + ImGui::PushStyleVar(ImGuiStyleVar_ButtonTextAlign, ImVec2(1.0f, 0.5f)); + auto popupId = StringHelper::Sprintf("editAxisThresholdPopup##%s", id.c_str()); + if (ImGui::Button(StringHelper::Sprintf("%s###editAxisThresholdButton%s", ICON_FA_COG, id.c_str()).c_str(), + ImVec2(ImGui::CalcTextSize(ICON_FA_COG).x + SCALE_IMGUI_SIZE(10.0f), 0.0f))) { + ImGui::OpenPopup(popupId.c_str()); + } + if (ImGui::IsItemHovered(ImGuiHoveredFlags_DelayNormal | ImGuiHoveredFlags_NoSharedDelay)) { + ImGui::SetTooltip("Edit axis threshold"); + } + ImGui::PopStyleColor(); + ImGui::PopStyleColor(); + ImGui::PopStyleVar(); + + if (ImGui::BeginPopup(popupId.c_str())) { + mInputEditorPopupOpen = true; + ImGui::Text("Axis Threshold\n\nThe extent to which the joystick\nmust be moved or the trigger\npressed to " + "initiate the assigned\nbutton action.\n\n"); + + if (sdlAxisDirectionToButtonMapping->AxisIsStick()) { + ImGui::Text("Stick axis threshold:"); + + int32_t stickAxisThreshold = sdlIndexMapping->GetStickAxisThresholdPercentage(); + if (stickAxisThreshold == 0) { + ImGui::BeginDisabled(); + } + ImGui::PushButtonRepeat(true); + if (ImGui::Button(StringHelper::Sprintf("-##Stick Axis Threshold%s", id.c_str()).c_str())) { + sdlIndexMapping->SetStickAxisThresholdPercentage(stickAxisThreshold - 1); + sdlIndexMapping->SaveToConfig(); + } + ImGui::PopButtonRepeat(); + if (stickAxisThreshold == 0) { + ImGui::EndDisabled(); + } + ImGui::SameLine(0.0f, 0.0f); + ImGui::SetNextItemWidth(SCALE_IMGUI_SIZE(160.0f)); + if (ImGui::SliderInt(StringHelper::Sprintf("##Stick Axis Threshold%s", id.c_str()).c_str(), + &stickAxisThreshold, 0, 100, "%d%%", ImGuiSliderFlags_AlwaysClamp)) { + sdlIndexMapping->SetStickAxisThresholdPercentage(stickAxisThreshold); + sdlIndexMapping->SaveToConfig(); + } + ImGui::SameLine(0.0f, 0.0f); + if (stickAxisThreshold == 100) { + ImGui::BeginDisabled(); + } + ImGui::PushButtonRepeat(true); + if (ImGui::Button(StringHelper::Sprintf("+##Stick Axis Threshold%s", id.c_str()).c_str())) { + sdlIndexMapping->SetStickAxisThresholdPercentage(stickAxisThreshold + 1); + sdlIndexMapping->SaveToConfig(); + } + ImGui::PopButtonRepeat(); + if (stickAxisThreshold == 100) { + ImGui::EndDisabled(); + } + } + + if (sdlAxisDirectionToButtonMapping->AxisIsTrigger()) { + ImGui::Text("Trigger axis threshold:"); + + int32_t triggerAxisThreshold = sdlIndexMapping->GetTriggerAxisThresholdPercentage(); + if (triggerAxisThreshold == 0) { + ImGui::BeginDisabled(); + } + ImGui::PushButtonRepeat(true); + if (ImGui::Button(StringHelper::Sprintf("-##Trigger Axis Threshold%s", id.c_str()).c_str())) { + sdlIndexMapping->SetTriggerAxisThresholdPercentage(triggerAxisThreshold - 1); + sdlIndexMapping->SaveToConfig(); + } + ImGui::PopButtonRepeat(); + if (triggerAxisThreshold == 0) { + ImGui::EndDisabled(); + } + ImGui::SameLine(0.0f, 0.0f); + ImGui::SetNextItemWidth(SCALE_IMGUI_SIZE(160.0f)); + if (ImGui::SliderInt(StringHelper::Sprintf("##Trigger Axis Threshold%s", id.c_str()).c_str(), + &triggerAxisThreshold, 0, 100, "%d%%", ImGuiSliderFlags_AlwaysClamp)) { + sdlIndexMapping->SetTriggerAxisThresholdPercentage(triggerAxisThreshold); + sdlIndexMapping->SaveToConfig(); + } + ImGui::SameLine(0.0f, 0.0f); + if (triggerAxisThreshold == 100) { + ImGui::BeginDisabled(); + } + ImGui::PushButtonRepeat(true); + if (ImGui::Button(StringHelper::Sprintf("+##Trigger Axis Threshold%s", id.c_str()).c_str())) { + sdlIndexMapping->SetTriggerAxisThresholdPercentage(triggerAxisThreshold + 1); + sdlIndexMapping->SaveToConfig(); + } + ImGui::PopButtonRepeat(); + if (triggerAxisThreshold == 100) { + ImGui::EndDisabled(); + } + } + + if (ImGui::Button("Close")) { + mInputEditorPopupOpen = false; + ImGui::CloseCurrentPopup(); + } + + ImGui::EndPopup(); + } + + ImGui::PopStyleVar(); + ImGui::SameLine(0, 0); + } +#endif + + ImGui::PushStyleColor(ImGuiCol_Button, buttonColor); + ImGui::PushStyleColor(ImGuiCol_ButtonHovered, buttonHoveredColor); + ImGui::PushStyleVar(ImGuiStyleVar_ButtonTextAlign, ImVec2(1.0f, 0.5f)); + if (ImGui::Button(StringHelper::Sprintf("%s###removeButtonMappingButton%s", ICON_FA_TIMES, id.c_str()).c_str(), + ImVec2(ImGui::CalcTextSize(ICON_FA_TIMES).x + SCALE_IMGUI_SIZE(10.0f), 0.0f))) { + LUS::Context::GetInstance() + ->GetControlDeck() + ->GetControllerByPort(port) + ->GetButton(bitmask) + ->ClearButtonMapping(id); + }; + ImGui::PopStyleColor(); + ImGui::PopStyleColor(); + ImGui::PopStyleVar(); + + ImGui::SameLine(0, SCALE_IMGUI_SIZE(4.0f)); +} + +void SohInputEditorWindow::DrawButtonLine(const char* buttonName, uint8_t port, uint16_t bitmask, + ImVec4 color = CHIP_COLOR_N64_GREY) { + ImGui::NewLine(); + ImGui::SameLine(SCALE_IMGUI_SIZE(32.0f)); + DrawInputChip(buttonName, color); + ImGui::SameLine(SCALE_IMGUI_SIZE(86.0f)); + for (auto id : mBitmaskToMappingIds[port][bitmask]) { + DrawButtonLineEditMappingButton(port, bitmask, id); + } + DrawButtonLineAddMappingButton(port, bitmask); +} + +void SohInputEditorWindow::DrawStickDirectionLineAddMappingButton(uint8_t port, uint8_t stick, + LUS::Direction direction) { + ImGui::PushStyleVar(ImGuiStyleVar_ButtonTextAlign, ImVec2(1.0f, 0.5f)); + auto popupId = StringHelper::Sprintf("addStickDirectionMappingPopup##%d-%d-%d", port, stick, direction); + if (ImGui::Button( + StringHelper::Sprintf("%s###addStickDirectionMappingButton%d-%d-%d", ICON_FA_PLUS, port, stick, direction) + .c_str(), + ImVec2(SCALE_IMGUI_SIZE(20.0f), 0.0f))) { + ImGui::OpenPopup(popupId.c_str()); + }; + ImGui::PopStyleVar(); + + if (ImGui::BeginPopup(popupId.c_str())) { + mInputEditorPopupOpen = true; + ImGui::Text("Press any button,\nmove any axis,\nor press any key\nto add mapping"); + if (ImGui::Button("Cancel")) { + mInputEditorPopupOpen = false; + ImGui::CloseCurrentPopup(); + } + if (stick == LUS::LEFT) { + if (mMappingInputBlockTimer == INT32_MAX && + LUS::Context::GetInstance() + ->GetControlDeck() + ->GetControllerByPort(port) + ->GetLeftStick() + ->AddOrEditAxisDirectionMappingFromRawPress(direction, "")) { + mInputEditorPopupOpen = false; + ImGui::CloseCurrentPopup(); + } + } else { + if (mMappingInputBlockTimer == INT32_MAX && + LUS::Context::GetInstance() + ->GetControlDeck() + ->GetControllerByPort(port) + ->GetRightStick() + ->AddOrEditAxisDirectionMappingFromRawPress(direction, "")) { + ImGui::CloseCurrentPopup(); + } + } + ImGui::EndPopup(); + } +} + +void SohInputEditorWindow::DrawStickDirectionLineEditMappingButton(uint8_t port, uint8_t stick, + LUS::Direction direction, std::string id) { + std::shared_ptr mapping = nullptr; + if (stick == LUS::LEFT) { + mapping = LUS::Context::GetInstance() + ->GetControlDeck() + ->GetControllerByPort(port) + ->GetLeftStick() + ->GetAxisDirectionMappingById(direction, id); + } else { + mapping = LUS::Context::GetInstance() + ->GetControlDeck() + ->GetControllerByPort(port) + ->GetRightStick() + ->GetAxisDirectionMappingById(direction, id); + } + + if (mapping == nullptr) { + return; + } + + ImGui::PushStyleVar(ImGuiStyleVar_ButtonTextAlign, ImVec2(0.0f, 0.5f)); + std::string icon = ""; + switch (mapping->GetMappingType()) { + case MAPPING_TYPE_GAMEPAD: + icon = ICON_FA_GAMEPAD; + break; + case MAPPING_TYPE_KEYBOARD: + icon = ICON_FA_KEYBOARD_O; + break; + case MAPPING_TYPE_UNKNOWN: + icon = ICON_FA_BUG; + break; + } + auto buttonColor = ImGui::GetStyleColorVec4(ImGuiCol_Button); + auto buttonHoveredColor = ImGui::GetStyleColorVec4(ImGuiCol_ButtonHovered); + auto physicalInputDisplayName = + StringHelper::Sprintf("%s %s", icon.c_str(), mapping->GetPhysicalInputName().c_str()); + GetButtonColorsForLUSDeviceIndex(mapping->GetLUSDeviceIndex(), buttonColor, buttonHoveredColor); + ImGui::PushStyleColor(ImGuiCol_Button, buttonColor); + ImGui::PushStyleColor(ImGuiCol_ButtonHovered, buttonHoveredColor); + auto popupId = StringHelper::Sprintf("editStickDirectionMappingPopup##%s", id.c_str()); + if (ImGui::Button( + StringHelper::Sprintf("%s###editStickDirectionMappingButton%s", physicalInputDisplayName.c_str(), + id.c_str()) + .c_str(), + ImVec2(ImGui::CalcTextSize(physicalInputDisplayName.c_str()).x + SCALE_IMGUI_SIZE(12.0f), 0.0f))) { + ImGui::OpenPopup(popupId.c_str()); + } + if (ImGui::IsItemHovered(ImGuiHoveredFlags_DelayNormal | ImGuiHoveredFlags_NoSharedDelay)) { + ImGui::SetTooltip(mapping->GetPhysicalDeviceName().c_str()); + } + ImGui::PopStyleColor(); + ImGui::PopStyleColor(); + + if (ImGui::BeginPopup(popupId.c_str())) { + mInputEditorPopupOpen = true; + ImGui::Text("Press any button,\nmove any axis,\nor press any key\nto edit mapping"); + if (ImGui::Button("Cancel")) { + mInputEditorPopupOpen = false; + ImGui::CloseCurrentPopup(); + } + + if (stick == LUS::LEFT) { + if (mMappingInputBlockTimer == INT32_MAX && + LUS::Context::GetInstance() + ->GetControlDeck() + ->GetControllerByPort(port) + ->GetLeftStick() + ->AddOrEditAxisDirectionMappingFromRawPress(direction, id)) { + mInputEditorPopupOpen = false; + ImGui::CloseCurrentPopup(); + } + } else { + if (mMappingInputBlockTimer == INT32_MAX && + LUS::Context::GetInstance() + ->GetControlDeck() + ->GetControllerByPort(port) + ->GetRightStick() + ->AddOrEditAxisDirectionMappingFromRawPress(direction, id)) { + ImGui::CloseCurrentPopup(); + } + } + ImGui::EndPopup(); + } + + ImGui::PopStyleVar(); + ImGui::SameLine(0, 0); + ImGui::PushStyleColor(ImGuiCol_Button, buttonColor); + ImGui::PushStyleColor(ImGuiCol_ButtonHovered, buttonHoveredColor); + ImGui::PushStyleVar(ImGuiStyleVar_ButtonTextAlign, ImVec2(1.0f, 0.5f)); + if (ImGui::Button( + StringHelper::Sprintf("%s###removeStickDirectionMappingButton%s", ICON_FA_TIMES, id.c_str()).c_str(), + ImVec2(ImGui::CalcTextSize(ICON_FA_TIMES).x + SCALE_IMGUI_SIZE(10.0f), 0.0f))) { + if (stick == LUS::LEFT) { + LUS::Context::GetInstance() + ->GetControlDeck() + ->GetControllerByPort(port) + ->GetLeftStick() + ->ClearAxisDirectionMapping(direction, id); + } else { + LUS::Context::GetInstance() + ->GetControlDeck() + ->GetControllerByPort(port) + ->GetRightStick() + ->ClearAxisDirectionMapping(direction, id); + } + }; + ImGui::PopStyleColor(); + ImGui::PopStyleColor(); + ImGui::PopStyleVar(); + ImGui::SameLine(0, SCALE_IMGUI_SIZE(4.0f)); +} + +void SohInputEditorWindow::DrawStickDirectionLine(const char* axisDirectionName, uint8_t port, uint8_t stick, + LUS::Direction direction, ImVec4 color = CHIP_COLOR_N64_GREY) { + ImGui::NewLine(); + ImGui::SameLine(); + ImGui::BeginDisabled(); + ImGui::PushStyleColor(ImGuiCol_Button, color); + ImGui::Button(axisDirectionName, ImVec2(SCALE_IMGUI_SIZE(26.0f), 0)); + ImGui::PopStyleColor(); + ImGui::EndDisabled(); + ImGui::SameLine(0.0f, SCALE_IMGUI_SIZE(4.0f)); + for (auto id : mStickDirectionToMappingIds[port][stick][direction]) { + DrawStickDirectionLineEditMappingButton(port, stick, direction, id); + } + DrawStickDirectionLineAddMappingButton(port, stick, direction); +} + +void SohInputEditorWindow::DrawStickSection(uint8_t port, uint8_t stick, int32_t id, + ImVec4 color = CHIP_COLOR_N64_GREY) { + static int8_t sX, sY; + std::shared_ptr controllerStick = nullptr; + if (stick == LUS::LEFT) { + controllerStick = LUS::Context::GetInstance()->GetControlDeck()->GetControllerByPort(port)->GetLeftStick(); + } else { + controllerStick = LUS::Context::GetInstance()->GetControlDeck()->GetControllerByPort(port)->GetRightStick(); + } + controllerStick->Process(sX, sY); + DrawAnalogPreview(StringHelper::Sprintf("##AnalogPreview%d", id).c_str(), ImVec2(sX, sY)); + + ImGui::SameLine(); + ImGui::BeginGroup(); + DrawStickDirectionLine(ICON_FA_ARROW_UP, port, stick, LUS::UP, color); + DrawStickDirectionLine(ICON_FA_ARROW_DOWN, port, stick, LUS::DOWN, color); + DrawStickDirectionLine(ICON_FA_ARROW_LEFT, port, stick, LUS::LEFT, color); + DrawStickDirectionLine(ICON_FA_ARROW_RIGHT, port, stick, LUS::RIGHT, color); + ImGui::EndGroup(); + ImGui::SetNextItemOpen(true, ImGuiCond_Once); + if (ImGui::TreeNode(StringHelper::Sprintf("Analog Stick Options##%d", id).c_str())) { + ImGui::Text("Deadzone:"); + + int32_t deadzonePercentage = controllerStick->GetDeadzonePercentage(); + if (deadzonePercentage == 0) { + ImGui::BeginDisabled(); + } + ImGui::PushButtonRepeat(true); + if (ImGui::Button(StringHelper::Sprintf("-##Deadzone%d", id).c_str())) { + controllerStick->SetDeadzone(deadzonePercentage - 1); + } + ImGui::PopButtonRepeat(); + if (deadzonePercentage == 0) { + ImGui::EndDisabled(); + } + ImGui::SameLine(0.0f, 0.0f); + ImGui::SetNextItemWidth(SCALE_IMGUI_SIZE(160.0f)); + if (ImGui::SliderInt(StringHelper::Sprintf("##Deadzone%d", id).c_str(), &deadzonePercentage, 0, 100, "%d%%", + ImGuiSliderFlags_AlwaysClamp)) { + controllerStick->SetDeadzone(deadzonePercentage); + } + ImGui::SameLine(0.0f, 0.0f); + if (deadzonePercentage == 100) { + ImGui::BeginDisabled(); + } + ImGui::PushButtonRepeat(true); + if (ImGui::Button(StringHelper::Sprintf("+##Deadzone%d", id).c_str())) { + controllerStick->SetDeadzone(deadzonePercentage + 1); + } + ImGui::PopButtonRepeat(); + if (deadzonePercentage == 100) { + ImGui::EndDisabled(); + } + if (!controllerStick->DeadzoneIsDefault()) { + ImGui::SameLine(); + if (ImGui::Button(StringHelper::Sprintf("Reset to Default###resetStickDeadzone%d", id).c_str())) { + controllerStick->ResetDeadzoneToDefault(); + } + } + + ImGui::Text("Notch Snap Angle:"); + int32_t notchSnapAngle = controllerStick->GetNotchSnapAngle(); + if (notchSnapAngle == 0) { + ImGui::BeginDisabled(); + } + ImGui::PushButtonRepeat(true); + if (ImGui::Button(StringHelper::Sprintf("-##NotchProximityThreshold%d", id).c_str())) { + controllerStick->SetNotchSnapAngle(notchSnapAngle - 1); + } + ImGui::PopButtonRepeat(); + if (notchSnapAngle == 0) { + ImGui::EndDisabled(); + } + ImGui::SameLine(0.0f, 0.0f); + ImGui::SetNextItemWidth(SCALE_IMGUI_SIZE(160.0f)); + if (ImGui::SliderInt(StringHelper::Sprintf("##NotchProximityThreshold%d", id).c_str(), ¬chSnapAngle, 0, 45, + "%d°", ImGuiSliderFlags_AlwaysClamp)) { + controllerStick->SetNotchSnapAngle(notchSnapAngle); + } + ImGui::SameLine(0.0f, 0.0f); + if (notchSnapAngle == 45) { + ImGui::BeginDisabled(); + } + ImGui::PushButtonRepeat(true); + if (ImGui::Button(StringHelper::Sprintf("+##NotchProximityThreshold%d", id).c_str())) { + controllerStick->SetNotchSnapAngle(notchSnapAngle + 1); + } + ImGui::PopButtonRepeat(); + if (notchSnapAngle == 45) { + ImGui::EndDisabled(); + } + if (!controllerStick->NotchSnapAngleIsDefault()) { + ImGui::SameLine(); + if (ImGui::Button(StringHelper::Sprintf("Reset to Default###resetStickSnap%d", id).c_str())) { + controllerStick->ResetNotchSnapAngleToDefault(); + } + } + + ImGui::TreePop(); + } +} + +void SohInputEditorWindow::UpdateBitmaskToMappingIds(uint8_t port) { + // todo: do we need this now that ControllerButton exists? + + for (auto [bitmask, button] : + LUS::Context::GetInstance()->GetControlDeck()->GetControllerByPort(port)->GetAllButtons()) { + for (auto [id, mapping] : button->GetAllButtonMappings()) { + // using a vector here instead of a set because i want newly added mappings + // to go to the end of the list instead of autosorting + if (std::find(mBitmaskToMappingIds[port][bitmask].begin(), mBitmaskToMappingIds[port][bitmask].end(), id) == + mBitmaskToMappingIds[port][bitmask].end()) { + mBitmaskToMappingIds[port][bitmask].push_back(id); + } + } + } +} + +void SohInputEditorWindow::UpdateStickDirectionToMappingIds(uint8_t port) { + // todo: do we need this? + for (auto stick : + { std::make_pair>( + LUS::LEFT, LUS::Context::GetInstance()->GetControlDeck()->GetControllerByPort(port)->GetLeftStick()), + std::make_pair>( + LUS::RIGHT, + LUS::Context::GetInstance()->GetControlDeck()->GetControllerByPort(port)->GetRightStick()) }) { + for (auto direction : { LUS::LEFT, LUS::RIGHT, LUS::UP, LUS::DOWN }) { + for (auto [id, mapping] : stick.second->GetAllAxisDirectionMappingByDirection(direction)) { + // using a vector here instead of a set because i want newly added mappings + // to go to the end of the list instead of autosorting + if (std::find(mStickDirectionToMappingIds[port][stick.first][direction].begin(), + mStickDirectionToMappingIds[port][stick.first][direction].end(), + id) == mStickDirectionToMappingIds[port][stick.first][direction].end()) { + mStickDirectionToMappingIds[port][stick.first][direction].push_back(id); + } + } + } + } +} + +void SohInputEditorWindow::DrawRemoveRumbleMappingButton(uint8_t port, std::string id) { + ImGui::SameLine(); + ImGui::PushStyleVar(ImGuiStyleVar_ButtonTextAlign, ImVec2(1.0f, 0.5f)); + if (ImGui::Button(StringHelper::Sprintf("%s###removeRumbleMapping%s", ICON_FA_TIMES, id.c_str()).c_str(), + ImVec2(SCALE_IMGUI_SIZE(20.0f), SCALE_IMGUI_SIZE(20.0f)))) { + LUS::Context::GetInstance()->GetControlDeck()->GetControllerByPort(port)->GetRumble()->ClearRumbleMapping(id); + } + ImGui::PopStyleVar(); +} + +void SohInputEditorWindow::DrawAddRumbleMappingButton(uint8_t port) { + ImGui::SameLine(); + ImGui::PushStyleVar(ImGuiStyleVar_ButtonTextAlign, ImVec2(1.0f, 0.5f)); + auto popupId = StringHelper::Sprintf("addRumbleMappingPopup##%d", port); + if (ImGui::Button(StringHelper::Sprintf("%s###addRumbleMapping%d", ICON_FA_PLUS, port).c_str(), + ImVec2(SCALE_IMGUI_SIZE(20.0f), SCALE_IMGUI_SIZE(20.0f)))) { + ImGui::OpenPopup(popupId.c_str()); + } + ImGui::PopStyleVar(); + + if (ImGui::BeginPopup(popupId.c_str())) { + mInputEditorPopupOpen = true; + ImGui::Text("Press any button\nor move any axis\nto add rumble device"); + if (ImGui::Button("Cancel")) { + mInputEditorPopupOpen = false; + ImGui::CloseCurrentPopup(); + } + + if (mMappingInputBlockTimer == INT32_MAX && LUS::Context::GetInstance() + ->GetControlDeck() + ->GetControllerByPort(port) + ->GetRumble() + ->AddRumbleMappingFromRawPress()) { + mInputEditorPopupOpen = false; + ImGui::CloseCurrentPopup(); + } + ImGui::EndPopup(); + } +} + +bool SohInputEditorWindow::TestingRumble() { + return mRumbleTimer != INT32_MAX; +} + +void SohInputEditorWindow::DrawRumbleSection(uint8_t port) { + for (auto [id, mapping] : LUS::Context::GetInstance() + ->GetControlDeck() + ->GetControllerByPort(port) + ->GetRumble() + ->GetAllRumbleMappings()) { + ImGui::AlignTextToFramePadding(); + ImGui::SetNextItemOpen(true, ImGuiCond_Once); + auto buttonColor = ImGui::GetStyleColorVec4(ImGuiCol_Button); + auto buttonHoveredColor = ImGui::GetStyleColorVec4(ImGuiCol_ButtonHovered); + GetButtonColorsForLUSDeviceIndex(mapping->GetLUSDeviceIndex(), buttonColor, buttonHoveredColor); + // begin hackaround https://github.com/ocornut/imgui/issues/282#issuecomment-123763192 + // spaces to have background color for text in a tree node + std::string spaces = ""; + for (size_t i = 0; i < mapping->GetPhysicalDeviceName().length(); i++) { + spaces += " "; + } + auto open = ImGui::TreeNode(StringHelper::Sprintf("%s###Rumble%s", spaces.c_str(), id.c_str()).c_str()); + ImGui::SameLine(); + ImGui::SetCursorPosX(SCALE_IMGUI_SIZE(30.0f)); + // end hackaround + + ImGui::PushItemFlag(ImGuiItemFlags_Disabled, true); + ImGui::PushStyleColor(ImGuiCol_Button, buttonColor); + ImGui::Button(mapping->GetPhysicalDeviceName().c_str()); + ImGui::PopStyleColor(); + ImGui::PopItemFlag(); + + DrawRemoveRumbleMappingButton(port, id); + ImGui::SameLine(); + if (ImGui::Button( + StringHelper::Sprintf("%s###rumbleTestButton%s", TestingRumble() ? "Stop" : "Test", id.c_str()) + .c_str())) { + if (mRumbleTimer != INT32_MAX) { + mRumbleTimer = INT32_MAX; + mRumbleMappingToTest->StopRumble(); + mRumbleMappingToTest = nullptr; + } else { + mRumbleTimer = ImGui::GetIO().Framerate; + mRumbleMappingToTest = mapping; + } + } + if (open) { + ImGui::Text("Small Motor Intensity:"); + + int32_t smallMotorIntensity = mapping->GetHighFrequencyIntensityPercentage(); + if (smallMotorIntensity == 0) { + ImGui::BeginDisabled(); + } + ImGui::PushButtonRepeat(true); + if (ImGui::Button(StringHelper::Sprintf("-##Small Motor Intensity%s", id.c_str()).c_str())) { + mapping->SetHighFrequencyIntensity(smallMotorIntensity - 1); + mapping->SaveToConfig(); + } + ImGui::PopButtonRepeat(); + if (smallMotorIntensity == 0) { + ImGui::EndDisabled(); + } + ImGui::SameLine(0.0f, 0.0f); + ImGui::SetNextItemWidth(SCALE_IMGUI_SIZE(160.0f)); + if (ImGui::SliderInt(StringHelper::Sprintf("##Small Motor Intensity%s", id.c_str()).c_str(), + &smallMotorIntensity, 0, 100, "%d%%", ImGuiSliderFlags_AlwaysClamp)) { + mapping->SetHighFrequencyIntensity(smallMotorIntensity); + mapping->SaveToConfig(); + } + ImGui::SameLine(0.0f, 0.0f); + if (smallMotorIntensity == 100) { + ImGui::BeginDisabled(); + } + ImGui::PushButtonRepeat(true); + if (ImGui::Button(StringHelper::Sprintf("+##Small Motor Intensity%s", id.c_str()).c_str())) { + mapping->SetHighFrequencyIntensity(smallMotorIntensity + 1); + mapping->SaveToConfig(); + } + ImGui::PopButtonRepeat(); + if (smallMotorIntensity == 100) { + ImGui::EndDisabled(); + } + if (!mapping->HighFrequencyIntensityIsDefault()) { + ImGui::SameLine(); + if (ImGui::Button(StringHelper::Sprintf("Reset to Default###resetHighFrequencyIntensity%s", id.c_str()) + .c_str())) { + mapping->ResetHighFrequencyIntensityToDefault(); + } + } + + ImGui::Text("Large Motor Intensity:"); + + int32_t largeMotorIntensity = mapping->GetLowFrequencyIntensityPercentage(); + if (largeMotorIntensity == 0) { + ImGui::BeginDisabled(); + } + ImGui::PushButtonRepeat(true); + if (ImGui::Button(StringHelper::Sprintf("-##Large Motor Intensity%s", id.c_str()).c_str())) { + mapping->SetLowFrequencyIntensity(largeMotorIntensity - 1); + mapping->SaveToConfig(); + } + ImGui::PopButtonRepeat(); + if (largeMotorIntensity == 0) { + ImGui::EndDisabled(); + } + ImGui::SameLine(0.0f, 0.0f); + ImGui::SetNextItemWidth(SCALE_IMGUI_SIZE(160.0f)); + if (ImGui::SliderInt(StringHelper::Sprintf("##Large Motor Intensity%s", id.c_str()).c_str(), + &largeMotorIntensity, 0, 100, "%d%%", ImGuiSliderFlags_AlwaysClamp)) { + mapping->SetLowFrequencyIntensity(largeMotorIntensity); + mapping->SaveToConfig(); + } + ImGui::SameLine(0.0f, 0.0f); + if (largeMotorIntensity == 100) { + ImGui::BeginDisabled(); + } + ImGui::PushButtonRepeat(true); + if (ImGui::Button(StringHelper::Sprintf("+##Large Motor Intensity%s", id.c_str()).c_str())) { + mapping->SetLowFrequencyIntensity(largeMotorIntensity + 1); + mapping->SaveToConfig(); + } + ImGui::PopButtonRepeat(); + if (largeMotorIntensity == 100) { + ImGui::EndDisabled(); + } + if (!mapping->LowFrequencyIntensityIsDefault()) { + ImGui::SameLine(); + if (ImGui::Button( + StringHelper::Sprintf("Reset to Default###resetLowFrequencyIntensity%s", id.c_str()).c_str())) { + mapping->ResetLowFrequencyIntensityToDefault(); + } + } + ImGui::Dummy(ImVec2(0, SCALE_IMGUI_SIZE(20))); + + ImGui::TreePop(); + } + } + + ImGui::AlignTextToFramePadding(); + ImGui::BulletText("Add rumble device"); + DrawAddRumbleMappingButton(port); +} + +void SohInputEditorWindow::DrawRemoveLEDMappingButton(uint8_t port, std::string id) { + ImGui::SameLine(); + ImGui::PushStyleVar(ImGuiStyleVar_ButtonTextAlign, ImVec2(1.0f, 0.5f)); + if (ImGui::Button(StringHelper::Sprintf("%s###removeLEDMapping%s", ICON_FA_TIMES, id.c_str()).c_str(), + ImVec2(SCALE_IMGUI_SIZE(20.0f), SCALE_IMGUI_SIZE(20.0f)))) { + LUS::Context::GetInstance()->GetControlDeck()->GetControllerByPort(port)->GetLED()->ClearLEDMapping(id); + } + ImGui::PopStyleVar(); +} + +void SohInputEditorWindow::DrawAddLEDMappingButton(uint8_t port) { + ImGui::SameLine(); + ImGui::PushStyleVar(ImGuiStyleVar_ButtonTextAlign, ImVec2(1.0f, 0.5f)); + auto popupId = StringHelper::Sprintf("addLEDMappingPopup##%d", port); + if (ImGui::Button(StringHelper::Sprintf("%s###addLEDMapping%d", ICON_FA_PLUS, port).c_str(), + ImVec2(SCALE_IMGUI_SIZE(20.0f), SCALE_IMGUI_SIZE(20.0f)))) { + ImGui::OpenPopup(popupId.c_str()); + } + ImGui::PopStyleVar(); + + if (ImGui::BeginPopup(popupId.c_str())) { + mInputEditorPopupOpen = true; + ImGui::Text("Press any button\nor move any axis\nto add LED device"); + if (ImGui::Button("Cancel")) { + mInputEditorPopupOpen = false; + ImGui::CloseCurrentPopup(); + } + + if (mMappingInputBlockTimer == INT32_MAX && LUS::Context::GetInstance() + ->GetControlDeck() + ->GetControllerByPort(port) + ->GetLED() + ->AddLEDMappingFromRawPress()) { + mInputEditorPopupOpen = false; + ImGui::CloseCurrentPopup(); + } + ImGui::EndPopup(); + } +} + +void SohInputEditorWindow::DrawHelpIcon(const std::string& helptext) { + // place the ? button to the most of the right side of the cell it is using. + ImGui::SetCursorPosY(ImGui::GetCursorPosY() - SCALE_IMGUI_SIZE(22)); + ImGui::SetCursorPosX(ImGui::GetCursorPosX() + ImGui::GetContentRegionAvail().x - SCALE_IMGUI_SIZE(15)); + ImGui::SmallButton("?"); + UIWidgets::Tooltip(helptext.c_str()); +} + +void SohInputEditorWindow::DrawLEDSection(uint8_t port) { + for (auto [id, mapping] : + LUS::Context::GetInstance()->GetControlDeck()->GetControllerByPort(port)->GetLED()->GetAllLEDMappings()) { + ImGui::AlignTextToFramePadding(); + ImGui::SetNextItemOpen(true, ImGuiCond_Once); + auto open = ImGui::TreeNode( + StringHelper::Sprintf("%s##LED%s", mapping->GetPhysicalDeviceName().c_str(), id.c_str()).c_str()); + DrawRemoveLEDMappingButton(port, id); + if (open) { + ImGui::AlignTextToFramePadding(); + ImGui::Text("LED Color:"); + ImGui::SameLine(); + ImGui::SetNextItemWidth(SCALE_IMGUI_SIZE(80.0f)); + int32_t colorSource = mapping->GetColorSource(); + if (ImGui::Combo(StringHelper::Sprintf("###ledColorSource%s", mapping->GetLEDMappingId().c_str()).c_str(), + &colorSource, "Off\0Set\0Game\0\0")) { + mapping->SetColorSource(colorSource); + }; + if (mapping->GetColorSource() == LED_COLOR_SOURCE_SET) { + ImGui::SameLine(); + ImVec4 color = { mapping->GetSavedColor().r / 255.0f, mapping->GetSavedColor().g / 255.0f, + mapping->GetSavedColor().b / 255.0f, 1.0f }; + if (ImGui::ColorEdit3( + StringHelper::Sprintf("###ledSavedColor%s", mapping->GetLEDMappingId().c_str()).c_str(), + (float*)&color, ImGuiColorEditFlags_NoInputs | ImGuiColorEditFlags_NoLabel)) { + mapping->SetSavedColor( + Color_RGB8({ static_cast(color.x * 255.0), static_cast(color.y * 255.0), + static_cast(color.z * 255.0) })); + } + } + // todo: clean this up, probably just hardcode to LED_COLOR_SOURCE_GAME and use SoH options only here + if (mapping->GetColorSource() == LED_COLOR_SOURCE_GAME) { + static const char* ledSources[] = { + "Original Tunic Colors", "Cosmetics Tunic Colors", "Health Colors", + "Original Navi Targeting Colors", "Cosmetics Navi Targeting Colors", "Custom" + }; + UIWidgets::PaddedText("Source"); + UIWidgets::EnhancementCombobox("gLedColorSource", ledSources, LED_SOURCE_TUNIC_ORIGINAL); + DrawHelpIcon("Health\n- Red when health critical (13-20% depending on max health)\n- Yellow when " + "health < 40%. Green otherwise.\n\n" + "Tunics: colors will mirror currently equipped tunic, whether original or the current " + "values in Cosmetics Editor.\n\n" + "Custom: single, solid color"); + if (CVarGetInteger("gLedColorSource", 1) == LED_SOURCE_CUSTOM) { + UIWidgets::Spacer(3); + auto port1Color = CVarGetColor24("gLedPort1Color", { 255, 255, 255 }); + ImVec4 colorVec = { port1Color.r / 255.0f, port1Color.g / 255.0f, port1Color.b / 255.0f, 1.0f }; + if (ImGui::ColorEdit3("", (float*)&colorVec, + ImGuiColorEditFlags_NoInputs | ImGuiColorEditFlags_NoLabel)) { + Color_RGB8 color; + color.r = colorVec.x * 255.0; + color.g = colorVec.y * 255.0; + color.b = colorVec.z * 255.0; + + CVarSetColor24("gLedPort1Color", color); + LUS::Context::GetInstance()->GetWindow()->GetGui()->SaveConsoleVariablesOnNextTick(); + } + ImGui::SameLine(); + ImGui::Text("Custom Color"); + } + UIWidgets::PaddedEnhancementSliderFloat("Brightness: %d%%", "##LED_Brightness", "gLedBrightness", 0.0f, + 1.0f, "", 1.0f, true, true); + DrawHelpIcon("Sets the brightness of controller LEDs. 0% brightness = LEDs off."); + UIWidgets::PaddedEnhancementCheckbox( + "Critical Health Override", "gLedCriticalOverride", true, true, + CVarGetInteger("gLedColorSource", LED_SOURCE_TUNIC_ORIGINAL) == LED_SOURCE_HEALTH, + "Override redundant for health source.", UIWidgets::CheckboxGraphics::Cross, true); + DrawHelpIcon("Shows red color when health is critical, otherwise displays according to color source."); + } + ImGui::TreePop(); + } + } + + ImGui::AlignTextToFramePadding(); + ImGui::BulletText("Add LED device"); + DrawAddLEDMappingButton(port); +} + +void SohInputEditorWindow::DrawRemoveGyroMappingButton(uint8_t port, std::string id) { + ImGui::SameLine(); + ImGui::PushStyleVar(ImGuiStyleVar_ButtonTextAlign, ImVec2(1.0f, 0.5f)); + if (ImGui::Button(StringHelper::Sprintf("%s###removeGyroMapping%s", ICON_FA_TIMES, id.c_str()).c_str(), + ImVec2(SCALE_IMGUI_SIZE(20.0f), SCALE_IMGUI_SIZE(20.0f)))) { + LUS::Context::GetInstance()->GetControlDeck()->GetControllerByPort(port)->GetGyro()->ClearGyroMapping(); + } + ImGui::PopStyleVar(); +} + +void SohInputEditorWindow::DrawAddGyroMappingButton(uint8_t port) { + ImGui::SameLine(); + ImGui::PushStyleVar(ImGuiStyleVar_ButtonTextAlign, ImVec2(1.0f, 0.5f)); + auto popupId = StringHelper::Sprintf("addGyroMappingPopup##%d", port); + if (ImGui::Button(StringHelper::Sprintf("%s###addGyroMapping%d", ICON_FA_PLUS, port).c_str(), + ImVec2(SCALE_IMGUI_SIZE(20.0f), SCALE_IMGUI_SIZE(20.0f)))) { + ImGui::OpenPopup(popupId.c_str()); + } + ImGui::PopStyleVar(); + + if (ImGui::BeginPopup(popupId.c_str())) { + mInputEditorPopupOpen = true; + ImGui::Text("Press any button\nor move any axis\nto add gyro device"); + if (ImGui::Button("Cancel")) { + mInputEditorPopupOpen = false; + ImGui::CloseCurrentPopup(); + } + + if (mMappingInputBlockTimer == INT32_MAX && LUS::Context::GetInstance() + ->GetControlDeck() + ->GetControllerByPort(port) + ->GetGyro() + ->SetGyroMappingFromRawPress()) { + mInputEditorPopupOpen = false; + ImGui::CloseCurrentPopup(); + } + ImGui::EndPopup(); + } +} + +void SohInputEditorWindow::DrawGyroSection(uint8_t port) { + auto mapping = + LUS::Context::GetInstance()->GetControlDeck()->GetControllerByPort(port)->GetGyro()->GetGyroMapping(); + if (mapping != nullptr) { + auto id = mapping->GetGyroMappingId(); + ImGui::AlignTextToFramePadding(); + ImGui::SetNextItemOpen(true, ImGuiCond_Once); + ImGui::BulletText(mapping->GetPhysicalDeviceName().c_str()); + DrawRemoveGyroMappingButton(port, id); + + static float sPitch, sYaw = 0.0f; + mapping->UpdatePad(sPitch, sYaw); + + ImGui::SetCursorPos(ImVec2(ImGui::GetCursorPos().x, ImGui::GetCursorPos().y - SCALE_IMGUI_SIZE(8))); + // to find a reasonable scaling factor gyro values + // I tried to find the maximum value reported by shaking + // a PS5 controller as hard as I could without worrying about breaking it + // the max I found for both pitch and yaw was ~21 + // the preview window expects values in an n64 analog stick range (-85 to 85) + // so I decided to multiply these by 85/21 + DrawAnalogPreview(StringHelper::Sprintf("###GyroPreview%s", id.c_str()).c_str(), + ImVec2(sYaw * (85.0f / 21.0f), sPitch * (85.0f / 21.0f)), 0.0f, true); + ImGui::SameLine(); + ImGui::SetCursorPos( + ImVec2(ImGui::GetCursorPos().x + SCALE_IMGUI_SIZE(8), ImGui::GetCursorPos().y + SCALE_IMGUI_SIZE(8))); + + ImGui::BeginGroup(); + ImGui::Text("Sensitivity:"); + + int32_t sensitivity = mapping->GetSensitivityPercent(); + if (sensitivity == 0) { + ImGui::BeginDisabled(); + } + ImGui::PushButtonRepeat(true); + if (ImGui::Button(StringHelper::Sprintf("-##GyroSensitivity%s", id.c_str()).c_str())) { + mapping->SetSensitivity(sensitivity - 1); + mapping->SaveToConfig(); + } + ImGui::PopButtonRepeat(); + if (sensitivity == 0) { + ImGui::EndDisabled(); + } + ImGui::SameLine(0.0f, 0.0f); + ImGui::SetNextItemWidth(SCALE_IMGUI_SIZE(160.0f)); + if (ImGui::SliderInt(StringHelper::Sprintf("##GyroSensitivity%s", id.c_str()).c_str(), &sensitivity, 0, 100, + "%d%%", ImGuiSliderFlags_AlwaysClamp)) { + mapping->SetSensitivity(sensitivity); + mapping->SaveToConfig(); + } + ImGui::SameLine(0.0f, 0.0f); + if (sensitivity == 100) { + ImGui::BeginDisabled(); + } + ImGui::PushButtonRepeat(true); + if (ImGui::Button(StringHelper::Sprintf("+##GyroSensitivity%s", id.c_str()).c_str())) { + mapping->SetSensitivity(sensitivity + 1); + mapping->SaveToConfig(); + } + ImGui::PopButtonRepeat(); + if (sensitivity == 100) { + ImGui::EndDisabled(); + } + + if (!mapping->SensitivityIsDefault()) { + ImGui::SameLine(); + if (ImGui::Button(StringHelper::Sprintf("Reset to Default###resetGyroSensitivity%s", id.c_str()).c_str())) { + mapping->ResetSensitivityToDefault(); + } + } + + ImGui::SetCursorPos(ImVec2(ImGui::GetCursorPos().x, ImGui::GetCursorPos().y + SCALE_IMGUI_SIZE(8))); + if (ImGui::Button("Recalibrate")) { + mapping->Recalibrate(); + mapping->SaveToConfig(); + } + ImGui::EndGroup(); + ImGui::SetCursorPos(ImVec2(ImGui::GetCursorPos().x, ImGui::GetCursorPos().y - SCALE_IMGUI_SIZE(8))); + } else { + ImGui::AlignTextToFramePadding(); + ImGui::BulletText("Add gyro device"); + DrawAddGyroMappingButton(port); + } +} + +void SohInputEditorWindow::DrawButtonDeviceIcons(uint8_t portIndex, std::set bitmasks) { + std::set allLusDeviceIndices; + allLusDeviceIndices.insert(LUS::LUSDeviceIndex::Keyboard); + for (auto [lusIndex, mapping] : LUS::Context::GetInstance() + ->GetControlDeck() + ->GetDeviceIndexMappingManager() + ->GetAllDeviceIndexMappingsFromConfig()) { + allLusDeviceIndices.insert(lusIndex); + } + + std::vector> lusDeviceIndiciesWithMappings; + for (auto lusIndex : allLusDeviceIndices) { + for (auto [bitmask, button] : + LUS::Context::GetInstance()->GetControlDeck()->GetControllerByPort(portIndex)->GetAllButtons()) { + if (!bitmasks.contains(bitmask)) { + continue; + } + + if (button->HasMappingsForLUSDeviceIndex(lusIndex)) { + for (auto [id, mapping] : button->GetAllButtonMappings()) { + if (mapping->GetLUSDeviceIndex() == lusIndex) { + lusDeviceIndiciesWithMappings.push_back( + std::pair(lusIndex, mapping->PhysicalDeviceIsConnected())); + break; + } + } + break; + } + } + } + + for (auto [lusIndex, connected] : lusDeviceIndiciesWithMappings) { + auto buttonColor = ImGui::GetStyleColorVec4(ImGuiCol_Button); + auto buttonHoveredColor = ImGui::GetStyleColorVec4(ImGuiCol_ButtonHovered); + GetButtonColorsForLUSDeviceIndex(lusIndex, buttonColor, buttonHoveredColor); + ImGui::PushStyleColor(ImGuiCol_Button, buttonColor); + ImGui::PushStyleColor(ImGuiCol_ButtonHovered, buttonHoveredColor); + ImGui::SameLine(); + if (lusIndex == LUS::LUSDeviceIndex::Keyboard) { + ImGui::SmallButton(ICON_FA_KEYBOARD_O); + } else { + ImGui::SmallButton(connected ? ICON_FA_GAMEPAD : ICON_FA_CHAIN_BROKEN); + } + ImGui::PopStyleColor(); + ImGui::PopStyleColor(); + } +} + +void SohInputEditorWindow::DrawAnalogStickDeviceIcons(uint8_t portIndex, LUS::Stick stick) { + std::set allLusDeviceIndices; + allLusDeviceIndices.insert(LUS::LUSDeviceIndex::Keyboard); + for (auto [lusIndex, mapping] : LUS::Context::GetInstance() + ->GetControlDeck() + ->GetDeviceIndexMappingManager() + ->GetAllDeviceIndexMappingsFromConfig()) { + allLusDeviceIndices.insert(lusIndex); + } + + std::vector> lusDeviceIndiciesWithMappings; + for (auto lusIndex : allLusDeviceIndices) { + auto controllerStick = + stick == LUS::Stick::LEFT_STICK + ? LUS::Context::GetInstance()->GetControlDeck()->GetControllerByPort(portIndex)->GetLeftStick() + : LUS::Context::GetInstance()->GetControlDeck()->GetControllerByPort(portIndex)->GetRightStick(); + if (controllerStick->HasMappingsForLUSDeviceIndex(lusIndex)) { + for (auto [direction, mappings] : controllerStick->GetAllAxisDirectionMappings()) { + bool foundMapping = false; + for (auto [id, mapping] : mappings) { + if (mapping->GetLUSDeviceIndex() == lusIndex) { + foundMapping = true; + lusDeviceIndiciesWithMappings.push_back( + std::pair(lusIndex, mapping->PhysicalDeviceIsConnected())); + break; + } + } + if (foundMapping) { + break; + } + } + } + } + + for (auto [lusIndex, connected] : lusDeviceIndiciesWithMappings) { + auto buttonColor = ImGui::GetStyleColorVec4(ImGuiCol_Button); + auto buttonHoveredColor = ImGui::GetStyleColorVec4(ImGuiCol_ButtonHovered); + GetButtonColorsForLUSDeviceIndex(lusIndex, buttonColor, buttonHoveredColor); + ImGui::PushStyleColor(ImGuiCol_Button, buttonColor); + ImGui::PushStyleColor(ImGuiCol_ButtonHovered, buttonHoveredColor); + ImGui::SameLine(); + if (lusIndex == LUS::LUSDeviceIndex::Keyboard) { + ImGui::SmallButton(ICON_FA_KEYBOARD_O); + } else { + ImGui::SmallButton(connected ? ICON_FA_GAMEPAD : ICON_FA_CHAIN_BROKEN); + } + ImGui::PopStyleColor(); + ImGui::PopStyleColor(); + } +} + +void SohInputEditorWindow::DrawRumbleDeviceIcons(uint8_t portIndex) { + std::set allLusDeviceIndices; + for (auto [lusIndex, mapping] : LUS::Context::GetInstance() + ->GetControlDeck() + ->GetDeviceIndexMappingManager() + ->GetAllDeviceIndexMappingsFromConfig()) { + allLusDeviceIndices.insert(lusIndex); + } + + std::vector> lusDeviceIndiciesWithMappings; + for (auto lusIndex : allLusDeviceIndices) { + if (LUS::Context::GetInstance() + ->GetControlDeck() + ->GetControllerByPort(portIndex) + ->GetRumble() + ->HasMappingsForLUSDeviceIndex(lusIndex)) { + for (auto [id, mapping] : LUS::Context::GetInstance() + ->GetControlDeck() + ->GetControllerByPort(portIndex) + ->GetRumble() + ->GetAllRumbleMappings()) { + if (mapping->GetLUSDeviceIndex() == lusIndex) { + lusDeviceIndiciesWithMappings.push_back( + std::pair(lusIndex, mapping->PhysicalDeviceIsConnected())); + break; + } + } + } + } + + for (auto [lusIndex, connected] : lusDeviceIndiciesWithMappings) { + auto buttonColor = ImGui::GetStyleColorVec4(ImGuiCol_Button); + auto buttonHoveredColor = ImGui::GetStyleColorVec4(ImGuiCol_ButtonHovered); + GetButtonColorsForLUSDeviceIndex(lusIndex, buttonColor, buttonHoveredColor); + ImGui::PushStyleColor(ImGuiCol_Button, buttonColor); + ImGui::PushStyleColor(ImGuiCol_ButtonHovered, buttonHoveredColor); + ImGui::SameLine(); + ImGui::SmallButton(connected ? ICON_FA_GAMEPAD : ICON_FA_CHAIN_BROKEN); + ImGui::PopStyleColor(); + ImGui::PopStyleColor(); + } +} + +void SohInputEditorWindow::DrawGyroDeviceIcons(uint8_t portIndex) { + auto mapping = + LUS::Context::GetInstance()->GetControlDeck()->GetControllerByPort(portIndex)->GetGyro()->GetGyroMapping(); + if (mapping == nullptr) { + return; + } + + auto buttonColor = ImGui::GetStyleColorVec4(ImGuiCol_Button); + auto buttonHoveredColor = ImGui::GetStyleColorVec4(ImGuiCol_ButtonHovered); + GetButtonColorsForLUSDeviceIndex(mapping->GetLUSDeviceIndex(), buttonColor, buttonHoveredColor); + ImGui::PushStyleColor(ImGuiCol_Button, buttonColor); + ImGui::PushStyleColor(ImGuiCol_ButtonHovered, buttonHoveredColor); + ImGui::SameLine(); + ImGui::SmallButton(mapping->PhysicalDeviceIsConnected() ? ICON_FA_GAMEPAD : ICON_FA_CHAIN_BROKEN); + ImGui::PopStyleColor(); + ImGui::PopStyleColor(); +} + +void SohInputEditorWindow::DrawLEDDeviceIcons(uint8_t portIndex) { + std::set allLusDeviceIndices; + for (auto [lusIndex, mapping] : LUS::Context::GetInstance() + ->GetControlDeck() + ->GetDeviceIndexMappingManager() + ->GetAllDeviceIndexMappingsFromConfig()) { + allLusDeviceIndices.insert(lusIndex); + } + + std::vector> lusDeviceIndiciesWithMappings; + for (auto lusIndex : allLusDeviceIndices) { + if (LUS::Context::GetInstance() + ->GetControlDeck() + ->GetControllerByPort(portIndex) + ->GetRumble() + ->HasMappingsForLUSDeviceIndex(lusIndex)) { + for (auto [id, mapping] : LUS::Context::GetInstance() + ->GetControlDeck() + ->GetControllerByPort(portIndex) + ->GetLED() + ->GetAllLEDMappings()) { + if (mapping->GetLUSDeviceIndex() == lusIndex) { + lusDeviceIndiciesWithMappings.push_back( + std::pair(lusIndex, mapping->PhysicalDeviceIsConnected())); + break; + } + } + } + } + + for (auto [lusIndex, connected] : lusDeviceIndiciesWithMappings) { + auto buttonColor = ImGui::GetStyleColorVec4(ImGuiCol_Button); + auto buttonHoveredColor = ImGui::GetStyleColorVec4(ImGuiCol_ButtonHovered); + GetButtonColorsForLUSDeviceIndex(lusIndex, buttonColor, buttonHoveredColor); + ImGui::PushStyleColor(ImGuiCol_Button, buttonColor); + ImGui::PushStyleColor(ImGuiCol_ButtonHovered, buttonHoveredColor); + ImGui::SameLine(); + ImGui::SmallButton(connected ? ICON_FA_GAMEPAD : ICON_FA_CHAIN_BROKEN); + ImGui::PopStyleColor(); + ImGui::PopStyleColor(); + } +} + +void SohInputEditorWindow::DrawLinkTab() { + uint8_t portIndex = 0; + if (ImGui::BeginTabItem(StringHelper::Sprintf("Link (P1)###port%d", portIndex).c_str())) { + DrawClearAllButton(portIndex); + DrawSetDefaultsButton(portIndex); + + UpdateBitmaskToMappingIds(portIndex); + UpdateStickDirectionToMappingIds(portIndex); + + ImGui::PushStyleColor(ImGuiCol_Header, ImVec4(0.133f, 0.133f, 0.133f, 1.0f)); + ImGui::PushStyleColor(ImGuiCol_HeaderHovered, ImVec4(0.0f, 0.0f, 0.0f, 1.0f)); + ImGui::PushStyleColor(ImGuiCol_HeaderActive, ImVec4(0.0f, 0.0f, 0.0f, 1.0f)); + + if (ImGui::CollapsingHeader("Buttons", NULL, ImGuiTreeNodeFlags_DefaultOpen)) { + DrawButtonDeviceIcons(portIndex, mButtonsBitmasks); + DrawButtonLine("A", portIndex, BTN_A, CHIP_COLOR_N64_BLUE); + DrawButtonLine("B", portIndex, BTN_B, CHIP_COLOR_N64_GREEN); + DrawButtonLine("Start", portIndex, BTN_START, CHIP_COLOR_N64_RED); + DrawButtonLine("L", portIndex, BTN_L); + DrawButtonLine("R", portIndex, BTN_R); + DrawButtonLine("Z", portIndex, BTN_Z); + DrawButtonLine(StringHelper::Sprintf("C %s", ICON_FA_ARROW_UP).c_str(), portIndex, BTN_CUP, + CHIP_COLOR_N64_YELLOW); + DrawButtonLine(StringHelper::Sprintf("C %s", ICON_FA_ARROW_DOWN).c_str(), portIndex, BTN_CDOWN, + CHIP_COLOR_N64_YELLOW); + DrawButtonLine(StringHelper::Sprintf("C %s", ICON_FA_ARROW_LEFT).c_str(), portIndex, BTN_CLEFT, + CHIP_COLOR_N64_YELLOW); + DrawButtonLine(StringHelper::Sprintf("C %s", ICON_FA_ARROW_RIGHT).c_str(), portIndex, BTN_CRIGHT, + CHIP_COLOR_N64_YELLOW); + } else { + DrawButtonDeviceIcons(portIndex, mButtonsBitmasks); + } + + if (ImGui::CollapsingHeader("D-Pad", NULL, ImGuiTreeNodeFlags_DefaultOpen)) { + DrawButtonDeviceIcons(portIndex, mDpadBitmasks); + DrawButtonLine(StringHelper::Sprintf("%s", ICON_FA_ARROW_UP).c_str(), portIndex, BTN_DUP); + DrawButtonLine(StringHelper::Sprintf("%s", ICON_FA_ARROW_DOWN).c_str(), portIndex, BTN_DDOWN); + DrawButtonLine(StringHelper::Sprintf("%s", ICON_FA_ARROW_LEFT).c_str(), portIndex, BTN_DLEFT); + DrawButtonLine(StringHelper::Sprintf("%s", ICON_FA_ARROW_RIGHT).c_str(), portIndex, BTN_DRIGHT); + } else { + DrawButtonDeviceIcons(portIndex, mDpadBitmasks); + } + + if (ImGui::CollapsingHeader("Analog Stick", NULL, ImGuiTreeNodeFlags_DefaultOpen)) { + DrawAnalogStickDeviceIcons(portIndex, LUS::LEFT_STICK); + DrawStickSection(portIndex, LUS::LEFT, 0); + } else { + DrawAnalogStickDeviceIcons(portIndex, LUS::LEFT_STICK); + } + + if (ImGui::CollapsingHeader("Additional (\"Right\") Stick")) { + DrawAnalogStickDeviceIcons(portIndex, LUS::RIGHT_STICK); + DrawStickSection(portIndex, LUS::RIGHT, 1, CHIP_COLOR_N64_YELLOW); + } else { + DrawAnalogStickDeviceIcons(portIndex, LUS::RIGHT_STICK); + } + + if (ImGui::CollapsingHeader("Rumble")) { + DrawRumbleDeviceIcons(portIndex); + DrawRumbleSection(portIndex); + } else { + DrawRumbleDeviceIcons(portIndex); + } + + if (ImGui::CollapsingHeader("Gyro")) { + DrawGyroDeviceIcons(portIndex); + DrawGyroSection(portIndex); + } else { + DrawGyroDeviceIcons(portIndex); + } + + if (ImGui::CollapsingHeader("LEDs")) { + DrawLEDDeviceIcons(portIndex); + DrawLEDSection(portIndex); + } else { + DrawLEDDeviceIcons(portIndex); + } + + if (ImGui::CollapsingHeader("Modifier Buttons")) { + DrawButtonDeviceIcons(portIndex, mModifierButtonsBitmasks); + DrawButtonLine("M1", portIndex, BTN_MODIFIER1); + DrawButtonLine("M2", portIndex, BTN_MODIFIER2); + } else { + DrawButtonDeviceIcons(portIndex, mModifierButtonsBitmasks); + } + + ImGui::PopStyleColor(); + ImGui::PopStyleColor(); + ImGui::PopStyleColor(); + ImGui::EndTabItem(); + } +} + +void SohInputEditorWindow::DrawIvanTab() { + if (CVarGetInteger("gDebugEnabled", 0)) { + DrawDebugPortTab(1, "Ivan (P2)"); + return; + } + + uint8_t portIndex = 1; + if (ImGui::BeginTabItem(StringHelper::Sprintf("Ivan (P2)###port%d", portIndex).c_str())) { + DrawClearAllButton(portIndex); + DrawSetDefaultsButton(portIndex); + + UpdateBitmaskToMappingIds(portIndex); + UpdateStickDirectionToMappingIds(portIndex); + + ImGui::PushStyleColor(ImGuiCol_Header, ImVec4(0.133f, 0.133f, 0.133f, 1.0f)); + ImGui::PushStyleColor(ImGuiCol_HeaderHovered, ImVec4(0.0f, 0.0f, 0.0f, 1.0f)); + ImGui::PushStyleColor(ImGuiCol_HeaderActive, ImVec4(0.0f, 0.0f, 0.0f, 1.0f)); + + if (ImGui::CollapsingHeader("Buttons", NULL, ImGuiTreeNodeFlags_DefaultOpen)) { + DrawButtonDeviceIcons(portIndex, mButtonsBitmasks); + DrawButtonLine("A", portIndex, BTN_A, CHIP_COLOR_N64_BLUE); + DrawButtonLine("B", portIndex, BTN_B, CHIP_COLOR_N64_GREEN); + DrawButtonLine("Z", portIndex, BTN_Z); + DrawButtonLine(StringHelper::Sprintf("C %s", ICON_FA_ARROW_UP).c_str(), portIndex, BTN_CUP, + CHIP_COLOR_N64_YELLOW); + DrawButtonLine(StringHelper::Sprintf("C %s", ICON_FA_ARROW_DOWN).c_str(), portIndex, BTN_CDOWN, + CHIP_COLOR_N64_YELLOW); + DrawButtonLine(StringHelper::Sprintf("C %s", ICON_FA_ARROW_LEFT).c_str(), portIndex, BTN_CLEFT, + CHIP_COLOR_N64_YELLOW); + DrawButtonLine(StringHelper::Sprintf("C %s", ICON_FA_ARROW_RIGHT).c_str(), portIndex, BTN_CRIGHT, + CHIP_COLOR_N64_YELLOW); + } else { + DrawButtonDeviceIcons(portIndex, mButtonsBitmasks); + } + + if (ImGui::CollapsingHeader("D-Pad", NULL, ImGuiTreeNodeFlags_DefaultOpen)) { + DrawButtonDeviceIcons(portIndex, mDpadBitmasks); + DrawButtonLine(StringHelper::Sprintf("%s", ICON_FA_ARROW_UP).c_str(), portIndex, BTN_DUP); + DrawButtonLine(StringHelper::Sprintf("%s", ICON_FA_ARROW_DOWN).c_str(), portIndex, BTN_DDOWN); + DrawButtonLine(StringHelper::Sprintf("%s", ICON_FA_ARROW_LEFT).c_str(), portIndex, BTN_DLEFT); + DrawButtonLine(StringHelper::Sprintf("%s", ICON_FA_ARROW_RIGHT).c_str(), portIndex, BTN_DRIGHT); + } else { + DrawButtonDeviceIcons(portIndex, mDpadBitmasks); + } + + if (ImGui::CollapsingHeader("Analog Stick", NULL, ImGuiTreeNodeFlags_DefaultOpen)) { + DrawAnalogStickDeviceIcons(portIndex, LUS::LEFT_STICK); + DrawStickSection(portIndex, LUS::LEFT, 0); + } else { + DrawAnalogStickDeviceIcons(portIndex, LUS::LEFT_STICK); + } + + ImGui::PopStyleColor(); + ImGui::PopStyleColor(); + ImGui::PopStyleColor(); + ImGui::EndTabItem(); + } +} + +void SohInputEditorWindow::DrawDebugPortTab(uint8_t portIndex, std::string customName) { + if (ImGui::BeginTabItem(customName == "" + ? StringHelper::Sprintf("Port %d###port%d", portIndex + 1, portIndex).c_str() + : customName.c_str())) { + DrawClearAllButton(portIndex); + DrawSetDefaultsButton(portIndex); + + UpdateBitmaskToMappingIds(portIndex); + UpdateStickDirectionToMappingIds(portIndex); + + ImGui::PushStyleColor(ImGuiCol_Header, ImVec4(0.133f, 0.133f, 0.133f, 1.0f)); + ImGui::PushStyleColor(ImGuiCol_HeaderHovered, ImVec4(0.0f, 0.0f, 0.0f, 1.0f)); + ImGui::PushStyleColor(ImGuiCol_HeaderActive, ImVec4(0.0f, 0.0f, 0.0f, 1.0f)); + + if (ImGui::CollapsingHeader("Buttons", NULL, ImGuiTreeNodeFlags_DefaultOpen)) { + DrawButtonDeviceIcons(portIndex, mButtonsBitmasks); + DrawButtonLine("A", portIndex, BTN_A, CHIP_COLOR_N64_BLUE); + DrawButtonLine("B", portIndex, BTN_B, CHIP_COLOR_N64_GREEN); + DrawButtonLine("Start", portIndex, BTN_START, CHIP_COLOR_N64_RED); + DrawButtonLine("L", portIndex, BTN_L); + DrawButtonLine("R", portIndex, BTN_R); + DrawButtonLine("Z", portIndex, BTN_Z); + DrawButtonLine(StringHelper::Sprintf("C %s", ICON_FA_ARROW_UP).c_str(), portIndex, BTN_CUP, + CHIP_COLOR_N64_YELLOW); + DrawButtonLine(StringHelper::Sprintf("C %s", ICON_FA_ARROW_DOWN).c_str(), portIndex, BTN_CDOWN, + CHIP_COLOR_N64_YELLOW); + DrawButtonLine(StringHelper::Sprintf("C %s", ICON_FA_ARROW_LEFT).c_str(), portIndex, BTN_CLEFT, + CHIP_COLOR_N64_YELLOW); + DrawButtonLine(StringHelper::Sprintf("C %s", ICON_FA_ARROW_RIGHT).c_str(), portIndex, BTN_CRIGHT, + CHIP_COLOR_N64_YELLOW); + } else { + DrawButtonDeviceIcons(portIndex, mButtonsBitmasks); + } + + if (ImGui::CollapsingHeader("D-Pad", NULL, ImGuiTreeNodeFlags_DefaultOpen)) { + DrawButtonDeviceIcons(portIndex, mDpadBitmasks); + DrawButtonLine(StringHelper::Sprintf("%s", ICON_FA_ARROW_UP).c_str(), portIndex, BTN_DUP); + DrawButtonLine(StringHelper::Sprintf("%s", ICON_FA_ARROW_DOWN).c_str(), portIndex, BTN_DDOWN); + DrawButtonLine(StringHelper::Sprintf("%s", ICON_FA_ARROW_LEFT).c_str(), portIndex, BTN_DLEFT); + DrawButtonLine(StringHelper::Sprintf("%s", ICON_FA_ARROW_RIGHT).c_str(), portIndex, BTN_DRIGHT); + } else { + DrawButtonDeviceIcons(portIndex, mDpadBitmasks); + } + + if (ImGui::CollapsingHeader("Analog Stick", NULL, ImGuiTreeNodeFlags_DefaultOpen)) { + DrawAnalogStickDeviceIcons(portIndex, LUS::LEFT_STICK); + DrawStickSection(portIndex, LUS::LEFT, 0); + } else { + DrawAnalogStickDeviceIcons(portIndex, LUS::LEFT_STICK); + } + + ImGui::PopStyleColor(); + ImGui::PopStyleColor(); + ImGui::PopStyleColor(); + ImGui::EndTabItem(); + } +} + +void SohInputEditorWindow::DrawClearAllButton(uint8_t portIndex) { + if (ImGui::Button("Clear All", ImGui::CalcTextSize("Clear All") * 2)) { + ImGui::OpenPopup("Clear All##clearAllPopup"); + } + if (ImGui::BeginPopupModal("Clear All##clearAllPopup", NULL, ImGuiWindowFlags_AlwaysAutoResize)) { + ImGui::Text("This will clear all mappings for port %d.\n\nContinue?", portIndex + 1); + if (ImGui::Button("Cancel")) { + ImGui::CloseCurrentPopup(); + } + if (ImGui::Button("Clear All")) { + LUS::Context::GetInstance()->GetControlDeck()->GetControllerByPort(portIndex)->ClearAllMappings(); + ImGui::CloseCurrentPopup(); + } + ImGui::EndPopup(); + } +} + +#ifdef __WIIU__ +void SohInputEditorWindow::DrawSetDefaultsButton(uint8_t portIndex) { + ImGui::SameLine(); + ImGui::PushStyleVar(ImGuiStyleVar_ButtonTextAlign, ImVec2(1.0f, 0.5f)); + auto popupId = StringHelper::Sprintf("setDefaultsPopup##%d", portIndex); + if (ImGui::Button(StringHelper::Sprintf("Set defaults...##%d", portIndex).c_str())) { + ImGui::OpenPopup(popupId.c_str()); + } + ImGui::PopStyleVar(); + + if (ImGui::BeginPopup(popupId.c_str())) { + std::map> indexMappings; + for (auto [lusIndex, mapping] : LUS::Context::GetInstance() + ->GetControlDeck() + ->GetDeviceIndexMappingManager() + ->GetAllDeviceIndexMappings()) { + auto wiiuIndexMapping = std::static_pointer_cast(mapping); + if (wiiuIndexMapping == nullptr) { + continue; + } + + indexMappings[lusIndex] = { wiiuIndexMapping->GetWiiUControllerName(), + wiiuIndexMapping->IsWiiUGamepad() ? INT32_MAX + : wiiuIndexMapping->GetDeviceChannel() }; + } + + bool shouldClose = false; + for (auto [lusIndex, info] : indexMappings) { + auto [name, wiiuChannel] = info; + bool isGamepad = wiiuChannel == INT32_MAX; + + auto buttonColor = ImGui::GetStyleColorVec4(ImGuiCol_Button); + auto buttonHoveredColor = ImGui::GetStyleColorVec4(ImGuiCol_ButtonHovered); + GetButtonColorsForLUSDeviceIndex(lusIndex, buttonColor, buttonHoveredColor); + ImGui::PushStyleColor(ImGuiCol_Button, buttonColor); + ImGui::PushStyleColor(ImGuiCol_ButtonHovered, buttonHoveredColor); + + auto fancyName = StringHelper::Sprintf( + "%s%s", name.c_str(), isGamepad ? "" : StringHelper::Sprintf(" (%d)", wiiuChannel).c_str()); + if (ImGui::Button(StringHelper::Sprintf("%s %s", ICON_FA_GAMEPAD, fancyName.c_str()).c_str())) { + ImGui::OpenPopup(StringHelper::Sprintf("Set Defaults for %s", name.c_str()).c_str()); + } + ImGui::PopStyleColor(); + ImGui::PopStyleColor(); + if (ImGui::BeginPopupModal(StringHelper::Sprintf("Set Defaults for %s", name.c_str()).c_str(), NULL, + ImGuiWindowFlags_AlwaysAutoResize)) { + ImGui::Text("This will clear all existing mappings for\n%s on port %d.\n\nContinue?", fancyName.c_str(), + portIndex + 1); + if (ImGui::Button("Cancel")) { + shouldClose = true; + ImGui::CloseCurrentPopup(); + } + if (ImGui::Button("Set defaults")) { + LUS::Context::GetInstance() + ->GetControlDeck() + ->GetControllerByPort(portIndex) + ->ClearAllMappingsForDevice(lusIndex); + LUS::Context::GetInstance()->GetControlDeck()->GetControllerByPort(portIndex)->AddDefaultMappings( + lusIndex); + shouldClose = true; + ImGui::CloseCurrentPopup(); + } + ImGui::EndPopup(); + } + } + + if (ImGui::Button("Cancel") || shouldClose) { + ImGui::CloseCurrentPopup(); + } + + ImGui::EndPopup(); + } +} + +void SohInputEditorWindow::DrawDevicesTab() { + if (ImGui::BeginTabItem("Devices")) { + std::map> indexMappings; + for (auto [lusIndex, mapping] : LUS::Context::GetInstance() + ->GetControlDeck() + ->GetDeviceIndexMappingManager() + ->GetAllDeviceIndexMappingsFromConfig()) { + auto wiiuIndexMapping = std::static_pointer_cast(mapping); + if (wiiuIndexMapping == nullptr) { + continue; + } + + indexMappings[lusIndex] = { wiiuIndexMapping->GetWiiUControllerName(), -1 }; + } + + for (auto [lusIndex, mapping] : LUS::Context::GetInstance() + ->GetControlDeck() + ->GetDeviceIndexMappingManager() + ->GetAllDeviceIndexMappings()) { + auto wiiuIndexMapping = std::static_pointer_cast(mapping); + if (wiiuIndexMapping == nullptr) { + continue; + } + + indexMappings[lusIndex] = { wiiuIndexMapping->GetWiiUControllerName(), + wiiuIndexMapping->IsWiiUGamepad() ? INT32_MAX + : wiiuIndexMapping->GetDeviceChannel() }; + } + + for (auto [lusIndex, info] : indexMappings) { + auto [name, wiiuChannel] = info; + bool connected = wiiuChannel != -1; + bool isGamepad = wiiuChannel == INT32_MAX; + + auto buttonColor = ImGui::GetStyleColorVec4(ImGuiCol_Button); + auto buttonHoveredColor = ImGui::GetStyleColorVec4(ImGuiCol_ButtonHovered); + GetButtonColorsForLUSDeviceIndex(lusIndex, buttonColor, buttonHoveredColor); + ImGui::PushItemFlag(ImGuiItemFlags_Disabled, true); + ImGui::PushStyleColor(ImGuiCol_Button, buttonColor); + ImGui::Button(StringHelper::Sprintf("%s %s%s", connected ? ICON_FA_GAMEPAD : ICON_FA_CHAIN_BROKEN, + name.c_str(), + !connected ? " (Disconnected)" + : isGamepad ? "" + : StringHelper::Sprintf(" (%d)", wiiuChannel).c_str()) + .c_str()); + ImGui::PopStyleColor(); + ImGui::PopItemFlag(); + } + + ImGui::EndTabItem(); + } +} +#else +void SohInputEditorWindow::DrawSetDefaultsButton(uint8_t portIndex) { + ImGui::SameLine(); + auto popupId = StringHelper::Sprintf("setDefaultsPopup##%d", portIndex); + if (ImGui::Button(StringHelper::Sprintf("Set Defaults##%d", portIndex).c_str(), + ImVec2(ImGui::CalcTextSize("Set Defaults") * 2))) { + ImGui::OpenPopup(popupId.c_str()); + } + + if (ImGui::BeginPopup(popupId.c_str())) { + std::map> indexMappings; + for (auto [lusIndex, mapping] : LUS::Context::GetInstance() + ->GetControlDeck() + ->GetDeviceIndexMappingManager() + ->GetAllDeviceIndexMappings()) { + auto sdlIndexMapping = std::static_pointer_cast(mapping); + if (sdlIndexMapping == nullptr) { + continue; + } + + indexMappings[lusIndex] = { sdlIndexMapping->GetSDLControllerName(), sdlIndexMapping->GetSDLDeviceIndex() }; + } + + bool shouldClose = false; + ImGui::PushStyleColor(ImGuiCol_Button, BUTTON_COLOR_KEYBOARD_BEIGE); + ImGui::PushStyleColor(ImGuiCol_ButtonHovered, BUTTON_COLOR_KEYBOARD_BEIGE_HOVERED); + if (ImGui::Button(StringHelper::Sprintf("%s Keyboard", ICON_FA_KEYBOARD_O).c_str())) { + ImGui::OpenPopup("Set Defaults for Keyboard"); + } + ImGui::PopStyleColor(); + ImGui::PopStyleColor(); + if (ImGui::BeginPopupModal("Set Defaults for Keyboard", NULL, ImGuiWindowFlags_AlwaysAutoResize)) { + ImGui::Text("This will clear all existing mappings for\nKeyboard on port %d.\n\nContinue?", portIndex + 1); + if (ImGui::Button("Cancel")) { + shouldClose = true; + ImGui::CloseCurrentPopup(); + } + if (ImGui::Button("Set defaults")) { + LUS::Context::GetInstance() + ->GetControlDeck() + ->GetControllerByPort(portIndex) + ->ClearAllMappingsForDevice(LUS::LUSDeviceIndex::Keyboard); + LUS::Context::GetInstance()->GetControlDeck()->GetControllerByPort(portIndex)->AddDefaultMappings( + LUS::LUSDeviceIndex::Keyboard); + shouldClose = true; + ImGui::CloseCurrentPopup(); + } + ImGui::EndPopup(); + } + for (auto [lusIndex, info] : indexMappings) { + auto [name, sdlIndex] = info; + + auto buttonColor = ImGui::GetStyleColorVec4(ImGuiCol_Button); + auto buttonHoveredColor = ImGui::GetStyleColorVec4(ImGuiCol_ButtonHovered); + GetButtonColorsForLUSDeviceIndex(lusIndex, buttonColor, buttonHoveredColor); + ImGui::PushStyleColor(ImGuiCol_Button, buttonColor); + ImGui::PushStyleColor(ImGuiCol_ButtonHovered, buttonHoveredColor); + if (ImGui::Button(StringHelper::Sprintf("%s %s (%s)", ICON_FA_GAMEPAD, name.c_str(), + StringHelper::Sprintf("SDL %d", sdlIndex).c_str()) + .c_str())) { + ImGui::OpenPopup(StringHelper::Sprintf("Set Defaults for %s", name.c_str()).c_str()); + } + ImGui::PopStyleColor(); + ImGui::PopStyleColor(); + if (ImGui::BeginPopupModal(StringHelper::Sprintf("Set Defaults for %s", name.c_str()).c_str(), NULL, + ImGuiWindowFlags_AlwaysAutoResize)) { + ImGui::Text("This will clear all existing mappings for\n%s (SDL %d) on port %d.\n\nContinue?", + name.c_str(), sdlIndex, portIndex + 1); + if (ImGui::Button("Cancel")) { + shouldClose = true; + ImGui::CloseCurrentPopup(); + } + if (ImGui::Button("Set defaults")) { + LUS::Context::GetInstance() + ->GetControlDeck() + ->GetControllerByPort(portIndex) + ->ClearAllMappingsForDevice(lusIndex); + LUS::Context::GetInstance()->GetControlDeck()->GetControllerByPort(portIndex)->AddDefaultMappings( + lusIndex); + shouldClose = true; + ImGui::CloseCurrentPopup(); + } + ImGui::EndPopup(); + } + } + + if (ImGui::Button("Cancel") || shouldClose) { + ImGui::CloseCurrentPopup(); + } + + ImGui::EndPopup(); + } +} + +void SohInputEditorWindow::DrawDevicesTab() { + if (ImGui::BeginTabItem("Devices")) { + std::map> indexMappings; + for (auto [lusIndex, mapping] : LUS::Context::GetInstance() + ->GetControlDeck() + ->GetDeviceIndexMappingManager() + ->GetAllDeviceIndexMappingsFromConfig()) { + auto sdlIndexMapping = std::static_pointer_cast(mapping); + if (sdlIndexMapping == nullptr) { + continue; + } + + indexMappings[lusIndex] = { sdlIndexMapping->GetSDLControllerName(), -1 }; + } + + for (auto [lusIndex, mapping] : LUS::Context::GetInstance() + ->GetControlDeck() + ->GetDeviceIndexMappingManager() + ->GetAllDeviceIndexMappings()) { + auto sdlIndexMapping = std::static_pointer_cast(mapping); + if (sdlIndexMapping == nullptr) { + continue; + } + + indexMappings[lusIndex] = { sdlIndexMapping->GetSDLControllerName(), sdlIndexMapping->GetSDLDeviceIndex() }; + } + + for (auto [lusIndex, info] : indexMappings) { + auto [name, sdlIndex] = info; + bool connected = sdlIndex != -1; + + auto buttonColor = ImGui::GetStyleColorVec4(ImGuiCol_Button); + auto buttonHoveredColor = ImGui::GetStyleColorVec4(ImGuiCol_ButtonHovered); + GetButtonColorsForLUSDeviceIndex(lusIndex, buttonColor, buttonHoveredColor); + ImGui::PushItemFlag(ImGuiItemFlags_Disabled, true); + ImGui::PushStyleColor(ImGuiCol_Button, buttonColor); + ImGui::Button( + StringHelper::Sprintf("%s %s (%s)", connected ? ICON_FA_GAMEPAD : ICON_FA_CHAIN_BROKEN, name.c_str(), + connected ? StringHelper::Sprintf("SDL %d", sdlIndex).c_str() : "Disconnected") + .c_str()); + ImGui::PopStyleColor(); + ImGui::PopItemFlag(); + } + + ImGui::EndTabItem(); + } +} +#endif + +void SohInputEditorWindow::DrawElement() { + ImGui::Begin("Controller Configuration###sohControllerConfigWindowV1", &mIsVisible); + ImGui::BeginTabBar("##ControllerConfigPortTabs"); + DrawLinkTab(); + DrawIvanTab(); + if (CVarGetInteger("gDebugEnabled", 0)) { + DrawDebugPortTab(2); + DrawDebugPortTab(3); + } + DrawDevicesTab(); + ImGui::EndTabBar(); + ImGui::End(); +} diff --git a/soh/soh/Enhancements/controls/SohInputEditorWindow.h b/soh/soh/Enhancements/controls/SohInputEditorWindow.h new file mode 100644 index 000000000..089719a58 --- /dev/null +++ b/soh/soh/Enhancements/controls/SohInputEditorWindow.h @@ -0,0 +1,86 @@ +#pragma once + +#include "stdint.h" +#include +#include +#include +#include +#include +#include + +class SohInputEditorWindow : public LUS::GuiWindow { + public: + using GuiWindow::GuiWindow; + ~SohInputEditorWindow(); + + void DrawButton(const char* label, int32_t n64Btn, int32_t currentPort, int32_t* btnReading); + + void DrawInputChip(const char* buttonName, ImVec4 color); + void DrawAnalogPreview(const char* label, ImVec2 stick, float deadzone = 0, bool gyro = false); + void DrawControllerSchema(); + bool TestingRumble(); + + protected: + void InitElement() override; + void DrawElement() override; + void UpdateElement() override; + + private: + void DrawStickDirectionLine(const char* axisDirectionName, uint8_t port, uint8_t stick, LUS::Direction direction, + ImVec4 color); + void DrawButtonLine(const char* buttonName, uint8_t port, uint16_t bitmask, ImVec4 color); + void DrawButtonLineEditMappingButton(uint8_t port, uint16_t bitmask, std::string id); + void DrawButtonLineAddMappingButton(uint8_t port, uint16_t bitmask); + + void DrawStickDirectionLineEditMappingButton(uint8_t port, uint8_t stick, LUS::Direction direction, std::string id); + void DrawStickDirectionLineAddMappingButton(uint8_t port, uint8_t stick, LUS::Direction direction); + void DrawStickSection(uint8_t port, uint8_t stick, int32_t id, ImVec4 color); + + void DrawRumbleSection(uint8_t port); + void DrawRemoveRumbleMappingButton(uint8_t port, std::string id); + void DrawAddRumbleMappingButton(uint8_t port); + + void DrawLEDSection(uint8_t port); + void DrawRemoveLEDMappingButton(uint8_t port, std::string id); + void DrawAddLEDMappingButton(uint8_t port); + + void DrawGyroSection(uint8_t port); + void DrawRemoveGyroMappingButton(uint8_t port, std::string id); + void DrawAddGyroMappingButton(uint8_t port); + + int32_t mGameInputBlockTimer; + int32_t mMappingInputBlockTimer; + int32_t mRumbleTimer; + std::shared_ptr mRumbleMappingToTest; + + // mBitmaskToMappingIds[port][bitmask] = { id0, id1, ... } + std::unordered_map>> mBitmaskToMappingIds; + + // mStickDirectionToMappingIds[port][stick][direction] = { id0, id1, ... } + std::unordered_map>>> + mStickDirectionToMappingIds; + + void UpdateBitmaskToMappingIds(uint8_t port); + void UpdateStickDirectionToMappingIds(uint8_t port); + + void GetButtonColorsForLUSDeviceIndex(LUS::LUSDeviceIndex lusIndex, ImVec4& buttonColor, + ImVec4& buttonHoveredColor); + void DrawLinkTab(); + void DrawIvanTab(); + void DrawDebugPortTab(uint8_t portIndex, std::string customName = ""); + void DrawDevicesTab(); + std::set mButtonsBitmasks; + std::set mDpadBitmasks; + std::set mModifierButtonsBitmasks; + void DrawButtonDeviceIcons(uint8_t portIndex, std::set bitmasks); + void DrawAnalogStickDeviceIcons(uint8_t portIndex, LUS::Stick stick); + void DrawRumbleDeviceIcons(uint8_t portIndex); + void DrawGyroDeviceIcons(uint8_t portIndex); + void DrawLEDDeviceIcons(uint8_t portIndex); + bool mInputEditorPopupOpen; + void DrawSetDefaultsButton(uint8_t portIndex); + void DrawClearAllButton(uint8_t portIndex); + + void DrawHelpIcon(const std::string& helptext); +}; diff --git a/soh/soh/OTRGlobals.cpp b/soh/soh/OTRGlobals.cpp index 242745ae3..43aad0d36 100644 --- a/soh/soh/OTRGlobals.cpp +++ b/soh/soh/OTRGlobals.cpp @@ -30,6 +30,7 @@ #include #include "Enhancements/speechsynthesizer/SpeechSynthesizer.h" #include "Enhancements/controls/GameControlEditor.h" +#include "Enhancements/controls/SohInputEditorWindow.h" #include "Enhancements/cosmetics/CosmeticsEditor.h" #include "Enhancements/audio/AudioCollection.h" #include "Enhancements/audio/AudioEditor.h" @@ -279,9 +280,26 @@ OTRGlobals::OTRGlobals() { OOT_PAL_GC_DBG1, OOT_PAL_GC_DBG2 }; - // tell LUS to reserve 3 SoH specific threads (Game, Audio, Save) - context = LUS::Context::CreateInstance("Ship of Harkinian", appShortName, "shipofharkinian.json", OTRFiles, {}, 3); + context = LUS::Context::CreateUninitializedInstance("Ship of Harkinian", appShortName, "shipofharkinian.json"); + + context->InitLogging(); + context->InitConfiguration(); + context->InitConsoleVariables(); + + // tell LUS to reserve 3 SoH specific threads (Game, Audio, Save) + context->InitResourceManager(OTRFiles, {}, 3); + + context->InitControlDeck({BTN_MODIFIER1, BTN_MODIFIER2}); + context->GetControlDeck()->SetSinglePlayerMappingMode(true); + + context->InitCrashHandler(); + context->InitConsole(); + + auto sohInputEditorWindow = std::make_shared("gControllerConfigurationEnabled", "Input Editor"); + context->InitWindow(sohInputEditorWindow); + context->InitAudio(); + context->GetResourceManager()->GetResourceLoader()->RegisterResourceFactory(LUS::ResourceType::SOH_Animation, "Animation", std::make_shared()); context->GetResourceManager()->GetResourceLoader()->RegisterResourceFactory(LUS::ResourceType::SOH_PlayerAnimation, "PlayerAnimation", std::make_shared()); context->GetResourceManager()->GetResourceLoader()->RegisterResourceFactory(LUS::ResourceType::SOH_Room, "Room", std::make_shared()); // Is room scene? maybe? @@ -2065,15 +2083,22 @@ Color_RGB8 GetColorForControllerLED() { } extern "C" void OTRControllerCallback(uint8_t rumble) { - auto physicalDevice = LUS::Context::GetInstance()->GetControlDeck()->GetDeviceFromPortIndex(0); + // We call this every tick, SDL accounts for this use and prevents driver spam + // https://github.com/libsdl-org/SDL/blob/f17058b562c8a1090c0c996b42982721ace90903/src/joystick/SDL_joystick.c#L1114-L1144 + LUS::Context::GetInstance()->GetControlDeck()->GetControllerByPort(0)->GetLED()->SetLEDColor(GetColorForControllerLED()); - if (physicalDevice->CanSetLed()) { - // We call this every tick, SDL accounts for this use and prevents driver spam - // https://github.com/libsdl-org/SDL/blob/f17058b562c8a1090c0c996b42982721ace90903/src/joystick/SDL_joystick.c#L1114-L1144 - physicalDevice->SetLedColor(0, GetColorForControllerLED()); + static std::shared_ptr controllerConfigWindow = nullptr; + if (controllerConfigWindow == nullptr) { + controllerConfigWindow = std::dynamic_pointer_cast(LUS::Context::GetInstance()->GetWindow()->GetGui()->GetGuiWindow("Input Editor")); + } else if (controllerConfigWindow->TestingRumble()) { + return; } - physicalDevice->SetRumble(0, rumble); + if (rumble) { + LUS::Context::GetInstance()->GetControlDeck()->GetControllerByPort(0)->GetRumble()->StartRumble(); + } else { + LUS::Context::GetInstance()->GetControlDeck()->GetControllerByPort(0)->GetRumble()->StopRumble(); + } } extern "C" float OTRGetAspectRatio() { @@ -2112,12 +2137,12 @@ extern "C" void AudioPlayer_Play(const uint8_t* buf, uint32_t len) { } extern "C" int Controller_ShouldRumble(size_t slot) { - auto controlDeck = LUS::Context::GetInstance()->GetControlDeck(); - - if (slot < controlDeck->GetNumConnectedPorts()) { - auto physicalDevice = controlDeck->GetDeviceFromPortIndex(slot); - - if (physicalDevice->GetProfile(slot)->UseRumble && physicalDevice->CanRumble()) { + for (auto [id, mapping] : LUS::Context::GetInstance() + ->GetControlDeck() + ->GetControllerByPort(static_cast(slot)) + ->GetRumble() + ->GetAllRumbleMappings()) { + if (mapping->PhysicalDeviceIsConnected()) { return 1; } } diff --git a/soh/soh/OTRGlobals.h b/soh/soh/OTRGlobals.h index e00cfecd5..e51ad458b 100644 --- a/soh/soh/OTRGlobals.h +++ b/soh/soh/OTRGlobals.h @@ -12,6 +12,9 @@ #define GAME_PLATFORM_N64 0 #define GAME_PLATFORM_GC 1 +#define BTN_MODIFIER1 0x00040 +#define BTN_MODIFIER2 0x00080 + #ifdef __cplusplus #include #include "Enhancements/savestates.h" From c3ae829370d701e1bd48c78b296b2752909f180f Mon Sep 17 00:00:00 2001 From: Garrett Cox Date: Mon, 20 Nov 2023 12:25:22 -0600 Subject: [PATCH 016/113] Add enhancement for removing explosive limit (#3242) --- soh/soh/SohMenuBar.cpp | 2 ++ soh/src/overlays/actors/ovl_player_actor/z_player.c | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/soh/soh/SohMenuBar.cpp b/soh/soh/SohMenuBar.cpp index 598ec343d..291b82569 100644 --- a/soh/soh/SohMenuBar.cpp +++ b/soh/soh/SohMenuBar.cpp @@ -610,6 +610,8 @@ void DrawEnhancementsMenu() { UIWidgets::Tooltip("Allows child to use bow with arrows.\nAllows adult to use slingshot with seeds.\n\nRequires glitches or 'Timeless Equipment' cheat to equip."); UIWidgets::PaddedEnhancementCheckbox("Better Farore's Wind", "gBetterFW", true, false); UIWidgets::Tooltip("Helps FW persist between ages, gives child and adult separate FW points, and can be used in more places."); + UIWidgets::PaddedEnhancementCheckbox("Remove Explosive Limit", "gRemoveExplosiveLimit", true, false); + UIWidgets::Tooltip("Removes the cap of 3 active explosives being deployed at once."); UIWidgets::PaddedEnhancementCheckbox("Static Explosion Radius", "gStaticExplosionRadius", true, false); UIWidgets::Tooltip("Explosions are now a static size, like in Majora's Mask and OoT3D. Makes bombchu hovering much easier."); UIWidgets::PaddedEnhancementCheckbox("Prevent Bombchus Forcing First-Person", "gDisableFirstPersonChus", true, false); diff --git a/soh/src/overlays/actors/ovl_player_actor/z_player.c b/soh/src/overlays/actors/ovl_player_actor/z_player.c index fe551de75..d297eb024 100644 --- a/soh/src/overlays/actors/ovl_player_actor/z_player.c +++ b/soh/src/overlays/actors/ovl_player_actor/z_player.c @@ -2968,7 +2968,7 @@ void func_80835F44(PlayState* play, Player* this, s32 item) { ((actionParam == PLAYER_IA_MAGIC_BEAN) && (AMMO(ITEM_BEAN) == 0)) || (temp = Player_ActionToExplosive(this, actionParam), ((temp >= 0) && ((AMMO(sExplosiveInfos[temp].itemId) == 0) || - (play->actorCtx.actorLists[ACTORCAT_EXPLOSIVE].length >= 3)))))) { + (play->actorCtx.actorLists[ACTORCAT_EXPLOSIVE].length >= 3 && !CVarGetInteger("gRemoveExplosiveLimit", 0))))))) { func_80078884(NA_SE_SY_ERROR); return; } From 5b81964ea5c0c1087f20b4f8da5a5605501784e8 Mon Sep 17 00:00:00 2001 From: Pepe20129 <72659707+Pepe20129@users.noreply.github.com> Date: Sun, 26 Nov 2023 17:54:54 +0100 Subject: [PATCH 017/113] Bring over some player documentation from decomp (#3380) * Document static variables * Document enums and structs * Document some functions * Document more functions * actionParam to itemAction and fix build * Document some local variables and a define * General cleanup * Use PlayerMeleeWeaponAnimation enum when appropiate * Document some function parameters and local variables * Document some of player struct --- soh/include/z64player.h | 44 +- .../Enhancements/debugger/debugSaveEditor.cpp | 2 +- .../GameInteractor_RawAction.cpp | 6 +- soh/src/code/z_actor.c | 16 +- soh/src/code/z_camera.c | 4 +- soh/src/code/z_player_lib.c | 8 +- .../actors/ovl_Bg_Haka_Trap/z_bg_haka_trap.c | 4 +- .../actors/ovl_Boss_Dodongo/z_boss_dodongo.c | 2 +- .../overlays/actors/ovl_Boss_Mo/z_boss_mo.c | 8 +- .../actors/ovl_En_Encount1/z_en_encount1.c | 2 +- .../actors/ovl_En_Partner/z_en_partner.c | 4 +- .../actors/ovl_En_Siofuki/z_en_siofuki.c | 4 +- .../actors/ovl_En_Stream/z_en_stream.c | 6 +- .../actors/ovl_En_Torch2/z_en_torch2.c | 4 +- .../actors/ovl_player_actor/z_player.c | 3364 +++++++++-------- 15 files changed, 1916 insertions(+), 1562 deletions(-) diff --git a/soh/include/z64player.h b/soh/include/z64player.h index ff30cc170..73b5166e2 100644 --- a/soh/include/z64player.h +++ b/soh/include/z64player.h @@ -494,8 +494,8 @@ typedef struct { #define PLAYER_STATE3_RESTORE_NAYRUS_LOVE (1 << 6) // Set by ocarina effects actors when destroyed to signal Nayru's Love may be restored (see `ACTOROVL_ALLOC_ABSOLUTE`) #define PLAYER_STATE3_HOOKSHOT_TRAVELLING (1 << 7) //Travelling to target -typedef void (*PlayerFunc674)(struct Player*, struct PlayState*); -typedef s32 (*PlayerFunc82C)(struct Player*, struct PlayState*); +typedef void (*PlayerActionFunc)(struct Player*, struct PlayState*); +typedef s32 (*UpperActionFunc)(struct Player*, struct PlayState*); typedef void (*PlayerFuncA74)(struct PlayState*, struct Player*); typedef struct Player { @@ -512,7 +512,7 @@ typedef struct Player { /* 0x0155 */ char unk_155[0x003]; /* 0x0158 */ u8 modelGroup; /* 0x0159 */ u8 nextModelGroup; - /* 0x015A */ s8 unk_15A; + /* 0x015A */ s8 itemChangeType; /* 0x015B */ u8 modelAnimType; /* 0x015C */ u8 leftHandType; /* 0x015D */ u8 rightHandType; @@ -548,11 +548,11 @@ typedef struct Player { /* 0x043C */ s8 mountSide; /* 0x043D */ char unk_43D[0x003]; /* 0x0440 */ Actor* rideActor; - /* 0x0444 */ u8 csMode; - /* 0x0445 */ u8 prevCsMode; - /* 0x0446 */ u8 unk_446; + /* 0x0444 */ u8 csAction; + /* 0x0445 */ u8 prevCsAction; + /* 0x0446 */ u8 cueId; /* 0x0447 */ u8 unk_447; - /* 0x0448 */ Actor* unk_448; + /* 0x0448 */ Actor* csActor; /* 0x044C */ char unk_44C[0x004]; /* 0x0450 */ Vec3f unk_450; /* 0x045C */ Vec3f unk_45C; @@ -567,7 +567,7 @@ typedef struct Player { /* 0x0668 */ char unk_668[0x004]; /* 0x066C */ s32 unk_66C; /* 0x0670 */ s32 meleeWeaponEffectIndex; - /* 0x0674 */ PlayerFunc674 func_674; + /* 0x0674 */ PlayerActionFunc actionFunc; /* 0x0678 */ PlayerAgeProperties* ageProperties; /* 0x067C */ u32 stateFlags1; /* 0x0680 */ u32 stateFlags2; @@ -581,7 +581,7 @@ typedef struct Player { /* 0x0698 */ f32 targetActorDistance; /* 0x069C */ char unk_69C[0x004]; /* 0x06A0 */ f32 unk_6A0; - /* 0x06A4 */ f32 unk_6A4; + /* 0x06A4 */ f32 closestSecretDistSq; /* 0x06A8 */ Actor* unk_6A8; /* 0x06AC */ s8 unk_6AC; /* 0x06AD */ u8 unk_6AD; @@ -596,18 +596,18 @@ typedef struct Player { /* 0x06C0 */ s16 unk_6C0; /* 0x06C2 */ s16 unk_6C2; /* 0x06C4 */ f32 unk_6C4; - /* 0x06C8 */ SkelAnime skelAnime2; - /* 0x070C */ Vec3s jointTable2[PLAYER_LIMB_BUF_COUNT]; - /* 0x079C */ Vec3s morphTable2[PLAYER_LIMB_BUF_COUNT]; - /* 0x082C */ PlayerFunc82C func_82C; - /* 0x0830 */ f32 unk_830; + /* 0x06C8 */ SkelAnime upperSkelAnime; + /* 0x070C */ Vec3s upperJointTable[PLAYER_LIMB_BUF_COUNT]; + /* 0x079C */ Vec3s upperMorphTable[PLAYER_LIMB_BUF_COUNT]; + /* 0x082C */ UpperActionFunc upperActionFunc; + /* 0x0830 */ f32 upperAnimBlendWeight; /* 0x0834 */ s16 unk_834; /* 0x0836 */ s8 unk_836; /* 0x0837 */ u8 unk_837; /* 0x0838 */ f32 linearVelocity; /* 0x083C */ s16 currentYaw; /* 0x083E */ s16 targetYaw; - /* 0x0840 */ u16 unk_840; + /* 0x0840 */ u16 underwaterTimer; /* 0x0842 */ s8 meleeWeaponAnimation; /* 0x0843 */ s8 meleeWeaponState; /* 0x0844 */ s8 unk_844; @@ -631,8 +631,8 @@ typedef struct Player { /* 0x087C */ s16 unk_87C; /* 0x087E */ s16 unk_87E; /* 0x0880 */ f32 unk_880; - /* 0x0884 */ f32 wallHeight; // height used to determine whether link can climb or grab a ledge at the top - /* 0x0888 */ f32 wallDistance; // distance to the colliding wall plane + /* 0x0884 */ f32 yDistToLedge; // y distance to ground above an interact wall. LEDGE_DIST_MAX if no ground is found + /* 0x0888 */ f32 distToInteractWall; // distance to the colliding wall plane /* 0x088C */ u8 unk_88C; /* 0x088D */ u8 unk_88D; /* 0x088E */ u8 unk_88E; @@ -643,17 +643,17 @@ typedef struct Player { /* 0x0893 */ u8 hoverBootsTimer; /* 0x0894 */ s16 fallStartHeight; // last truncated Y position before falling /* 0x0896 */ s16 fallDistance; // truncated Y distance the player has fallen so far (positive is down) - /* 0x0898 */ s16 unk_898; - /* 0x089A */ s16 unk_89A; + /* 0x0898 */ s16 floorPitch; // angle of the floor slope in the direction of current world yaw (positive for ascending slope) + /* 0x089A */ s16 floorPitchAlt; // the calculation for this value is bugged and doesn't represent anything meaningful /* 0x089C */ s16 unk_89C; - /* 0x089E */ u16 unk_89E; + /* 0x089E */ u16 floorSfxOffset; /* 0x08A0 */ u8 unk_8A0; /* 0x08A1 */ u8 unk_8A1; /* 0x08A2 */ s16 unk_8A2; /* 0x08A4 */ f32 unk_8A4; /* 0x08A8 */ f32 unk_8A8; - /* 0x08AC */ f32 windSpeed; // Pushing player, examples include water currents, floor conveyors, climbing sloped surfaces // Upstream TODO: pushedSpeed - /* 0x08B0 */ s16 windDirection; // Yaw direction of player being pushed // Upstream TODO: pushedYaw + /* 0x08AC */ f32 pushedSpeed; // Pushing player, examples include water currents, floor conveyors, climbing sloped surfaces + /* 0x08B0 */ s16 pushedYaw; // Yaw direction of player being pushed /* 0x08B4 */ WeaponInfo meleeWeaponInfo[3]; /* 0x0908 */ Vec3f bodyPartsPos[PLAYER_BODYPART_MAX]; /* 0x09E0 */ MtxF mf_9E0; diff --git a/soh/soh/Enhancements/debugger/debugSaveEditor.cpp b/soh/soh/Enhancements/debugger/debugSaveEditor.cpp index b357363ac..f90ab739c 100644 --- a/soh/soh/Enhancements/debugger/debugSaveEditor.cpp +++ b/soh/soh/Enhancements/debugger/debugSaveEditor.cpp @@ -1573,7 +1573,7 @@ void DrawPlayerTab() { ImGui::InputScalar("Y Velocity", ImGuiDataType_Float, &player->actor.velocity.y); UIWidgets::InsertHelpHoverText("Link's speed along the Y plane. Caps at -20"); - ImGui::InputScalar("Wall Height", ImGuiDataType_Float, &player->wallHeight); + ImGui::InputScalar("Wall Height", ImGuiDataType_Float, &player->yDistToLedge); UIWidgets::InsertHelpHoverText("Height used to determine whether Link can climb or grab a ledge at the top"); ImGui::InputScalar("Invincibility Timer", ImGuiDataType_S8, &player->invincibilityTimer); diff --git a/soh/soh/Enhancements/game-interactor/GameInteractor_RawAction.cpp b/soh/soh/Enhancements/game-interactor/GameInteractor_RawAction.cpp index 1bde59242..854b7dc11 100644 --- a/soh/soh/Enhancements/game-interactor/GameInteractor_RawAction.cpp +++ b/soh/soh/Enhancements/game-interactor/GameInteractor_RawAction.cpp @@ -520,7 +520,7 @@ void GameInteractor::RawAction::SetRandomWind(bool active) { if (active) { GameInteractor::State::RandomWindActive = 1; if (GameInteractor::State::RandomWindSecondsSinceLastDirectionChange == 0) { - player->windDirection = (rand() % 49152) - 32767; + player->pushedYaw = (rand() % 49152) - 32767; GameInteractor::State::RandomWindSecondsSinceLastDirectionChange = 5; } else { GameInteractor::State::RandomWindSecondsSinceLastDirectionChange--; @@ -528,8 +528,8 @@ void GameInteractor::RawAction::SetRandomWind(bool active) { } else { GameInteractor::State::RandomWindActive = 0; GameInteractor::State::RandomWindSecondsSinceLastDirectionChange = 0; - player->windSpeed = 0.0f; - player->windDirection = 0.0f; + player->pushedSpeed = 0.0f; + player->pushedYaw = 0.0f; } } diff --git a/soh/src/code/z_actor.c b/soh/src/code/z_actor.c index b032b9e2b..3b68f1211 100644 --- a/soh/src/code/z_actor.c +++ b/soh/src/code/z_actor.c @@ -1426,27 +1426,27 @@ void Actor_MountHorse(PlayState* play, Player* player, Actor* horse) { } s32 func_8002DEEC(Player* player) { - return (player->stateFlags1 & 0x20000080) || (player->csMode != 0); + return (player->stateFlags1 & 0x20000080) || (player->csAction != 0); } void func_8002DF18(PlayState* play, Player* player) { func_8006DC68(play, player); } -s32 func_8002DF38(PlayState* play, Actor* actor, u8 csMode) { +s32 func_8002DF38(PlayState* play, Actor* actor, u8 csAction) { Player* player = GET_PLAYER(play); - player->csMode = csMode; - player->unk_448 = actor; + player->csAction = csAction; + player->csActor = actor; player->doorBgCamIndex = 0; return true; } -s32 func_8002DF54(PlayState* play, Actor* actor, u8 csMode) { +s32 func_8002DF54(PlayState* play, Actor* actor, u8 csAction) { Player* player = GET_PLAYER(play); - func_8002DF38(play, actor, csMode); + func_8002DF38(play, actor, csAction); player->doorBgCamIndex = 1; return true; @@ -2121,8 +2121,8 @@ void func_8002F5C4(Actor* actorA, Actor* actorB, PlayState* play) { void func_8002F5F0(Actor* actor, PlayState* play) { Player* player = GET_PLAYER(play); - if (actor->xyzDistToPlayerSq < player->unk_6A4) { - player->unk_6A4 = actor->xyzDistToPlayerSq; + if (actor->xyzDistToPlayerSq < player->closestSecretDistSq) { + player->closestSecretDistSq = actor->xyzDistToPlayerSq; } } diff --git a/soh/src/code/z_camera.c b/soh/src/code/z_camera.c index e31a73dcf..ed8b9c8f4 100644 --- a/soh/src/code/z_camera.c +++ b/soh/src/code/z_camera.c @@ -4521,7 +4521,7 @@ s32 Camera_Subj4(Camera* camera) { if ((anim->unk_28 < temp_f16) && !anim->unk_2E) { player = camera->player; anim->unk_2E = true; - func_800F4010(&player->actor.projectedPos, player->unk_89E + 0x8B0, 4.0f); + func_800F4010(&player->actor.projectedPos, player->floorSfxOffset + 0x8B0, 4.0f); } else if (anim->unk_28 > temp_f16) { anim->unk_2E = false; } @@ -7732,7 +7732,7 @@ void Camera_Finish(Camera* camera) { player->actor.freezeTimer = 0; player->stateFlags1 &= ~0x20000000; - if (player->csMode != 0) { + if (player->csAction != 0) { func_8002DF54(camera->play, &player->actor, 7); osSyncPrintf("camera: player demo end!!\n"); } diff --git a/soh/src/code/z_player_lib.c b/soh/src/code/z_player_lib.c index d16fbadaf..b9a66c90e 100644 --- a/soh/src/code/z_player_lib.c +++ b/soh/src/code/z_player_lib.c @@ -573,7 +573,7 @@ uint8_t Player_IsCustomLinkModel() { } s32 Player_InBlockingCsMode(PlayState* play, Player* this) { - return (this->stateFlags1 & 0x20000080) || (this->csMode != 0) || (play->transitionTrigger == TRANS_TRIGGER_START) || + return (this->stateFlags1 & 0x20000080) || (this->csAction != 0) || (play->transitionTrigger == TRANS_TRIGGER_START) || (this->stateFlags1 & 1) || (this->stateFlags3 & 0x80) || ((gSaveContext.magicState != MAGIC_STATE_IDLE) && (Player_ActionToMagicSpell(this, this->itemAction) >= 0)); } @@ -668,7 +668,7 @@ void func_8008EC70(Player* this) { } void Player_SetEquipmentData(PlayState* play, Player* this) { - if (this->csMode != 0x56) { + if (this->csAction != 0x56) { this->currentShield = SHIELD_EQUIP_TO_PLAYER(CUR_EQUIP_VALUE(EQUIP_TYPE_SHIELD)); this->currentTunic = TUNIC_EQUIP_TO_PLAYER(CUR_EQUIP_VALUE(EQUIP_TYPE_TUNIC)); this->currentBoots = BOOTS_EQUIP_TO_PLAYER(CUR_EQUIP_VALUE(EQUIP_TYPE_BOOTS)); @@ -893,8 +893,8 @@ s32 Player_GetEnvironmentalHazard(PlayState* play) { if (play->roomCtx.curRoom.behaviorType2 == ROOM_BEHAVIOR_TYPE2_3) { // Room is hot var = 0; - } else if ((this->unk_840 > 80) && - ((this->currentBoots == PLAYER_BOOTS_IRON) || (this->unk_840 >= 300))) { // Deep underwater + } else if ((this->underwaterTimer > 80) && + ((this->currentBoots == PLAYER_BOOTS_IRON) || (this->underwaterTimer >= 300))) { // Deep underwater var = ((this->currentBoots == PLAYER_BOOTS_IRON) && (this->actor.bgCheckFlags & 1)) ? 1 : 3; } else if (this->stateFlags1 & 0x8000000) { // Swimming var = 2; diff --git a/soh/src/overlays/actors/ovl_Bg_Haka_Trap/z_bg_haka_trap.c b/soh/src/overlays/actors/ovl_Bg_Haka_Trap/z_bg_haka_trap.c index fc7b36cb9..9bfce3603 100644 --- a/soh/src/overlays/actors/ovl_Bg_Haka_Trap/z_bg_haka_trap.c +++ b/soh/src/overlays/actors/ovl_Bg_Haka_Trap/z_bg_haka_trap.c @@ -438,8 +438,8 @@ void func_808809E4(BgHakaTrap* this, PlayState* play, s16 arg2) { if ((fabsf(sp18.x) < 70.0f) && (fabsf(sp18.y) < 100.0f) && (sp18.z < 500.0f) && (GET_PLAYER(play)->currentBoots != PLAYER_BOOTS_IRON)) { - player->windSpeed = ((500.0f - sp18.z) * 0.06f + 5.0f) * arg2 * (1.0f / 0x3A00) * (2.0f / 3.0f); - player->windDirection = this->dyna.actor.shape.rot.y; + player->pushedSpeed = ((500.0f - sp18.z) * 0.06f + 5.0f) * arg2 * (1.0f / 0x3A00) * (2.0f / 3.0f); + player->pushedYaw = this->dyna.actor.shape.rot.y; } } diff --git a/soh/src/overlays/actors/ovl_Boss_Dodongo/z_boss_dodongo.c b/soh/src/overlays/actors/ovl_Boss_Dodongo/z_boss_dodongo.c index e90e36e80..2d1b6fdca 100644 --- a/soh/src/overlays/actors/ovl_Boss_Dodongo/z_boss_dodongo.c +++ b/soh/src/overlays/actors/ovl_Boss_Dodongo/z_boss_dodongo.c @@ -970,7 +970,7 @@ void BossDodongo_Update(Actor* thisx, PlayState* play2) { magmaScale = ((s16)(Rand_ZeroOne() * 50)) - 50; } - if (player2->csMode >= 10) { + if (player2->csAction >= 10) { phi_s0_3 = -1; } diff --git a/soh/src/overlays/actors/ovl_Boss_Mo/z_boss_mo.c b/soh/src/overlays/actors/ovl_Boss_Mo/z_boss_mo.c index a8d992ca9..78534e851 100644 --- a/soh/src/overlays/actors/ovl_Boss_Mo/z_boss_mo.c +++ b/soh/src/overlays/actors/ovl_Boss_Mo/z_boss_mo.c @@ -854,7 +854,7 @@ void BossMo_Tentacle(BossMo* this, PlayState* play) { if (&this->actor == player->actor.parent) { player->unk_850 = 0x65; player->actor.parent = NULL; - player->csMode = 0; + player->csAction = 0; if (this->timers[0] == 0) { func_8002F6D4(play, &this->actor, 20.0f, this->actor.shape.rot.y + 0x8000, 10.0f, 0); } @@ -884,7 +884,7 @@ void BossMo_Tentacle(BossMo* this, PlayState* play) { if (&this->actor == player->actor.parent) { player->unk_850 = 0x65; player->actor.parent = NULL; - player->csMode = 0; + player->csAction = 0; } Math_ApproachF(&this->tentRippleSize, 0.15f, 0.5f, 0.01); if (this->meltIndex < 41) { @@ -1806,7 +1806,7 @@ void BossMo_CoreCollisionCheck(BossMo* this, PlayState* play) { if (player->actor.parent != NULL) { player->unk_850 = 0x65; player->actor.parent = NULL; - player->csMode = 0; + player->csAction = 0; } } else { this->actor.colChkInfo.health = 1; @@ -1825,7 +1825,7 @@ void BossMo_CoreCollisionCheck(BossMo* this, PlayState* play) { if (player->actor.parent == &sMorphaTent1->actor) { player->unk_850 = 0x65; player->actor.parent = NULL; - player->csMode = 0; + player->csAction = 0; } } this->work[MO_TENT_ACTION_STATE] = MO_CORE_STUNNED; diff --git a/soh/src/overlays/actors/ovl_En_Encount1/z_en_encount1.c b/soh/src/overlays/actors/ovl_En_Encount1/z_en_encount1.c index 2d05c116c..48877526a 100644 --- a/soh/src/overlays/actors/ovl_En_Encount1/z_en_encount1.c +++ b/soh/src/overlays/actors/ovl_En_Encount1/z_en_encount1.c @@ -248,7 +248,7 @@ void EnEncount1_SpawnStalchildOrWolfos(EnEncount1* this, PlayState* play) { while ((this->curNumSpawn < this->maxCurSpawns && this->totalNumSpawn < this->maxTotalSpawns) || (CVarGetInteger("gRandomizedEnemies", 0) && enemyCount < 15)) { if (play->sceneNum == SCENE_HYRULE_FIELD) { - if ((player->unk_89E == 0) || (player->actor.floorBgId != BGCHECK_SCENE) || + if ((player->floorSfxOffset == 0) || (player->actor.floorBgId != BGCHECK_SCENE) || !(player->actor.bgCheckFlags & 1) || (player->stateFlags1 & 0x08000000)) { this->fieldSpawnTimer = 60; diff --git a/soh/src/overlays/actors/ovl_En_Partner/z_en_partner.c b/soh/src/overlays/actors/ovl_En_Partner/z_en_partner.c index 8780ab10c..51e3e1499 100644 --- a/soh/src/overlays/actors/ovl_En_Partner/z_en_partner.c +++ b/soh/src/overlays/actors/ovl_En_Partner/z_en_partner.c @@ -21,7 +21,7 @@ void EnPartner_Draw(Actor* thisx, PlayState* play); void EnPartner_SpawnSparkles(EnPartner* this, PlayState* play, s32 sparkleLife); void func_808328EC(Player* this, u16 sfxId); -void func_808429B4(PlayState* play, s32 speed, s32 y, s32 countdown); +void Player_RequestQuake(PlayState* play, s32 speed, s32 y, s32 countdown); s32 spawn_boomerang_ivan(EnPartner* this, PlayState* play); static InitChainEntry sInitChain[] = { @@ -278,7 +278,7 @@ void UseHammer(Actor* thisx, PlayState* play, u8 started) { static Vec3f zeroVec = { 0.0f, 0.0f, 0.0f }; Vec3f shockwavePos = this->actor.world.pos; - func_808429B4(play, 27767, 7, 20); + Player_RequestQuake(play, 27767, 7, 20); Player_PlaySfx(&this->actor, NA_SE_IT_HAMMER_HIT); EffectSsBlast_SpawnWhiteShockwave(play, &shockwavePos, &zeroVec, &zeroVec); diff --git a/soh/src/overlays/actors/ovl_En_Siofuki/z_en_siofuki.c b/soh/src/overlays/actors/ovl_En_Siofuki/z_en_siofuki.c index 8d624559d..81138e23c 100644 --- a/soh/src/overlays/actors/ovl_En_Siofuki/z_en_siofuki.c +++ b/soh/src/overlays/actors/ovl_En_Siofuki/z_en_siofuki.c @@ -164,8 +164,8 @@ void func_80AFBE8C(EnSiofuki* this, PlayState* play) { Math_ApproachF(&this->appliedSpeed, this->targetAppliedSpeed, 1.0f, 0.1f); } - player->windDirection = this->appliedYaw; - player->windSpeed = this->appliedSpeed; + player->pushedYaw = this->appliedYaw; + player->pushedSpeed = this->appliedSpeed; } } else { if (this->applySpeed) { diff --git a/soh/src/overlays/actors/ovl_En_Stream/z_en_stream.c b/soh/src/overlays/actors/ovl_En_Stream/z_en_stream.c index 6706bef32..9d061ee47 100644 --- a/soh/src/overlays/actors/ovl_En_Stream/z_en_stream.c +++ b/soh/src/overlays/actors/ovl_En_Stream/z_en_stream.c @@ -92,11 +92,11 @@ void EnStream_SuckPlayer(EnStream* this, PlayState* play) { if (func_80B0B81C(&this->actor.world.pos, &player->actor.world.pos, &posDifference, this->actor.scale.y) != 0) { xzDist = sqrtf(SQ(posDifference.x) + SQ(posDifference.z)); yDistWithOffset = player->actor.world.pos.y - (this->actor.world.pos.y - 90.0f); - player->windDirection = Math_FAtan2F(-posDifference.x, -posDifference.z) * (0x8000 / M_PI); + player->pushedYaw = Math_FAtan2F(-posDifference.x, -posDifference.z) * (0x8000 / M_PI); if (xzDist > 3.0f) { - Math_SmoothStepToF(&player->windSpeed, 3.0f, 0.5f, xzDist, 0.0f); + Math_SmoothStepToF(&player->pushedSpeed, 3.0f, 0.5f, xzDist, 0.0f); } else { - player->windSpeed = 0.0f; + player->pushedSpeed = 0.0f; Math_SmoothStepToF(&player->actor.world.pos.x, this->actor.world.pos.x, 0.5f, 3.0f, 0.0f); Math_SmoothStepToF(&player->actor.world.pos.z, this->actor.world.pos.z, 0.5f, 3.0f, 0.0f); } diff --git a/soh/src/overlays/actors/ovl_En_Torch2/z_en_torch2.c b/soh/src/overlays/actors/ovl_En_Torch2/z_en_torch2.c index e83393899..bfc99a5b8 100644 --- a/soh/src/overlays/actors/ovl_En_Torch2/z_en_torch2.c +++ b/soh/src/overlays/actors/ovl_En_Torch2/z_en_torch2.c @@ -602,8 +602,8 @@ void EnTorch2_Update(Actor* thisx, PlayState* play2) { // Handles Dark Link being damaged if ((this->actor.colChkInfo.health == 0) && sDeathFlag) { - this->csMode = 0x18; - this->unk_448 = &player->actor; + this->csAction = 0x18; + this->csActor = &player->actor; this->doorBgCamIndex = 1; sDeathFlag = false; } diff --git a/soh/src/overlays/actors/ovl_player_actor/z_player.c b/soh/src/overlays/actors/ovl_player_actor/z_player.c index 4b1bbdcfe..fa63c23ea 100644 --- a/soh/src/overlays/actors/ovl_player_actor/z_player.c +++ b/soh/src/overlays/actors/ovl_player_actor/z_player.c @@ -35,6 +35,10 @@ #include #include +// Some player animations are played at this reduced speed, for reasons yet unclear. +// This is called "adjusted" for now. +#define PLAYER_ANIM_ADJUSTED_SPEED (2.0f / 3.0f) + typedef enum { /* 0x00 */ KNOB_ANIM_ADULT_L, /* 0x01 */ KNOB_ANIM_CHILD_L, @@ -50,7 +54,7 @@ typedef struct { typedef struct { /* 0x00 */ s16 actorId; /* 0x02 */ u8 itemId; - /* 0x03 */ u8 actionParam; + /* 0x03 */ u8 itemAction; /* 0x04 */ u8 textId; } BottleCatchInfo; // size = 0x06 @@ -75,7 +79,7 @@ typedef struct { typedef struct { /* 0x00 */ u16 sfxId; /* 0x02 */ s16 field; -} struct_80832924; // size = 0x04 +} AnimSfxEntry; // size = 0x04 typedef struct { /* 0x00 */ u16 unk_00; @@ -84,8 +88,8 @@ typedef struct { typedef struct { /* 0x00 */ LinkAnimationHeader* anim; - /* 0x04 */ u8 unk_04; -} struct_808540F4; // size = 0x08 + /* 0x04 */ u8 changeFrame; +} ItemChangeInfo; // size = 0x08 typedef struct { /* 0x00 */ LinkAnimationHeader* unk_00; @@ -116,14 +120,6 @@ typedef struct { }; } struct_80854B18; // size = 0x08 -typedef struct { - /* 0x00 */ s16 unk_00; - /* 0x02 */ s16 unk_02; - /* 0x04 */ s16 unk_04; - /* 0x06 */ s16 unk_06; - /* 0x08 */ s16 unk_08; -} struct_80858AC8; // size = 0x0A - void func_80833770(PlayState* play, Player* this); void func_80833790(PlayState* play, Player* this); void func_8083379C(PlayState* play, Player* this); @@ -131,10 +127,10 @@ void func_8083377C(PlayState* play, Player* this); void func_808337D4(PlayState* play, Player* this); void func_80833910(PlayState* play, Player* this); void func_80833984(PlayState* play, Player* this); -void func_8083399C(PlayState* play, Player* this, s8 actionParam); +void Player_InitItemAction(PlayState* play, Player* this, s8 itemAction); s32 func_8083485C(Player* this, PlayState* play); s32 func_808349DC(Player* this, PlayState* play); -s32 func_80834A2C(Player* this, PlayState* play); +s32 Player_UpperAction_ChangeHeldItem(Player* this, PlayState* play); s32 func_80834B5C(Player* this, PlayState* play); s32 func_80834C74(Player* this, PlayState* play); s32 func_8083501C(Player* this, PlayState* play); @@ -149,7 +145,7 @@ s32 func_808359FC(Player* this, PlayState* play); // Throw boomerang s32 spawn_boomerang_ivan(EnPartner* this, PlayState* play); // Throw boomerang Ivan s32 func_80835B60(Player* this, PlayState* play); // Boomerang active s32 func_80835C08(Player* this, PlayState* play); -void func_80835F44(PlayState* play, Player* this, s32 item); +void Player_UseItem(PlayState* play, Player* this, s32 item); void func_80839F90(Player* this, PlayState* play); s32 func_80838A14(Player* this, PlayState* play); s32 func_80839800(Player* this, PlayState* play); @@ -347,7 +343,7 @@ void func_80852E14(Player* this, PlayState* play); s32 Player_IsDroppingFish(PlayState* play); s32 Player_StartFishing(PlayState* play); s32 func_80852F38(PlayState* play, Player* this); -s32 func_80852FFC(PlayState* play, Actor* actor, s32 csMode); +s32 Player_TryCsAction(PlayState* play, Actor* actor, s32 csAction); void func_80853080(Player* this, PlayState* play); s32 Player_InflictDamage(PlayState* play, s32 damage); s32 Player_InflictDamageModified(PlayState* play, s32 damage, u8 modified); @@ -356,12 +352,35 @@ void func_80853148(PlayState* play, Actor* actor); // .bss part 1 static s32 D_80858AA0; static s32 D_80858AA4; -static Vec3f D_80858AA8; +static Vec3f sInteractWallCheckResult; static Input* sControlInput; // .data -static u8 D_80853410[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }; +static u8 sUpperBodyLimbCopyMap[PLAYER_LIMB_MAX] = { + false, // PLAYER_LIMB_NONE + false, // PLAYER_LIMB_ROOT + false, // PLAYER_LIMB_WAIST + false, // PLAYER_LIMB_LOWER + false, // PLAYER_LIMB_R_THIGH + false, // PLAYER_LIMB_R_SHIN + false, // PLAYER_LIMB_R_FOOT + false, // PLAYER_LIMB_L_THIGH + false, // PLAYER_LIMB_L_SHIN + false, // PLAYER_LIMB_L_FOOT + true, // PLAYER_LIMB_UPPER + true, // PLAYER_LIMB_HEAD + true, // PLAYER_LIMB_HAT + true, // PLAYER_LIMB_COLLAR + true, // PLAYER_LIMB_L_SHOULDER + true, // PLAYER_LIMB_L_FOREARM + true, // PLAYER_LIMB_L_HAND + true, // PLAYER_LIMB_R_SHOULDER + true, // PLAYER_LIMB_R_FOREARM + true, // PLAYER_LIMB_R_HAND + true, // PLAYER_LIMB_SHEATH + true // PLAYER_LIMB_TORSO +}; static PlayerAgeProperties sAgeProperties[] = { { @@ -471,24 +490,24 @@ static PlayerAgeProperties sAgeProperties[] = { }; static u32 D_808535D0 = false; -static f32 D_808535D4 = 0.0f; -static s16 D_808535D8 = 0; +static f32 sControlStickMagnitude = 0.0f; +static s16 sControlStickAngle = 0; static s16 D_808535DC = 0; static s32 D_808535E0 = 0; -static s32 D_808535E4 = 0; +static s32 sFloorType = 0; static f32 D_808535E8 = 1.0f; static f32 D_808535EC = 1.0f; -static u32 D_808535F0 = 0; -static u32 D_808535F4 = 0; -static s16 D_808535F8 = 0; -static s16 D_808535FC = 0; -static f32 D_80853600 = 0.0f; -static s32 D_80853604 = 0; -static s32 D_80853608 = 0; -static s32 D_8085360C = 0; -static s16 D_80853610 = 0; -static s32 D_80853614 = 0; // Held item button just pressed? -static s32 D_80853618 = 0; // Held item button currently down? +static u32 sTouchedWallFlags = 0; +static u32 sConveyorSpeed = 0; +static s16 sIsFloorConveyor = 0; +static s16 sConveyorYaw = 0; +static f32 sYDistToFloor = 0.0f; +static s32 sPrevFloorProperty = 0; +static s32 sShapeYawToTouchedWall = 0; +static s32 sWorldYawToTouchedWall = 0; +static s16 sFloorShapePitch = 0; +static s32 sUseHeldItem = false; // When true, the current held item is used. Is reset to false every frame. +static s32 sHeldItemButtonIsHeldDown = false; // Indicates if the button for the current held item is held down. static u16 D_8085361C[] = { NA_SE_VO_LI_SWEAT, @@ -497,6 +516,8 @@ static u16 D_8085361C[] = { NA_SE_VO_LI_FALL_L, }; +#define GET_PLAYER_ANIM(group, type) D_80853914[group][type] + static LinkAnimationHeader* D_80853914[PLAYER_ANIMGROUP_MAX][PLAYER_ANIMTYPE_MAX] = { /* PLAYER_ANIMGROUP_wait */ { @@ -933,54 +954,54 @@ static LinkAnimationHeader* D_80853D7C[][2] = { { &gPlayerAnim_link_wait_itemD2_20f, &gPlayerAnim_link_wait_itemD2_20f } }; -static struct_80832924 D_80853DEC[] = { +static AnimSfxEntry D_80853DEC[] = { { NA_SE_VO_LI_SNEEZE, -0x2008 }, }; -static struct_80832924 D_80853DF0[] = { +static AnimSfxEntry D_80853DF0[] = { { NA_SE_VO_LI_SWEAT, -0x2012 }, }; -static struct_80832924 D_80853DF4[] = { +static AnimSfxEntry D_80853DF4[] = { { NA_SE_VO_LI_BREATH_REST, -0x200D }, }; -static struct_80832924 D_80853DF8[] = { +static AnimSfxEntry D_80853DF8[] = { { NA_SE_VO_LI_BREATH_REST, -0x200A }, }; -static struct_80832924 D_80853DFC[] = { +static AnimSfxEntry D_80853DFC[] = { { NA_SE_PL_CALM_HIT, 0x82C }, { NA_SE_PL_CALM_HIT, 0x830 }, { NA_SE_PL_CALM_HIT, 0x834 }, { NA_SE_PL_CALM_HIT, 0x838 }, { NA_SE_PL_CALM_HIT, -0x83C }, }; -static struct_80832924 D_80853E10[] = { +static AnimSfxEntry D_80853E10[] = { { 0, 0x4019 }, { 0, 0x401E }, { 0, 0x402C }, { 0, 0x4030 }, { 0, 0x4034 }, { 0, -0x4038 }, }; -static struct_80832924 D_80853E28[] = { +static AnimSfxEntry D_80853E28[] = { { NA_SE_IT_SHIELD_POSTURE, 0x810 }, { NA_SE_IT_SHIELD_POSTURE, 0x814 }, { NA_SE_IT_SHIELD_POSTURE, -0x846 }, }; -static struct_80832924 D_80853E34[] = { +static AnimSfxEntry D_80853E34[] = { { NA_SE_IT_HAMMER_SWING, 0x80A }, { NA_SE_VO_LI_AUTO_JUMP, 0x200A }, { NA_SE_IT_SWORD_SWING, 0x816 }, { NA_SE_VO_LI_SWORD_N, -0x2016 }, }; -static struct_80832924 D_80853E44[] = { +static AnimSfxEntry D_80853E44[] = { { NA_SE_IT_SWORD_SWING, 0x827 }, { NA_SE_VO_LI_SWORD_N, -0x2027 }, }; -static struct_80832924 D_80853E4C[] = { +static AnimSfxEntry D_80853E4C[] = { { NA_SE_VO_LI_RELAX, -0x2014 }, }; -static struct_80832924* D_80853E50[] = { +static AnimSfxEntry* D_80853E50[] = { D_80853DEC, D_80853DF0, D_80853DF4, D_80853DF8, D_80853DFC, D_80853E10, D_80853E28, D_80853E34, D_80853E44, D_80853E4C, NULL, }; @@ -989,162 +1010,293 @@ static u8 D_80853E7C[] = { 0, 0, 1, 1, 2, 2, 2, 2, 10, 10, 10, 10, 10, 10, 3, 3, 4, 4, 8, 8, 5, 5, 6, 6, 7, 7, 9, 9, 0, }; -// Used to map item IDs to action params -static s8 sItemActionParams[] = { - PLAYER_IA_DEKU_STICK, - PLAYER_IA_DEKU_NUT, - PLAYER_IA_BOMB, - PLAYER_IA_BOW, - PLAYER_IA_BOW_FIRE, - PLAYER_IA_DINS_FIRE, - PLAYER_IA_SLINGSHOT, - PLAYER_IA_OCARINA_FAIRY, - PLAYER_IA_OCARINA_OF_TIME, - PLAYER_IA_BOMBCHU, - PLAYER_IA_HOOKSHOT, - PLAYER_IA_LONGSHOT, - PLAYER_IA_BOW_ICE, - PLAYER_IA_FARORES_WIND, - PLAYER_IA_BOOMERANG, - PLAYER_IA_LENS_OF_TRUTH, - PLAYER_IA_MAGIC_BEAN, - PLAYER_IA_HAMMER, - PLAYER_IA_BOW_LIGHT, - PLAYER_IA_NAYRUS_LOVE, - PLAYER_IA_BOTTLE, - PLAYER_IA_BOTTLE_POTION_RED, - PLAYER_IA_BOTTLE_POTION_GREEN, - PLAYER_IA_BOTTLE_POTION_BLUE, - PLAYER_IA_BOTTLE_FAIRY, - PLAYER_IA_BOTTLE_FISH, - PLAYER_IA_BOTTLE_MILK_FULL, - PLAYER_IA_BOTTLE_RUTOS_LETTER, - PLAYER_IA_BOTTLE_FIRE, - PLAYER_IA_BOTTLE_BUG, - PLAYER_IA_BOTTLE_BIG_POE, - PLAYER_IA_BOTTLE_MILK_HALF, - PLAYER_IA_BOTTLE_POE, - PLAYER_IA_WEIRD_EGG, - PLAYER_IA_CHICKEN, - PLAYER_IA_ZELDAS_LETTER, - PLAYER_IA_MASK_KEATON, - PLAYER_IA_MASK_SKULL, - PLAYER_IA_MASK_SPOOKY, - PLAYER_IA_MASK_BUNNY_HOOD, - PLAYER_IA_MASK_GORON, - PLAYER_IA_MASK_ZORA, - PLAYER_IA_MASK_GERUDO, - PLAYER_IA_MASK_TRUTH, - PLAYER_IA_SWORD_MASTER, - PLAYER_IA_POCKET_EGG, - PLAYER_IA_POCKET_CUCCO, - PLAYER_IA_COJIRO, - PLAYER_IA_ODD_MUSHROOM, - PLAYER_IA_ODD_POTION, - PLAYER_IA_POACHERS_SAW, - PLAYER_IA_BROKEN_GORONS_SWORD, - PLAYER_IA_PRESCRIPTION, - PLAYER_IA_FROG, - PLAYER_IA_EYEDROPS, - PLAYER_IA_CLAIM_CHECK, - PLAYER_IA_BOW_FIRE, - PLAYER_IA_BOW_ICE, - PLAYER_IA_BOW_LIGHT, - PLAYER_IA_SWORD_KOKIRI, - PLAYER_IA_SWORD_MASTER, - PLAYER_IA_SWORD_BIGGORON, - PLAYER_IA_SHIELD_DEKU, - PLAYER_IA_SHIELD_HYLIAN, - PLAYER_IA_SHIELD_MIRROR, - PLAYER_IA_TUNIC_KOKIRI, - PLAYER_IA_TUNIC_GORON, - PLAYER_IA_TUNIC_ZORA, - PLAYER_IA_BOOTS_KOKIRI, - PLAYER_IA_BOOTS_IRON, - PLAYER_IA_BOOTS_HOVER, +// Used to map item IDs to item actions +static s8 sItemActions[] = { + PLAYER_IA_DEKU_STICK, // ITEM_DEKU_STICK + PLAYER_IA_DEKU_NUT, // ITEM_DEKU_NUT + PLAYER_IA_BOMB, // ITEM_BOMB + PLAYER_IA_BOW, // ITEM_BOW + PLAYER_IA_BOW_FIRE, // ITEM_ARROW_FIRE + PLAYER_IA_DINS_FIRE, // ITEM_DINS_FIRE + PLAYER_IA_SLINGSHOT, // ITEM_SLINGSHOT + PLAYER_IA_OCARINA_FAIRY, // ITEM_OCARINA_FAIRY + PLAYER_IA_OCARINA_OF_TIME, // ITEM_OCARINA_OF_TIME + PLAYER_IA_BOMBCHU, // ITEM_BOMBCHU + PLAYER_IA_HOOKSHOT, // ITEM_HOOKSHOT + PLAYER_IA_LONGSHOT, // ITEM_LONGSHOT + PLAYER_IA_BOW_ICE, // ITEM_ARROW_ICE + PLAYER_IA_FARORES_WIND, // ITEM_FARORES_WIND + PLAYER_IA_BOOMERANG, // ITEM_BOOMERANG + PLAYER_IA_LENS_OF_TRUTH, // ITEM_LENS_OF_TRUTH + PLAYER_IA_MAGIC_BEAN, // ITEM_MAGIC_BEAN + PLAYER_IA_HAMMER, // ITEM_HAMMER + PLAYER_IA_BOW_LIGHT, // ITEM_ARROW_LIGHT + PLAYER_IA_NAYRUS_LOVE, // ITEM_NAYRUS_LOVE + PLAYER_IA_BOTTLE, // ITEM_BOTTLE_EMPTY + PLAYER_IA_BOTTLE_POTION_RED, // ITEM_BOTTLE_POTION_RED + PLAYER_IA_BOTTLE_POTION_GREEN, // ITEM_BOTTLE_POTION_GREEN + PLAYER_IA_BOTTLE_POTION_BLUE, // ITEM_BOTTLE_POTION_BLUE + PLAYER_IA_BOTTLE_FAIRY, // ITEM_BOTTLE_FAIRY + PLAYER_IA_BOTTLE_FISH, // ITEM_BOTTLE_FISH + PLAYER_IA_BOTTLE_MILK_FULL, // ITEM_BOTTLE_MILK_FULL + PLAYER_IA_BOTTLE_RUTOS_LETTER, // ITEM_BOTTLE_RUTOS_LETTER + PLAYER_IA_BOTTLE_FIRE, // ITEM_BOTTLE_BLUE_FIRE + PLAYER_IA_BOTTLE_BUG, // ITEM_BOTTLE_BUG + PLAYER_IA_BOTTLE_BIG_POE, // ITEM_BOTTLE_BIG_POE + PLAYER_IA_BOTTLE_MILK_HALF, // ITEM_BOTTLE_MILK_HALF + PLAYER_IA_BOTTLE_POE, // ITEM_BOTTLE_POE + PLAYER_IA_WEIRD_EGG, // ITEM_WEIRD_EGG + PLAYER_IA_CHICKEN, // ITEM_CHICKEN + PLAYER_IA_ZELDAS_LETTER, // ITEM_ZELDAS_LETTER + PLAYER_IA_MASK_KEATON, // ITEM_MASK_KEATON + PLAYER_IA_MASK_SKULL, // ITEM_MASK_SKULL + PLAYER_IA_MASK_SPOOKY, // ITEM_MASK_SPOOKY + PLAYER_IA_MASK_BUNNY_HOOD, // ITEM_MASK_BUNNY_HOOD + PLAYER_IA_MASK_GORON, // ITEM_MASK_GORON + PLAYER_IA_MASK_ZORA, // ITEM_MASK_ZORA + PLAYER_IA_MASK_GERUDO, // ITEM_MASK_GERUDO + PLAYER_IA_MASK_TRUTH, // ITEM_MASK_TRUTH + PLAYER_IA_SWORD_MASTER, // ITEM_SOLD_OUT + PLAYER_IA_POCKET_EGG, // ITEM_POCKET_EGG + PLAYER_IA_POCKET_CUCCO, // ITEM_POCKET_CUCCO + PLAYER_IA_COJIRO, // ITEM_COJIRO + PLAYER_IA_ODD_MUSHROOM, // ITEM_ODD_MUSHROOM + PLAYER_IA_ODD_POTION, // ITEM_ODD_POTION + PLAYER_IA_POACHERS_SAW, // ITEM_POACHERS_SAW + PLAYER_IA_BROKEN_GORONS_SWORD, // ITEM_BROKEN_GORONS_SWORD + PLAYER_IA_PRESCRIPTION, // ITEM_PRESCRIPTION + PLAYER_IA_FROG, // ITEM_EYEBALL_FROG + PLAYER_IA_EYEDROPS, // ITEM_EYE_DROPS + PLAYER_IA_CLAIM_CHECK, // ITEM_CLAIM_CHECK + PLAYER_IA_BOW_FIRE, // ITEM_BOW_FIRE + PLAYER_IA_BOW_ICE, // ITEM_BOW_ICE + PLAYER_IA_BOW_LIGHT, // ITEM_BOW_LIGHT + PLAYER_IA_SWORD_KOKIRI, // ITEM_SWORD_KOKIRI + PLAYER_IA_SWORD_MASTER, // ITEM_SWORD_MASTER + PLAYER_IA_SWORD_BIGGORON, // ITEM_SWORD_BIGGORON + PLAYER_IA_SHIELD_DEKU, // ITEM_SHIELD_DEKU + PLAYER_IA_SHIELD_HYLIAN, // ITEM_SHIELD_HYLIAN + PLAYER_IA_SHIELD_MIRROR, // ITEM_SHIELD_MIRROR + PLAYER_IA_TUNIC_KOKIRI, // ITEM_TUNIC_KOKIRI + PLAYER_IA_TUNIC_GORON, // ITEM_TUNIC_GORON + PLAYER_IA_TUNIC_ZORA, // ITEM_TUNIC_ZORA + PLAYER_IA_BOOTS_KOKIRI, // ITEM_BOOTS_KOKIRI + PLAYER_IA_BOOTS_IRON, // ITEM_BOOTS_IRON + PLAYER_IA_BOOTS_HOVER, // ITEM_BOOTS_HOVER }; static u8 sMaskMemory; u8 gWalkSpeedToggle1; u8 gWalkSpeedToggle2; -// Used to map action params to update functions -static s32 (*D_80853EDC[])(Player* this, PlayState* play) = { - func_8083485C, func_8083485C, func_8083485C, func_808349DC, func_808349DC, func_808349DC, func_8083485C, - func_8083485C, func_8083501C, func_8083501C, func_8083501C, func_8083501C, func_8083501C, func_8083501C, - func_8083501C, func_8083501C, func_8083501C, func_8083501C, func_808356E8, func_808356E8, func_80835800, - func_8083485C, func_8083485C, func_8083485C, func_8083485C, func_8083485C, func_8083485C, func_8083485C, - func_8083485C, func_8083485C, func_8083485C, func_8083485C, func_8083485C, func_8083485C, func_8083485C, - func_8083485C, func_8083485C, func_8083485C, func_8083485C, func_8083485C, func_8083485C, func_8083485C, - func_8083485C, func_8083485C, func_8083485C, func_8083485C, func_8083485C, func_8083485C, func_8083485C, - func_8083485C, func_8083485C, func_8083485C, func_8083485C, func_8083485C, func_8083485C, func_8083485C, - func_8083485C, func_8083485C, func_8083485C, func_8083485C, func_8083485C, func_8083485C, func_8083485C, - func_8083485C, func_8083485C, func_8083485C, func_8083485C, func_8083485C, func_8083485C, func_8083485C, - func_8083485C, func_8083485C, func_8083485C, func_8083485C, func_8083485C, func_8083485C, +static s32 (*sItemActionUpdateFuncs[])(Player* this, PlayState* play) = { + func_8083485C, // PLAYER_IA_NONE + func_8083485C, // PLAYER_IA_SWORD_CS + func_8083485C, // PLAYER_IA_FISHING_POLE + func_808349DC, // PLAYER_IA_SWORD_MASTER + func_808349DC, // PLAYER_IA_SWORD_KOKIRI + func_808349DC, // PLAYER_IA_SWORD_BIGGORON + func_8083485C, // PLAYER_IA_DEKU_STICK + func_8083485C, // PLAYER_IA_HAMMER + func_8083501C, // PLAYER_IA_BOW + func_8083501C, // PLAYER_IA_BOW_FIRE + func_8083501C, // PLAYER_IA_BOW_ICE + func_8083501C, // PLAYER_IA_BOW_LIGHT + func_8083501C, // PLAYER_IA_BOW_0C + func_8083501C, // PLAYER_IA_BOW_0D + func_8083501C, // PLAYER_IA_BOW_0E + func_8083501C, // PLAYER_IA_SLINGSHOT + func_8083501C, // PLAYER_IA_HOOKSHOT + func_8083501C, // PLAYER_IA_LONGSHOT + func_808356E8, // PLAYER_IA_BOMB + func_808356E8, // PLAYER_IA_BOMBCHU + func_80835800, // PLAYER_IA_BOOMERANG + func_8083485C, // PLAYER_IA_MAGIC_SPELL_15 + func_8083485C, // PLAYER_IA_MAGIC_SPELL_16 + func_8083485C, // PLAYER_IA_MAGIC_SPELL_17 + func_8083485C, // PLAYER_IA_FARORES_WIND + func_8083485C, // PLAYER_IA_NAYRUS_LOVE + func_8083485C, // PLAYER_IA_DINS_FIRE + func_8083485C, // PLAYER_IA_DEKU_NUT + func_8083485C, // PLAYER_IA_OCARINA_FAIRY + func_8083485C, // PLAYER_IA_OCARINA_OF_TIME + func_8083485C, // PLAYER_IA_BOTTLE + func_8083485C, // PLAYER_IA_BOTTLE_FISH + func_8083485C, // PLAYER_IA_BOTTLE_FIRE + func_8083485C, // PLAYER_IA_BOTTLE_BUG + func_8083485C, // PLAYER_IA_BOTTLE_POE + func_8083485C, // PLAYER_IA_BOTTLE_BIG_POE + func_8083485C, // PLAYER_IA_BOTTLE_RUTOS_LETTER + func_8083485C, // PLAYER_IA_BOTTLE_POTION_RED + func_8083485C, // PLAYER_IA_BOTTLE_POTION_BLUE + func_8083485C, // PLAYER_IA_BOTTLE_POTION_GREEN + func_8083485C, // PLAYER_IA_BOTTLE_MILK_FULL + func_8083485C, // PLAYER_IA_BOTTLE_MILK_HALF + func_8083485C, // PLAYER_IA_BOTTLE_FAIRY + func_8083485C, // PLAYER_IA_ZELDAS_LETTER + func_8083485C, // PLAYER_IA_WEIRD_EGG + func_8083485C, // PLAYER_IA_CHICKEN + func_8083485C, // PLAYER_IA_MAGIC_BEAN + func_8083485C, // PLAYER_IA_POCKET_EGG + func_8083485C, // PLAYER_IA_POCKET_CUCCO + func_8083485C, // PLAYER_IA_COJIRO + func_8083485C, // PLAYER_IA_ODD_MUSHROOM + func_8083485C, // PLAYER_IA_ODD_POTION + func_8083485C, // PLAYER_IA_POACHERS_SAW + func_8083485C, // PLAYER_IA_BROKEN_GORONS_SWORD + func_8083485C, // PLAYER_IA_PRESCRIPTION + func_8083485C, // PLAYER_IA_FROG + func_8083485C, // PLAYER_IA_EYEDROPS + func_8083485C, // PLAYER_IA_CLAIM_CHECK + func_8083485C, // PLAYER_IA_MASK_KEATON + func_8083485C, // PLAYER_IA_MASK_SKULL + func_8083485C, // PLAYER_IA_MASK_SPOOKY + func_8083485C, // PLAYER_IA_MASK_BUNNY_HOOD + func_8083485C, // PLAYER_IA_MASK_GORON + func_8083485C, // PLAYER_IA_MASK_ZORA + func_8083485C, // PLAYER_IA_MASK_GERUDO + func_8083485C, // PLAYER_IA_MASK_TRUTH + func_8083485C, // PLAYER_IA_LENS_OF_TRUTH + func_8083485C, // PLAYER_IA_SHIELD_DEKU + func_8083485C, // PLAYER_IA_SHIELD_HYLIAN + func_8083485C, // PLAYER_IA_SHIELD_MIRROR + func_8083485C, // PLAYER_IA_TUNIC_KOKIRI + func_8083485C, // PLAYER_IA_TUNIC_GORON + func_8083485C, // PLAYER_IA_TUNIC_ZORA + func_8083485C, // PLAYER_IA_BOOTS_KOKIRI + func_8083485C, // PLAYER_IA_BOOTS_IRON + func_8083485C, // PLAYER_IA_BOOTS_HOVER }; -static void (*D_80853FE8[])(PlayState* play, Player* this) = { - func_80833770, func_80833770, func_80833770, func_80833770, func_80833770, func_80833770, func_8083377C, - func_80833790, func_8083379C, func_8083379C, func_8083379C, func_8083379C, func_8083379C, func_8083379C, - func_8083379C, func_8083379C, func_80833910, func_80833910, func_808337D4, func_808337D4, func_80833984, - func_80833770, func_80833770, func_80833770, func_80833770, func_80833770, func_80833770, func_80833770, - func_80833770, func_80833770, func_80833770, func_80833770, func_80833770, func_80833770, func_80833770, - func_80833770, func_80833770, func_80833770, func_80833770, func_80833770, func_80833770, func_80833770, - func_80833770, func_80833770, func_80833770, func_80833770, func_80833770, func_80833770, func_80833770, - func_80833770, func_80833770, func_80833770, func_80833770, func_80833770, func_80833770, func_80833770, - func_80833770, func_80833770, func_80833770, func_80833770, func_80833770, func_80833770, func_80833770, - func_80833770, func_80833770, func_80833770, func_80833770, func_80833770, func_80833770, func_80833770, - func_80833770, func_80833770, func_80833770, func_80833770, func_80833770, func_80833770, +static void (*sItemActionInitFuncs[])(PlayState* play, Player* this) = { + func_80833770, // PLAYER_IA_NONE + func_80833770, // PLAYER_IA_SWORD_CS + func_80833770, // PLAYER_IA_FISHING_POLE + func_80833770, // PLAYER_IA_SWORD_MASTER + func_80833770, // PLAYER_IA_SWORD_KOKIRI + func_80833770, // PLAYER_IA_SWORD_BIGGORON + func_8083377C, // PLAYER_IA_DEKU_STICK + func_80833790, // PLAYER_IA_HAMMER + func_8083379C, // PLAYER_IA_BOW + func_8083379C, // PLAYER_IA_BOW_FIRE + func_8083379C, // PLAYER_IA_BOW_ICE + func_8083379C, // PLAYER_IA_BOW_LIGHT + func_8083379C, // PLAYER_IA_BOW_0C + func_8083379C, // PLAYER_IA_BOW_0D + func_8083379C, // PLAYER_IA_BOW_0E + func_8083379C, // PLAYER_IA_SLINGSHOT + func_80833910, // PLAYER_IA_HOOKSHOT + func_80833910, // PLAYER_IA_LONGSHOT + func_808337D4, // PLAYER_IA_BOMB + func_808337D4, // PLAYER_IA_BOMBCHU + func_80833984, // PLAYER_IA_BOOMERANG + func_80833770, // PLAYER_IA_MAGIC_SPELL_15 + func_80833770, // PLAYER_IA_MAGIC_SPELL_16 + func_80833770, // PLAYER_IA_MAGIC_SPELL_17 + func_80833770, // PLAYER_IA_FARORES_WIND + func_80833770, // PLAYER_IA_NAYRUS_LOVE + func_80833770, // PLAYER_IA_DINS_FIRE + func_80833770, // PLAYER_IA_DEKU_NUT + func_80833770, // PLAYER_IA_OCARINA_FAIRY + func_80833770, // PLAYER_IA_OCARINA_OF_TIME + func_80833770, // PLAYER_IA_BOTTLE + func_80833770, // PLAYER_IA_BOTTLE_FISH + func_80833770, // PLAYER_IA_BOTTLE_FIRE + func_80833770, // PLAYER_IA_BOTTLE_BUG + func_80833770, // PLAYER_IA_BOTTLE_POE + func_80833770, // PLAYER_IA_BOTTLE_BIG_POE + func_80833770, // PLAYER_IA_BOTTLE_RUTOS_LETTER + func_80833770, // PLAYER_IA_BOTTLE_POTION_RED + func_80833770, // PLAYER_IA_BOTTLE_POTION_BLUE + func_80833770, // PLAYER_IA_BOTTLE_POTION_GREEN + func_80833770, // PLAYER_IA_BOTTLE_MILK_FULL + func_80833770, // PLAYER_IA_BOTTLE_MILK_HALF + func_80833770, // PLAYER_IA_BOTTLE_FAIRY + func_80833770, // PLAYER_IA_ZELDAS_LETTER + func_80833770, // PLAYER_IA_WEIRD_EGG + func_80833770, // PLAYER_IA_CHICKEN + func_80833770, // PLAYER_IA_MAGIC_BEAN + func_80833770, // PLAYER_IA_POCKET_EGG + func_80833770, // PLAYER_IA_POCKET_CUCCO + func_80833770, // PLAYER_IA_COJIRO + func_80833770, // PLAYER_IA_ODD_MUSHROOM + func_80833770, // PLAYER_IA_ODD_POTION + func_80833770, // PLAYER_IA_POACHERS_SAW + func_80833770, // PLAYER_IA_BROKEN_GORONS_SWORD + func_80833770, // PLAYER_IA_PRESCRIPTION + func_80833770, // PLAYER_IA_FROG + func_80833770, // PLAYER_IA_EYEDROPS + func_80833770, // PLAYER_IA_CLAIM_CHECK + func_80833770, // PLAYER_IA_MASK_KEATON + func_80833770, // PLAYER_IA_MASK_SKULL + func_80833770, // PLAYER_IA_MASK_SPOOKY + func_80833770, // PLAYER_IA_MASK_BUNNY_HOOD + func_80833770, // PLAYER_IA_MASK_GORON + func_80833770, // PLAYER_IA_MASK_ZORA + func_80833770, // PLAYER_IA_MASK_GERUDO + func_80833770, // PLAYER_IA_MASK_TRUTH + func_80833770, // PLAYER_IA_LENS_OF_TRUTH + func_80833770, // PLAYER_IA_SHIELD_DEKU + func_80833770, // PLAYER_IA_SHIELD_HYLIAN + func_80833770, // PLAYER_IA_SHIELD_MIRROR + func_80833770, // PLAYER_IA_TUNIC_KOKIRI + func_80833770, // PLAYER_IA_TUNIC_GORON + func_80833770, // PLAYER_IA_TUNIC_ZORA + func_80833770, // PLAYER_IA_BOOTS_KOKIRI + func_80833770, // PLAYER_IA_BOOTS_IRON + func_80833770, // PLAYER_IA_BOOTS_HOVER }; typedef enum { - /* 0 */ PLAYER_D_808540F4_0, - /* 1 */ PLAYER_D_808540F4_1, - /* 2 */ PLAYER_D_808540F4_2, - /* 3 */ PLAYER_D_808540F4_3, - /* 4 */ PLAYER_D_808540F4_4, - /* 5 */ PLAYER_D_808540F4_5, - /* 6 */ PLAYER_D_808540F4_6, - /* 7 */ PLAYER_D_808540F4_7, - /* 8 */ PLAYER_D_808540F4_8, - /* 9 */ PLAYER_D_808540F4_9, - /* 10 */ PLAYER_D_808540F4_10, - /* 11 */ PLAYER_D_808540F4_11, - /* 12 */ PLAYER_D_808540F4_12, - /* 13 */ PLAYER_D_808540F4_13, - /* 14 */ PLAYER_D_808540F4_MAX -} PlayerD_808540F4Index; + /* 0 */ PLAYER_ITEM_CHG_0, + /* 1 */ PLAYER_ITEM_CHG_1, + /* 2 */ PLAYER_ITEM_CHG_2, + /* 3 */ PLAYER_ITEM_CHG_3, + /* 4 */ PLAYER_ITEM_CHG_4, + /* 5 */ PLAYER_ITEM_CHG_5, + /* 6 */ PLAYER_ITEM_CHG_6, + /* 7 */ PLAYER_ITEM_CHG_7, + /* 8 */ PLAYER_ITEM_CHG_8, + /* 9 */ PLAYER_ITEM_CHG_9, + /* 10 */ PLAYER_ITEM_CHG_10, + /* 11 */ PLAYER_ITEM_CHG_11, + /* 12 */ PLAYER_ITEM_CHG_12, + /* 13 */ PLAYER_ITEM_CHG_13, + /* 14 */ PLAYER_ITEM_CHG_MAX +} ItemChangeType; -static struct_808540F4 D_808540F4[PLAYER_D_808540F4_MAX] = { - /* PLAYER_D_808540F4_0 */ { &gPlayerAnim_link_normal_free2free, 12 }, - /* PLAYER_D_808540F4_1 */ { &gPlayerAnim_link_normal_normal2fighter, 6 }, - /* PLAYER_D_808540F4_2 */ { &gPlayerAnim_link_hammer_normal2long, 8 }, - /* PLAYER_D_808540F4_3 */ { &gPlayerAnim_link_normal_normal2free, 8 }, - /* PLAYER_D_808540F4_4 */ { &gPlayerAnim_link_fighter_fighter2long, 8 }, - /* PLAYER_D_808540F4_5 */ { &gPlayerAnim_link_normal_fighter2free, 10 }, - /* PLAYER_D_808540F4_6 */ { &gPlayerAnim_link_hammer_long2free, 7 }, - /* PLAYER_D_808540F4_7 */ { &gPlayerAnim_link_hammer_long2long, 11 }, - /* PLAYER_D_808540F4_8 */ { &gPlayerAnim_link_normal_free2free, 12 }, - /* PLAYER_D_808540F4_9 */ { &gPlayerAnim_link_normal_normal2bom, 4 }, - /* PLAYER_D_808540F4_10 */ { &gPlayerAnim_link_normal_long2bom, 4 }, - /* PLAYER_D_808540F4_11 */ { &gPlayerAnim_link_normal_free2bom, 4 }, - /* PLAYER_D_808540F4_12 */ { &gPlayerAnim_link_anchor_anchor2fighter, 5 }, - /* PLAYER_D_808540F4_13 */ { &gPlayerAnim_link_normal_free2freeB, 13 }, +static ItemChangeInfo sItemChangeInfo[PLAYER_ITEM_CHG_MAX] = { + /* PLAYER_ITEM_CHG_0 */ { &gPlayerAnim_link_normal_free2free, 12 }, + /* PLAYER_ITEM_CHG_1 */ { &gPlayerAnim_link_normal_normal2fighter, 6 }, + /* PLAYER_ITEM_CHG_2 */ { &gPlayerAnim_link_hammer_normal2long, 8 }, + /* PLAYER_ITEM_CHG_3 */ { &gPlayerAnim_link_normal_normal2free, 8 }, + /* PLAYER_ITEM_CHG_4 */ { &gPlayerAnim_link_fighter_fighter2long, 8 }, + /* PLAYER_ITEM_CHG_5 */ { &gPlayerAnim_link_normal_fighter2free, 10 }, + /* PLAYER_ITEM_CHG_6 */ { &gPlayerAnim_link_hammer_long2free, 7 }, + /* PLAYER_ITEM_CHG_7 */ { &gPlayerAnim_link_hammer_long2long, 11 }, + /* PLAYER_ITEM_CHG_8 */ { &gPlayerAnim_link_normal_free2free, 12 }, + /* PLAYER_ITEM_CHG_9 */ { &gPlayerAnim_link_normal_normal2bom, 4 }, + /* PLAYER_ITEM_CHG_10 */ { &gPlayerAnim_link_normal_long2bom, 4 }, + /* PLAYER_ITEM_CHG_11 */ { &gPlayerAnim_link_normal_free2bom, 4 }, + /* PLAYER_ITEM_CHG_12 */ { &gPlayerAnim_link_anchor_anchor2fighter, 5 }, + /* PLAYER_ITEM_CHG_13 */ { &gPlayerAnim_link_normal_free2freeB, 13 }, }; -static s8 D_80854164[PLAYER_ANIMTYPE_MAX][PLAYER_ANIMTYPE_MAX] = { - { PLAYER_D_808540F4_8, -PLAYER_D_808540F4_5, -PLAYER_D_808540F4_3, -PLAYER_D_808540F4_6, PLAYER_D_808540F4_8, - PLAYER_D_808540F4_11 }, - { PLAYER_D_808540F4_5, PLAYER_D_808540F4_0, -PLAYER_D_808540F4_1, PLAYER_D_808540F4_4, PLAYER_D_808540F4_5, - PLAYER_D_808540F4_9 }, - { PLAYER_D_808540F4_3, PLAYER_D_808540F4_1, PLAYER_D_808540F4_0, PLAYER_D_808540F4_2, PLAYER_D_808540F4_3, - PLAYER_D_808540F4_9 }, - { PLAYER_D_808540F4_6, -PLAYER_D_808540F4_4, -PLAYER_D_808540F4_2, PLAYER_D_808540F4_7, PLAYER_D_808540F4_6, - PLAYER_D_808540F4_10 }, - { PLAYER_D_808540F4_8, -PLAYER_D_808540F4_5, -PLAYER_D_808540F4_3, -PLAYER_D_808540F4_6, PLAYER_D_808540F4_8, - PLAYER_D_808540F4_11 }, - { PLAYER_D_808540F4_8, -PLAYER_D_808540F4_5, -PLAYER_D_808540F4_3, -PLAYER_D_808540F4_6, PLAYER_D_808540F4_8, - PLAYER_D_808540F4_11 }, +// Maps the appropriate ItemChangeType based on current and next animtype. +// A negative type value means the corresponding animation should be played in reverse. +static s8 sItemChangeTypes[PLAYER_ANIMTYPE_MAX][PLAYER_ANIMTYPE_MAX] = { + { PLAYER_ITEM_CHG_8, -PLAYER_ITEM_CHG_5, -PLAYER_ITEM_CHG_3, -PLAYER_ITEM_CHG_6, PLAYER_ITEM_CHG_8, + PLAYER_ITEM_CHG_11 }, + { PLAYER_ITEM_CHG_5, PLAYER_ITEM_CHG_0, -PLAYER_ITEM_CHG_1, PLAYER_ITEM_CHG_4, PLAYER_ITEM_CHG_5, + PLAYER_ITEM_CHG_9 }, + { PLAYER_ITEM_CHG_3, PLAYER_ITEM_CHG_1, PLAYER_ITEM_CHG_0, PLAYER_ITEM_CHG_2, PLAYER_ITEM_CHG_3, + PLAYER_ITEM_CHG_9 }, + { PLAYER_ITEM_CHG_6, -PLAYER_ITEM_CHG_4, -PLAYER_ITEM_CHG_2, PLAYER_ITEM_CHG_7, PLAYER_ITEM_CHG_6, + PLAYER_ITEM_CHG_10 }, + { PLAYER_ITEM_CHG_8, -PLAYER_ITEM_CHG_5, -PLAYER_ITEM_CHG_3, -PLAYER_ITEM_CHG_6, PLAYER_ITEM_CHG_8, + PLAYER_ITEM_CHG_11 }, + { PLAYER_ITEM_CHG_8, -PLAYER_ITEM_CHG_5, -PLAYER_ITEM_CHG_3, -PLAYER_ITEM_CHG_6, PLAYER_ITEM_CHG_8, + PLAYER_ITEM_CHG_11 }, }; static ExplosiveInfo sExplosiveInfos[] = { @@ -1152,60 +1304,88 @@ static ExplosiveInfo sExplosiveInfos[] = { { ITEM_BOMBCHU, ACTOR_EN_BOM_CHU }, }; -static struct_80854190 D_80854190[] = { +static struct_80854190 D_80854190[PLAYER_MWA_MAX] = { + /* PLAYER_MWA_FORWARD_SLASH_1H */ { &gPlayerAnim_link_fighter_normal_kiru, &gPlayerAnim_link_fighter_normal_kiru_end, &gPlayerAnim_link_fighter_normal_kiru_endR, 1, 4 }, + /* PLAYER_MWA_FORWARD_SLASH_2H */ { &gPlayerAnim_link_fighter_Lnormal_kiru, &gPlayerAnim_link_fighter_Lnormal_kiru_end, &gPlayerAnim_link_anchor_Lnormal_kiru_endR, 1, 4 }, + /* PLAYER_MWA_FORWARD_COMBO_1H */ { &gPlayerAnim_link_fighter_normal_kiru_finsh, &gPlayerAnim_link_fighter_normal_kiru_finsh_end, &gPlayerAnim_link_anchor_normal_kiru_finsh_endR, 0, 5 }, + /* PLAYER_MWA_FORWARD_COMBO_2H */ { &gPlayerAnim_link_fighter_Lnormal_kiru_finsh, &gPlayerAnim_link_fighter_Lnormal_kiru_finsh_end, &gPlayerAnim_link_anchor_Lnormal_kiru_finsh_endR, 1, 7 }, + /* PLAYER_MWA_RIGHT_SLASH_1H */ { &gPlayerAnim_link_fighter_Lside_kiru, &gPlayerAnim_link_fighter_Lside_kiru_end, &gPlayerAnim_link_anchor_Lside_kiru_endR, 1, 4 }, + /* PLAYER_MWA_RIGHT_SLASH_2H */ { &gPlayerAnim_link_fighter_LLside_kiru, &gPlayerAnim_link_fighter_LLside_kiru_end, &gPlayerAnim_link_anchor_LLside_kiru_endL, 0, 5 }, + /* PLAYER_MWA_RIGHT_COMBO_1H */ { &gPlayerAnim_link_fighter_Lside_kiru_finsh, &gPlayerAnim_link_fighter_Lside_kiru_finsh_end, &gPlayerAnim_link_anchor_Lside_kiru_finsh_endR, 2, 8 }, + /* PLAYER_MWA_RIGHT_COMBO_2H */ { &gPlayerAnim_link_fighter_LLside_kiru_finsh, &gPlayerAnim_link_fighter_LLside_kiru_finsh_end, &gPlayerAnim_link_anchor_LLside_kiru_finsh_endR, 3, 8 }, + /* PLAYER_MWA_LEFT_SLASH_1H */ { &gPlayerAnim_link_fighter_Rside_kiru, &gPlayerAnim_link_fighter_Rside_kiru_end, &gPlayerAnim_link_anchor_Rside_kiru_endR, 0, 4 }, + /* PLAYER_MWA_LEFT_SLASH_2H */ { &gPlayerAnim_link_fighter_LRside_kiru, &gPlayerAnim_link_fighter_LRside_kiru_end, &gPlayerAnim_link_anchor_LRside_kiru_endR, 0, 5 }, + /* PLAYER_MWA_LEFT_COMBO_1H */ { &gPlayerAnim_link_fighter_Rside_kiru_finsh, &gPlayerAnim_link_fighter_Rside_kiru_finsh_end, &gPlayerAnim_link_anchor_Rside_kiru_finsh_endR, 0, 6 }, + /* PLAYER_MWA_LEFT_COMBO_2H */ { &gPlayerAnim_link_fighter_LRside_kiru_finsh, &gPlayerAnim_link_fighter_LRside_kiru_finsh_end, &gPlayerAnim_link_anchor_LRside_kiru_finsh_endL, 1, 5 }, + /* PLAYER_MWA_STAB_1H */ { &gPlayerAnim_link_fighter_pierce_kiru, &gPlayerAnim_link_fighter_pierce_kiru_end, &gPlayerAnim_link_anchor_pierce_kiru_endR, 0, 3 }, + /* PLAYER_MWA_STAB_2H */ { &gPlayerAnim_link_fighter_Lpierce_kiru, &gPlayerAnim_link_fighter_Lpierce_kiru_end, &gPlayerAnim_link_anchor_Lpierce_kiru_endL, 0, 3 }, + /* PLAYER_MWA_STAB_COMBO_1H */ { &gPlayerAnim_link_fighter_pierce_kiru_finsh, &gPlayerAnim_link_fighter_pierce_kiru_finsh_end, &gPlayerAnim_link_anchor_pierce_kiru_finsh_endR, 1, 9 }, + /* PLAYER_MWA_STAB_COMBO_2H */ { &gPlayerAnim_link_fighter_Lpierce_kiru_finsh, &gPlayerAnim_link_fighter_Lpierce_kiru_finsh_end, &gPlayerAnim_link_anchor_Lpierce_kiru_finsh_endR, 1, 8 }, + /* PLAYER_MWA_FLIPSLASH_START */ { &gPlayerAnim_link_fighter_jump_rollkiru, &gPlayerAnim_link_fighter_jump_kiru_finsh, &gPlayerAnim_link_fighter_jump_kiru_finsh, 1, 10 }, + /* PLAYER_MWA_JUMPSLASH_START */ { &gPlayerAnim_link_fighter_Lpower_jump_kiru, &gPlayerAnim_link_fighter_Lpower_jump_kiru_hit, &gPlayerAnim_link_fighter_Lpower_jump_kiru_hit, 1, 11 }, + /* PLAYER_MWA_FLIPSLASH_FINISH */ { &gPlayerAnim_link_fighter_jump_kiru_finsh, &gPlayerAnim_link_fighter_jump_kiru_finsh_end, &gPlayerAnim_link_fighter_jump_kiru_finsh_end, 1, 2 }, + /* PLAYER_MWA_JUMPSLASH_FINISH */ { &gPlayerAnim_link_fighter_Lpower_jump_kiru_hit, &gPlayerAnim_link_fighter_Lpower_jump_kiru_end, &gPlayerAnim_link_fighter_Lpower_jump_kiru_end, 1, 2 }, + /* PLAYER_MWA_BACKSLASH_RIGHT */ { &gPlayerAnim_link_fighter_turn_kiruR, &gPlayerAnim_link_fighter_turn_kiruR_end, &gPlayerAnim_link_fighter_turn_kiruR_end, 1, 5 }, + /* PLAYER_MWA_BACKSLASH_LEFT */ { &gPlayerAnim_link_fighter_turn_kiruL, &gPlayerAnim_link_fighter_turn_kiruL_end, &gPlayerAnim_link_fighter_turn_kiruL_end, 1, 4 }, + /* PLAYER_MWA_HAMMER_FORWARD */ { &gPlayerAnim_link_hammer_hit, &gPlayerAnim_link_hammer_hit_end, &gPlayerAnim_link_hammer_hit_endR, 3, 10 }, + /* PLAYER_MWA_HAMMER_SIDE */ { &gPlayerAnim_link_hammer_side_hit, &gPlayerAnim_link_hammer_side_hit_end, &gPlayerAnim_link_hammer_side_hit_endR, 2, 11 }, + /* PLAYER_MWA_SPIN_ATTACK_1H */ { &gPlayerAnim_link_fighter_rolling_kiru, &gPlayerAnim_link_fighter_rolling_kiru_end, &gPlayerAnim_link_anchor_rolling_kiru_endR, 0, 12 }, + /* PLAYER_MWA_SPIN_ATTACK_2H */ { &gPlayerAnim_link_fighter_Lrolling_kiru, &gPlayerAnim_link_fighter_Lrolling_kiru_end, &gPlayerAnim_link_anchor_Lrolling_kiru_endR, 0, 15 }, + /* PLAYER_MWA_BIG_SPIN_1H */ { &gPlayerAnim_link_fighter_Wrolling_kiru, &gPlayerAnim_link_fighter_Wrolling_kiru_end, &gPlayerAnim_link_anchor_rolling_kiru_endR, 0, 16 }, + /* PLAYER_MWA_BIG_SPIN_2H */ { &gPlayerAnim_link_fighter_Wrolling_kiru, &gPlayerAnim_link_fighter_Wrolling_kiru_end, &gPlayerAnim_link_anchor_Lrolling_kiru_endR, 0, 16 }, }; @@ -1240,10 +1420,10 @@ static LinkAnimationHeader* D_80854378[] = { &gPlayerAnim_link_fighter_Lpower_kiru_side_walk, }; -static u8 D_80854380[2] = { 0x18, 0x19 }; -static u8 D_80854384[2] = { 0x1A, 0x1B }; +static u8 D_80854380[2] = { PLAYER_MWA_SPIN_ATTACK_1H, PLAYER_MWA_SPIN_ATTACK_2H }; +static u8 D_80854384[2] = { PLAYER_MWA_BIG_SPIN_1H, PLAYER_MWA_BIG_SPIN_2H }; -static u16 D_80854388[] = { BTN_B, BTN_CLEFT, BTN_CDOWN, BTN_CRIGHT, BTN_DUP, BTN_DDOWN, BTN_DLEFT, BTN_DRIGHT }; +static u16 sItemButtons[] = { BTN_B, BTN_CLEFT, BTN_CDOWN, BTN_CRIGHT, BTN_DUP, BTN_DDOWN, BTN_DLEFT, BTN_DRIGHT }; static u8 sMagicSpellCosts[] = { 12, 24, 24, 12, 24, 12 }; @@ -1286,13 +1466,11 @@ static LinkAnimationHeader* D_808543D4[] = { &gPlayerAnim_link_hook_wait, }; -// return type can't be void due to regalloc in func_8084FCAC void Player_ZeroSpeedXZ(Player* this) { this->actor.speedXZ = 0.0f; this->linearVelocity = 0.0f; } -// return type can't be void due to regalloc in func_8083F72C void func_80832224(Player* this) { Player_ZeroSpeedXZ(this); this->unk_6AD = 0; @@ -1304,20 +1482,20 @@ s32 func_8083224C(PlayState* play) { return CHECK_FLAG_ALL(this->actor.flags, ACTOR_FLAG_PLAYER_TALKED_TO); } -void func_80832264(PlayState* play, Player* this, LinkAnimationHeader* anim) { +void Player_AnimPlayOnce(PlayState* play, Player* this, LinkAnimationHeader* anim) { LinkAnimation_PlayOnce(play, &this->skelAnime, anim); } -void func_80832284(PlayState* play, Player* this, LinkAnimationHeader* anim) { +void Player_AnimPlayLoop(PlayState* play, Player* this, LinkAnimationHeader* anim) { LinkAnimation_PlayLoop(play, &this->skelAnime, anim); } -void func_808322A4(PlayState* play, Player* this, LinkAnimationHeader* anim) { - LinkAnimation_PlayLoopSetSpeed(play, &this->skelAnime, anim, 2.0f / 3.0f); +void Player_AnimPlayLoopAdjusted(PlayState* play, Player* this, LinkAnimationHeader* anim) { + LinkAnimation_PlayLoopSetSpeed(play, &this->skelAnime, anim, PLAYER_ANIM_ADJUSTED_SPEED); } -void func_808322D0(PlayState* play, Player* this, LinkAnimationHeader* anim) { - LinkAnimation_PlayOnceSetSpeed(play, &this->skelAnime, anim, 2.0f / 3.0f); +void Player_AnimPlayOnceAdjusted(PlayState* play, Player* this, LinkAnimationHeader* anim) { + LinkAnimation_PlayOnceSetSpeed(play, &this->skelAnime, anim, PLAYER_ANIM_ADJUSTED_SPEED); } void func_808322FC(Player* this) { @@ -1332,11 +1510,11 @@ void func_80832318(Player* this) { } void func_80832340(PlayState* play, Player* this) { - Camera* camera; + Camera* subCam; if (this->subCamId != SUBCAM_NONE) { - camera = play->cameraPtrs[this->subCamId]; - if ((camera != NULL) && (camera->csId == 1100)) { + subCam = play->cameraPtrs[this->subCamId]; + if ((subCam != NULL) && (subCam->csId == 1100)) { OnePointCutscene_EndCutscene(play, this->subCamId); this->subCamId = SUBCAM_NONE; } @@ -1345,7 +1523,7 @@ void func_80832340(PlayState* play, Player* this) { this->stateFlags2 &= ~(PLAYER_STATE2_UNDERWATER | PLAYER_STATE2_DIVING); } -void func_808323B4(PlayState* play, Player* this) { +void Player_DetachHeldActor(PlayState* play, Player* this) { Actor* heldActor = this->heldActor; if ((heldActor != NULL) && !Player_HoldsHookshot(this)) { @@ -1357,7 +1535,7 @@ void func_808323B4(PlayState* play, Player* this) { } if (Player_GetExplosiveHeld(this) >= 0) { - func_8083399C(play, this, PLAYER_IA_NONE); + Player_InitItemAction(play, this, PLAYER_IA_NONE); this->heldItemId = ITEM_NONE_FE; } } @@ -1391,7 +1569,7 @@ void func_80832440(PlayState* play, Player* this) { s32 func_80832528(PlayState* play, Player* this) { if (this->heldItemAction >= PLAYER_IA_FISHING_POLE) { - func_80835F44(play, this, ITEM_NONE); + Player_UseItem(play, this, ITEM_NONE); return 1; } else { return 0; @@ -1400,13 +1578,13 @@ s32 func_80832528(PlayState* play, Player* this) { void func_80832564(PlayState* play, Player* this) { func_80832440(play, this); - func_808323B4(play, this); + Player_DetachHeldActor(play, this); } s32 func_80832594(Player* this, s32 arg1, s32 arg2) { - s16 temp = this->unk_A80 - D_808535D8; + s16 controlStickAngleDiff = this->unk_A80 - sControlStickAngle; - this->unk_850 += arg1 + (s16)(ABS(temp) * fabsf(D_808535D4) * 2.5415802156203426e-06f); + this->unk_850 += arg1 + (s16)(ABS(controlStickAngleDiff) * fabsf(sControlStickMagnitude) * 2.5415802156203426e-06f); if (CHECK_BTN_ANY(sControlInput->press.button, BTN_A | BTN_B)) { this->unk_850 += 5; @@ -1421,15 +1599,15 @@ void func_80832630(PlayState* play) { } } -void Player_RequestRumble(Player* this, s32 arg1, s32 arg2, s32 arg3, s32 arg4) { +void Player_RequestRumble(Player* this, s32 sourceStrength, s32 duration, s32 decreaseRate, s32 distSq) { if (this->actor.category == ACTORCAT_PLAYER) { - func_800AA000(arg4, arg1, arg2, arg3); + func_800AA000(distSq, sourceStrength, duration, decreaseRate); } } void func_80832698(Player* this, u16 sfxId) { if (this->actor.category == ACTORCAT_PLAYER) { - Player_PlaySfx(&this->actor, sfxId + this->ageProperties->unk_92); + Player_PlaySfx(this, sfxId + this->ageProperties->unk_92); } else { func_800F4190(&this->actor.projectedPos, sfxId); } @@ -1446,19 +1624,19 @@ void func_808326F0(Player* this) { } u16 func_8083275C(Player* this, u16 sfxId) { - return sfxId + this->unk_89E; + return sfxId + this->floorSfxOffset; } void func_80832770(Player* this, u16 sfxId) { - Player_PlaySfx(&this->actor, func_8083275C(this, sfxId)); + Player_PlaySfx(this, func_8083275C(this, sfxId)); } u16 func_808327A4(Player* this, u16 sfxId) { - return sfxId + this->unk_89E + this->ageProperties->unk_94; + return sfxId + this->floorSfxOffset + this->ageProperties->unk_94; } void func_808327C4(Player* this, u16 sfxId) { - Player_PlaySfx(&this->actor, func_808327A4(this, sfxId)); + Player_PlaySfx(this, func_808327A4(this, sfxId)); } void func_808327F8(Player* this, f32 arg1) { @@ -1488,7 +1666,7 @@ void func_80832854(Player* this) { sfxId = func_808327A4(this, NA_SE_PL_JUMP); } - Player_PlaySfx(&this->actor, sfxId); + Player_PlaySfx(this, sfxId); } void func_808328A0(Player* this) { @@ -1500,93 +1678,103 @@ void func_808328A0(Player* this) { sfxId = func_808327A4(this, NA_SE_PL_LAND); } - Player_PlaySfx(&this->actor, sfxId); + Player_PlaySfx(this, sfxId); } void func_808328EC(Player* this, u16 sfxId) { - Player_PlaySfx(&this->actor, sfxId); + Player_PlaySfx(this, sfxId); this->stateFlags2 |= PLAYER_STATE2_FOOTSTEP; } -void func_80832924(Player* this, struct_80832924* entry) { - s32 data; - s32 flags; - u32 cont; +/** + * Process a list of `AnimSfx` entries. + * An `AnimSfx` entry contains a sound effect to play, a frame number that indicates + * when during an animation it should play, and a type value that indicates how it should be played back. + * + * The list will stop being processed after an entry that has a negative value for the `data` field. + * + * Some types do not make use of `sfxId`, the SFX function called will pick a sound on its own. + * The `sfxId` field is not used in this case and can be any value, but 0 is typically used. + * + * @param entry A pointer to the first entry of an `AnimSfx` list. + */ +void Player_ProcessAnimSfxList(Player* this, AnimSfxEntry* entry) { + s32 cont; s32 pad; do { - data = ABS(entry->field); - flags = data & 0x7800; - if (LinkAnimation_OnFrame(&this->skelAnime, fabsf(data & 0x7FF))) { - if (flags == 0x800) { - Player_PlaySfx(&this->actor, entry->sfxId); - } else if (flags == 0x1000) { + s32 absData = ABS(entry->field); + s32 type = absData & 0x7800; + if (LinkAnimation_OnFrame(&this->skelAnime, fabsf(absData & 0x7FF))) { + if (type == 0x800) { + Player_PlaySfx(this, entry->sfxId); + } else if (type == 0x1000) { func_80832770(this, entry->sfxId); - } else if (flags == 0x1800) { + } else if (type == 0x1800) { func_808327C4(this, entry->sfxId); - } else if (flags == 0x2000) { + } else if (type == 0x2000) { func_80832698(this, entry->sfxId); - } else if (flags == 0x2800) { + } else if (type == 0x2800) { func_808328A0(this); - } else if (flags == 0x3000) { + } else if (type == 0x3000) { func_808327F8(this, 6.0f); - } else if (flags == 0x3800) { + } else if (type == 0x3800) { func_80832854(this); - } else if (flags == 0x4000) { + } else if (type == 0x4000) { func_808327F8(this, 0.0f); - } else if (flags == 0x4800) { + } else if (type == 0x4800) { func_800F4010(&this->actor.projectedPos, this->ageProperties->unk_94 + NA_SE_PL_WALK_LADDER, 0.0f); } } - cont = (entry->field >= 0); + + cont = (entry->field >= 0); // stop processing if `data` is negative entry++; } while (cont); } -void func_80832B0C(PlayState* play, Player* this, LinkAnimationHeader* anim) { - LinkAnimation_Change(play, &this->skelAnime, anim, 1.0f, 0.0f, Animation_GetLastFrame(anim), ANIMMODE_ONCE, - -6.0f); +void Player_AnimChangeOnceMorph(PlayState* play, Player* this, LinkAnimationHeader* anim) { + LinkAnimation_Change(play, &this->skelAnime, anim, 1.0f, 0.0f, Animation_GetLastFrame(anim), ANIMMODE_ONCE, -6.0f); } -void func_80832B78(PlayState* play, Player* this, LinkAnimationHeader* anim) { - LinkAnimation_Change(play, &this->skelAnime, anim, 2.0f / 3.0f, 0.0f, Animation_GetLastFrame(anim), +void Player_AnimChangeOnceMorphAdjusted(PlayState* play, Player* this, LinkAnimationHeader* anim) { + LinkAnimation_Change(play, &this->skelAnime, anim, PLAYER_ANIM_ADJUSTED_SPEED, 0.0f, Animation_GetLastFrame(anim), ANIMMODE_ONCE, -6.0f); } -void func_80832BE8(PlayState* play, Player* this, LinkAnimationHeader* anim) { +void Player_AnimChangeLoopMorph(PlayState* play, Player* this, LinkAnimationHeader* anim) { LinkAnimation_Change(play, &this->skelAnime, anim, 1.0f, 0.0f, 0.0f, ANIMMODE_LOOP, -6.0f); } -void func_80832C2C(PlayState* play, Player* this, LinkAnimationHeader* anim) { +void Player_AnimChangeFreeze(PlayState* play, Player* this, LinkAnimationHeader* anim) { LinkAnimation_Change(play, &this->skelAnime, anim, 1.0f, 0.0f, 0.0f, ANIMMODE_ONCE, 0.0f); } -void func_80832C6C(PlayState* play, Player* this, LinkAnimationHeader* anim) { +void Player_AnimChangeLoopSlowMorph(PlayState* play, Player* this, LinkAnimationHeader* anim) { LinkAnimation_Change(play, &this->skelAnime, anim, 1.0f, 0.0f, 0.0f, ANIMMODE_LOOP, -16.0f); } s32 func_80832CB0(PlayState* play, Player* this, LinkAnimationHeader* anim) { if (LinkAnimation_Update(play, &this->skelAnime)) { - func_80832284(play, this, anim); + Player_AnimPlayLoop(play, this, anim); return 1; } else { return 0; } } -void func_80832CFC(Player* this) { +void Player_SkelAnimeResetPrevTranslRot(Player* this) { this->skelAnime.prevTransl = this->skelAnime.baseTransl; this->skelAnime.prevRot = this->actor.shape.rot.y; } -void func_80832D20(Player* this) { - func_80832CFC(this); +void Player_SkelAnimeResetPrevTranslRotAgeScale(Player* this) { + Player_SkelAnimeResetPrevTranslRot(this); this->skelAnime.prevTransl.x *= this->ageProperties->unk_08; this->skelAnime.prevTransl.y *= this->ageProperties->unk_08; this->skelAnime.prevTransl.z *= this->ageProperties->unk_08; } -void func_80832DB0(Player* this) { +void Player_ZeroRootLimbYaw(Player* this) { this->skelAnime.jointTable[1].y = 0; } @@ -1602,7 +1790,7 @@ void func_80832DBC(Player* this) { } else { this->skelAnime.jointTable[0].y = this->skelAnime.baseTransl.y; } - func_80832CFC(this); + Player_SkelAnimeResetPrevTranslRot(this); this->skelAnime.moveFlags = 0; } } @@ -1633,11 +1821,14 @@ void func_80832E48(Player* this, s32 flags) { func_808322FC(this); } -void func_80832F54(PlayState* play, Player* this, s32 flags) { - if (flags & 0x200) { - func_80832D20(this); - } else if ((flags & 0x100) || (this->skelAnime.moveFlags != 0)) { - func_80832CFC(this); +#define ANIM_REPLACE_APPLY_FLAG_8 (1 << 8) +#define ANIM_REPLACE_APPLY_FLAG_9 (1 << 9) + +void Player_AnimReplaceApplyFlags(PlayState* play, Player* this, s32 flags) { + if (flags & ANIM_REPLACE_APPLY_FLAG_9) { + Player_SkelAnimeResetPrevTranslRotAgeScale(this); + } else if ((flags & ANIM_REPLACE_APPLY_FLAG_8) || (this->skelAnime.moveFlags != 0)) { + Player_SkelAnimeResetPrevTranslRot(this); } else { this->skelAnime.prevTransl = this->skelAnime.jointTable[0]; this->skelAnime.prevRot = this->actor.shape.rot.y; @@ -1648,58 +1839,58 @@ void func_80832F54(PlayState* play, Player* this, s32 flags) { AnimationContext_DisableQueue(play); } -void func_80832FFC(PlayState* play, Player* this, LinkAnimationHeader* anim, s32 flags, f32 playbackSpeed) { +void Player_AnimReplacePlayOnceSetSpeed(PlayState* play, Player* this, LinkAnimationHeader* anim, s32 flags, f32 playbackSpeed) { LinkAnimation_PlayOnceSetSpeed(play, &this->skelAnime, anim, playbackSpeed); - func_80832F54(play, this, flags); + Player_AnimReplaceApplyFlags(play, this, flags); } -void func_8083303C(PlayState* play, Player* this, LinkAnimationHeader* anim, s32 flags) { - func_80832FFC(play, this, anim, flags, 1.0f); +void Player_AnimReplacePlayOnce(PlayState* play, Player* this, LinkAnimationHeader* anim, s32 flags) { + Player_AnimReplacePlayOnceSetSpeed(play, this, anim, flags, 1.0f); } -void func_80833064(PlayState* play, Player* this, LinkAnimationHeader* anim, s32 flags) { - func_80832FFC(play, this, anim, flags, 2.0f / 3.0f); +void Player_AnimReplacePlayOnceAdjusted(PlayState* play, Player* this, LinkAnimationHeader* anim, s32 flags) { + Player_AnimReplacePlayOnceSetSpeed(play, this, anim, flags, PLAYER_ANIM_ADJUSTED_SPEED); } -void func_8083308C(PlayState* play, Player* this, LinkAnimationHeader* anim) { - func_80833064(play, this, anim, 0x1C); +void Player_AnimReplaceNormalPlayOnceAdjusted(PlayState* play, Player* this, LinkAnimationHeader* anim) { + Player_AnimReplacePlayOnceAdjusted(play, this, anim, 0x1C); } -void func_808330AC(PlayState* play, Player* this, LinkAnimationHeader* anim, s32 flags, f32 playbackSpeed) { +void Player_AnimReplacePlayLoopSetSpeed(PlayState* play, Player* this, LinkAnimationHeader* anim, s32 flags, f32 playbackSpeed) { LinkAnimation_PlayLoopSetSpeed(play, &this->skelAnime, anim, playbackSpeed); - func_80832F54(play, this, flags); + Player_AnimReplaceApplyFlags(play, this, flags); } -void func_808330EC(PlayState* play, Player* this, LinkAnimationHeader* anim, s32 flags) { - func_808330AC(play, this, anim, flags, 1.0f); +void Player_AnimReplacePlayLoop(PlayState* play, Player* this, LinkAnimationHeader* anim, s32 flags) { + Player_AnimReplacePlayLoopSetSpeed(play, this, anim, flags, 1.0f); } -void func_80833114(PlayState* play, Player* this, LinkAnimationHeader* anim, s32 flags) { - func_808330AC(play, this, anim, flags, 2.0f / 3.0f); +void Player_AnimReplacePlayLoopAdjusted(PlayState* play, Player* this, LinkAnimationHeader* anim, s32 flags) { + Player_AnimReplacePlayLoopSetSpeed(play, this, anim, flags, PLAYER_ANIM_ADJUSTED_SPEED); } -void func_8083313C(PlayState* play, Player* this, LinkAnimationHeader* anim) { - func_80833114(play, this, anim, 0x1C); +void Player_AnimReplaceNormalPlayLoopAdjusted(PlayState* play, Player* this, LinkAnimationHeader* anim) { + Player_AnimReplacePlayLoopAdjusted(play, this, anim, 0x1C); } -void func_8083315C(PlayState* play, Player* this) { +void Player_ProcessControlStick(PlayState* play, Player* this) { s8 phi_v1; s8 phi_v0; - this->unk_A7C = D_808535D4; - this->unk_A80 = D_808535D8; + this->unk_A7C = sControlStickMagnitude; + this->unk_A80 = sControlStickAngle; - func_80077D10(&D_808535D4, &D_808535D8, sControlInput); + func_80077D10(&sControlStickMagnitude, &sControlStickAngle, sControlInput); - D_808535DC = Camera_GetInputDirYaw(GET_ACTIVE_CAM(play)) + D_808535D8; + D_808535DC = Camera_GetInputDirYaw(GET_ACTIVE_CAM(play)) + sControlStickAngle; this->unk_846 = (this->unk_846 + 1) % 4; - if (D_808535D4 < 55.0f) { + if (sControlStickMagnitude < 55.0f) { phi_v0 = -1; phi_v1 = -1; } else { - phi_v1 = (u16)(D_808535D8 + 0x2000) >> 9; + phi_v1 = (u16)(sControlStickAngle + 0x2000) >> 9; phi_v0 = (u16)((s16)(D_808535DC - this->actor.shape.rot.y) + 0x2000) >> 14; } @@ -1731,7 +1922,7 @@ void func_808332F4(Player* this, PlayState* play) { } static LinkAnimationHeader* func_80833338(Player* this) { - return D_80853914[PLAYER_ANIMGROUP_wait][this->modelAnimType]; + return GET_PLAYER_ANIM(PLAYER_ANIMGROUP_wait, this->modelAnimType); } s32 func_80833350(Player* this) { @@ -1752,18 +1943,18 @@ s32 func_80833350(Player* this) { void func_808333FC(Player* this, s32 arg1) { if (D_80853E7C[arg1] != 0) { - func_80832924(this, D_80853E50[D_80853E7C[arg1] - 1]); + Player_ProcessAnimSfxList(this, D_80853E50[D_80853E7C[arg1] - 1]); } } LinkAnimationHeader* func_80833438(Player* this) { if (this->unk_890 != 0) { - return D_80853914[PLAYER_ANIMGROUP_damage_run][this->modelAnimType]; + return GET_PLAYER_ANIM(PLAYER_ANIMGROUP_damage_run, this->modelAnimType); } else if (!(this->stateFlags1 & (PLAYER_STATE1_IN_WATER | PLAYER_STATE1_IN_CUTSCENE)) && (this->currentBoots == PLAYER_BOOTS_IRON)) { - return D_80853914[PLAYER_ANIMGROUP_heavy_run][this->modelAnimType]; + return GET_PLAYER_ANIM(PLAYER_ANIMGROUP_heavy_run, this->modelAnimType); } else { - return D_80853914[PLAYER_ANIMGROUP_run][this->modelAnimType]; + return GET_PLAYER_ANIM(PLAYER_ANIMGROUP_run, this->modelAnimType); } } @@ -1775,7 +1966,7 @@ LinkAnimationHeader* func_808334E4(Player* this) { if (func_808334B4(this)) { return &gPlayerAnim_link_boom_throw_waitR; } else { - return D_80853914[PLAYER_ANIMGROUP_waitR][this->modelAnimType]; + return GET_PLAYER_ANIM(PLAYER_ANIMGROUP_waitR, this->modelAnimType); } } @@ -1783,7 +1974,7 @@ LinkAnimationHeader* func_80833528(Player* this) { if (func_808334B4(this)) { return &gPlayerAnim_link_boom_throw_waitL; } else { - return D_80853914[PLAYER_ANIMGROUP_waitL][this->modelAnimType]; + return GET_PLAYER_ANIM(PLAYER_ANIMGROUP_waitL, this->modelAnimType); } } @@ -1791,7 +1982,7 @@ LinkAnimationHeader* func_8083356C(Player* this) { if (func_8002DD78(this)) { return &gPlayerAnim_link_bow_side_walk; } else { - return D_80853914[PLAYER_ANIMGROUP_side_walk][this->modelAnimType]; + return GET_PLAYER_ANIM(PLAYER_ANIMGROUP_side_walk, this->modelAnimType); } } @@ -1799,7 +1990,7 @@ LinkAnimationHeader* func_808335B0(Player* this) { if (func_808334B4(this)) { return &gPlayerAnim_link_boom_throw_side_walkR; } else { - return D_80853914[PLAYER_ANIMGROUP_side_walkR][this->modelAnimType]; + return GET_PLAYER_ANIM(PLAYER_ANIMGROUP_side_walkR, this->modelAnimType); } } @@ -1807,37 +1998,35 @@ LinkAnimationHeader* func_808335F4(Player* this) { if (func_808334B4(this)) { return &gPlayerAnim_link_boom_throw_side_walkL; } else { - return D_80853914[PLAYER_ANIMGROUP_side_walkL][this->modelAnimType]; + return GET_PLAYER_ANIM(PLAYER_ANIMGROUP_side_walkL, this->modelAnimType); } } -void func_80833638(Player* this, PlayerFunc82C arg1) { - this->func_82C = arg1; +void Player_SetUpperActionFunc(Player* this, UpperActionFunc arg1) { + this->upperActionFunc = arg1; this->unk_836 = 0; - this->unk_830 = 0.0f; + this->upperAnimBlendWeight = 0.0f; func_808326F0(this); } -void func_80833664(PlayState* play, Player* this, s8 actionParam) { +void Player_InitItemActionWithAnim(PlayState* play, Player* this, s8 itemAction) { LinkAnimationHeader* current = this->skelAnime.animation; LinkAnimationHeader** iter = &D_80853914[0][this->modelAnimType]; - u32 i; + u32 animGroup; this->stateFlags1 &= ~(PLAYER_STATE1_ITEM_IN_HAND | PLAYER_STATE1_BOOMERANG_IN_HAND); - for (i = 0; i < ARRAY_COUNT(D_80853914); i++) { + for (animGroup = 0; animGroup < PLAYER_ANIMGROUP_MAX; animGroup++) { if (current == *iter) { break; } - iter += ARRAY_COUNT(D_80853914[0]); + iter += PLAYER_ANIMTYPE_MAX; } - func_8083399C(play, this, actionParam); + Player_InitItemAction(play, this, itemAction); - if (i < ARRAY_COUNT(D_80853914)) { - // fake match - // surely D_80853914 isn't a 1D array... unless? - this->skelAnime.animation = D_80853914[0][i * ARRAY_COUNT(D_80853914[0]) + this->modelAnimType]; + if (animGroup < PLAYER_ANIMGROUP_MAX) { + this->skelAnime.animation = GET_PLAYER_ANIM(animGroup, this->modelAnimType); } } @@ -1849,7 +2038,7 @@ s8 Player_ItemToItemAction(s32 item) { } else if (item == ITEM_FISHING_POLE) { return PLAYER_IA_FISHING_POLE; } else { - return sItemActionParams[item]; + return sItemActions[item]; } } @@ -1923,22 +2112,22 @@ void func_80833984(PlayState* play, Player* this) { this->stateFlags1 |= PLAYER_STATE1_BOOMERANG_IN_HAND; } -void func_8083399C(PlayState* play, Player* this, s8 actionParam) { +void Player_InitItemAction(PlayState* play, Player* this, s8 itemAction) { this->unk_860 = 0; this->unk_85C = 0.0f; this->unk_858 = 0.0f; - this->heldItemAction = this->itemAction = actionParam; + this->heldItemAction = this->itemAction = itemAction; this->modelGroup = this->nextModelGroup; this->stateFlags1 &= ~(PLAYER_STATE1_ITEM_IN_HAND | PLAYER_STATE1_BOOMERANG_IN_HAND); - D_80853FE8[actionParam](play, this); + sItemActionInitFuncs[itemAction](play, this); Player_SetModelGroup(this, this->modelGroup); } -void func_80833A20(Player* this, s32 newSwordState) { +void func_80833A20(Player* this, s32 newMeleeWeaponState) { u16 itemSfx; u16 voiceSfx; @@ -1952,7 +2141,7 @@ void func_80833A20(Player* this, s32 newSwordState) { voiceSfx = NA_SE_VO_LI_SWORD_N; if (this->heldItemAction == PLAYER_IA_HAMMER) { itemSfx = NA_SE_IT_HAMMER_SWING; - } else if (this->meleeWeaponAnimation >= 0x18) { + } else if (this->meleeWeaponAnimation >= PLAYER_MWA_SPIN_ATTACK_1H) { itemSfx = 0; voiceSfx = NA_SE_VO_LI_SWORD_L; } else if (this->unk_845 >= 3) { @@ -1964,7 +2153,8 @@ void func_80833A20(Player* this, s32 newSwordState) { func_808328EC(this, itemSfx); } - if ((this->meleeWeaponAnimation < 0x10) || (this->meleeWeaponAnimation >= 0x14)) { + if (!((this->meleeWeaponAnimation >= PLAYER_MWA_FLIPSLASH_START) && + (this->meleeWeaponAnimation <= PLAYER_MWA_JUMPSLASH_FINISH))) { func_80832698(this, voiceSfx); } @@ -1973,7 +2163,7 @@ void func_80833A20(Player* this, s32 newSwordState) { } } - this->meleeWeaponState = newSwordState; + this->meleeWeaponState = newMeleeWeaponState; } s32 func_80833B2C(Player* this) { @@ -2012,23 +2202,23 @@ void func_80833C3C(Player* this) { this->unk_870 = this->unk_874 = 0.0f; } -s32 func_80833C50(Player* this, s32 item) { +s32 Player_ItemIsInUse(Player* this, s32 item) { if ((item < ITEM_NONE_FE) && (Player_ItemToItemAction(item) == this->itemAction)) { - return 1; + return true; } else { - return 0; + return false; } } -s32 func_80833C98(s32 item1, s32 actionParam) { - if ((item1 < ITEM_NONE_FE) && (Player_ItemToItemAction(item1) == actionParam)) { - return 1; +s32 Player_ItemIsItemAction(s32 item1, s32 itemAction) { + if ((item1 < ITEM_NONE_FE) && (Player_ItemToItemAction(item1) == itemAction)) { + return true; } else { - return 0; + return false; } } -s32 func_80833CDC(PlayState* play, s32 index) { +s32 Player_GetItemOnButton(PlayState* play, s32 index) { if (index >= ((CVarGetInteger("gDpadEquips", 0) != 0) ? 8 : 4)) { return ITEM_NONE; } else if (play->bombchuBowlingStatus != 0) { @@ -2052,8 +2242,17 @@ s32 func_80833CDC(PlayState* play, s32 index) { } } -void func_80833DF8(Player* this, PlayState* play) { - s32 maskActionParam; +/** + * Handles the high level item usage and changing process based on the B and C buttons. + * + * Tasks include: + * - Put away a mask if it is not present on any C button + * - Put away an item if it is not present on the B button or any C button + * - Use an item on the B button or any C button if the corresponding button is pressed + * - Keep track of the current item button being held down + */ +void Player_ProcessItemButtons(Player* this, PlayState* play) { + s32 maskItemAction; s32 item; s32 i; @@ -2074,15 +2273,15 @@ void func_80833DF8(Player* this, PlayState* play) { func_808328EC(this, NA_SE_PL_CHANGE_ARMS); } } else { - maskActionParam = this->currentMask - 1 + PLAYER_IA_MASK_KEATON; + maskItemAction = this->currentMask - 1 + PLAYER_IA_MASK_KEATON; bool hasOnDpad = false; if (CVarGetInteger("gDpadEquips", 0) != 0) { for (int buttonIndex = 0; buttonIndex < 4; buttonIndex++) { - hasOnDpad |= func_80833C98(DPAD_ITEM(buttonIndex), maskActionParam); + hasOnDpad |= Player_ItemIsItemAction(DPAD_ITEM(buttonIndex), maskItemAction); } } - if (!func_80833C98(C_BTN_ITEM(0), maskActionParam) && !func_80833C98(C_BTN_ITEM(1), maskActionParam) && - !func_80833C98(C_BTN_ITEM(2), maskActionParam) && !hasOnDpad) { + if (!Player_ItemIsItemAction(C_BTN_ITEM(0), maskItemAction) && !Player_ItemIsItemAction(C_BTN_ITEM(1), maskItemAction) && + !Player_ItemIsItemAction(C_BTN_ITEM(2), maskItemAction) && !hasOnDpad) { this->currentMask = PLAYER_MASK_NONE; } } @@ -2093,101 +2292,105 @@ void func_80833DF8(Player* this, PlayState* play) { bool hasOnDpad = false; if (CVarGetInteger("gDpadEquips", 0) != 0) { for (int buttonIndex = 0; buttonIndex < 4; buttonIndex++) { - hasOnDpad |= func_80833C50(this, DPAD_ITEM(buttonIndex)); + hasOnDpad |= Player_ItemIsInUse(this, DPAD_ITEM(buttonIndex)); } } - if (!func_80833C50(this, B_BTN_ITEM) && !func_80833C50(this, C_BTN_ITEM(0)) && - !func_80833C50(this, C_BTN_ITEM(1)) && !func_80833C50(this, C_BTN_ITEM(2)) && !hasOnDpad) { - func_80835F44(play, this, ITEM_NONE); + if (!Player_ItemIsInUse(this, B_BTN_ITEM) && !Player_ItemIsInUse(this, C_BTN_ITEM(0)) && + !Player_ItemIsInUse(this, C_BTN_ITEM(1)) && !Player_ItemIsInUse(this, C_BTN_ITEM(2)) && !hasOnDpad) { + Player_UseItem(play, this, ITEM_NONE); return; } } - for (i = 0; i < ARRAY_COUNT(D_80854388); i++) { - if (CHECK_BTN_ALL(sControlInput->press.button, D_80854388[i])) { + for (i = 0; i < ARRAY_COUNT(sItemButtons); i++) { + if (CHECK_BTN_ALL(sControlInput->press.button, sItemButtons[i])) { break; } } - item = func_80833CDC(play, i); + item = Player_GetItemOnButton(play, i); + if (item >= ITEM_NONE_FE) { - for (i = 0; i < ARRAY_COUNT(D_80854388); i++) { - if (CHECK_BTN_ALL(sControlInput->cur.button, D_80854388[i])) { + for (i = 0; i < ARRAY_COUNT(sItemButtons); i++) { + if (CHECK_BTN_ALL(sControlInput->cur.button, sItemButtons[i])) { break; } } - item = func_80833CDC(play, i); + item = Player_GetItemOnButton(play, i); + if ((item < ITEM_NONE_FE) && (Player_ItemToItemAction(item) == this->heldItemAction)) { - D_80853618 = true; + sHeldItemButtonIsHeldDown = true; } } else { this->heldItemButton = i; - func_80835F44(play, this, item); + Player_UseItem(play, this, item); } } } -void func_808340DC(Player* this, PlayState* play) { +void Player_StartChangingHeldItem(Player* this, PlayState* play) { LinkAnimationHeader* anim; - f32 frameCount; + f32 endFrameTemp; f32 startFrame; f32 endFrame; f32 playSpeed; - s32 sp38; - s8 sp37; + s32 itemChangeType; + s8 heldItemAction; s32 nextAnimType; - sp37 = Player_ItemToItemAction(this->heldItemId); - func_80833638(this, func_80834A2C); + heldItemAction = Player_ItemToItemAction(this->heldItemId); + + Player_SetUpperActionFunc(this, Player_UpperAction_ChangeHeldItem); nextAnimType = gPlayerModelTypes[this->nextModelGroup][PLAYER_MODELGROUPENTRY_ANIM]; - sp38 = D_80854164[gPlayerModelTypes[this->modelGroup][PLAYER_MODELGROUPENTRY_ANIM]][nextAnimType]; - if ((sp37 == PLAYER_IA_BOTTLE) || (sp37 == PLAYER_IA_BOOMERANG) || - ((sp37 == PLAYER_IA_NONE) && + itemChangeType = sItemChangeTypes[gPlayerModelTypes[this->modelGroup][PLAYER_MODELGROUPENTRY_ANIM]][nextAnimType]; + + if ((heldItemAction == PLAYER_IA_BOTTLE) || (heldItemAction == PLAYER_IA_BOOMERANG) || + ((heldItemAction == PLAYER_IA_NONE) && ((this->heldItemAction == PLAYER_IA_BOTTLE) || (this->heldItemAction == PLAYER_IA_BOOMERANG)))) { - sp38 = (sp37 == PLAYER_IA_NONE) ? -PLAYER_D_808540F4_13 : PLAYER_D_808540F4_13; + itemChangeType = (heldItemAction == PLAYER_IA_NONE) ? -PLAYER_ITEM_CHG_13 : PLAYER_ITEM_CHG_13; } - this->unk_15A = ABS(sp38); + this->itemChangeType = ABS(itemChangeType); + anim = sItemChangeInfo[this->itemChangeType].anim; - anim = D_808540F4[this->unk_15A].anim; if ((anim == &gPlayerAnim_link_normal_fighter2free) && (this->currentShield == PLAYER_SHIELD_NONE)) { anim = &gPlayerAnim_link_normal_free2fighter_free; } - frameCount = Animation_GetLastFrame(anim); - endFrame = frameCount; + endFrameTemp = Animation_GetLastFrame(anim); + endFrame = endFrameTemp; - if (sp38 >= 0) { + if (itemChangeType >= 0) { playSpeed = 1.2f; startFrame = 0.0f; } else { endFrame = 0.0f; playSpeed = -1.2f; - startFrame = frameCount; + startFrame = endFrameTemp; } - if (sp37 != PLAYER_IA_NONE) { + if (heldItemAction != PLAYER_IA_NONE) { playSpeed *= 2.0f; } - LinkAnimation_Change(play, &this->skelAnime2, anim, playSpeed, startFrame, endFrame, ANIMMODE_ONCE, 0.0f); + LinkAnimation_Change(play, &this->upperSkelAnime, anim, playSpeed, startFrame, endFrame, ANIMMODE_ONCE, 0.0f); this->stateFlags1 &= ~PLAYER_STATE1_START_PUTAWAY; } -void func_80834298(Player* this, PlayState* play) { +void Player_UpdateItems(Player* this, PlayState* play) { if ((this->actor.category == ACTORCAT_PLAYER) && (CVarGetInteger("gQuickPutaway", 0) || !(this->stateFlags1 & PLAYER_STATE1_START_PUTAWAY)) && ((this->heldItemAction == this->itemAction) || (this->stateFlags1 & PLAYER_STATE1_SHIELDING)) && - (gSaveContext.health != 0) && (play->csCtx.state == CS_STATE_IDLE) && (this->csMode == 0) && + (gSaveContext.health != 0) && (play->csCtx.state == CS_STATE_IDLE) && (this->csAction == 0) && (play->shootingGalleryStatus == 0) && (play->activeCamera == MAIN_CAM) && (play->transitionTrigger != TRANS_TRIGGER_START) && (gSaveContext.timer1State != 10)) { - func_80833DF8(this, play); + Player_ProcessItemButtons(this, play); } if (this->stateFlags1 & PLAYER_STATE1_START_PUTAWAY) { - func_808340DC(this, play); + Player_StartChangingHeldItem(this, play); } } @@ -2228,13 +2431,13 @@ s32 func_8083442C(Player* this, PlayState* play) { (gSaveContext.magicState != MAGIC_STATE_IDLE)) { func_80078884(NA_SE_SY_ERROR); } else { - func_80833638(this, func_808351D4); + Player_SetUpperActionFunc(this, func_808351D4); this->stateFlags1 |= PLAYER_STATE1_READY_TO_FIRE; this->unk_834 = 14; if (this->unk_860 >= 0) { - Player_PlaySfx(&this->actor, D_80854398[ABS(this->unk_860) - 1]); + Player_PlaySfx(this, D_80854398[ABS(this->unk_860) - 1]); if (!Player_HoldsHookshot(this) && (func_80834380(play, this, &item, &arrowType) > 0)) { magicArrowType = arrowType - ARROW_FIRE; @@ -2258,7 +2461,7 @@ s32 func_8083442C(Player* this, PlayState* play) { return 0; } -void func_80834594(PlayState* play, Player* this) { +void Player_FinishItemChange(PlayState* play, Player* this) { if (this->heldItemAction != PLAYER_IA_NONE) { if (func_8008F2BC(this, this->heldItemAction) >= 0) { func_808328EC(this, NA_SE_IT_SWORD_PUTAWAY); @@ -2267,7 +2470,7 @@ void func_80834594(PlayState* play, Player* this) { } } - func_80835F44(play, this, this->heldItemId); + Player_UseItem(play, this, this->heldItemId); if (func_8008F2BC(this, this->heldItemAction) >= 0) { func_808328EC(this, NA_SE_IT_SWORD_PICKOUT); @@ -2277,20 +2480,20 @@ void func_80834594(PlayState* play, Player* this) { } void func_80834644(PlayState* play, Player* this) { - if (func_80834A2C == this->func_82C) { - func_80834594(play, this); + if (Player_UpperAction_ChangeHeldItem == this->upperActionFunc) { + Player_FinishItemChange(play, this); } - func_80833638(this, D_80853EDC[this->heldItemAction]); + Player_SetUpperActionFunc(this, sItemActionUpdateFuncs[this->heldItemAction]); this->unk_834 = 0; this->unk_6AC = 0; - func_808323B4(play, this); + Player_DetachHeldActor(play, this); this->stateFlags1 &= ~PLAYER_STATE1_START_PUTAWAY; } LinkAnimationHeader* func_808346C4(PlayState* play, Player* this) { - func_80833638(this, func_80834B5C); - func_808323B4(play, this); + Player_SetUpperActionFunc(this, func_80834B5C); + Player_DetachHeldActor(play, this); if (this->unk_870 < 0.5f) { return D_808543A4[Player_HoldsTwoHandedWeapon(this) && @@ -2312,8 +2515,8 @@ s32 func_80834758(PlayState* play, Player* this) { anim = func_808346C4(play, this); frame = Animation_GetLastFrame(anim); - LinkAnimation_Change(play, &this->skelAnime2, anim, 1.0f, frame, frame, ANIMMODE_ONCE, 0.0f); - Player_PlaySfx(&this->actor, NA_SE_IT_SHIELD_POSTURE); + LinkAnimation_Change(play, &this->upperSkelAnime, anim, 1.0f, frame, frame, ANIMMODE_ONCE, 0.0f); + Player_PlaySfx(this, NA_SE_IT_SHIELD_POSTURE); return 1; } else { @@ -2330,25 +2533,25 @@ s32 func_8083485C(Player* this, PlayState* play) { } void func_80834894(Player* this) { - func_80833638(this, func_80834C74); + Player_SetUpperActionFunc(this, func_80834C74); if (this->itemAction < 0) { func_8008EC70(this); } - Animation_Reverse(&this->skelAnime2); - Player_PlaySfx(&this->actor, NA_SE_IT_SHIELD_REMOVE); + Animation_Reverse(&this->upperSkelAnime); + Player_PlaySfx(this, NA_SE_IT_SHIELD_REMOVE); } -void func_808348EC(PlayState* play, Player* this) { - struct_808540F4* ptr = &D_808540F4[this->unk_15A]; - f32 frame; +void Player_WaitToFinishItemChange(PlayState* play, Player* this) { + ItemChangeInfo* itemChangeEntry = &sItemChangeInfo[this->itemChangeType]; + f32 changeFrame; - frame = ptr->unk_04; - frame = (this->skelAnime2.playSpeed < 0.0f) ? frame - 1.0f : frame; + changeFrame = itemChangeEntry->changeFrame; + changeFrame = (this->upperSkelAnime.playSpeed < 0.0f) ? changeFrame - 1.0f : changeFrame; - if (LinkAnimation_OnFrame(&this->skelAnime2, frame)) { - func_80834594(play, this); + if (LinkAnimation_OnFrame(&this->upperSkelAnime, changeFrame)) { + Player_FinishItemChange(play, this); } func_80833B54(this); @@ -2356,7 +2559,7 @@ void func_808348EC(PlayState* play, Player* this) { s32 func_8083499C(Player* this, PlayState* play) { if (this->stateFlags1 & PLAYER_STATE1_START_PUTAWAY) { - func_808340DC(this, play); + Player_StartChangingHeldItem(this, play); } else { return 0; } @@ -2372,31 +2575,31 @@ s32 func_808349DC(Player* this, PlayState* play) { } } -s32 func_80834A2C(Player* this, PlayState* play) { - if (LinkAnimation_Update(play, &this->skelAnime2) || +s32 Player_UpperAction_ChangeHeldItem(Player* this, PlayState* play) { + if (LinkAnimation_Update(play, &this->upperSkelAnime) || ((Player_ItemToItemAction(this->heldItemId) == this->heldItemAction) && - (D_80853614 = (D_80853614 || + (sUseHeldItem = (sUseHeldItem || ((this->modelAnimType != PLAYER_ANIMTYPE_3) && (play->shootingGalleryStatus == 0)))))) { - func_80833638(this, D_80853EDC[this->heldItemAction]); + Player_SetUpperActionFunc(this, sItemActionUpdateFuncs[this->heldItemAction]); this->unk_834 = 0; this->unk_6AC = 0; - D_80853618 = D_80853614; - return this->func_82C(this, play); + sHeldItemButtonIsHeldDown = sUseHeldItem; + return this->upperActionFunc(this, play); } if (func_80833350(this) != 0) { - func_808348EC(play, this); - func_80832264(play, this, func_80833338(this)); + Player_WaitToFinishItemChange(play, this); + Player_AnimPlayOnce(play, this, func_80833338(this)); this->unk_6AC = 0; } else { - func_808348EC(play, this); + Player_WaitToFinishItemChange(play, this); } return 1; } s32 func_80834B5C(Player* this, PlayState* play) { - LinkAnimation_Update(play, &this->skelAnime2); + LinkAnimation_Update(play, &this->upperSkelAnime); if (!CHECK_BTN_ALL(sControlInput->cur.button, BTN_R)) { func_80834894(this); @@ -2412,10 +2615,10 @@ s32 func_80834BD4(Player* this, PlayState* play) { LinkAnimationHeader* anim; f32 frame; - if (LinkAnimation_Update(play, &this->skelAnime2)) { + if (LinkAnimation_Update(play, &this->upperSkelAnime)) { anim = func_808346C4(play, this); frame = Animation_GetLastFrame(anim); - LinkAnimation_Change(play, &this->skelAnime2, anim, 1.0f, frame, frame, ANIMMODE_ONCE, 0.0f); + LinkAnimation_Change(play, &this->upperSkelAnime, anim, 1.0f, frame, frame, ANIMMODE_ONCE, 0.0f); } this->stateFlags1 |= PLAYER_STATE1_SHIELDING; @@ -2425,13 +2628,13 @@ s32 func_80834BD4(Player* this, PlayState* play) { } s32 func_80834C74(Player* this, PlayState* play) { - D_80853614 = D_80853618; + sUseHeldItem = sHeldItemButtonIsHeldDown; - if (D_80853614 || LinkAnimation_Update(play, &this->skelAnime2)) { - func_80833638(this, D_80853EDC[this->heldItemAction]); - LinkAnimation_PlayLoop(play, &this->skelAnime2, D_80853914[PLAYER_ANIMGROUP_wait][this->modelAnimType]); + if (sUseHeldItem || LinkAnimation_Update(play, &this->upperSkelAnime)) { + Player_SetUpperActionFunc(this, sItemActionUpdateFuncs[this->heldItemAction]); + LinkAnimation_PlayLoop(play, &this->upperSkelAnime, GET_PLAYER_ANIM(PLAYER_ANIMGROUP_wait, this->modelAnimType)); this->unk_6AC = 0; - this->func_82C(this, play); + this->upperActionFunc(this, play); return 0; } @@ -2451,17 +2654,17 @@ s32 func_80834D2C(Player* this, PlayState* play) { } else { anim = &gPlayerAnim_link_hook_shot_ready; } - LinkAnimation_PlayOnce(play, &this->skelAnime2, anim); + LinkAnimation_PlayOnce(play, &this->upperSkelAnime, anim); } else { - func_80833638(this, func_80835884); + Player_SetUpperActionFunc(this, func_80835884); this->unk_834 = 10; - LinkAnimation_PlayOnce(play, &this->skelAnime2, &gPlayerAnim_link_boom_throw_wait2waitR); + LinkAnimation_PlayOnce(play, &this->upperSkelAnime, &gPlayerAnim_link_boom_throw_wait2waitR); } if (this->stateFlags1 & PLAYER_STATE1_ON_HORSE) { - func_80832284(play, this, &gPlayerAnim_link_uma_anim_walk); + Player_AnimPlayLoop(play, this, &gPlayerAnim_link_uma_anim_walk); } else if ((this->actor.bgCheckFlags & 1) && !func_80833B54(this)) { - func_80832284(play, this, D_80853914[PLAYER_ANIMGROUP_wait][this->modelAnimType]); + Player_AnimPlayLoop(play, this, GET_PLAYER_ANIM(PLAYER_ANIMGROUP_wait, this->modelAnimType)); } return 1; @@ -2493,7 +2696,7 @@ s32 func_80834EB8(Player* this, PlayState* play) { s32 func_80834F2C(Player* this, PlayState* play) { if ((this->doorType == PLAYER_DOORTYPE_NONE) && !(this->stateFlags1 & PLAYER_STATE1_THREW_BOOMERANG)) { - if (D_80853614 || func_80834E44(play)) { + if (sUseHeldItem || func_80834E44(play)) { if (func_80834D2C(this, play)) { return func_80834EB8(this, play); } @@ -2508,7 +2711,7 @@ s32 func_80834FBC(Player* this) { if (this->heldActor == NULL) { this->heldActor = this->actor.child; Player_RequestRumble(this, 255, 10, 250, 0); - Player_PlaySfx(&this->actor, NA_SE_IT_HOOKSHOT_RECEIVE); + Player_PlaySfx(this, NA_SE_IT_HOOKSHOT_RECEIVE); } return 1; @@ -2589,10 +2792,10 @@ s32 func_808351D4(Player* this, PlayState* play) { if ((this->unk_836 == 0) && (func_80833350(this) == 0) && (this->skelAnime.animation == &gPlayerAnim_link_bow_side_walk)) { - LinkAnimation_PlayOnce(play, &this->skelAnime2, D_808543CC[sp2C]); + LinkAnimation_PlayOnce(play, &this->upperSkelAnime, D_808543CC[sp2C]); this->unk_836 = -1; - } else if (LinkAnimation_Update(play, &this->skelAnime2)) { - LinkAnimation_PlayLoop(play, &this->skelAnime2, D_808543D4[sp2C]); + } else if (LinkAnimation_Update(play, &this->upperSkelAnime)) { + LinkAnimation_PlayLoop(play, &this->upperSkelAnime, D_808543D4[sp2C]); this->unk_836 = 1; } else if (this->unk_836 == 1) { this->unk_836 = 2; @@ -2604,12 +2807,12 @@ s32 func_808351D4(Player* this, PlayState* play) { func_80834EB8(this, play); - if ((this->unk_836 > 0) && ((this->unk_860 < 0) || (!D_80853618 && !func_80834E7C(play)))) { - func_80833638(this, func_808353D8); + if ((this->unk_836 > 0) && ((this->unk_860 < 0) || (!sHeldItemButtonIsHeldDown && !func_80834E7C(play)))) { + Player_SetUpperActionFunc(this, func_808353D8); if (this->unk_860 >= 0) { if (sp2C == 0) { if (!func_808350A4(play, this)) { - Player_PlaySfx(&this->actor, D_808543DC[ABS(this->unk_860) - 1]); + Player_PlaySfx(this, D_808543DC[ABS(this->unk_860) - 1]); } } else if (this->actor.bgCheckFlags & 1) { func_808350A4(play, this); @@ -2625,21 +2828,21 @@ s32 func_808351D4(Player* this, PlayState* play) { } s32 func_808353D8(Player* this, PlayState* play) { - LinkAnimation_Update(play, &this->skelAnime2); + LinkAnimation_Update(play, &this->upperSkelAnime); if (Player_HoldsHookshot(this) && !func_80834FBC(this)) { return 1; } if (!func_80834758(play, this) && - (D_80853614 || ((this->unk_860 < 0) && D_80853618) || func_80834E44(play))) { + (sUseHeldItem || ((this->unk_860 < 0) && sHeldItemButtonIsHeldDown) || func_80834E44(play))) { this->unk_860 = ABS(this->unk_860); if (func_8083442C(this, play)) { if (Player_HoldsHookshot(this)) { this->unk_836 = 1; } else { - LinkAnimation_PlayOnce(play, &this->skelAnime2, &gPlayerAnim_link_bow_bow_shoot_next); + LinkAnimation_PlayOnce(play, &this->upperSkelAnime, &gPlayerAnim_link_bow_bow_shoot_next); } } } else { @@ -2655,10 +2858,10 @@ s32 func_808353D8(Player* this, PlayState* play) { } if (Player_HoldsHookshot(this)) { - func_80833638(this, func_8083501C); + Player_SetUpperActionFunc(this, func_8083501C); } else { - func_80833638(this, func_80835588); - LinkAnimation_PlayOnce(play, &this->skelAnime2, &gPlayerAnim_link_bow_bow_shoot_end); + Player_SetUpperActionFunc(this, func_80835588); + LinkAnimation_PlayOnce(play, &this->upperSkelAnime, &gPlayerAnim_link_bow_bow_shoot_end); } this->unk_834 = 0; @@ -2668,8 +2871,8 @@ s32 func_808353D8(Player* this, PlayState* play) { } s32 func_80835588(Player* this, PlayState* play) { - if (!(this->actor.bgCheckFlags & 1) || LinkAnimation_Update(play, &this->skelAnime2)) { - func_80833638(this, func_8083501C); + if (!(this->actor.bgCheckFlags & 1) || LinkAnimation_Update(play, &this->upperSkelAnime)) { + Player_SetUpperActionFunc(this, func_8083501C); } return 1; @@ -2678,7 +2881,7 @@ s32 func_80835588(Player* this, PlayState* play) { void func_808355DC(Player* this) { this->stateFlags1 |= PLAYER_STATE1_TARGET_NOTHING; - if (!(this->skelAnime.moveFlags & 0x80) && (this->actor.bgCheckFlags & 0x200) && (D_80853608 < 0x2000)) { + if (!(this->skelAnime.moveFlags & 0x80) && (this->actor.bgCheckFlags & 0x200) && (sShapeYawToTouchedWall < 0x2000)) { this->currentYaw = this->actor.shape.rot.y = this->actor.wallYaw + 0x8000; } @@ -2697,8 +2900,8 @@ s32 func_80835644(PlayState* play, Player* this, Actor* arg2) { void func_80835688(Player* this, PlayState* play) { if (!func_80835644(play, this, this->heldActor)) { - func_80833638(this, func_808356E8); - LinkAnimation_PlayLoop(play, &this->skelAnime2, &gPlayerAnim_link_normal_carryB_wait); + Player_SetUpperActionFunc(this, func_808356E8); + LinkAnimation_PlayLoop(play, &this->upperSkelAnime, &gPlayerAnim_link_normal_carryB_wait); } } @@ -2714,8 +2917,8 @@ s32 func_808356E8(Player* this, PlayState* play) { } if (this->stateFlags1 & PLAYER_STATE1_ITEM_OVER_HEAD) { - if (LinkAnimation_Update(play, &this->skelAnime2)) { - LinkAnimation_PlayLoop(play, &this->skelAnime2, &gPlayerAnim_link_normal_carryB_wait); + if (LinkAnimation_Update(play, &this->upperSkelAnime)) { + LinkAnimation_PlayLoop(play, &this->upperSkelAnime, &gPlayerAnim_link_normal_carryB_wait); } if ((heldActor->id == ACTOR_EN_NIW) && (this->actor.velocity.y <= 0.0f)) { @@ -2740,7 +2943,7 @@ s32 func_80835800(Player* this, PlayState* play) { } if (this->stateFlags1 & PLAYER_STATE1_THREW_BOOMERANG) { - func_80833638(this, func_80835B60); + Player_SetUpperActionFunc(this, func_80835B60); } else if (func_80834F2C(this, play)) { return 1; } @@ -2749,9 +2952,9 @@ s32 func_80835800(Player* this, PlayState* play) { } s32 func_80835884(Player* this, PlayState* play) { - if (LinkAnimation_Update(play, &this->skelAnime2)) { - func_80833638(this, func_808358F0); - LinkAnimation_PlayLoop(play, &this->skelAnime2, &gPlayerAnim_link_boom_throw_waitR); + if (LinkAnimation_Update(play, &this->upperSkelAnime)) { + Player_SetUpperActionFunc(this, func_808358F0); + LinkAnimation_PlayLoop(play, &this->upperSkelAnime, &gPlayerAnim_link_boom_throw_waitR); } func_80834EB8(this, play); @@ -2764,17 +2967,17 @@ s32 func_808358F0(Player* this, PlayState* play) { if ((func_808334E4(this) == animSeg) || (func_80833528(this) == animSeg) || (func_808335B0(this) == animSeg) || (func_808335F4(this) == animSeg)) { - AnimationContext_SetCopyAll(play, this->skelAnime.limbCount, this->skelAnime2.jointTable, + AnimationContext_SetCopyAll(play, this->skelAnime.limbCount, this->upperSkelAnime.jointTable, this->skelAnime.jointTable); } else { - LinkAnimation_Update(play, &this->skelAnime2); + LinkAnimation_Update(play, &this->upperSkelAnime); } func_80834EB8(this, play); - if (!D_80853618) { - func_80833638(this, func_808359FC); - LinkAnimation_PlayOnce(play, &this->skelAnime2, + if (!sHeldItemButtonIsHeldDown) { + Player_SetUpperActionFunc(this, func_808359FC); + LinkAnimation_PlayOnce(play, &this->upperSkelAnime, (this->unk_870 < 0.5f) ? &gPlayerAnim_link_boom_throwR : &gPlayerAnim_link_boom_throwL); } @@ -2782,10 +2985,10 @@ s32 func_808358F0(Player* this, PlayState* play) { } s32 func_808359FC(Player* this, PlayState* play) { - if (LinkAnimation_Update(play, &this->skelAnime2)) { - func_80833638(this, func_80835B60); + if (LinkAnimation_Update(play, &this->upperSkelAnime)) { + Player_SetUpperActionFunc(this, func_80835B60); this->unk_834 = 0; - } else if (LinkAnimation_OnFrame(&this->skelAnime2, 6.0f)) { + } else if (LinkAnimation_OnFrame(&this->upperSkelAnime, 6.0f)) { f32 posX = (Math_SinS(this->actor.shape.rot.y) * 10.0f) + this->actor.world.pos.x; f32 posZ = (Math_CosS(this->actor.shape.rot.y) * 10.0f) + this->actor.world.pos.z; s32 yaw = (this->unk_664 != NULL) ? this->actor.shape.rot.y + 14000 : this->actor.shape.rot.y; @@ -2802,7 +3005,7 @@ s32 func_808359FC(Player* this, PlayState* play) { func_808355DC(this); } this->unk_A73 = 4; - Player_PlaySfx(&this->actor, NA_SE_IT_BOOMERANG_THROW); + Player_PlaySfx(this, NA_SE_IT_BOOMERANG_THROW); func_80832698(this, NA_SE_VO_LI_SWORD_N); } } @@ -2837,15 +3040,15 @@ s32 func_80835B60(Player* this, PlayState* play) { } if (!(this->stateFlags1 & PLAYER_STATE1_THREW_BOOMERANG)) { - func_80833638(this, func_80835C08); - LinkAnimation_PlayOnce(play, &this->skelAnime2, &gPlayerAnim_link_boom_catch); + Player_SetUpperActionFunc(this, func_80835C08); + LinkAnimation_PlayOnce(play, &this->upperSkelAnime, &gPlayerAnim_link_boom_catch); func_808357E8(this, gPlayerLeftHandBoomerangDLs); Player_PlaySfx(&this->actor, NA_SE_PL_CATCH_BOOMERANG); func_80832698(this, NA_SE_VO_LI_SWORD_N); return 1; } - if (D_80853614 && CVarGetInteger("gFastBoomerang", 0)) { + if (sUseHeldItem && CVarGetInteger("gFastBoomerang", 0)) { this->boomerangQuickRecall = true; } @@ -2853,26 +3056,26 @@ s32 func_80835B60(Player* this, PlayState* play) { } s32 func_80835C08(Player* this, PlayState* play) { - if (!func_80835800(this, play) && LinkAnimation_Update(play, &this->skelAnime2)) { - func_80833638(this, func_80835800); + if (!func_80835800(this, play) && LinkAnimation_Update(play, &this->upperSkelAnime)) { + Player_SetUpperActionFunc(this, func_80835800); } return 1; } -s32 func_80835C58(PlayState* play, Player* this, PlayerFunc674 func, s32 flags) { - if (func == this->func_674) { +s32 Player_SetupAction(PlayState* play, Player* this, PlayerActionFunc actionFunc, s32 flags) { + if (actionFunc == this->actionFunc) { return 0; } - if (func_8084E3C4 == this->func_674) { + if (func_8084E3C4 == this->actionFunc) { Audio_OcaSetInstrument(0); this->stateFlags2 &= ~(PLAYER_STATE2_ATTEMPT_PLAY_FOR_ACTOR | PLAYER_STATE2_PLAY_FOR_ACTOR); - } else if (func_808507F4 == this->func_674) { + } else if (func_808507F4 == this->actionFunc) { func_80832340(play, this); } - this->func_674 = func; + this->actionFunc = actionFunc; if ((this->itemAction != this->heldItemAction) && (!(flags & 1) || !(this->stateFlags1 & PLAYER_STATE1_SHIELDING))) { @@ -2885,34 +3088,38 @@ s32 func_80835C58(PlayState* play, Player* this, PlayerFunc674 func, s32 flags) } func_80832DBC(this); + this->stateFlags1 &= ~(PLAYER_STATE1_HOOKSHOT_FALLING | PLAYER_STATE1_TEXT_ON_SCREEN | PLAYER_STATE1_DAMAGED | PLAYER_STATE1_IN_ITEM_CS | PLAYER_STATE1_IN_CUTSCENE | PLAYER_STATE1_FLOOR_DISABLED); this->stateFlags2 &= ~(PLAYER_STATE2_HOPPING | PLAYER_STATE2_OCARINA_PLAYING | PLAYER_STATE2_IDLING); this->stateFlags3 &= ~(PLAYER_STATE3_MIDAIR | PLAYER_STATE3_FINISHED_ATTACKING | PLAYER_STATE3_HOOKSHOT_TRAVELLING); + this->unk_84F = 0; this->unk_850 = 0; + this->unk_6AC = 0; + func_808326F0(this); return 1; } -void func_80835DAC(PlayState* play, Player* this, PlayerFunc674 func, s32 flags) { +void func_80835DAC(PlayState* play, Player* this, PlayerActionFunc actionFunc, s32 flags) { s32 temp; temp = this->skelAnime.moveFlags; this->skelAnime.moveFlags = 0; - func_80835C58(play, this, func, flags); + Player_SetupAction(play, this, actionFunc, flags); this->skelAnime.moveFlags = temp; } -void func_80835DE4(PlayState* play, Player* this, PlayerFunc674 func, s32 flags) { +void func_80835DE4(PlayState* play, Player* this, PlayerActionFunc actionFunc, s32 flags) { s32 temp; if (this->itemAction >= 0) { temp = this->itemAction; this->itemAction = this->heldItemAction; - func_80835C58(play, this, func, flags); + Player_SetupAction(play, this, actionFunc, flags); this->itemAction = temp; Player_SetModels(this, Player_ActionToModelGroup(this, this->itemAction)); } @@ -2933,7 +3140,7 @@ void func_80835EA4(PlayState* play, s32 arg1) { Camera_SetCameraData(Play_GetCamera(play, 0), 4, 0, 0, arg1, 0, 0); } -void func_80835EFC(Player* this) { +void Player_DestroyHookshot(Player* this) { if (Player_HoldsHookshot(this)) { Actor* heldActor = this->heldActor; @@ -2945,41 +3152,41 @@ void func_80835EFC(Player* this) { } } -void func_80835F44(PlayState* play, Player* this, s32 item) { - s8 actionParam; +void Player_UseItem(PlayState* play, Player* this, s32 item) { + s8 itemAction; s32 temp; s32 nextAnimType; - actionParam = Player_ItemToItemAction(item); + itemAction = Player_ItemToItemAction(item); if (((this->heldItemAction == this->itemAction) && - (!(this->stateFlags1 & PLAYER_STATE1_SHIELDING) || (Player_ActionToMeleeWeapon(actionParam) != 0) || - (actionParam == PLAYER_IA_NONE))) || + (!(this->stateFlags1 & PLAYER_STATE1_SHIELDING) || (Player_ActionToMeleeWeapon(itemAction) != 0) || + (itemAction == PLAYER_IA_NONE))) || ((this->itemAction < 0) && - ((Player_ActionToMeleeWeapon(actionParam) != 0) || (actionParam == PLAYER_IA_NONE)))) { + ((Player_ActionToMeleeWeapon(itemAction) != 0) || (itemAction == PLAYER_IA_NONE)))) { - if ((actionParam == PLAYER_IA_NONE) || !(this->stateFlags1 & PLAYER_STATE1_IN_WATER) || + if ((itemAction == PLAYER_IA_NONE) || !(this->stateFlags1 & PLAYER_STATE1_IN_WATER) || ((this->actor.bgCheckFlags & 1) && - ((actionParam == PLAYER_IA_HOOKSHOT) || (actionParam == PLAYER_IA_LONGSHOT))) || - ((actionParam >= PLAYER_IA_SHIELD_DEKU) && (actionParam <= PLAYER_IA_BOOTS_HOVER))) { + ((itemAction == PLAYER_IA_HOOKSHOT) || (itemAction == PLAYER_IA_LONGSHOT))) || + ((itemAction >= PLAYER_IA_SHIELD_DEKU) && (itemAction <= PLAYER_IA_BOOTS_HOVER))) { if ((play->bombchuBowlingStatus == 0) && - (((actionParam == PLAYER_IA_DEKU_STICK) && (AMMO(ITEM_STICK) == 0)) || - ((actionParam == PLAYER_IA_MAGIC_BEAN) && (AMMO(ITEM_BEAN) == 0)) || - (temp = Player_ActionToExplosive(this, actionParam), + (((itemAction == PLAYER_IA_DEKU_STICK) && (AMMO(ITEM_STICK) == 0)) || + ((itemAction == PLAYER_IA_MAGIC_BEAN) && (AMMO(ITEM_BEAN) == 0)) || + (temp = Player_ActionToExplosive(this, itemAction), ((temp >= 0) && ((AMMO(sExplosiveInfos[temp].itemId) == 0) || (play->actorCtx.actorLists[ACTORCAT_EXPLOSIVE].length >= 3 && !CVarGetInteger("gRemoveExplosiveLimit", 0))))))) { func_80078884(NA_SE_SY_ERROR); return; } - if (actionParam >= PLAYER_IA_SHIELD_DEKU) { + if (itemAction >= PLAYER_IA_SHIELD_DEKU) { // Changing shields through action commands is unimplemented // Boots and tunics handled previously return; } - if (actionParam == PLAYER_IA_LENS_OF_TRUTH) { + if (itemAction == PLAYER_IA_LENS_OF_TRUTH) { if (Magic_RequestChange(play, 0, MAGIC_CONSUME_LENS)) { if (play->actorCtx.lensActive) { Actor_DisableLens(play); @@ -2993,7 +3200,7 @@ void func_80835F44(PlayState* play, Player* this, s32 item) { return; } - if (actionParam == PLAYER_IA_DEKU_NUT) { + if (itemAction == PLAYER_IA_DEKU_NUT) { if (AMMO(ITEM_NUT) != 0) { func_8083C61C(play, this); } else { @@ -3002,12 +3209,12 @@ void func_80835F44(PlayState* play, Player* this, s32 item) { return; } - temp = Player_ActionToMagicSpell(this, actionParam); + temp = Player_ActionToMagicSpell(this, itemAction); if (temp >= 0) { - if (((actionParam == PLAYER_IA_FARORES_WIND) && (gSaveContext.respawn[RESPAWN_MODE_TOP].data > 0)) || + if (((itemAction == PLAYER_IA_FARORES_WIND) && (gSaveContext.respawn[RESPAWN_MODE_TOP].data > 0)) || ((gSaveContext.magicCapacity != 0) && (gSaveContext.magicState == MAGIC_STATE_IDLE) && (gSaveContext.magic >= sMagicSpellCosts[temp]))) { - this->itemAction = actionParam; + this->itemAction = itemAction; this->unk_6AD = 4; } else { func_80078884(NA_SE_SY_ERROR); @@ -3015,50 +3222,51 @@ void func_80835F44(PlayState* play, Player* this, s32 item) { return; } - if (actionParam >= PLAYER_IA_MASK_KEATON) { + if (itemAction >= PLAYER_IA_MASK_KEATON) { if (this->currentMask != PLAYER_MASK_NONE) { this->currentMask = PLAYER_MASK_NONE; } else { - this->currentMask = actionParam - PLAYER_IA_MASK_KEATON + 1; + this->currentMask = itemAction - PLAYER_IA_MASK_KEATON + 1; } sMaskMemory = this->currentMask; func_808328EC(this, NA_SE_PL_CHANGE_ARMS); return; } - if (((actionParam >= PLAYER_IA_OCARINA_FAIRY) && (actionParam <= PLAYER_IA_OCARINA_OF_TIME)) || - (actionParam >= PLAYER_IA_BOTTLE_FISH)) { + if (((itemAction >= PLAYER_IA_OCARINA_FAIRY) && (itemAction <= PLAYER_IA_OCARINA_OF_TIME)) || + (itemAction >= PLAYER_IA_BOTTLE_FISH)) { if (!func_8008E9C4(this) || - ((actionParam >= PLAYER_IA_BOTTLE_POTION_RED) && (actionParam <= PLAYER_IA_BOTTLE_FAIRY))) { + ((itemAction >= PLAYER_IA_BOTTLE_POTION_RED) && (itemAction <= PLAYER_IA_BOTTLE_FAIRY))) { func_8002D53C(play, &play->actorCtx.titleCtx); this->unk_6AD = 4; - this->itemAction = actionParam; + this->itemAction = itemAction; } return; } - if ((actionParam != this->heldItemAction) || - ((this->heldActor == 0) && (Player_ActionToExplosive(this, actionParam) >= 0))) { - this->nextModelGroup = Player_ActionToModelGroup(this, actionParam); + if ((itemAction != this->heldItemAction) || + ((this->heldActor == 0) && (Player_ActionToExplosive(this, itemAction) >= 0))) { + this->nextModelGroup = Player_ActionToModelGroup(this, itemAction); nextAnimType = gPlayerModelTypes[this->nextModelGroup][PLAYER_MODELGROUPENTRY_ANIM]; - if ((this->heldItemAction >= 0) && (Player_ActionToMagicSpell(this, actionParam) < 0) && + if ((this->heldItemAction >= 0) && (Player_ActionToMagicSpell(this, itemAction) < 0) && (item != this->heldItemId) && - (D_80854164[gPlayerModelTypes[this->modelGroup][PLAYER_MODELGROUPENTRY_ANIM]][nextAnimType] != - PLAYER_D_808540F4_0) && + (sItemChangeTypes[gPlayerModelTypes[this->modelGroup][PLAYER_MODELGROUPENTRY_ANIM]][nextAnimType] != + PLAYER_ITEM_CHG_0) && (!CVarGetInteger("gSeparateArrows", 0) || - actionParam < PLAYER_IA_BOW || actionParam > PLAYER_IA_BOW_0E || + itemAction < PLAYER_IA_BOW || itemAction > PLAYER_IA_BOW_0E || this->heldItemAction < PLAYER_IA_BOW || this->heldItemAction > PLAYER_IA_BOW_0E)) { this->heldItemId = item; this->stateFlags1 |= PLAYER_STATE1_START_PUTAWAY; } else { - func_80835EFC(this); - func_808323B4(play, this); - func_80833664(play, this, actionParam); + // Init new held item for use + Player_DestroyHookshot(this); + Player_DetachHeldActor(play, this); + Player_InitItemActionWithAnim(play, this, itemAction); } return; } - D_80853614 = D_80853618 = true; + sUseHeldItem = sHeldItemButtonIsHeldDown = true; } } } @@ -3068,11 +3276,11 @@ void func_80836448(PlayState* play, Player* this, LinkAnimationHeader* anim) { func_80832564(play, this); - func_80835C58(play, this, cond ? func_8084E368 : func_80843CEC, 0); + Player_SetupAction(play, this, cond ? func_8084E368 : func_80843CEC, 0); this->stateFlags1 |= PLAYER_STATE1_DEAD; - func_80832264(play, this, anim); + Player_AnimPlayOnce(play, this, anim); if (anim == &gPlayerAnim_link_derth_rebirth) { this->skelAnime.endFrame = 84.0f; } @@ -3099,20 +3307,20 @@ void func_80836448(PlayState* play, Player* this, LinkAnimationHeader* anim) { } } -s32 func_808365C8(Player* this) { - return (!(func_808458D0 == this->func_674) || +s32 Player_CanUpdateItems(Player* this) { + return (!(func_808458D0 == this->actionFunc) || ((this->stateFlags1 & PLAYER_STATE1_START_PUTAWAY) && ((this->heldItemId == ITEM_LAST_USED) || (this->heldItemId == ITEM_NONE)))) && - (!(func_80834A2C == this->func_82C) || + (!(Player_UpperAction_ChangeHeldItem == this->upperActionFunc) || (Player_ItemToItemAction(this->heldItemId) == this->heldItemAction)); } -s32 func_80836670(Player* this, PlayState* play) { +s32 Player_UpdateUpperBody(Player* this, PlayState* play) { if (!(this->stateFlags1 & PLAYER_STATE1_ON_HORSE) && (this->actor.parent != NULL) && Player_HoldsHookshot(this)) { - func_80835C58(play, this, func_80850AEC, 1); + Player_SetupAction(play, this, func_80850AEC, 1); this->stateFlags3 |= PLAYER_STATE3_HOOKSHOT_TRAVELLING; - func_80832264(play, this, &gPlayerAnim_link_hook_fly_start); - func_80832F54(play, this, 0x9B); + Player_AnimPlayOnce(play, this, &gPlayerAnim_link_hook_fly_start); + Player_AnimReplaceApplyFlags(play, this, 0x9B); func_80832224(this); this->currentYaw = this->actor.shape.rot.y; this->actor.bgCheckFlags &= ~1; @@ -3122,31 +3330,31 @@ s32 func_80836670(Player* this, PlayState* play) { return 1; } - if (func_808365C8(this)) { - func_80834298(this, play); - if (func_8084E604 == this->func_674) { + if (Player_CanUpdateItems(this)) { + Player_UpdateItems(this, play); + if (func_8084E604 == this->actionFunc) { return 1; } } - if (!this->func_82C(this, play)) { + if (!this->upperActionFunc(this, play)) { return 0; } - if (this->unk_830 != 0.0f) { + if (this->upperAnimBlendWeight != 0.0f) { if ((func_80833350(this) == 0) || (this->linearVelocity != 0.0f)) { - AnimationContext_SetCopyFalse(play, this->skelAnime.limbCount, this->skelAnime2.jointTable, - this->skelAnime.jointTable, D_80853410); + AnimationContext_SetCopyFalse(play, this->skelAnime.limbCount, this->upperSkelAnime.jointTable, + this->skelAnime.jointTable, sUpperBodyLimbCopyMap); } - Math_StepToF(&this->unk_830, 0.0f, 0.25f); + Math_StepToF(&this->upperAnimBlendWeight, 0.0f, 0.25f); AnimationContext_SetInterp(play, this->skelAnime.limbCount, this->skelAnime.jointTable, - this->skelAnime2.jointTable, 1.0f - this->unk_830); + this->upperSkelAnime.jointTable, 1.0f - this->upperAnimBlendWeight); } else if ((func_80833350(this) == 0) || (this->linearVelocity != 0.0f)) { AnimationContext_SetCopyTrue(play, this->skelAnime.limbCount, this->skelAnime.jointTable, - this->skelAnime2.jointTable, D_80853410); + this->upperSkelAnime.jointTable, sUpperBodyLimbCopyMap); } else { AnimationContext_SetCopyAll(play, this->skelAnime.limbCount, this->skelAnime.jointTable, - this->skelAnime2.jointTable); + this->upperSkelAnime.jointTable); } return 1; @@ -3154,7 +3362,7 @@ s32 func_80836670(Player* this, PlayState* play) { s32 func_80836898(PlayState* play, Player* this, PlayerFuncA74 func) { this->func_A74 = func; - func_80835C58(play, this, func_808458D0, 0); + Player_SetupAction(play, this, func_808458D0, 0); this->stateFlags2 |= PLAYER_STATE2_DISABLE_ROTATION_ALWAYS; return func_80832528(play, this); } @@ -3234,7 +3442,7 @@ void func_80836BEC(Player* this, PlayState* play) { this->stateFlags1 &= ~PLAYER_STATE1_30; } - if ((play->csCtx.state != CS_STATE_IDLE) || (this->csMode != 0) || + if ((play->csCtx.state != CS_STATE_IDLE) || (this->csAction != 0) || (this->stateFlags1 & (PLAYER_STATE1_DEAD | PLAYER_STATE1_IN_CUTSCENE)) || (this->stateFlags3 & PLAYER_STATE3_HOOKSHOT_TRAVELLING)) { this->unk_66C = 0; } else if (zTrigPressed || (this->stateFlags2 & PLAYER_STATE2_SWITCH_TARGETING) || (this->unk_684 != NULL)) { @@ -3326,74 +3534,98 @@ void func_80836BEC(Player* this, PlayState* play) { } } -s32 func_80836FAC(PlayState* play, Player* this, f32* arg2, s16* arg3, f32 arg4) { - f32 temp_f2; - f32 temp_f0; - f32 temp_f14; - f32 temp_f12; +/** + * Calculates target speed and yaw based on input from the control stick. + * See `Player_GetMovementSpeedAndYaw` for detailed argument descriptions. + * + * @return true if the control stick has any magnitude, false otherwise. + */ +s32 Player_CalcSpeedAndYawFromControlStick(PlayState* play, Player* this, f32* outSpeedTarget, s16* outYawTarget, f32 speedMode) { + f32 temp; + f32 sinFloorPitch; + f32 floorPitchInfluence; + f32 speedCap; if ((this->unk_6AD != 0) || (play->transitionTrigger == TRANS_TRIGGER_START) || (this->stateFlags1 & PLAYER_STATE1_LOADING)) { - *arg2 = 0.0f; - *arg3 = this->actor.shape.rot.y; + *outSpeedTarget = 0.0f; + *outYawTarget = this->actor.shape.rot.y; } else { - *arg2 = D_808535D4; - *arg3 = D_808535D8; + *outSpeedTarget = sControlStickMagnitude; + *outYawTarget = sControlStickAngle; - if (arg4 != 0.0f) { - *arg2 -= 20.0f; - if (*arg2 < 0.0f) { - *arg2 = 0.0f; + if (speedMode != 0.0f) { + *outSpeedTarget -= 20.0f; + if (*outSpeedTarget < 0.0f) { + // If control stick magnitude is below 20, return zero speed. + *outSpeedTarget = 0.0f; } else { - temp_f2 = 1.0f - Math_CosS(*arg2 * 450.0f); - *arg2 = ((temp_f2 * temp_f2) * 30.0f) + 7.0f; + // Cosine of the control stick magnitude isn't exactly meaningful, but + // it happens to give a desirable curve for grounded movement speed relative + // to control stick magnitude. + temp = 1.0f - Math_CosS(*outSpeedTarget * 450.0f); + *outSpeedTarget = ((temp * temp) * 30.0f) + 7.0f; } } else { - *arg2 *= 0.8f; + // Speed increases linearly relative to control stick magnitude + *outSpeedTarget *= 0.8f; } - if (D_808535D4 != 0.0f) { - temp_f0 = Math_SinS(this->unk_898); - temp_f12 = this->unk_880; - temp_f14 = CLAMP(temp_f0, 0.0f, 0.6f); + if (sControlStickMagnitude != 0.0f) { + sinFloorPitch = Math_SinS(this->floorPitch); + speedCap = this->unk_880; + floorPitchInfluence = CLAMP(sinFloorPitch, 0.0f, 0.6f); if (this->unk_6C4 != 0.0f) { - temp_f12 = temp_f12 - (this->unk_6C4 * 0.008f); - if (temp_f12 < 2.0f) { - temp_f12 = 2.0f; + speedCap = speedCap - (this->unk_6C4 * 0.008f); + if (speedCap < 2.0f) { + speedCap = 2.0f; } } - *arg2 = (*arg2 * 0.14f) - (8.0f * temp_f14 * temp_f14); - *arg2 = CLAMP(*arg2, 0.0f, temp_f12); + *outSpeedTarget = (*outSpeedTarget * 0.14f) - (8.0f * floorPitchInfluence * floorPitchInfluence); + *outSpeedTarget = CLAMP(*outSpeedTarget, 0.0f, speedCap); - return 1; + return true; } } - return 0; + return false; } s32 func_8083721C(Player* this) { return Math_StepToF(&this->linearVelocity, 0.0f, REG(43) / 100.0f); } -s32 func_80837268(Player* this, f32* arg1, s16* arg2, f32 arg3, PlayState* play) { - if (!func_80836FAC(play, this, arg1, arg2, arg3)) { - *arg2 = this->actor.shape.rot.y; +/** + * Gets target speed and yaw values for movement based on control stick input. + * Control stick magnitude and angle are processed in `Player_CalcSpeedAndYawFromControlStick` to get target values. + * Additionally, this function does extra processing on the target yaw value if the control stick is neutral. + * + * @param outSpeedTarget a pointer to the variable that will hold the resulting target speed value + * @param outYawTarget a pointer to the variable that will hold the resulting target yaw value + * @param speedMode toggles between a linear and curved mode for the speed value + * + * @see Player_CalcSpeedAndYawFromControlStick for more information on the linear vs curved speed mode. + * + * @return true if the control stick has any magnitude, false otherwise. + */ +s32 Player_GetMovementSpeedAndYaw(Player* this, f32* outSpeedTarget, s16* outYawTarget, f32 speedMode, PlayState* play) { + if (!Player_CalcSpeedAndYawFromControlStick(play, this, outSpeedTarget, outYawTarget, speedMode)) { + *outYawTarget = this->actor.shape.rot.y; if (this->unk_664 != NULL) { if ((play->actorCtx.targetCtx.unk_4B != 0) && !(this->stateFlags2 & PLAYER_STATE2_DISABLE_ROTATION_ALWAYS)) { - *arg2 = Math_Vec3f_Yaw(&this->actor.world.pos, &this->unk_664->focus.pos); - return 0; + *outYawTarget = Math_Vec3f_Yaw(&this->actor.world.pos, &this->unk_664->focus.pos); + return false; } } else if (func_80833B2C(this)) { - *arg2 = this->targetYaw; + *outYawTarget = this->targetYaw; } - return 0; + return false; } else { - *arg2 += Camera_GetInputDirYaw(GET_ACTIVE_CAM(play)); - return 1; + *outYawTarget += Camera_GetInputDirYaw(GET_ACTIVE_CAM(play)); + return true; } } @@ -3414,37 +3646,53 @@ static s32 (*D_80854448[])(Player* this, PlayState* play) = { func_80850224, func_8083C544, func_8083EB44, func_8083BDBC, func_8083C2B0, func_80838A14, func_8083B040, }; -s32 func_80837348(PlayState* play, Player* this, s8* arg2, s32 arg3) { +/** + * This function processes "Action Change Lists", which run various functions that + * check if it is appropriate to change to a new action. + * + * Action Change Lists are a list of indices for the `sActionChangeFuncs` array. + * The functions are ran in order until one of them returns true, or the end of the list is reached. + * An Action Change index having a negative value indicates that it is the last member in the list. + * + * Because these lists are processed sequentially, the order of the indices in the list determines its priority. + * + * If the `updateUpperBody` argument is true, Player's upper body will update before the Action Change List + * is processed. This allows for Item Action functions to run. + * + * @return true if a new action has been chosen + * + */ +s32 Player_TryActionChangeList(PlayState* play, Player* this, s8* actionChangeList, s32 updateUpperBody) { s32 i; if (!(this->stateFlags1 & (PLAYER_STATE1_LOADING | PLAYER_STATE1_DEAD | PLAYER_STATE1_IN_CUTSCENE))) { - if (arg3 != 0) { - D_808535E0 = func_80836670(this, play); - if (func_8084E604 == this->func_674) { - return 1; + if (updateUpperBody != 0) { + D_808535E0 = Player_UpdateUpperBody(this, play); + if (func_8084E604 == this->actionFunc) { + return true; } } if (func_8008F128(this)) { this->unk_6AE |= 0x41; - return 1; + return true; } - if (!(this->stateFlags1 & PLAYER_STATE1_START_PUTAWAY) && (func_80834A2C != this->func_82C)) { - while (*arg2 >= 0) { - if (D_80854448[*arg2](this, play)) { - return 1; + if (!(this->stateFlags1 & PLAYER_STATE1_START_PUTAWAY) && (Player_UpperAction_ChangeHeldItem != this->upperActionFunc)) { + while (*actionChangeList >= 0) { + if (D_80854448[*actionChangeList](this, play)) { + return true; } - arg2++; + actionChangeList++; } - if (D_80854448[-(*arg2)](this, play)) { - return 1; + if (D_80854448[-(*actionChangeList)](this, play)) { + return true; } } } - return 0; + return false; } s32 func_808374A0(PlayState* play, Player* this, SkelAnime* skelAnime, f32 arg3) { @@ -3452,11 +3700,11 @@ s32 func_808374A0(PlayState* play, Player* this, SkelAnime* skelAnime, f32 arg3) s16 sp22; if ((skelAnime->endFrame - arg3) <= skelAnime->curFrame) { - if (func_80837348(play, this, D_80854418, 1)) { + if (Player_TryActionChangeList(play, this, D_80854418, 1)) { return 0; } - if (func_80837268(this, &sp24, &sp22, 0.018f, play)) { + if (Player_GetMovementSpeedAndYaw(this, &sp24, &sp22, 0.018f, play)) { return 1; } } @@ -3520,25 +3768,35 @@ s32 func_808375D8(Player* this) { void func_80837704(PlayState* play, Player* this) { LinkAnimationHeader* anim; - if ((this->meleeWeaponAnimation >= 4) && (this->meleeWeaponAnimation < 8)) { + if ((this->meleeWeaponAnimation >= PLAYER_MWA_RIGHT_SLASH_1H) && + (this->meleeWeaponAnimation <= PLAYER_MWA_RIGHT_COMBO_2H)) { anim = D_80854358[Player_HoldsTwoHandedWeapon(this)]; } else { anim = D_80854350[Player_HoldsTwoHandedWeapon(this)]; } func_80832318(this); - LinkAnimation_Change(play, &this->skelAnime, anim, 1.0f, 8.0f, Animation_GetLastFrame(anim), ANIMMODE_ONCE, - -9.0f); + LinkAnimation_Change(play, &this->skelAnime, anim, 1.0f, 8.0f, Animation_GetLastFrame(anim), ANIMMODE_ONCE, -9.0f); func_80837530(play, this, 0x200); } void func_808377DC(PlayState* play, Player* this) { - func_80835C58(play, this, func_80844E68, 1); + Player_SetupAction(play, this, func_80844E68, 1); func_80837704(play, this); } -static s8 D_80854480[] = { 12, 4, 4, 8 }; -static s8 D_80854484[] = { 22, 23, 22, 23 }; +static s8 D_80854480[] = { + PLAYER_MWA_STAB_1H, + PLAYER_MWA_RIGHT_SLASH_1H, + PLAYER_MWA_RIGHT_SLASH_1H, + PLAYER_MWA_LEFT_SLASH_1H, +}; +static s8 D_80854484[] = { + PLAYER_MWA_HAMMER_FORWARD, + PLAYER_MWA_HAMMER_SIDE, + PLAYER_MWA_HAMMER_FORWARD, + PLAYER_MWA_HAMMER_SIDE, +}; s32 func_80837818(Player* this) { s32 sp1C = this->unk_84B[this->unk_846]; @@ -3552,25 +3810,25 @@ s32 func_80837818(Player* this) { this->unk_845 = 0; } else { if (func_808375D8(this)) { - sp18 = 24; + sp18 = PLAYER_MWA_SPIN_ATTACK_1H; } else { if (sp1C < 0) { if (func_80833BCC(this)) { - sp18 = 0; + sp18 = PLAYER_MWA_FORWARD_SLASH_1H; } else { - sp18 = 4; + sp18 = PLAYER_MWA_RIGHT_SLASH_1H; } } else { sp18 = D_80854480[sp1C]; - if (sp18 == 12) { + if (sp18 == PLAYER_MWA_STAB_1H) { this->stateFlags2 |= PLAYER_STATE2_SWORD_LUNGE; if (!func_80833BCC(this)) { - sp18 = 0; + sp18 = PLAYER_MWA_FORWARD_SLASH_1H; } } } if (this->heldItemAction == PLAYER_IA_DEKU_STICK) { - sp18 = 0; + sp18 = PLAYER_MWA_FORWARD_SLASH_1H; } } if (Player_HoldsTwoHandedWeapon(this)) { @@ -3581,10 +3839,10 @@ s32 func_80837818(Player* this) { return sp18; } -void func_80837918(Player* this, s32 quadIndex, u32 flags) { - this->meleeWeaponQuads[quadIndex].info.toucher.dmgFlags = flags; +void func_80837918(Player* this, s32 quadIndex, u32 dmgFlags) { + this->meleeWeaponQuads[quadIndex].info.toucher.dmgFlags = dmgFlags; - if (flags == 2) { + if (dmgFlags == 2) { this->meleeWeaponQuads[quadIndex].info.toucherFlags = TOUCH_ON | TOUCH_NEAREST | TOUCH_SFX_WOOD; } else { this->meleeWeaponQuads[quadIndex].info.toucherFlags = TOUCH_ON | TOUCH_NEAREST; @@ -3598,12 +3856,12 @@ static u32 D_80854488[][2] = { void func_80837948(PlayState* play, Player* this, s32 arg2) { s32 pad; - u32 flags; + u32 dmgFlags; s32 temp; - func_80835C58(play, this, func_808502D0, 0); + Player_SetupAction(play, this, func_808502D0, 0); this->unk_844 = 8; - if ((arg2 < 18) || (arg2 >= 20)) { + if (!((arg2 >= PLAYER_MWA_FLIPSLASH_FINISH) && (arg2 <= PLAYER_MWA_JUMPSLASH_FINISH))) { func_80832318(this); } @@ -3618,9 +3876,9 @@ void func_80837948(PlayState* play, Player* this, s32 arg2) { this->meleeWeaponAnimation = arg2; - func_808322D0(play, this, D_80854190[arg2].unk_00); - if ((arg2 != 16) && (arg2 != 17)) { - func_80832F54(play, this, 0x209); + Player_AnimPlayOnceAdjusted(play, this, D_80854190[arg2].unk_00); + if ((arg2 != PLAYER_MWA_FLIPSLASH_START) && (arg2 != PLAYER_MWA_JUMPSLASH_START)) { + Player_AnimReplaceApplyFlags(play, this, 0x209); } this->currentYaw = this->actor.shape.rot.y; @@ -3631,19 +3889,19 @@ void func_80837948(PlayState* play, Player* this, s32 arg2) { temp = Player_GetMeleeWeaponHeld(this) - 1; } - if ((arg2 >= 16) && (arg2 < 20)) { + if ((arg2 >= PLAYER_MWA_FLIPSLASH_START) && (arg2 <= PLAYER_MWA_JUMPSLASH_FINISH)) { if (CVarGetInteger("gRestoreQPA", 1) && temp == -1) { - flags = 0x16171617; + dmgFlags = 0x16171617; } else { - flags = D_80854488[temp][1]; + dmgFlags = D_80854488[temp][1]; } } else { - flags = D_80854488[temp][0]; + dmgFlags = D_80854488[temp][0]; } - func_80837918(this, 0, flags); - func_80837918(this, 1, flags); + func_80837918(this, 0, dmgFlags); + func_80837918(this, 1, dmgFlags); } void func_80837AE0(Player* this, s32 timer) { @@ -3683,8 +3941,8 @@ void func_80837B60(Player* this) { } void func_80837B9C(Player* this, PlayState* play) { - func_80835C58(play, this, func_8084411C, 0); - func_80832284(play, this, &gPlayerAnim_link_normal_landing_wait); + Player_SetupAction(play, this, func_8084411C, 0); + Player_AnimPlayLoop(play, this, &gPlayerAnim_link_normal_landing_wait); this->unk_850 = 1; if (this->unk_6AD != 3) { this->unk_6AD = 0; @@ -3698,7 +3956,7 @@ static LinkAnimationHeader* D_808544B0[] = { }; void func_80837C0C(PlayState* play, Player* this, s32 arg2, f32 arg3, f32 arg4, s16 arg5, s32 arg6) { - LinkAnimationHeader* sp2C = NULL; + LinkAnimationHeader* anim = NULL; LinkAnimationHeader** sp28; if (this->stateFlags1 & PLAYER_STATE1_HANGING_OFF_LEDGE) { @@ -3707,7 +3965,7 @@ void func_80837C0C(PlayState* play, Player* this, s32 arg2, f32 arg3, f32 arg4, this->unk_890 = 0; - Player_PlaySfx(&this->actor, NA_SE_PL_DAMAGE); + Player_PlaySfx(this, NA_SE_PL_DAMAGE); if (!func_80837B18(play, this, 0 - this->actor.colChkInfo.damage)) { this->stateFlags2 &= ~PLAYER_STATE2_GRABBED_BY_ENEMY; @@ -3720,39 +3978,39 @@ void func_80837C0C(PlayState* play, Player* this, s32 arg2, f32 arg3, f32 arg4, func_80837AE0(this, arg6); if (arg2 == 3) { - func_80835C58(play, this, func_8084FB10, 0); + Player_SetupAction(play, this, func_8084FB10, 0); - sp2C = &gPlayerAnim_link_normal_ice_down; + anim = &gPlayerAnim_link_normal_ice_down; func_80832224(this); Player_RequestRumble(this, 255, 10, 40, 0); - Player_PlaySfx(&this->actor, NA_SE_PL_FREEZE_S); + Player_PlaySfx(this, NA_SE_PL_FREEZE_S); func_80832698(this, NA_SE_VO_LI_FREEZE); } else if (arg2 == 4) { - func_80835C58(play, this, func_8084FBF4, 0); + Player_SetupAction(play, this, func_8084FBF4, 0); Player_RequestRumble(this, 255, 80, 150, 0); - func_808322A4(play, this, &gPlayerAnim_link_normal_electric_shock); + Player_AnimPlayLoopAdjusted(play, this, &gPlayerAnim_link_normal_electric_shock); func_80832224(this); this->unk_850 = 20; } else { arg5 -= this->actor.shape.rot.y; if (this->stateFlags1 & PLAYER_STATE1_IN_WATER) { - func_80835C58(play, this, func_8084E30C, 0); + Player_SetupAction(play, this, func_8084E30C, 0); Player_RequestRumble(this, 180, 20, 50, 0); this->linearVelocity = 4.0f; this->actor.velocity.y = 0.0f; - sp2C = &gPlayerAnim_link_swimer_swim_hit; + anim = &gPlayerAnim_link_swimer_swim_hit; func_80832698(this, NA_SE_VO_LI_DAMAGE_S); } else if ((arg2 == 1) || (arg2 == 2) || !(this->actor.bgCheckFlags & 1) || (this->stateFlags1 & (PLAYER_STATE1_HANGING_OFF_LEDGE | PLAYER_STATE1_CLIMBING_LEDGE | PLAYER_STATE1_CLIMBING_LADDER))) { - func_80835C58(play, this, func_8084377C, 0); + Player_SetupAction(play, this, func_8084377C, 0); this->stateFlags3 |= PLAYER_STATE3_MIDAIR; @@ -3766,7 +4024,7 @@ void func_80837C0C(PlayState* play, Player* this, s32 arg2, f32 arg3, f32 arg4, this->linearVelocity = 3.0f; this->actor.velocity.y = 6.0f; - func_80832C2C(play, this, D_80853914[PLAYER_ANIMGROUP_damage_run][this->modelAnimType]); + Player_AnimChangeFreeze(play, this, GET_PLAYER_ANIM(PLAYER_ANIMGROUP_damage_run, this->modelAnimType)); func_80832698(this, NA_SE_VO_LI_DAMAGE_S); } else { this->actor.speedXZ = arg3; @@ -3774,9 +4032,9 @@ void func_80837C0C(PlayState* play, Player* this, s32 arg2, f32 arg3, f32 arg4, this->actor.velocity.y = arg4; if (ABS(arg5) > 0x4000) { - sp2C = &gPlayerAnim_link_normal_front_downA; + anim = &gPlayerAnim_link_normal_front_downA; } else { - sp2C = &gPlayerAnim_link_normal_back_downA; + anim = &gPlayerAnim_link_normal_back_downA; } if ((this->actor.category != ACTORCAT_PLAYER) && (this->actor.colChkInfo.health == 0)) { @@ -3798,7 +4056,7 @@ void func_80837C0C(PlayState* play, Player* this, s32 arg2, f32 arg3, f32 arg4, sp28 = D_808544B0; - func_80835C58(play, this, func_8084370C, 0); + Player_SetupAction(play, this, func_8084370C, 0); func_80833C3C(this); if (this->actor.colChkInfo.damage < 5) { @@ -3817,7 +4075,7 @@ void func_80837C0C(PlayState* play, Player* this, s32 arg2, f32 arg3, f32 arg4, sp28 += 1; } - sp2C = *sp28; + anim = *sp28; func_80832698(this, NA_SE_VO_LI_DAMAGE_S); } @@ -3834,8 +4092,8 @@ void func_80837C0C(PlayState* play, Player* this, s32 arg2, f32 arg3, f32 arg4, this->stateFlags1 |= PLAYER_STATE1_DAMAGED; - if (sp2C != NULL) { - func_808322D0(play, this, sp2C); + if (anim != NULL) { + Player_AnimPlayOnceAdjusted(play, this, anim); } } @@ -3866,7 +4124,7 @@ void func_8083821C(Player* this) { s32 i; // clang-format off - for (i = 0; i < 18; i++) { this->flameTimers[i] = Rand_S16Offset(0, 200); } + for (i = 0; i < PLAYER_BODYPART_MAX; i++) { this->flameTimers[i] = Rand_S16Offset(0, 200); } // clang-format on this->isBurning = true; @@ -3898,7 +4156,7 @@ s32 func_808382DC(Player* this, PlayState* play) { } else { sp68 = ((Player_GetHeight(this) - 8.0f) < (this->unk_6C4 * this->actor.scale.y)); - if (sp68 || (this->actor.bgCheckFlags & 0x100) || (D_808535E4 == 9) || (this->stateFlags2 & PLAYER_STATE2_FORCED_VOID_OUT)) { + if (sp68 || (this->actor.bgCheckFlags & 0x100) || (sFloorType == 9) || (this->stateFlags2 & PLAYER_STATE2_FORCED_VOID_OUT)) { func_80832698(this, NA_SE_VO_LI_DAMAGE_S); if (sp68) { @@ -3956,14 +4214,14 @@ s32 func_808382DC(Player* this, PlayState* play) { if (!Player_IsChildWithHylianShield(this)) { if (this->invincibilityTimer >= 0) { LinkAnimationHeader* anim; - s32 sp54 = func_80843188 == this->func_674; + s32 sp54 = func_80843188 == this->actionFunc; if (!func_808332B8(this)) { - func_80835C58(play, this, func_808435C4, 0); + Player_SetupAction(play, this, func_808435C4, 0); } if (!(this->unk_84F = sp54)) { - func_80833638(this, func_80834BD4); + Player_SetUpperActionFunc(this, func_80834BD4); if (this->unk_870 < 0.5f) { anim = D_808543BC[Player_HoldsTwoHandedWeapon(this) && @@ -3974,9 +4232,9 @@ s32 func_808382DC(Player* this, PlayState* play) { !(CVarGetInteger("gShieldTwoHanded", 0) && (this->heldItemAction != PLAYER_IA_DEKU_STICK))]; } - LinkAnimation_PlayOnce(play, &this->skelAnime2, anim); + LinkAnimation_PlayOnce(play, &this->upperSkelAnime, anim); } else { - func_80832264(play, this, + Player_AnimPlayOnce(play, this, D_808543C4[Player_HoldsTwoHandedWeapon(this) && !(CVarGetInteger("gShieldTwoHanded", 0) && (this->heldItemAction != PLAYER_IA_DEKU_STICK))]); @@ -3997,7 +4255,7 @@ s32 func_808382DC(Player* this, PlayState* play) { } if ((this->unk_A87 != 0) || (this->invincibilityTimer > 0) || (this->stateFlags1 & PLAYER_STATE1_DAMAGED) || - (this->csMode != 0) || (this->meleeWeaponQuads[0].base.atFlags & AT_HIT) || + (this->csAction != 0) || (this->meleeWeaponQuads[0].base.atFlags & AT_HIT) || (this->meleeWeaponQuads[1].base.atFlags & AT_HIT)) { return 0; } @@ -4028,7 +4286,7 @@ s32 func_808382DC(Player* this, PlayState* play) { return 0; } else { static u8 D_808544F4[] = { 120, 60 }; - s32 sp48 = func_80838144(D_808535E4); + s32 sp48 = func_80838144(sFloorType); if (((this->actor.wallPoly != NULL) && SurfaceType_IsWallDamage(&play->colCtx, this->actor.wallPoly, this->actor.wallBgId)) || @@ -4051,10 +4309,10 @@ s32 func_808382DC(Player* this, PlayState* play) { } void func_80838940(Player* this, LinkAnimationHeader* anim, f32 arg2, PlayState* play, u16 sfxId) { - func_80835C58(play, this, func_8084411C, 1); + Player_SetupAction(play, this, func_8084411C, 1); if (anim != NULL) { - func_808322D0(play, this, anim); + Player_AnimPlayOnceAdjusted(play, this, anim); } this->actor.velocity.y = arg2 * D_808535E8; @@ -4073,31 +4331,31 @@ void func_808389E8(Player* this, LinkAnimationHeader* anim, f32 arg2, PlayState* s32 func_80838A14(Player* this, PlayState* play) { s32 sp3C; - LinkAnimationHeader* sp38; + LinkAnimationHeader* anim; f32 sp34; f32 temp; - f32 sp2C; - f32 sp28; + f32 wallPolyNormalX; + f32 wallPolyNormalZ; f32 sp24; if (!(this->stateFlags1 & PLAYER_STATE1_ITEM_OVER_HEAD) && (this->unk_88C >= 2) && - (!(this->stateFlags1 & PLAYER_STATE1_IN_WATER) || (this->ageProperties->unk_14 > this->wallHeight))) { + (!(this->stateFlags1 & PLAYER_STATE1_IN_WATER) || (this->ageProperties->unk_14 > this->yDistToLedge))) { sp3C = 0; if (func_808332B8(this)) { if (this->actor.yDistToWater < 50.0f) { - if ((this->unk_88C < 2) || (this->wallHeight > this->ageProperties->unk_10)) { + if ((this->unk_88C < 2) || (this->yDistToLedge > this->ageProperties->unk_10)) { return 0; } } else if ((this->currentBoots != PLAYER_BOOTS_IRON) || (this->unk_88C > 2)) { return 0; } } else if (!(this->actor.bgCheckFlags & 1) || - ((this->ageProperties->unk_14 <= this->wallHeight) && (this->stateFlags1 & PLAYER_STATE1_IN_WATER))) { + ((this->ageProperties->unk_14 <= this->yDistToLedge) && (this->stateFlags1 & PLAYER_STATE1_IN_WATER))) { return 0; } - if ((this->actor.wallBgId != BGCHECK_SCENE) && (D_808535F0 & 0x40)) { + if ((this->actor.wallBgId != BGCHECK_SCENE) && (sTouchedWallFlags & 0x40)) { if (this->unk_88D >= 6) { this->stateFlags2 |= PLAYER_STATE2_DO_ACTION_CLIMB; if (CHECK_BTN_ALL(sControlInput->press.button, BTN_A)) { @@ -4109,46 +4367,46 @@ s32 func_80838A14(Player* this, PlayState* play) { } if (sp3C != 0) { - func_80835C58(play, this, func_80845668, 0); + Player_SetupAction(play, this, func_80845668, 0); this->stateFlags1 |= PLAYER_STATE1_JUMPING; - sp34 = this->wallHeight; + sp34 = this->yDistToLedge; if (this->ageProperties->unk_14 <= sp34) { - sp38 = &gPlayerAnim_link_normal_250jump_start; + anim = &gPlayerAnim_link_normal_250jump_start; this->linearVelocity = 1.0f; } else { - sp2C = COLPOLY_GET_NORMAL(this->actor.wallPoly->normal.x); - sp28 = COLPOLY_GET_NORMAL(this->actor.wallPoly->normal.z); - sp24 = this->wallDistance + 0.5f; + wallPolyNormalX = COLPOLY_GET_NORMAL(this->actor.wallPoly->normal.x); + wallPolyNormalZ = COLPOLY_GET_NORMAL(this->actor.wallPoly->normal.z); + sp24 = this->distToInteractWall + 0.5f; this->stateFlags1 |= PLAYER_STATE1_CLIMBING_LEDGE; if (func_808332B8(this)) { - sp38 = &gPlayerAnim_link_swimer_swim_15step_up; + anim = &gPlayerAnim_link_swimer_swim_15step_up; sp34 -= (60.0f * this->ageProperties->unk_08); this->stateFlags1 &= ~PLAYER_STATE1_IN_WATER; } else if (this->ageProperties->unk_18 <= sp34) { - sp38 = &gPlayerAnim_link_normal_150step_up; + anim = &gPlayerAnim_link_normal_150step_up; sp34 -= (59.0f * this->ageProperties->unk_08); } else { - sp38 = &gPlayerAnim_link_normal_100step_up; + anim = &gPlayerAnim_link_normal_100step_up; sp34 -= (41.0f * this->ageProperties->unk_08); } this->actor.shape.yOffset -= sp34 * 100.0f; - this->actor.world.pos.x -= sp24 * sp2C; - this->actor.world.pos.y += this->wallHeight; - this->actor.world.pos.z -= sp24 * sp28; + this->actor.world.pos.x -= sp24 * wallPolyNormalX; + this->actor.world.pos.y += this->yDistToLedge; + this->actor.world.pos.z -= sp24 * wallPolyNormalZ; func_80832224(this); } this->actor.bgCheckFlags |= 1; - LinkAnimation_PlayOnceSetSpeed(play, &this->skelAnime, sp38, 1.3f); + LinkAnimation_PlayOnceSetSpeed(play, &this->skelAnime, anim, 1.3f); AnimationContext_DisableQueue(play); this->actor.shape.rot.y = this->currentYaw = this->actor.wallYaw + 0x8000; @@ -4156,7 +4414,7 @@ s32 func_80838A14(Player* this, PlayState* play) { return 1; } } else if ((this->actor.bgCheckFlags & 1) && (this->unk_88C == 1) && (this->unk_88D >= 3)) { - temp = (this->wallHeight * 0.08f) + 5.5f; + temp = (this->yDistToLedge * 0.08f) + 5.5f; func_808389E8(this, &gPlayerAnim_link_normal_jump, temp, play); this->linearVelocity = 2.5f; @@ -4167,7 +4425,7 @@ s32 func_80838A14(Player* this, PlayState* play) { } void func_80838E70(PlayState* play, Player* this, f32 arg2, s16 arg3) { - func_80835C58(play, this, func_80845CA4, 0); + Player_SetupAction(play, this, func_80845CA4, 0); func_80832440(play, this); this->unk_84F = 1; @@ -4176,16 +4434,16 @@ void func_80838E70(PlayState* play, Player* this, f32 arg2, s16 arg3) { this->unk_450.x = (Math_SinS(arg3) * arg2) + this->actor.world.pos.x; this->unk_450.z = (Math_CosS(arg3) * arg2) + this->actor.world.pos.z; - func_80832264(play, this, func_80833338(this)); + Player_AnimPlayOnce(play, this, func_80833338(this)); } void func_80838F18(PlayState* play, Player* this) { - func_80835C58(play, this, func_8084D610, 0); - func_80832C6C(play, this, &gPlayerAnim_link_swimer_swim_wait); + Player_SetupAction(play, this, func_8084D610, 0); + Player_AnimChangeLoopSlowMorph(play, this, &gPlayerAnim_link_swimer_swim_wait); } void func_80838F5C(PlayState* play, Player* this) { - func_80835C58(play, this, func_8084F88C, 0); + Player_SetupAction(play, this, func_8084F88C, 0); this->stateFlags1 |= PLAYER_STATE1_IN_CUTSCENE | PLAYER_STATE1_FLOOR_DISABLED; @@ -4195,7 +4453,7 @@ void func_80838F5C(PlayState* play, Player* this) { s32 func_80838FB8(PlayState* play, Player* this) { if ((play->transitionTrigger == TRANS_TRIGGER_OFF) && (this->stateFlags1 & PLAYER_STATE1_FLOOR_DISABLED)) { func_80838F5C(play, this); - func_80832284(play, this, &gPlayerAnim_link_normal_landing_wait); + Player_AnimPlayLoop(play, this, &gPlayerAnim_link_normal_landing_wait); func_80832698(this, NA_SE_VO_LI_FALL_S); func_800788CC(NA_SE_OC_SECRET_WARP_IN); return 1; @@ -4257,7 +4515,7 @@ u8 sReturnEntranceGroupIndices[] = { 0, // ENTR_RETURN_GREAT_FAIRYS_FOUNTAIN_MAGIC }; -s32 func_80839034(PlayState* play, Player* this, CollisionPoly* poly, u32 bgId) { +s32 Player_HandleExitsAndVoids(PlayState* play, Player* this, CollisionPoly* poly, u32 bgId) { s32 sp3C; s32 temp; s32 sp34; @@ -4267,15 +4525,15 @@ s32 func_80839034(PlayState* play, Player* this, CollisionPoly* poly, u32 bgId) if (this->actor.category == ACTORCAT_PLAYER) { sp3C = 0; - if (!(this->stateFlags1 & PLAYER_STATE1_DEAD) && (play->transitionTrigger == TRANS_TRIGGER_OFF) && (this->csMode == 0) && + if (!(this->stateFlags1 & PLAYER_STATE1_DEAD) && (play->transitionTrigger == TRANS_TRIGGER_OFF) && (this->csAction == 0) && !(this->stateFlags1 & PLAYER_STATE1_LOADING) && (((poly != NULL) && (sp3C = SurfaceType_GetSceneExitIndex(&play->colCtx, poly, bgId), sp3C != 0)) || - (func_8083816C(D_808535E4) && (this->unk_A7A == 12)))) { + (func_8083816C(sFloorType) && (this->unk_A7A == 12)))) { sp34 = this->unk_A84 - (s32)this->actor.world.pos.y; if (!(this->stateFlags1 & (PLAYER_STATE1_ON_HORSE | PLAYER_STATE1_IN_WATER | PLAYER_STATE1_IN_CUTSCENE)) && - !(this->actor.bgCheckFlags & 1) && (sp34 < 100) && (D_80853600 > 100.0f)) { + !(this->actor.bgCheckFlags & 1) && (sp34 < 100) && (sYDistToFloor > 100.0f)) { return 0; } @@ -4341,8 +4599,8 @@ s32 func_80839034(PlayState* play, Player* this, CollisionPoly* poly, u32 bgId) gSaveContext.entranceSpeed = linearVel; } - if (D_808535F4 != 0) { - yaw = D_808535FC; + if (sConveyorSpeed != 0) { + yaw = sConveyorYaw; } else { yaw = this->actor.world.rot.y; } @@ -4364,7 +4622,7 @@ s32 func_80839034(PlayState* play, Player* this, CollisionPoly* poly, u32 bgId) if ((this->actor.world.pos.y < -4000.0f) || (((this->unk_A7A == 5) || (this->unk_A7A == 12)) && - ((D_80853600 < 100.0f) || (this->fallDistance > 400.0f) || + ((sYDistToFloor < 100.0f) || (this->fallDistance > 400.0f) || ((play->sceneNum != SCENE_SHADOW_TEMPLE) && (this->fallDistance > 200.0f)))) || ((play->sceneNum == SCENE_GANONS_TOWER_COLLAPSE_EXTERIOR) && (this->fallDistance > 320.0f))) { @@ -4395,25 +4653,30 @@ s32 func_80839034(PlayState* play, Player* this, CollisionPoly* poly, u32 bgId) return 0; } -void func_808395DC(Player* this, Vec3f* arg1, Vec3f* arg2, Vec3f* arg3) { +/** + * Gets a position relative to player's yaw. + * An offset is applied to the provided base position in the direction of shape y rotation. + * The resulting position is stored in `dest` + */ +void Player_GetRelativePosition(Player* this, Vec3f* base, Vec3f* offset, Vec3f* dest) { f32 cos = Math_CosS(this->actor.shape.rot.y); f32 sin = Math_SinS(this->actor.shape.rot.y); - arg3->x = arg1->x + ((arg2->x * cos) + (arg2->z * sin)); - arg3->y = arg1->y + arg2->y; - arg3->z = arg1->z + ((arg2->z * cos) - (arg2->x * sin)); + dest->x = base->x + ((offset->x * cos) + (offset->z * sin)); + dest->y = base->y + offset->y; + dest->z = base->z + ((offset->z * cos) - (offset->x * sin)); } Actor* Player_SpawnFairy(PlayState* play, Player* this, Vec3f* arg2, Vec3f* arg3, s32 type) { Vec3f pos; - func_808395DC(this, arg2, arg3, &pos); + Player_GetRelativePosition(this, arg2, arg3, &pos); return Actor_Spawn(&play->actorCtx, play, ACTOR_EN_ELF, pos.x, pos.y, pos.z, 0, 0, 0, type, true); } f32 func_808396F4(PlayState* play, Player* this, Vec3f* arg2, Vec3f* arg3, CollisionPoly** arg4, s32* arg5) { - func_808395DC(this, &this->actor.world.pos, arg2, arg3); + Player_GetRelativePosition(this, &this->actor.world.pos, arg2, arg3); return BgCheck_EntityRaycastFloor3(&play->colCtx, arg4, arg5, arg3); } @@ -4425,17 +4688,24 @@ f32 func_8083973C(PlayState* play, Player* this, Vec3f* arg2, Vec3f* arg3) { return func_808396F4(play, this, arg2, arg3, &sp24, &sp20); } -s32 func_80839768(PlayState* play, Player* this, Vec3f* arg2, CollisionPoly** arg3, s32* arg4, Vec3f* arg5) { - Vec3f sp44; - Vec3f sp38; +/** + * Checks if a line between the player's position and the provided `offset` intersect a wall. + * + * Point A of the line is at player's world position offset by the height provided in `offset`. + * Point B of the line is at player's world position offset by the entire `offset` vector. + * Point A and B are always at the same height, meaning this is a horizontal line test. + */ +s32 Player_PosVsWallLineTest(PlayState* play, Player* this, Vec3f* offset, CollisionPoly** wallPoly, s32* bgId, Vec3f* posResult) { + Vec3f posA; + Vec3f posB; - sp44.x = this->actor.world.pos.x; - sp44.y = this->actor.world.pos.y + arg2->y; - sp44.z = this->actor.world.pos.z; + posA.x = this->actor.world.pos.x; + posA.y = this->actor.world.pos.y + offset->y; + posA.z = this->actor.world.pos.z; - func_808395DC(this, &this->actor.world.pos, arg2, &sp38); + Player_GetRelativePosition(this, &this->actor.world.pos, offset, &posB); - return BgCheck_EntityLineTest1(&play->colCtx, &sp44, &sp38, arg5, arg3, true, false, false, true, arg4); + return BgCheck_EntityLineTest1(&play->colCtx, &posA, &posB, posResult, wallPoly, true, false, false, true, bgId); } s32 func_80839800(Player* this, PlayState* play) { @@ -4457,7 +4727,7 @@ s32 func_80839800(Player* this, PlayState* play) { (!(this->stateFlags1 & PLAYER_STATE1_ITEM_OVER_HEAD) || ((this->heldActor != NULL) && (this->heldActor->id == ACTOR_EN_RU1)))) { // Disable doors in Boss Rush so the player can't leave the boss rooms backwards. - if ((CHECK_BTN_ALL(sControlInput->press.button, BTN_A) || (func_8084F9A0 == this->func_674)) && !IS_BOSS_RUSH) { + if ((CHECK_BTN_ALL(sControlInput->press.button, BTN_A) || (func_8084F9A0 == this->actionFunc)) && !IS_BOSS_RUSH) { doorActor = this->doorActor; if (this->doorType <= PLAYER_DOORTYPE_AJAR) { @@ -4499,7 +4769,7 @@ s32 func_80839800(Player* this, PlayState* play) { if (this->doorTimer != 0) { this->unk_850 = 0; - func_80832B0C(play, this, func_80833338(this)); + Player_AnimChangeOnceMorph(play, this, func_80833338(this)); this->skelAnime.endFrame = 0.0f; } else { this->linearVelocity = 0.1f; @@ -4522,16 +4792,16 @@ s32 func_80839800(Player* this, PlayState* play) { : (LINK_IS_ADULT ? KNOB_ANIM_ADULT_R : KNOB_ANIM_CHILD_R); if (door->animStyle == KNOB_ANIM_ADULT_L) { - sp5C = D_80853914[PLAYER_ANIMGROUP_doorA_free][this->modelAnimType]; + sp5C = GET_PLAYER_ANIM(PLAYER_ANIMGROUP_doorA_free, this->modelAnimType); } else if (door->animStyle == KNOB_ANIM_CHILD_L) { - sp5C = D_80853914[PLAYER_ANIMGROUP_doorA][this->modelAnimType]; + sp5C = GET_PLAYER_ANIM(PLAYER_ANIMGROUP_doorA, this->modelAnimType); } else if (door->animStyle == KNOB_ANIM_ADULT_R) { - sp5C = D_80853914[PLAYER_ANIMGROUP_doorB_free][this->modelAnimType]; + sp5C = GET_PLAYER_ANIM(PLAYER_ANIMGROUP_doorB_free, this->modelAnimType); } else { - sp5C = D_80853914[PLAYER_ANIMGROUP_doorB][this->modelAnimType]; + sp5C = GET_PLAYER_ANIM(PLAYER_ANIMGROUP_doorB, this->modelAnimType); } - func_80835C58(play, this, func_80845EF8, 0); + Player_SetupAction(play, this, func_80845EF8, 0); func_80832528(play, this); if (doorDirection < 0) { @@ -4553,7 +4823,7 @@ s32 func_80839800(Player* this, PlayState* play) { } func_80832224(this); - func_80832F54(play, this, 0x28F); + Player_AnimReplaceApplyFlags(play, this, 0x28F); if (doorActor->parent != NULL) { doorDirection = -doorDirection; @@ -4572,7 +4842,7 @@ s32 func_80839800(Player* this, PlayState* play) { BgCheck_EntityRaycastFloor1(&play->colCtx, &sp58, &sp4C); - if (func_80839034(play, this, sp58, BGCHECK_SCENE)) { + if (Player_HandleExitsAndVoids(play, this, sp58, BGCHECK_SCENE)) { gSaveContext.entranceSpeed = 2.0f; gSaveContext.entranceSound = NA_SE_OC_DOOR_OPEN; } @@ -4612,7 +4882,7 @@ s32 func_80839800(Player* this, PlayState* play) { void func_80839E88(Player* this, PlayState* play) { LinkAnimationHeader* anim; - func_80835C58(play, this, func_80840450, 1); + Player_SetupAction(play, this, func_80840450, 1); if (this->unk_870 < 0.5f) { anim = func_808334E4(this); @@ -4623,13 +4893,13 @@ void func_80839E88(Player* this, PlayState* play) { } this->unk_874 = this->unk_870; - func_80832284(play, this, anim); + Player_AnimPlayLoop(play, this, anim); this->currentYaw = this->actor.shape.rot.y; } void func_80839F30(Player* this, PlayState* play) { - func_80835C58(play, this, func_808407CC, 1); - func_80832B0C(play, this, func_80833338(this)); + Player_SetupAction(play, this, func_808407CC, 1); + Player_AnimChangeOnceMorph(play, this, func_80833338(this)); this->currentYaw = this->actor.shape.rot.y; } @@ -4644,17 +4914,17 @@ void func_80839F90(Player* this, PlayState* play) { } void func_80839FFC(Player* this, PlayState* play) { - PlayerFunc674 func; + PlayerActionFunc actionFunc; if (func_8008E9C4(this)) { - func = func_80840450; + actionFunc = func_80840450; } else if (func_80833B2C(this)) { - func = func_808407CC; + actionFunc = func_808407CC; } else { - func = func_80840BC8; + actionFunc = func_80840BC8; } - func_80835C58(play, this, func, 1); + Player_SetupAction(play, this, actionFunc, 1); } void func_8083A060(Player* this, PlayState* play) { @@ -4680,22 +4950,22 @@ void func_8083A0F4(PlayState* play, Player* this) { if (interactActorId == ACTOR_BG_TOKI_SWD) { this->interactRangeActor->parent = &this->actor; - func_80835C58(play, this, func_8084F608, 0); + Player_SetupAction(play, this, func_8084F608, 0); this->stateFlags1 |= PLAYER_STATE1_IN_CUTSCENE; sMaskMemory = PLAYER_MASK_NONE; } else { LinkAnimationHeader* anim; if (interactActorId == ACTOR_BG_HEAVY_BLOCK) { - func_80835C58(play, this, func_80846120, 0); + Player_SetupAction(play, this, func_80846120, 0); this->stateFlags1 |= PLAYER_STATE1_IN_CUTSCENE; anim = &gPlayerAnim_link_normal_heavy_carry; } else if ((interactActorId == ACTOR_EN_ISHI) && ((interactRangeActor->params & 0xF) == 1)) { - func_80835C58(play, this, func_80846260, 0); + Player_SetupAction(play, this, func_80846260, 0); anim = &gPlayerAnim_link_silver_carry; } else if (((interactActorId == ACTOR_EN_BOMBF) || (interactActorId == ACTOR_EN_KUSA)) && (Player_GetStrength() <= PLAYER_STR_NONE)) { - func_80835C58(play, this, func_80846408, 0); + Player_SetupAction(play, this, func_80846408, 0); this->actor.world.pos.x = (Math_SinS(interactRangeActor->yawTowardsPlayer) * 20.0f) + interactRangeActor->world.pos.x; this->actor.world.pos.z = @@ -4703,8 +4973,8 @@ void func_8083A0F4(PlayState* play, Player* this) { this->currentYaw = this->actor.shape.rot.y = interactRangeActor->yawTowardsPlayer + 0x8000; anim = &gPlayerAnim_link_normal_nocarry_free; } else { - func_80835C58(play, this, func_80846050, 0); - anim = D_80853914[PLAYER_ANIMGROUP_carryB][this->modelAnimType]; + Player_SetupAction(play, this, func_80846050, 0); + anim = GET_PLAYER_ANIM(PLAYER_ANIMGROUP_carryB, this->modelAnimType); } // Same actor is used for small and large silver rocks, use actor params to identify large ones @@ -4737,7 +5007,7 @@ void func_8083A360(PlayState* play, Player* this) { } void func_8083A388(PlayState* play, Player* this) { - func_80835C58(play, this, func_8084B78C, 0); + Player_SetupAction(play, this, func_8084B78C, 0); } void func_8083A3B0(PlayState* play, Player* this) { @@ -4795,20 +5065,20 @@ s32 func_8083A4A8(Player* this, PlayState* play) { return 1; } -void func_8083A5C4(PlayState* play, Player* this, CollisionPoly* arg2, f32 arg3, LinkAnimationHeader* arg4) { - f32 sp24 = COLPOLY_GET_NORMAL(arg2->normal.x); - f32 sp20 = COLPOLY_GET_NORMAL(arg2->normal.z); +void func_8083A5C4(PlayState* play, Player* this, CollisionPoly* arg2, f32 arg3, LinkAnimationHeader* anim) { + f32 nx = COLPOLY_GET_NORMAL(arg2->normal.x); + f32 nz = COLPOLY_GET_NORMAL(arg2->normal.z); - func_80835C58(play, this, func_8084BBE4, 0); + Player_SetupAction(play, this, func_8084BBE4, 0); func_80832564(play, this); - func_80832264(play, this, arg4); + Player_AnimPlayOnce(play, this, anim); - this->actor.world.pos.x -= (arg3 + 1.0f) * sp24; - this->actor.world.pos.z -= (arg3 + 1.0f) * sp20; - this->actor.shape.rot.y = this->currentYaw = Math_Atan2S(sp20, sp24); + this->actor.world.pos.x -= (arg3 + 1.0f) * nx; + this->actor.world.pos.z -= (arg3 + 1.0f) * nz; + this->actor.shape.rot.y = this->currentYaw = Math_Atan2S(nz, nx); func_80832224(this); - func_80832CFC(this); + Player_SkelAnimeResetPrevTranslRot(this); } s32 func_8083A6AC(Player* this, PlayState* play) { @@ -4818,7 +5088,10 @@ s32 func_8083A6AC(Player* this, PlayState* play) { Vec3f sp68; f32 temp1; - if ((this->actor.yDistToWater < -80.0f) && (ABS(this->unk_898) < 2730) && (ABS(this->unk_89A) < 2730)) { + //! @bug `floorPitch` and `floorPitchAlt` are cleared to 0 before this function is called, because the player + //! left the ground. The angles will always be zero and therefore will always pass these checks. + //! The intention seems to be to prevent ledge hanging or vine grabbing when walking off of a steep enough slope. + if ((this->actor.yDistToWater < -80.0f) && (ABS(this->floorPitch) < 2730) && (ABS(this->floorPitchAlt) < 2730)) { sp74.x = this->actor.prevPos.x - this->actor.world.pos.x; sp74.z = this->actor.prevPos.z - this->actor.world.pos.z; @@ -4844,7 +5117,7 @@ s32 func_8083A6AC(Player* this, PlayState* play) { sp54 = Math3D_UDistPlaneToPos(nx, ny, nz, sp84->dist, &this->actor.world.pos); - sp50 = D_80853604 == 6; + sp50 = sPrevFloorProperty == 6; if (!sp50 && (func_80041DB8(&play->colCtx, sp84, sp80) & 8)) { sp50 = 1; } @@ -4859,7 +5132,7 @@ s32 func_8083A6AC(Player* this, PlayState* play) { this->actor.shape.rot.y = this->currentYaw; this->stateFlags1 |= PLAYER_STATE1_CLIMBING_LADDER; - func_80832F54(play, this, 0x9F); + Player_AnimReplaceApplyFlags(play, this, 0x9F); this->unk_850 = -1; this->unk_84F = sp50; @@ -4878,7 +5151,7 @@ s32 func_8083A6AC(Player* this, PlayState* play) { } void func_8083A9B8(Player* this, LinkAnimationHeader* anim, PlayState* play) { - func_80835C58(play, this, func_8084BDFC, 0); + Player_SetupAction(play, this, func_8084BDFC, 0); LinkAnimation_PlayOnceSetSpeed(play, &this->skelAnime, anim, 1.3f); } @@ -4897,16 +5170,16 @@ void func_8083AA10(Player* this, PlayState* play) { if (!(this->stateFlags1 & (PLAYER_STATE1_IN_WATER | PLAYER_STATE1_IN_CUTSCENE)) && !(this->actor.bgCheckFlags & 1)) { if (!func_80838FB8(play, this)) { - if (D_80853604 == 8) { + if (sPrevFloorProperty == 8) { this->actor.world.pos.x = this->actor.prevPos.x; this->actor.world.pos.z = this->actor.prevPos.z; return; } if (!(this->stateFlags3 & PLAYER_STATE3_MIDAIR) && !(this->skelAnime.moveFlags & 0x80) && - (func_8084411C != this->func_674) && (func_80844A44 != this->func_674)) { + (func_8084411C != this->actionFunc) && (func_80844A44 != this->actionFunc)) { - if ((D_80853604 == 7) || (this->meleeWeaponState != 0)) { + if ((sPrevFloorProperty == 7) || (this->meleeWeaponState != 0)) { Math_Vec3f_Copy(&this->actor.world.pos, &this->actor.prevPos); Player_ZeroSpeedXZ(this); return; @@ -4914,22 +5187,22 @@ void func_8083AA10(Player* this, PlayState* play) { if (this->hoverBootsTimer != 0) { this->actor.velocity.y = 1.0f; - D_80853604 = 9; + sPrevFloorProperty = 9; return; } sp5C = (s16)(this->currentYaw - this->actor.shape.rot.y); - func_80835C58(play, this, func_8084411C, 1); + Player_SetupAction(play, this, func_8084411C, 1); func_80832440(play, this); - this->unk_89E = this->unk_A82; + this->floorSfxOffset = this->unk_A82; - if ((this->actor.bgCheckFlags & 4) && !(this->stateFlags1 & PLAYER_STATE1_IN_WATER) && (D_80853604 != 6) && - (D_80853604 != 9) && (D_80853600 > 20.0f) && (this->meleeWeaponState == 0) && (ABS(sp5C) < 0x2000) && + if ((this->actor.bgCheckFlags & 4) && !(this->stateFlags1 & PLAYER_STATE1_IN_WATER) && (sPrevFloorProperty != 6) && + (sPrevFloorProperty != 9) && (sYDistToFloor > 20.0f) && (this->meleeWeaponState == 0) && (ABS(sp5C) < 0x2000) && (this->linearVelocity > 3.0f)) { - if ((D_80853604 == 11) && !(this->stateFlags1 & PLAYER_STATE1_ITEM_OVER_HEAD)) { + if ((sPrevFloorProperty == 11) && !(this->stateFlags1 & PLAYER_STATE1_ITEM_OVER_HEAD)) { sp40 = func_808396F4(play, this, &D_8085451C, &sp44, &sp58, &sp54); sp3C = this->actor.world.pos.y; @@ -4937,7 +5210,7 @@ void func_8083AA10(Player* this, PlayState* play) { if (WaterBox_GetSurface1(play, &play->colCtx, sp44.x, sp44.z, &sp3C, &sp50) && ((sp3C - sp40) > 50.0f)) { func_808389E8(this, &gPlayerAnim_link_normal_run_jump_water_fall, 6.0f, play); - func_80835C58(play, this, func_80844A44, 0); + Player_SetupAction(play, this, func_80844A44, 0); return; } } @@ -4946,9 +5219,9 @@ void func_8083AA10(Player* this, PlayState* play) { return; } - if ((D_80853604 == 9) || (D_80853600 <= this->ageProperties->unk_34) || + if ((sPrevFloorProperty == 9) || (sYDistToFloor <= this->ageProperties->unk_34) || !func_8083A6AC(this, play)) { - func_80832284(play, this, &gPlayerAnim_link_normal_landing_wait); + Player_AnimPlayLoop(play, this, &gPlayerAnim_link_normal_landing_wait); return; } } @@ -4980,9 +5253,16 @@ s32 func_8083AD4C(PlayState* play, Player* this) { return Camera_ChangeMode(Play_GetCamera(play, 0), cameraMode); } -s32 func_8083ADD4(PlayState* play, Player* this) { +/** + * If appropriate, setup action for performing a `csAction` + * + * @return true if a `csAction` is started, false if not + */ +s32 Player_StartCsAction(PlayState* play, Player* this) { + // unk_6AD will get set to 3 in `Player_UpdateCommon` if `this->csAction` is non-zero + // (with a special case for `PLAYER_CSACTION_7`) if (this->unk_6AD == 3) { - func_80835C58(play, this, func_80852E14, 0); + Player_SetupAction(play, this, func_80852E14, 0); if (this->doorBgCamIndex != 0) { this->stateFlags1 |= PLAYER_STATE1_IN_CUTSCENE; } @@ -5016,6 +5296,14 @@ void func_8083AF44(PlayState* play, Player* this, s32 magicSpell) { func_80835DE4(play, this, func_808507F4, 0); this->unk_84F = magicSpell - 3; + + //! @bug `MAGIC_CONSUME_WAIT_PREVIEW` is not guaranteed to succeed. + //! Ideally, the return value of `Magic_RequestChange` should be checked before allowing the process of + //! using a spell to continue. If the magic state change request fails, `gSaveContext.magicTarget` will + //! never be set correctly. + //! When `MAGIC_STATE_CONSUME_SETUP` is set in `Player_Action_808507F4`, magic will eventually be + //! consumed to a stale target value. If that stale target value is higher than the current + //! magic value, it will be consumed to zero. Magic_RequestChange(play, sMagicSpellCosts[magicSpell], MAGIC_CONSUME_WAIT_PREVIEW); u8 isFastFarores = CVarGetInteger("gFastFarores", 0) && this->itemAction == PLAYER_IA_FARORES_WIND; @@ -5064,16 +5352,16 @@ s32 func_8083B040(Player* this, PlayState* play) { if ((this->unk_6AD != 0) && (func_808332B8(this) || (this->actor.bgCheckFlags & 1) || (this->stateFlags1 & PLAYER_STATE1_ON_HORSE))) { - if (!func_8083ADD4(play, this)) { + if (!Player_StartCsAction(play, this)) { if (this->unk_6AD == 4) { sp2C = Player_ActionToMagicSpell(this, this->itemAction); if (sp2C >= 0) { if ((sp2C != 3) || (gSaveContext.respawn[RESPAWN_MODE_TOP].data <= 0)) { func_8083AF44(play, this, sp2C); } else { - func_80835C58(play, this, func_8085063C, 1); + Player_SetupAction(play, this, func_8085063C, 1); this->stateFlags1 |= PLAYER_STATE1_IN_ITEM_CS | PLAYER_STATE1_IN_CUTSCENE; - func_80832264(play, this, func_80833338(this)); + Player_AnimPlayOnce(play, this, func_80833338(this)); func_80835EA4(play, 4); } @@ -5142,9 +5430,9 @@ s32 func_8083B040(Player* this, PlayState* play) { this->exchangeItemId = sp2C; if (this->unk_84F < 0) { - func_80832B0C(play, this, D_80853914[PLAYER_ANIMGROUP_check][this->modelAnimType]); + Player_AnimChangeOnceMorph(play, this, GET_PLAYER_ANIM(PLAYER_ANIMGROUP_check, this->modelAnimType)); } else { - func_80832264(play, this, D_80854548[this->unk_84F]); + Player_AnimPlayOnce(play, this, D_80854548[this->unk_84F]); } func_80832224(this); @@ -5156,20 +5444,20 @@ s32 func_8083B040(Player* this, PlayState* play) { if (sp2C >= 0) { if (sp2C == 0xC) { func_80835DE4(play, this, func_8084EED8, 0); - func_808322D0(play, this, &gPlayerAnim_link_bottle_bug_out); + Player_AnimPlayOnceAdjusted(play, this, &gPlayerAnim_link_bottle_bug_out); func_80835EA4(play, 3); } else if ((sp2C > 0) && (sp2C < 4)) { func_80835DE4(play, this, func_8084EFC0, 0); - func_808322D0(play, this, &gPlayerAnim_link_bottle_fish_out); + Player_AnimPlayOnceAdjusted(play, this, &gPlayerAnim_link_bottle_fish_out); func_80835EA4(play, (sp2C == 1) ? 1 : 5); } else { func_80835DE4(play, this, func_8084EAC0, 0); - func_80832B78(play, this, &gPlayerAnim_link_bottle_drink_demo_start); + Player_AnimChangeOnceMorphAdjusted(play, this, &gPlayerAnim_link_bottle_drink_demo_start); func_80835EA4(play, 2); } } else { func_80835DE4(play, this, func_8084E3C4, 0); - func_808322D0(play, this, &gPlayerAnim_link_normal_okarina_start); + Player_AnimPlayOnceAdjusted(play, this, &gPlayerAnim_link_normal_okarina_start); this->stateFlags2 |= PLAYER_STATE2_OCARINA_PLAYING; func_80835EA4(play, (this->unk_6A8 != NULL) ? 0x5B : 0x5A); if (this->unk_6A8 != NULL) { @@ -5179,7 +5467,7 @@ s32 func_8083B040(Player* this, PlayState* play) { } } else if (func_8083AD4C(play, this)) { if (!(this->stateFlags1 & PLAYER_STATE1_ON_HORSE)) { - func_80835C58(play, this, func_8084B1D8, 1); + Player_SetupAction(play, this, func_8084B1D8, 1); this->unk_850 = 13; func_8083B010(this); } @@ -5312,7 +5600,7 @@ s32 func_8083B998(Player* this, PlayState* play) { void func_8083BA90(PlayState* play, Player* this, s32 arg2, f32 xzVelocity, f32 yVelocity) { func_80837948(play, this, arg2); - func_80835C58(play, this, func_80844AF4, 0); + Player_SetupAction(play, this, func_80844AF4, 0); this->stateFlags3 |= PLAYER_STATE3_MIDAIR; @@ -5329,7 +5617,7 @@ void func_8083BA90(PlayState* play, Player* this, s32 arg2, f32 xzVelocity, f32 s32 func_8083BB20(Player* this) { if (!(this->stateFlags1 & PLAYER_STATE1_SHIELDING) && (Player_GetMeleeWeaponHeld(this) != 0)) { - if (D_80853614 || + if (sUseHeldItem || ((this->actor.category != ACTORCAT_PLAYER) && CHECK_BTN_ALL(sControlInput->press.button, BTN_B))) { return 1; } @@ -5339,8 +5627,8 @@ s32 func_8083BB20(Player* this) { } s32 func_8083BBA0(Player* this, PlayState* play) { - if (func_8083BB20(this) && (D_808535E4 != 7)) { - func_8083BA90(play, this, 17, 3.0f, 4.5f); + if (func_8083BB20(this) && (sFloorType != 7)) { + func_8083BA90(play, this, PLAYER_MWA_JUMPSLASH_START, 3.0f, 4.5f); return 1; } @@ -5348,14 +5636,14 @@ s32 func_8083BBA0(Player* this, PlayState* play) { } void func_8083BC04(Player* this, PlayState* play) { - func_80835C58(play, this, func_80844708, 0); - LinkAnimation_PlayOnceSetSpeed(play, &this->skelAnime, D_80853914[PLAYER_ANIMGROUP_landing_roll][this->modelAnimType], + Player_SetupAction(play, this, func_80844708, 0); + LinkAnimation_PlayOnceSetSpeed(play, &this->skelAnime, GET_PLAYER_ANIM(PLAYER_ANIMGROUP_landing_roll, this->modelAnimType), 1.25f * D_808535E8); gSaveContext.sohStats.count[COUNT_ROLLS]++; } s32 func_8083BC7C(Player* this, PlayState* play) { - if ((this->unk_84B[this->unk_846] == 0) && (D_808535E4 != 7)) { + if ((this->unk_84B[this->unk_846] == 0) && (sFloorType != 7)) { func_8083BC04(this, play); return 1; } @@ -5383,7 +5671,7 @@ s32 func_8083BDBC(Player* this, PlayState* play) { s32 sp2C; if (CHECK_BTN_ALL(sControlInput->press.button, BTN_A) && - (play->roomCtx.curRoom.behaviorType1 != ROOM_BEHAVIOR_TYPE1_2) && (D_808535E4 != 7) && + (play->roomCtx.curRoom.behaviorType1 != ROOM_BEHAVIOR_TYPE1_2) && (sFloorType != 7) && (SurfaceType_GetSlope(&play->colCtx, this->actor.floorPoly, this->actor.floorBgId) != 1)) { sp2C = this->unk_84B[this->unk_846]; @@ -5396,8 +5684,8 @@ s32 func_8083BDBC(Player* this, PlayState* play) { func_8083BC04(this, play); } } else { - if (Player_GetMeleeWeaponHeld(this) && func_808365C8(this)) { - func_8083BA90(play, this, 17, 5.0f, 5.0f); + if (Player_GetMeleeWeaponHeld(this) && Player_CanUpdateItems(this)) { + func_8083BA90(play, this, PLAYER_MWA_JUMPSLASH_START, 5.0f, 5.0f); } else { func_8083BC04(this, play); } @@ -5430,14 +5718,14 @@ void func_8083BF50(Player* this, PlayState* play) { } if (sp30 < 14.0f) { - anim = D_80853914[PLAYER_ANIMGROUP_walk_endL][this->modelAnimType]; + anim = GET_PLAYER_ANIM(PLAYER_ANIMGROUP_walk_endL, this->modelAnimType); sp30 = 11.0f - sp30; if (sp30 < 0.0f) { sp30 = 1.375f * -sp30; } sp30 /= 11.0f; } else { - anim = D_80853914[PLAYER_ANIMGROUP_walk_endR][this->modelAnimType]; + anim = GET_PLAYER_ANIM(PLAYER_ANIMGROUP_walk_endR, this->modelAnimType); sp30 = 26.0f - sp30; if (sp30 < 0.0f) { sp30 = 2 * -sp30; @@ -5456,8 +5744,8 @@ void func_8083C0B8(Player* this, PlayState* play) { } void func_8083C0E8(Player* this, PlayState* play) { - func_80835C58(play, this, func_80840BC8, 1); - func_80832264(play, this, func_80833338(this)); + Player_SetupAction(play, this, func_80840BC8, 1); + Player_AnimPlayOnce(play, this, func_80833338(this)); this->currentYaw = this->actor.shape.rot.y; } @@ -5484,7 +5772,7 @@ s32 func_8083C1DC(Player* this, PlayState* play) { return 1; } if ((this->unk_837 == 0) && (this->heldItemAction >= PLAYER_IA_SWORD_MASTER)) { - func_80835F44(play, this, ITEM_NONE); + Player_UseItem(play, this, ITEM_NONE); } else { this->stateFlags2 ^= PLAYER_STATE2_NAVI_OUT; } @@ -5502,14 +5790,14 @@ s32 func_8083C2B0(Player* this, PlayState* play) { (Player_IsChildWithHylianShield(this) || (!func_80833B2C(this) && (this->unk_664 == NULL)))) { func_80832318(this); - func_808323B4(play, this); + Player_DetachHeldActor(play, this); - if (func_80835C58(play, this, func_80843188, 0)) { + if (Player_SetupAction(play, this, func_80843188, 0)) { this->stateFlags1 |= PLAYER_STATE1_SHIELDING; if (!Player_IsChildWithHylianShield(this)) { Player_SetModelsForHoldingShield(this); - anim = D_80853914[PLAYER_ANIMGROUP_defense][this->modelAnimType]; + anim = GET_PLAYER_ANIM(PLAYER_ANIMGROUP_defense, this->modelAnimType); } else { anim = &gPlayerAnim_clink_normal_defense_ALL; } @@ -5528,7 +5816,7 @@ s32 func_8083C2B0(Player* this, PlayState* play) { LinkAnimation_Change(play, &this->skelAnime, anim, 1.0f, frame, frame, ANIMMODE_ONCE, 0.0f); if (Player_IsChildWithHylianShield(this)) { - func_80832F54(play, this, 4); + Player_AnimReplaceApplyFlags(play, this, 4); } Player_PlaySfx(&this->actor, NA_SE_IT_SHIELD_POSTURE); @@ -5580,8 +5868,8 @@ s32 func_8083C544(Player* this, PlayState* play) { s32 func_8083C61C(PlayState* play, Player* this) { if ((play->roomCtx.curRoom.behaviorType1 != ROOM_BEHAVIOR_TYPE1_2) && (this->actor.bgCheckFlags & 1) && (AMMO(ITEM_NUT) != 0)) { - func_80835C58(play, this, func_8084E604, 0); - func_80832264(play, this, &gPlayerAnim_link_normal_light_bom); + Player_SetupAction(play, this, func_8084E604, 0); + Player_AnimPlayOnce(play, this, &gPlayerAnim_link_normal_light_bom); this->unk_6AD = 0; return 1; } @@ -5597,15 +5885,15 @@ static struct_80854554 D_80854554[] = { s32 func_8083C6B8(PlayState* play, Player* this) { Vec3f sp24; - if (D_80853614) { + if (sUseHeldItem) { if (Player_GetBottleHeld(this) >= 0) { - func_80835C58(play, this, func_8084ECA4, 0); + Player_SetupAction(play, this, func_8084ECA4, 0); if (this->actor.yDistToWater > 12.0f) { this->unk_850 = 1; } - func_808322D0(play, this, D_80854554[this->unk_850].unk_00); + Player_AnimPlayOnceAdjusted(play, this, D_80854554[this->unk_850].unk_00); Player_PlaySfx(&this->actor, NA_SE_IT_SWORD_SWING); func_80832698(this, NA_SE_VO_LI_AUTO_JUMP); @@ -5624,10 +5912,10 @@ s32 func_8083C6B8(PlayState* play, Player* this) { return 0; } - func_80835C58(play, this, func_80850C68, 0); + Player_SetupAction(play, this, func_80850C68, 0); this->unk_860 = 1; Player_ZeroSpeedXZ(this); - func_80832264(play, this, &gPlayerAnim_link_fishing_throw); + Player_AnimPlayOnce(play, this, &gPlayerAnim_link_fishing_throw); return 1; } else { return 0; @@ -5638,16 +5926,16 @@ s32 func_8083C6B8(PlayState* play, Player* this) { } void func_8083C858(Player* this, PlayState* play) { - PlayerFunc674 func; + PlayerActionFunc actionFunc; if (func_80833BCC(this)) { - func = func_8084227C; + actionFunc = func_8084227C; } else { - func = func_80842180; + actionFunc = func_80842180; } - func_80835C58(play, this, func, 1); - func_80832BE8(play, this, D_80853914[PLAYER_ANIMGROUP_run][this->modelAnimType]); + Player_SetupAction(play, this, actionFunc, 1); + Player_AnimChangeLoopMorph(play, this, GET_PLAYER_ANIM(PLAYER_ANIMGROUP_run, this->modelAnimType)); this->unk_89C = 0; this->unk_864 = this->unk_868 = 0.0f; @@ -5667,8 +5955,8 @@ s32 func_8083C910(PlayState* play, Player* this, f32 arg2) { &sp2C) != 0) { sp28 -= this->actor.world.pos.y; if (this->ageProperties->unk_24 <= sp28) { - func_80835C58(play, this, func_8084D7C4, 0); - func_80832C6C(play, this, &gPlayerAnim_link_swimer_swim); + Player_SetupAction(play, this, func_8084D7C4, 0); + Player_AnimChangeLoopSlowMorph(play, this, &gPlayerAnim_link_swimer_swim); this->stateFlags1 |= PLAYER_STATE1_IN_WATER | PLAYER_STATE1_IN_CUTSCENE; this->unk_850 = 20; this->linearVelocity = 2.0f; @@ -5712,19 +6000,19 @@ void func_8083CA9C(PlayState* play, Player* this) { } void func_8083CB2C(Player* this, s16 yaw, PlayState* play) { - func_80835C58(play, this, func_808414F8, 1); + Player_SetupAction(play, this, func_808414F8, 1); LinkAnimation_CopyJointToMorph(play, &this->skelAnime); this->unk_864 = this->unk_868 = 0.0f; this->currentYaw = yaw; } void func_8083CB94(Player* this, PlayState* play) { - func_80835C58(play, this, func_80840DE4, 1); - func_80832BE8(play, this, D_80853914[PLAYER_ANIMGROUP_walk][this->modelAnimType]); + Player_SetupAction(play, this, func_80840DE4, 1); + Player_AnimChangeLoopMorph(play, this, GET_PLAYER_ANIM(PLAYER_ANIMGROUP_walk, this->modelAnimType)); } void func_8083CBF0(Player* this, s16 yaw, PlayState* play) { - func_80835C58(play, this, func_808423EC, 1); + Player_SetupAction(play, this, func_808423EC, 1); LinkAnimation_Change(play, &this->skelAnime, &gPlayerAnim_link_anchor_back_walk, 2.2f, 0.0f, Animation_GetLastFrame(&gPlayerAnim_link_anchor_back_walk), ANIMMODE_ONCE, -6.0f); this->linearVelocity = 8.0f; @@ -5732,19 +6020,19 @@ void func_8083CBF0(Player* this, s16 yaw, PlayState* play) { } void func_8083CC9C(Player* this, PlayState* play) { - func_80835C58(play, this, func_8084193C, 1); - func_80832BE8(play, this, D_80853914[PLAYER_ANIMGROUP_side_walkR][this->modelAnimType]); + Player_SetupAction(play, this, func_8084193C, 1); + Player_AnimChangeLoopMorph(play, this, GET_PLAYER_ANIM(PLAYER_ANIMGROUP_side_walkR, this->modelAnimType)); this->unk_868 = 0.0f; } void func_8083CD00(Player* this, PlayState* play) { - func_80835C58(play, this, func_8084251C, 1); + Player_SetupAction(play, this, func_8084251C, 1); LinkAnimation_PlayOnceSetSpeed(play, &this->skelAnime, &gPlayerAnim_link_anchor_back_brake, 2.0f); } void func_8083CD54(PlayState* play, Player* this, s16 yaw) { this->currentYaw = yaw; - func_80835C58(play, this, func_80841BA8, 1); + Player_SetupAction(play, this, func_80841BA8, 1); this->unk_87E = 1200; this->unk_87E *= D_808535E8; LinkAnimation_Change(play, &this->skelAnime, D_80853914[PLAYER_ANIMGROUP_45_turn][this->modelAnimType], 1.0f, 0.0f, @@ -5754,21 +6042,21 @@ void func_8083CD54(PlayState* play, Player* this, s16 yaw) { void func_8083CE0C(Player* this, PlayState* play) { LinkAnimationHeader* anim; - func_80835C58(play, this, func_80840BC8, 1); + Player_SetupAction(play, this, func_80840BC8, 1); if (this->unk_870 < 0.5f) { anim = D_80853914[PLAYER_ANIMGROUP_waitR2wait][this->modelAnimType]; } else { anim = D_80853914[PLAYER_ANIMGROUP_waitL2wait][this->modelAnimType]; } - func_80832264(play, this, anim); + Player_AnimPlayOnce(play, this, anim); this->currentYaw = this->actor.shape.rot.y; } void func_8083CEAC(Player* this, PlayState* play) { - func_80835C58(play, this, func_80840450, 1); - func_80832B0C(play, this, D_80853914[PLAYER_ANIMGROUP_wait2waitR][this->modelAnimType]); + Player_SetupAction(play, this, func_80840450, 1); + Player_AnimChangeOnceMorph(play, this, D_80853914[PLAYER_ANIMGROUP_wait2waitR][this->modelAnimType]); this->unk_850 = 1; } @@ -5829,8 +6117,8 @@ s32 func_8083D12C(PlayState* play, Player* this, Input* arg2) { if ((arg2 == NULL) || (CHECK_BTN_ALL(arg2->press.button, BTN_A) && (ABS(this->unk_6C2) < 12000) && (this->currentBoots != PLAYER_BOOTS_IRON))) { - func_80835C58(play, this, func_8084DC48, 0); - func_80832264(play, this, &gPlayerAnim_link_swimer_swim_deep_start); + Player_SetupAction(play, this, func_8084DC48, 0); + Player_AnimPlayOnce(play, this, &gPlayerAnim_link_swimer_swim_deep_start); this->unk_6C2 = 0; this->stateFlags2 |= PLAYER_STATE2_UNDERWATER; @@ -5852,7 +6140,7 @@ s32 func_8083D12C(PlayState* play, Player* this, Input* arg2) { this->stateFlags2 &= ~PLAYER_STATE2_UNDERWATER; if (arg2 != NULL) { - func_80835C58(play, this, func_8084E1EC, 1); + Player_SetupAction(play, this, func_8084E1EC, 1); if (this->stateFlags1 & PLAYER_STATE1_GETTING_ITEM) { this->stateFlags1 |= PLAYER_STATE1_GETTING_ITEM | PLAYER_STATE1_ITEM_OVER_HEAD | PLAYER_STATE1_IN_CUTSCENE; @@ -5863,15 +6151,12 @@ s32 func_8083D12C(PlayState* play, Player* this, Input* arg2) { func_80832340(play, this); // Skip take breath animation on surface if Link didn't grab an item while underwater and the setting is enabled - if (CVarGetInteger("gSkipSwimDeepEndAnim", 0) && !(this->stateFlags1 & PLAYER_STATE1_ITEM_OVER_HEAD)) - { + if (CVarGetInteger("gSkipSwimDeepEndAnim", 0) && !(this->stateFlags1 & PLAYER_STATE1_ITEM_OVER_HEAD)) { auto lastAnimFrame = Animation_GetLastFrame(&gPlayerAnim_link_swimer_swim_deep_end); LinkAnimation_Change(play, &this->skelAnime, &gPlayerAnim_link_swimer_swim_deep_end, 1.0f, lastAnimFrame, lastAnimFrame, ANIMMODE_ONCE, -6.0f); - } - else - { - func_80832B0C(play, this, + } else { + Player_AnimChangeOnceMorph(play, this, (this->stateFlags1 & PLAYER_STATE1_ITEM_OVER_HEAD) ? &gPlayerAnim_link_swimer_swim_get : &gPlayerAnim_link_swimer_swim_deep_end); } @@ -5889,7 +6174,7 @@ s32 func_8083D12C(PlayState* play, Player* this, Input* arg2) { } void func_8083D330(PlayState* play, Player* this) { - func_80832284(play, this, &gPlayerAnim_link_swimer_swim); + Player_AnimPlayLoop(play, this, &gPlayerAnim_link_swimer_swim); this->unk_6C2 = 16000; this->unk_850 = 1; } @@ -5902,12 +6187,12 @@ void func_8083D36C(PlayState* play, Player* this) { this->stateFlags2 &= ~PLAYER_STATE2_UNDERWATER; func_8083D12C(play, this, 0); this->unk_84F = 1; - } else if (func_80844A44 == this->func_674) { - func_80835C58(play, this, func_8084DC48, 0); + } else if (func_80844A44 == this->actionFunc) { + Player_SetupAction(play, this, func_8084DC48, 0); func_8083D330(play, this); } else { - func_80835C58(play, this, func_8084D610, 1); - func_80832B0C(play, this, + Player_SetupAction(play, this, func_8084D610, 1); + Player_AnimChangeOnceMorph(play, this, (this->actor.bgCheckFlags & 1) ? &gPlayerAnim_link_swimer_wait2swim_wait : &gPlayerAnim_link_swimer_land2swim_wait); } @@ -5934,22 +6219,22 @@ void func_8083D36C(PlayState* play, Player* this) { void func_8083D53C(PlayState* play, Player* this) { if (this->actor.yDistToWater < this->ageProperties->unk_2C) { Audio_SetBaseFilter(0); - this->unk_840 = 0; + this->underwaterTimer = 0; } else { Audio_SetBaseFilter(0x20); - if (this->unk_840 < 300) { - this->unk_840++; + if (this->underwaterTimer < 300) { + this->underwaterTimer++; } } - if ((func_80845668 != this->func_674) && (func_8084BDFC != this->func_674)) { + if ((func_80845668 != this->actionFunc) && (func_8084BDFC != this->actionFunc)) { if (this->ageProperties->unk_2C < this->actor.yDistToWater) { if (!(this->stateFlags1 & PLAYER_STATE1_IN_WATER) || (!((this->currentBoots == PLAYER_BOOTS_IRON) && (this->actor.bgCheckFlags & 1)) && - (func_8084E30C != this->func_674) && (func_8084E368 != this->func_674) && - (func_8084D610 != this->func_674) && (func_8084D84C != this->func_674) && - (func_8084DAB4 != this->func_674) && (func_8084DC48 != this->func_674) && - (func_8084E1EC != this->func_674) && (func_8084D7C4 != this->func_674))) { + (func_8084E30C != this->actionFunc) && (func_8084E368 != this->actionFunc) && + (func_8084D610 != this->actionFunc) && (func_8084D84C != this->actionFunc) && + (func_8084DAB4 != this->actionFunc) && (func_8084DC48 != this->actionFunc) && + (func_8084E1EC != this->actionFunc) && (func_8084D7C4 != this->actionFunc))) { func_8083D36C(play, this); return; } @@ -5972,11 +6257,11 @@ void func_8083D6EC(PlayState* play, Player* this) { this->actor.minVelocityY = -20.0f; this->actor.gravity = REG(68) / 100.0f; - if (func_8083816C(D_808535E4)) { + if (func_8083816C(sFloorType)) { temp1 = fabsf(this->linearVelocity) * 20.0f; temp3 = 0.0f; - if (D_808535E4 == 4) { + if (sFloorType == 4) { if (this->unk_6C4 > 1300.0f) { temp2 = this->unk_6C4; } else { @@ -5991,7 +6276,7 @@ void func_8083D6EC(PlayState* play, Player* this) { temp2 = 20000.0f; if (this->currentBoots != PLAYER_BOOTS_HOVER) { temp1 += temp1; - } else if ((D_808535E4 == 7) || (this->currentBoots == PLAYER_BOOTS_IRON)) { + } else if ((sFloorType == 7) || (this->currentBoots == PLAYER_BOOTS_IRON)) { temp1 = 0; } } @@ -6093,7 +6378,7 @@ void func_8083DC54(Player* this, PlayState* play) { return; } - if (D_808535E4 == 11) { + if (sFloorType == 11) { Math_SmoothStepToS(&this->actor.focus.rot.x, -20000, 10, 4000, 800); } else { sp46 = 0; @@ -6220,8 +6505,8 @@ s32 func_8083E0FC(Player* this, PlayState* play) { this->currentYaw = this->actor.shape.rot.y = rideActor->actor.shape.rot.y; Actor_MountHorse(play, this, &rideActor->actor); - func_80832264(play, this, D_80854578[temp].anim); - func_80832F54(play, this, 0x9B); + Player_AnimPlayOnce(play, this, D_80854578[temp].anim); + Player_AnimReplaceApplyFlags(play, this, 0x9B); this->actor.parent = this->rideActor; func_80832224(this); Actor_DisableLens(play); @@ -6231,56 +6516,60 @@ s32 func_8083E0FC(Player* this, PlayState* play) { return 0; } -void func_8083E298(CollisionPoly* arg0, Vec3f* arg1, s16* arg2) { - arg1->x = COLPOLY_GET_NORMAL(arg0->normal.x); - arg1->y = COLPOLY_GET_NORMAL(arg0->normal.y); - arg1->z = COLPOLY_GET_NORMAL(arg0->normal.z); +void Player_GetSlopeDirection(CollisionPoly* floorPoly, Vec3f* slopeNormal, s16* downwardSlopeYaw) { + slopeNormal->x = COLPOLY_GET_NORMAL(floorPoly->normal.x); + slopeNormal->y = COLPOLY_GET_NORMAL(floorPoly->normal.y); + slopeNormal->z = COLPOLY_GET_NORMAL(floorPoly->normal.z); - *arg2 = Math_Atan2S(arg1->z, arg1->x); + *downwardSlopeYaw = Math_Atan2S(slopeNormal->z, slopeNormal->x); } -static LinkAnimationHeader* D_80854590[] = { - &gPlayerAnim_link_normal_down_slope_slip, - &gPlayerAnim_link_normal_up_slope_slip, -}; - -s32 func_8083E318(PlayState* play, Player* this, CollisionPoly* arg2) { +s32 Player_HandleSlopes(PlayState* play, Player* this, CollisionPoly* floorPoly) { + static LinkAnimationHeader* sSlopeSlipAnims[] = { + &gPlayerAnim_link_normal_down_slope_slip, + &gPlayerAnim_link_normal_up_slope_slip, + }; s32 pad; - s16 sp4A; - Vec3f sp3C; - s16 sp3A; - f32 temp1; - f32 temp2; - s16 temp3; + s16 playerVelYaw; + Vec3f slopeNormal; + s16 downwardSlopeYaw; + f32 slopeSlowdownSpeed; + f32 slopeSlowdownSpeedStep; + s16 velYawToDownwardSlope; - if (!Player_InBlockingCsMode(play, this) && (func_8084F390 != this->func_674) && - (SurfaceType_GetSlope(&play->colCtx, arg2, this->actor.floorBgId) == 1)) { - sp4A = Math_Atan2S(this->actor.velocity.z, this->actor.velocity.x); - func_8083E298(arg2, &sp3C, &sp3A); - temp3 = sp3A - sp4A; + if (!Player_InBlockingCsMode(play, this) && (func_8084F390 != this->actionFunc) && + (SurfaceType_GetSlope(&play->colCtx, floorPoly, this->actor.floorBgId) == 1)) { + playerVelYaw = Math_Atan2S(this->actor.velocity.z, this->actor.velocity.x); + Player_GetSlopeDirection(floorPoly, &slopeNormal, &downwardSlopeYaw); + velYawToDownwardSlope = downwardSlopeYaw - playerVelYaw; - if (ABS(temp3) > 16000) { - temp1 = (1.0f - sp3C.y) * 40.0f; - temp2 = (temp1 * temp1) * 0.015f; - if (temp2 < 1.2f) { - temp2 = 1.2f; + if (ABS(velYawToDownwardSlope) > 0x3E80) { // 87.9 degrees + // moving parallel or upwards on the slope, player does not slip but does slow down + slopeSlowdownSpeed = (1.0f - slopeNormal.y) * 40.0f; + slopeSlowdownSpeedStep = (slopeSlowdownSpeed * slopeSlowdownSpeed) * 0.015f; + + if (slopeSlowdownSpeedStep < 1.2f) { + slopeSlowdownSpeedStep = 1.2f; } - this->windDirection = sp3A; - Math_StepToF(&this->windSpeed, temp1, temp2); + + // slows down speed as player is climbing a slope + this->pushedYaw = downwardSlopeYaw; + Math_StepToF(&this->pushedSpeed, slopeSlowdownSpeed, slopeSlowdownSpeedStep); } else { - func_80835C58(play, this, func_8084F390, 0); + // moving downward on the slope, causing player to slip + Player_SetupAction(play, this, func_8084F390, 0); func_80832564(play, this); - if (D_80853610 >= 0) { + if (sFloorShapePitch >= 0) { this->unk_84F = 1; } - func_80832BE8(play, this, D_80854590[this->unk_84F]); + Player_AnimChangeLoopMorph(play, this, sSlopeSlipAnims[this->unk_84F]); this->linearVelocity = sqrtf(SQ(this->actor.velocity.x) + SQ(this->actor.velocity.z)); - this->currentYaw = sp4A; - return 1; + this->currentYaw = playerVelYaw; + return true; } } - return 0; + return false; } // unknown data (unused) @@ -6410,12 +6699,12 @@ s32 func_8083E5A8(Player* this, PlayState* play) { // Show cutscene when picking up a item. if (showItemCutscene && !skipItemCutscene && !skipItemCutsceneRando) { - func_808323B4(play, this); + Player_DetachHeldActor(play, this); func_8083AE40(this, giEntry.objectId); if (!(this->stateFlags2 & PLAYER_STATE2_UNDERWATER) || (this->currentBoots == PLAYER_BOOTS_IRON)) { func_80836898(play, this, func_8083A434); - func_808322D0(play, this, &gPlayerAnim_link_demo_get_itemB); + Player_AnimPlayOnceAdjusted(play, this, &gPlayerAnim_link_demo_get_itemB); func_80835EA4(play, 9); } @@ -6463,12 +6752,12 @@ s32 func_8083E5A8(Player* this, PlayState* play) { if ((giEntry.itemId != ITEM_NONE) && (giEntry.gi >= 0) && (Item_CheckObtainability(giEntry.itemId) == ITEM_NONE)) { - func_808322D0(play, this, this->ageProperties->unk_98); - func_80832F54(play, this, 0x28F); + Player_AnimPlayOnceAdjusted(play, this, this->ageProperties->unk_98); + Player_AnimReplaceApplyFlags(play, this, 0x28F); chest->unk_1F4 = 1; Camera_ChangeSetting(Play_GetCamera(play, 0), CAM_SET_SLOW_CHEST_CS); } else { - func_80832264(play, this, &gPlayerAnim_link_normal_box_kick); + Player_AnimPlayOnce(play, this, &gPlayerAnim_link_normal_box_kick); chest->unk_1F4 = -1; } @@ -6486,9 +6775,9 @@ s32 func_8083E5A8(Player* this, PlayState* play) { if (sp24 == PLAYER_IA_SWORD_MASTER) { this->nextModelGroup = Player_ActionToModelGroup(this, PLAYER_IA_LAST_USED); - func_8083399C(play, this, PLAYER_IA_LAST_USED); + Player_InitItemAction(play, this, PLAYER_IA_LAST_USED); } else { - func_80835F44(play, this, ITEM_LAST_USED); + Player_UseItem(play, this, ITEM_LAST_USED); } } else { s32 strength = Player_GetStrength(); @@ -6512,8 +6801,8 @@ s32 func_8083E5A8(Player* this, PlayState* play) { } void func_8083EA94(Player* this, PlayState* play) { - func_80835C58(play, this, func_80846578, 1); - func_80832264(play, this, D_80853914[PLAYER_ANIMGROUP_throw][this->modelAnimType]); + Player_SetupAction(play, this, func_80846578, 1); + Player_AnimPlayOnce(play, this, GET_PLAYER_ANIM(PLAYER_ANIMGROUP_throw, this->modelAnimType)); } s32 func_8083EAF0(Player* this, Actor* actor) { @@ -6534,8 +6823,8 @@ s32 func_8083EB44(Player* this, PlayState* play) { CHECK_BTN_ANY(sControlInput->press.button, buttonsToCheck)) { if (!func_80835644(play, this, this->heldActor)) { if (!func_8083EAF0(this, this->heldActor)) { - func_80835C58(play, this, func_808464B0, 1); - func_80832264(play, this, D_80853914[PLAYER_ANIMGROUP_put][this->modelAnimType]); + Player_SetupAction(play, this, func_808464B0, 1); + Player_AnimPlayOnce(play, this, GET_PLAYER_ANIM(PLAYER_ANIMGROUP_put, this->modelAnimType)); } else { func_8083EA94(this, play); } @@ -6546,16 +6835,16 @@ s32 func_8083EB44(Player* this, PlayState* play) { return 0; } -s32 func_8083EC18(Player* this, PlayState* play, u32 arg2) { - if (this->wallHeight >= 79.0f) { +s32 func_8083EC18(Player* this, PlayState* play, u32 wallFlags) { + if (this->yDistToLedge >= 79.0f) { if (!(this->stateFlags1 & PLAYER_STATE1_IN_WATER) || (this->currentBoots == PLAYER_BOOTS_IRON) || (this->actor.yDistToWater < this->ageProperties->unk_2C)) { - s32 sp8C = (arg2 & 8) ? 2 : 0; + s32 sp8C = (wallFlags & 8) ? 2 : 0; - if ((sp8C != 0) || (arg2 & 2) || + if ((sp8C != 0) || (wallFlags & 2) || func_80041E4C(&play->colCtx, this->actor.wallPoly, this->actor.wallBgId)) { f32 phi_f20; - CollisionPoly* sp84 = this->actor.wallPoly; + CollisionPoly* wallPoly = this->actor.wallPoly; f32 sp80; f32 sp7C; f32 phi_f12; @@ -6573,7 +6862,7 @@ s32 func_8083EC18(Player* this, PlayState* play, u32 arg2) { Vec3f* sp44 = &sp50[0]; s32 pad; - CollisionPoly_GetVerticesByBgId(sp84, this->actor.wallBgId, &play->colCtx, sp50); + CollisionPoly_GetVerticesByBgId(wallPoly, this->actor.wallBgId, &play->colCtx, sp50); sp80 = phi_f12 = sp44->x; sp7C = phi_f14 = sp44->z; @@ -6600,8 +6889,8 @@ s32 func_8083EC18(Player* this, PlayState* play, u32 arg2) { sp80 = (sp80 + phi_f12) * 0.5f; sp7C = (sp7C + phi_f14) * 0.5f; - phi_f12 = ((this->actor.world.pos.x - sp80) * COLPOLY_GET_NORMAL(sp84->normal.z)) - - ((this->actor.world.pos.z - sp7C) * COLPOLY_GET_NORMAL(sp84->normal.x)); + phi_f12 = ((this->actor.world.pos.x - sp80) * COLPOLY_GET_NORMAL(wallPoly->normal.z)) - + ((this->actor.world.pos.z - sp7C) * COLPOLY_GET_NORMAL(wallPoly->normal.x)); sp48 = this->actor.world.pos.y - phi_f20; phi_f20 = ((f32)(s32)((sp48 / 15.000000223517418) + 0.5) * 15.000000223517418) - sp48; @@ -6609,50 +6898,50 @@ s32 func_8083EC18(Player* this, PlayState* play, u32 arg2) { } if (phi_f12 < 8.0f) { - f32 sp3C = COLPOLY_GET_NORMAL(sp84->normal.x); - f32 sp38 = COLPOLY_GET_NORMAL(sp84->normal.z); - f32 sp34 = this->wallDistance; - LinkAnimationHeader* sp30; + f32 wallPolyNormalX = COLPOLY_GET_NORMAL(wallPoly->normal.x); + f32 wallPolyNormalZ = COLPOLY_GET_NORMAL(wallPoly->normal.z); + f32 sp34 = this->distToInteractWall; + LinkAnimationHeader* anim; func_80836898(play, this, func_8083A3B0); this->stateFlags1 |= PLAYER_STATE1_CLIMBING_LADDER; this->stateFlags1 &= ~PLAYER_STATE1_IN_WATER; - if ((sp8C != 0) || (arg2 & 2)) { + if ((sp8C != 0) || (wallFlags & 2)) { if ((this->unk_84F = sp8C) != 0) { if (this->actor.bgCheckFlags & 1) { - sp30 = &gPlayerAnim_link_normal_Fclimb_startA; + anim = &gPlayerAnim_link_normal_Fclimb_startA; } else { - sp30 = &gPlayerAnim_link_normal_Fclimb_hold2upL; + anim = &gPlayerAnim_link_normal_Fclimb_hold2upL; } sp34 = (this->ageProperties->unk_38 - 1.0f) - sp34; } else { - sp30 = this->ageProperties->unk_A4; + anim = this->ageProperties->unk_A4; sp34 = sp34 - 1.0f; } this->unk_850 = -2; this->actor.world.pos.y += phi_f20; this->actor.shape.rot.y = this->currentYaw = this->actor.wallYaw + 0x8000; } else { - sp30 = this->ageProperties->unk_A8; + anim = this->ageProperties->unk_A8; this->unk_850 = -4; this->actor.shape.rot.y = this->currentYaw = this->actor.wallYaw; } - this->actor.world.pos.x = (sp34 * sp3C) + sp80; - this->actor.world.pos.z = (sp34 * sp38) + sp7C; + this->actor.world.pos.x = (sp34 * wallPolyNormalX) + sp80; + this->actor.world.pos.z = (sp34 * wallPolyNormalZ) + sp7C; func_80832224(this); Math_Vec3f_Copy(&this->actor.prevPos, &this->actor.world.pos); - func_80832264(play, this, sp30); - func_80832F54(play, this, 0x9F); + Player_AnimPlayOnce(play, this, anim); + Player_AnimReplaceApplyFlags(play, this, 0x9F); - return 1; + return true; } } } } - return 0; + return false; } void func_8083F070(Player* this, LinkAnimationHeader* anim, PlayState* play) { @@ -6660,67 +6949,78 @@ void func_8083F070(Player* this, LinkAnimationHeader* anim, PlayState* play) { LinkAnimation_PlayOnceSetSpeed(play, &this->skelAnime, anim, (4.0f / 3.0f)); } -s32 func_8083F0C8(Player* this, PlayState* play, u32 arg2) { +/** + * @return true if Player chooses to enter crawlspace + */ +s32 Player_TryEnteringCrawlspace(Player* this, PlayState* play, u32 interactWallFlags) { CollisionPoly* wallPoly; Vec3f wallVertices[3]; - f32 tempX; - f32 temp; - f32 tempZ; - f32 maxWallZ; + f32 xVertex1; + f32 xVertex2; + f32 zVertex1; + f32 zVertex2; s32 i; - if (!LINK_IS_ADULT && !(this->stateFlags1 & PLAYER_STATE1_IN_WATER) && (arg2 & 0x30)) { + if (!LINK_IS_ADULT && !(this->stateFlags1 & PLAYER_STATE1_IN_WATER) && (interactWallFlags & 0x30)) { wallPoly = this->actor.wallPoly; CollisionPoly_GetVerticesByBgId(wallPoly, this->actor.wallBgId, &play->colCtx, wallVertices); - // compute min and max x/z of wall vertices - tempX = temp = wallVertices[0].x; - tempZ = maxWallZ = wallVertices[0].z; + // Determines min and max vertices for x & z (edges of the crawlspace hole) + xVertex1 = xVertex2 = wallVertices[0].x; + zVertex1 = zVertex2 = wallVertices[0].z; for (i = 1; i < 3; i++) { - if (tempX > wallVertices[i].x) { - tempX = wallVertices[i].x; - } else if (temp < wallVertices[i].x) { - temp = wallVertices[i].x; + if (xVertex1 > wallVertices[i].x) { + // Update x min + xVertex1 = wallVertices[i].x; + } else if (xVertex2 < wallVertices[i].x) { + // Update x max + xVertex2 = wallVertices[i].x; } - if (tempZ > wallVertices[i].z) { - tempZ = wallVertices[i].z; - } else if (maxWallZ < wallVertices[i].z) { - maxWallZ = wallVertices[i].z; + if (zVertex1 > wallVertices[i].z) { + // Update z min + zVertex1 = wallVertices[i].z; + } else if (zVertex2 < wallVertices[i].z) { + // Update z max + zVertex2 = wallVertices[i].z; } } - // average min and max x/z of wall vertices - tempX = (tempX + temp) * 0.5f; - tempZ = (tempZ + maxWallZ) * 0.5f; + // XZ Center of the crawlspace hole + xVertex1 = (xVertex1 + xVertex2) * 0.5f; + zVertex1 = (zVertex1 + zVertex2) * 0.5f; - temp = ((this->actor.world.pos.x - tempX) * COLPOLY_GET_NORMAL(wallPoly->normal.z)) - - ((this->actor.world.pos.z - tempZ) * COLPOLY_GET_NORMAL(wallPoly->normal.x)); + // Perpendicular (sideways) XZ-Distance from player pos to crawlspace line + // Uses y-component of crossproduct formula for the distance from a point to a line + xVertex2 = ((this->actor.world.pos.x - xVertex1) * COLPOLY_GET_NORMAL(wallPoly->normal.z)) - + ((this->actor.world.pos.z - zVertex1) * COLPOLY_GET_NORMAL(wallPoly->normal.x)); - if (fabsf(temp) < 8.0f) { + if (fabsf(xVertex2) < 8.0f) { + // Give do-action prompt to "Enter on A" for the crawlspace this->stateFlags2 |= PLAYER_STATE2_DO_ACTION_ENTER; if (CHECK_BTN_ALL(sControlInput->press.button, BTN_A)) { + // Enter Crawlspace f32 wallPolyNormX = COLPOLY_GET_NORMAL(wallPoly->normal.x); f32 wallPolyNormZ = COLPOLY_GET_NORMAL(wallPoly->normal.z); - f32 wallDistance = this->wallDistance; + f32 distToInteractWall = this->distToInteractWall; func_80836898(play, this, func_8083A40C); this->stateFlags2 |= PLAYER_STATE2_CRAWLING; this->actor.shape.rot.y = this->currentYaw = this->actor.wallYaw + 0x8000; - this->actor.world.pos.x = tempX + (wallDistance * wallPolyNormX); - this->actor.world.pos.z = tempZ + (wallDistance * wallPolyNormZ); + this->actor.world.pos.x = xVertex1 + (distToInteractWall * wallPolyNormX); + this->actor.world.pos.z = zVertex1 + (distToInteractWall * wallPolyNormZ); func_80832224(this); this->actor.prevPos = this->actor.world.pos; - func_80832264(play, this, &gPlayerAnim_link_child_tunnel_start); - func_80832F54(play, this, 0x9D); + Player_AnimPlayOnce(play, this, &gPlayerAnim_link_child_tunnel_start); + Player_AnimReplaceApplyFlags(play, this, 0x9D); - return 1; + return true; } } } - return 0; + return false; } s32 func_8083F360(PlayState* play, Player* this, f32 arg1, f32 arg2, f32 arg3, f32 arg4) { @@ -6751,7 +7051,7 @@ s32 func_8083F360(PlayState* play, Player* this, f32 arg1, f32 arg2, f32 arg3, f this->actor.bgCheckFlags |= 0x200; this->actor.wallBgId = sp78; - D_808535F0 = func_80041DB8(&play->colCtx, wallPoly, sp78); + sTouchedWallFlags = func_80041DB8(&play->colCtx, wallPoly, sp78); temp1 = COLPOLY_GET_NORMAL(wallPoly->normal.x); temp2 = COLPOLY_GET_NORMAL(wallPoly->normal.z); @@ -6774,10 +7074,16 @@ s32 func_8083F524(PlayState* play, Player* this) { return func_8083F360(play, this, 26.0f, this->ageProperties->unk_38 + 5.0f, 30.0f, 0.0f); } -s32 func_8083F570(Player* this, PlayState* play) { +/** + * Two exit walls are placed at each end of the crawlspace, separate to the two entrance walls used to enter the + * crawlspace. These front and back exit walls are futher into the crawlspace than the front and + * back entrance walls. When player interacts with either of these two interior exit walls, start the leaving-crawlspace + * cutscene and return true. Else, return false + */ +s32 Player_TryLeavingCrawlspace(Player* this, PlayState* play) { s16 temp; - if ((this->linearVelocity != 0.0f) && (this->actor.bgCheckFlags & 8) && (D_808535F0 & 0x30)) { + if ((this->linearVelocity != 0.0f) && (this->actor.bgCheckFlags & 8) && (sTouchedWallFlags & 0x30)) { temp = this->actor.shape.rot.y - this->actor.wallYaw; if (this->linearVelocity < 0.0f) { @@ -6785,19 +7091,19 @@ s32 func_8083F570(Player* this, PlayState* play) { } if (ABS(temp) > 0x4000) { - func_80835C58(play, this, func_8084C81C, 0); + Player_SetupAction(play, this, func_8084C81C, 0); if (this->linearVelocity > 0.0f) { this->actor.shape.rot.y = this->actor.wallYaw + 0x8000; - func_80832264(play, this, &gPlayerAnim_link_child_tunnel_end); - func_80832F54(play, this, 0x9D); + Player_AnimPlayOnce(play, this, &gPlayerAnim_link_child_tunnel_end); + Player_AnimReplaceApplyFlags(play, this, 0x9D); OnePointCutscene_Init(play, 9601, 999, NULL, MAIN_CAM); } else { this->actor.shape.rot.y = this->actor.wallYaw; LinkAnimation_Change(play, &this->skelAnime, &gPlayerAnim_link_child_tunnel_start, -1.0f, Animation_GetLastFrame(&gPlayerAnim_link_child_tunnel_start), 0.0f, ANIMMODE_ONCE, 0.0f); - func_80832F54(play, this, 0x9D); + Player_AnimReplaceApplyFlags(play, this, 0x9D); OnePointCutscene_Init(play, 9602, 999, NULL, MAIN_CAM); } @@ -6813,10 +7119,10 @@ s32 func_8083F570(Player* this, PlayState* play) { void func_8083F72C(Player* this, LinkAnimationHeader* anim, PlayState* play) { if (!func_80836898(play, this, func_8083A388)) { - func_80835C58(play, this, func_8084B78C, 0); + Player_SetupAction(play, this, func_8084B78C, 0); } - func_80832264(play, this, anim); + Player_AnimPlayOnce(play, this, anim); func_80832224(this); this->actor.shape.rot.y = this->currentYaw = this->actor.wallYaw + 0x8000; @@ -6825,15 +7131,15 @@ void func_8083F72C(Player* this, LinkAnimationHeader* anim, PlayState* play) { s32 func_8083F7BC(Player* this, PlayState* play) { DynaPolyActor* wallPolyActor; - if (!(this->stateFlags1 & PLAYER_STATE1_ITEM_OVER_HEAD) && (this->actor.bgCheckFlags & 0x200) && (D_80853608 < 0x3000)) { + if (!(this->stateFlags1 & PLAYER_STATE1_ITEM_OVER_HEAD) && (this->actor.bgCheckFlags & 0x200) && (sShapeYawToTouchedWall < 0x3000)) { - if (((this->linearVelocity > 0.0f) && func_8083EC18(this, play, D_808535F0)) || - func_8083F0C8(this, play, D_808535F0)) { + if (((this->linearVelocity > 0.0f) && func_8083EC18(this, play, sTouchedWallFlags)) || + Player_TryEnteringCrawlspace(this, play, sTouchedWallFlags)) { return 1; } if (!func_808332B8(this) && ((this->linearVelocity == 0.0f) || !(this->stateFlags2 & PLAYER_STATE2_DO_ACTION_CLIMB)) && - (D_808535F0 & 0x40) && (this->actor.bgCheckFlags & 1) && (this->wallHeight >= 39.0f)) { + (sTouchedWallFlags & 0x40) && (this->actor.bgCheckFlags & 1) && (this->yDistToLedge >= 39.0f)) { this->stateFlags2 |= PLAYER_STATE2_DO_ACTION_GRAB; @@ -6892,21 +7198,21 @@ s32 func_8083F9D0(PlayState* play, Player* this) { } func_80839FFC(this, play); - func_80832264(play, this, &gPlayerAnim_link_normal_push_wait_end); + Player_AnimPlayOnce(play, this, &gPlayerAnim_link_normal_push_wait_end); this->stateFlags2 &= ~PLAYER_STATE2_MOVING_DYNAPOLY; return 1; } void func_8083FAB8(Player* this, PlayState* play) { - func_80835C58(play, this, func_8084B898, 0); + Player_SetupAction(play, this, func_8084B898, 0); this->stateFlags2 |= PLAYER_STATE2_MOVING_DYNAPOLY; - func_80832264(play, this, &gPlayerAnim_link_normal_push_start); + Player_AnimPlayOnce(play, this, &gPlayerAnim_link_normal_push_start); } void func_8083FB14(Player* this, PlayState* play) { - func_80835C58(play, this, func_8084B9E4, 0); + Player_SetupAction(play, this, func_8084B9E4, 0); this->stateFlags2 |= PLAYER_STATE2_MOVING_DYNAPOLY; - func_80832264(play, this, D_80853914[PLAYER_ANIMGROUP_pull_start][this->modelAnimType]); + Player_AnimPlayOnce(play, this, GET_PLAYER_ANIM(PLAYER_ANIMGROUP_pull_start, this->modelAnimType)); } void func_8083FB7C(Player* this, PlayState* play) { @@ -6917,7 +7223,7 @@ void func_8083FB7C(Player* this, PlayState* play) { s32 func_8083FBC0(Player* this, PlayState* play) { if (!CHECK_BTN_ALL(sControlInput->press.button, BTN_A) && (this->actor.bgCheckFlags & 0x200) && - ((D_808535F0 & 8) || (D_808535F0 & 2) || + ((sTouchedWallFlags & 8) || (sTouchedWallFlags & 2) || func_80041E4C(&play->colCtx, this->actor.wallPoly, this->actor.wallBgId))) { return 0; } @@ -7101,7 +7407,7 @@ void func_80840450(Player* this, PlayState* play) { if (this->unk_850 != 0) { if (LinkAnimation_Update(play, &this->skelAnime)) { func_80832DBC(this); - func_80832284(play, this, func_808334E4(this)); + Player_AnimPlayLoop(play, this, func_808334E4(this)); this->unk_850 = 0; this->stateFlags3 &= ~PLAYER_STATE3_FINISHED_ATTACKING; } @@ -7112,13 +7418,13 @@ void func_80840450(Player* this, PlayState* play) { func_8083721C(this); - if (!func_80837348(play, this, D_808543E0, 1)) { - if (!func_80833B54(this) && (!func_80833B2C(this) || (func_80834B5C != this->func_82C))) { + if (!Player_TryActionChangeList(play, this, D_808543E0, 1)) { + if (!func_80833B54(this) && (!func_80833B2C(this) || (func_80834B5C != this->upperActionFunc))) { func_8083CF10(this, play); return; } - func_80837268(this, &sp44, &sp42, 0.0f, play); + Player_GetMovementSpeedAndYaw(this, &sp44, &sp42, 0.0f, play); temp1 = func_8083FC68(this, sp44, sp42); @@ -7173,12 +7479,12 @@ void func_808407CC(Player* this, PlayState* play) { if (LinkAnimation_Update(play, &this->skelAnime)) { func_80832DBC(this); - func_80832264(play, this, func_80833338(this)); + Player_AnimPlayOnce(play, this, func_80833338(this)); } func_8083721C(this); - if (!func_80837348(play, this, D_808543E8, 1)) { + if (!Player_TryActionChangeList(play, this, D_808543E8, 1)) { if (func_80833B54(this)) { func_8083CEAC(this, play); return; @@ -7190,12 +7496,12 @@ void func_808407CC(Player* this, PlayState* play) { return; } - if (func_80834B5C == this->func_82C) { + if (func_80834B5C == this->upperActionFunc) { func_8083CEAC(this, play); return; } - func_80837268(this, &sp3C, &sp3A, 0.0f, play); + Player_GetMovementSpeedAndYaw(this, &sp3C, &sp3A, 0.0f, play); temp1 = func_8083FD78(this, &sp3C, &sp3A, play); @@ -7305,7 +7611,7 @@ void func_80840BC8(Player* this, PlayState* play) { func_8083721C(this); if (this->unk_850 == 0) { - if (!func_80837348(play, this, D_80854418, 1)) { + if (!Player_TryActionChangeList(play, this, D_80854418, 1)) { if (func_80833B54(this)) { func_8083CEAC(this, play); return; @@ -7316,7 +7622,7 @@ void func_80840BC8(Player* this, PlayState* play) { return; } - func_80837268(this, &sp3C, &sp3A, 0.018f, play); + Player_GetMovementSpeedAndYaw(this, &sp3C, &sp3A, 0.018f, play); if (sp3C != 0.0f) { func_8083C8DC(this, play, sp3A); @@ -7378,7 +7684,7 @@ void func_80840DE4(Player* this, PlayState* play) { func_808327F8(this, this->linearVelocity); } - if (!func_80837348(play, this, D_808543F4, 1)) { + if (!Player_TryActionChangeList(play, this, D_808543F4, 1)) { if (func_80833B54(this)) { func_8083CEAC(this, play); return; @@ -7389,7 +7695,7 @@ void func_80840DE4(Player* this, PlayState* play) { return; } - func_80837268(this, &sp44, &sp42, 0.0f, play); + Player_GetMovementSpeedAndYaw(this, &sp44, &sp42, 0.0f, play); temp1 = func_8083FD78(this, &sp44, &sp42, play); if (temp1 > 0) { @@ -7435,7 +7741,7 @@ void func_80841138(Player* this, PlayState* play) { if (this->unk_864 < 1.0f) { temp1 = R_UPDATE_RATE * 0.5f; func_8084029C(this, REG(35) / 1000.0f); - LinkAnimation_LoadToJoint(play, &this->skelAnime, D_80853914[PLAYER_ANIMGROUP_back_walk][this->modelAnimType], + LinkAnimation_LoadToJoint(play, &this->skelAnime, GET_PLAYER_ANIM(PLAYER_ANIMGROUP_back_walk, this->modelAnimType), this->unk_868); this->unk_864 += 1 * temp1; if (this->unk_864 >= 1.0f) { @@ -7447,7 +7753,7 @@ void func_80841138(Player* this, PlayState* play) { if (temp2 < 0.0f) { temp1 = 1.0f; func_8084029C(this, (REG(35) / 1000.0f) + ((REG(36) / 1000.0f) * this->linearVelocity)); - LinkAnimation_LoadToJoint(play, &this->skelAnime, D_80853914[PLAYER_ANIMGROUP_back_walk][this->modelAnimType], + LinkAnimation_LoadToJoint(play, &this->skelAnime, GET_PLAYER_ANIM(PLAYER_ANIMGROUP_back_walk, this->modelAnimType), this->unk_868); } else { temp1 = (REG(37) / 1000.0f) * temp2; @@ -7457,7 +7763,7 @@ void func_80841138(Player* this, PlayState* play) { temp1 = 1.0f; func_8084029C(this, 1.2f + ((REG(38) / 1000.0f) * temp2)); } - LinkAnimation_LoadToMorph(play, &this->skelAnime, D_80853914[PLAYER_ANIMGROUP_back_walk][this->modelAnimType], + LinkAnimation_LoadToMorph(play, &this->skelAnime, GET_PLAYER_ANIM(PLAYER_ANIMGROUP_back_walk, this->modelAnimType), this->unk_868); LinkAnimation_LoadToJoint(play, &this->skelAnime, &gPlayerAnim_link_normal_back_run, this->unk_868 * (16.0f / 29.0f)); @@ -7470,8 +7776,8 @@ void func_80841138(Player* this, PlayState* play) { } void func_8084140C(Player* this, PlayState* play) { - func_80835C58(play, this, func_8084170C, 1); - func_80832B0C(play, this, &gPlayerAnim_link_normal_back_brake); + Player_SetupAction(play, this, func_8084170C, 1); + Player_AnimChangeOnceMorph(play, this, &gPlayerAnim_link_normal_back_brake); } s32 func_80841458(Player* this, f32* arg1, s16* arg2, PlayState* play) { @@ -7500,13 +7806,13 @@ void func_808414F8(Player* this, PlayState* play) { func_80841138(this, play); - if (!func_80837348(play, this, D_80854400, 1)) { + if (!Player_TryActionChangeList(play, this, D_80854400, 1)) { if (!func_80833C04(this)) { func_8083C8DC(this, play, this->currentYaw); return; } - func_80837268(this, &sp34, &sp32, 0.0f, play); + Player_GetMovementSpeedAndYaw(this, &sp34, &sp32, 0.0f, play); sp2C = func_8083FD78(this, &sp34, &sp32, play); if (sp2C >= 0) { @@ -7533,8 +7839,8 @@ void func_808414F8(Player* this, PlayState* play) { } void func_808416C0(Player* this, PlayState* play) { - func_80835C58(play, this, func_808417FC, 1); - func_80832264(play, this, &gPlayerAnim_link_normal_back_brake_end); + Player_SetupAction(play, this, func_808417FC, 1); + Player_AnimPlayOnce(play, this, &gPlayerAnim_link_normal_back_brake_end); } void func_8084170C(Player* this, PlayState* play) { @@ -7545,8 +7851,8 @@ void func_8084170C(Player* this, PlayState* play) { sp34 = LinkAnimation_Update(play, &this->skelAnime); func_8083721C(this); - if (!func_80837348(play, this, D_80854400, 1)) { - func_80837268(this, &sp30, &sp2E, 0.0f, play); + if (!Player_TryActionChangeList(play, this, D_80854400, 1)) { + Player_GetMovementSpeedAndYaw(this, &sp30, &sp2E, 0.0f, play); if (this->linearVelocity == 0.0f) { this->currentYaw = this->actor.shape.rot.y; @@ -7565,7 +7871,7 @@ void func_808417FC(Player* this, PlayState* play) { sp1C = LinkAnimation_Update(play, &this->skelAnime); - if (!func_80837348(play, this, D_80854400, 1)) { + if (!Player_TryActionChangeList(play, this, D_80854400, 1)) { if (sp1C != 0) { func_80839F30(this, play); } @@ -7574,7 +7880,7 @@ void func_808417FC(Player* this, PlayState* play) { void func_80841860(PlayState* play, Player* this) { f32 frame; - // fake match? see func_80833664 + // fake match? see Player_InitItemActionWithAnim LinkAnimationHeader* sp38 = D_80853914[0][this->modelAnimType + PLAYER_ANIMGROUP_side_walkL * ARRAY_COUNT(D_80853914[0])]; LinkAnimationHeader* sp34 = D_80853914[0][this->modelAnimType + PLAYER_ANIMGROUP_side_walkR * ARRAY_COUNT(D_80853914[0])]; @@ -7595,13 +7901,13 @@ void func_8084193C(Player* this, PlayState* play) { func_80841860(play, this); - if (!func_80837348(play, this, D_80854408, 1)) { + if (!Player_TryActionChangeList(play, this, D_80854408, 1)) { if (!func_80833C04(this)) { func_8083C858(this, play); return; } - func_80837268(this, &sp3C, &sp3A, 0.0f, play); + Player_GetMovementSpeedAndYaw(this, &sp3C, &sp3A, 0.0f, play); if (func_80833B2C(this)) { temp1 = func_8083FD78(this, &sp3C, &sp3A, play); @@ -7660,12 +7966,12 @@ void func_80841BA8(Player* this, PlayState* play) { AnimationContext_SetLoadFrame(play, func_80833338(this), 0, this->skelAnime.limbCount, this->skelAnime.morphTable); AnimationContext_SetCopyTrue(play, this->skelAnime.limbCount, this->skelAnime.jointTable, - this->skelAnime.morphTable, D_80853410); + this->skelAnime.morphTable, sUpperBodyLimbCopyMap); } - func_80837268(this, &sp34, &sp32, 0.018f, play); + Player_GetMovementSpeedAndYaw(this, &sp34, &sp32, 0.018f, play); - if (!func_80837348(play, this, D_80854414, 1)) { + if (!Player_TryActionChangeList(play, this, D_80854414, 1)) { if (sp34 != 0.0f) { this->actor.shape.rot.y = sp32; func_8083C858(this, play); @@ -7682,20 +7988,20 @@ void func_80841CC4(Player* this, s32 arg1, PlayState* play) { s16 target; f32 rate; - if (ABS(D_80853610) < 3640) { + if (ABS(sFloorShapePitch) < 3640) { target = 0; } else { - target = CLAMP(D_80853610, -10922, 10922); + target = CLAMP(sFloorShapePitch, -10922, 10922); } Math_ScaledStepToS(&this->unk_89C, target, 400); if ((this->modelAnimType == PLAYER_ANIMTYPE_3) || ((this->unk_89C == 0) && (this->unk_6C4 <= 0.0f))) { if (arg1 == 0) { - LinkAnimation_LoadToJoint(play, &this->skelAnime, D_80853914[PLAYER_ANIMGROUP_walk][this->modelAnimType], + LinkAnimation_LoadToJoint(play, &this->skelAnime, GET_PLAYER_ANIM(PLAYER_ANIMGROUP_walk, this->modelAnimType), this->unk_868); } else { - LinkAnimation_LoadToMorph(play, &this->skelAnime, D_80853914[PLAYER_ANIMGROUP_walk][this->modelAnimType], + LinkAnimation_LoadToMorph(play, &this->skelAnime, GET_PLAYER_ANIM(PLAYER_ANIMGROUP_walk, this->modelAnimType), this->unk_868); } return; @@ -7721,10 +8027,10 @@ void func_80841CC4(Player* this, s32 arg1, PlayState* play) { } if (arg1 == 0) { - LinkAnimation_BlendToJoint(play, &this->skelAnime, D_80853914[PLAYER_ANIMGROUP_walk][this->modelAnimType], + LinkAnimation_BlendToJoint(play, &this->skelAnime, GET_PLAYER_ANIM(PLAYER_ANIMGROUP_walk, this->modelAnimType), this->unk_868, anim, this->unk_868, rate, this->blendTable); } else { - LinkAnimation_BlendToMorph(play, &this->skelAnime, D_80853914[PLAYER_ANIMGROUP_walk][this->modelAnimType], + LinkAnimation_BlendToMorph(play, &this->skelAnime, GET_PLAYER_ANIM(PLAYER_ANIMGROUP_walk, this->modelAnimType), this->unk_868, anim, this->unk_868, rate, this->blendTable); } } @@ -7737,7 +8043,7 @@ void func_80841EE4(Player* this, PlayState* play) { temp1 = R_UPDATE_RATE * 0.5f; func_8084029C(this, REG(35) / 1000.0f); - LinkAnimation_LoadToJoint(play, &this->skelAnime, D_80853914[PLAYER_ANIMGROUP_walk][this->modelAnimType], + LinkAnimation_LoadToJoint(play, &this->skelAnime, GET_PLAYER_ANIM(PLAYER_ANIMGROUP_walk, this->modelAnimType), this->unk_868); this->unk_864 += 1 * temp1; @@ -7782,13 +8088,13 @@ void func_80842180(Player* this, PlayState* play) { this->stateFlags2 |= PLAYER_STATE2_DISABLE_ROTATION_Z_TARGET; func_80841EE4(this, play); - if (!func_80837348(play, this, D_80854424, 1)) { + if (!Player_TryActionChangeList(play, this, D_80854424, 1)) { if (func_80833C04(this)) { func_8083C858(this, play); return; } - func_80837268(this, &sp2C, &sp2A, 0.018f, play); + Player_GetMovementSpeedAndYaw(this, &sp2C, &sp2A, 0.018f, play); if (!func_8083C484(this, &sp2C, &sp2A)) { int32_t giSpeedModifier = GameInteractor_RunSpeedModifier(); @@ -7837,13 +8143,13 @@ void func_8084227C(Player* this, PlayState* play) { this->stateFlags2 |= PLAYER_STATE2_DISABLE_ROTATION_Z_TARGET; func_80841EE4(this, play); - if (!func_80837348(play, this, D_80854430, 1)) { + if (!Player_TryActionChangeList(play, this, D_80854430, 1)) { if (!func_80833C04(this)) { func_8083C858(this, play); return; } - func_80837268(this, &sp2C, &sp2A, 0.0f, play); + Player_GetMovementSpeedAndYaw(this, &sp2C, &sp2A, 0.0f, play); if (!func_8083C484(this, &sp2C, &sp2A)) { if ((func_80833B2C(this) && (sp2C != 0.0f) && (func_8083FD78(this, &sp2C, &sp2A, play) <= 0)) || @@ -7869,13 +8175,13 @@ void func_808423EC(Player* this, PlayState* play) { sp34 = LinkAnimation_Update(play, &this->skelAnime); - if (!func_80837348(play, this, D_80854408, 1)) { + if (!Player_TryActionChangeList(play, this, D_80854408, 1)) { if (!func_80833C04(this)) { func_8083C858(this, play); return; } - func_80837268(this, &sp30, &sp2E, 0.0f, play); + Player_GetMovementSpeedAndYaw(this, &sp30, &sp2E, 0.0f, play); if ((this->skelAnime.morphWeight == 0.0f) && (this->skelAnime.curFrame > 5.0f)) { func_8083721C(this); @@ -7901,8 +8207,8 @@ void func_8084251C(Player* this, PlayState* play) { func_8083721C(this); - if (!func_80837348(play, this, D_80854440, 1)) { - func_80837268(this, &sp30, &sp2E, 0.0f, play); + if (!Player_TryActionChangeList(play, this, D_80854440, 1)) { + Player_GetMovementSpeedAndYaw(this, &sp30, &sp2E, 0.0f, play); if (this->linearVelocity == 0.0f) { this->currentYaw = this->actor.shape.rot.y; @@ -7931,7 +8237,7 @@ static Vec3f D_808545C0 = { 0.0f, 0.0f, 0.0f }; s32 func_8084269C(PlayState* play, Player* this) { Vec3f sp2C; - if ((this->unk_89E == 0) || (this->unk_89E == 1)) { + if ((this->floorSfxOffset == 0) || (this->floorSfxOffset == 1)) { func_8084260C(&this->actor.shape.feetPos[FOOT_LEFT], &sp2C, this->actor.floorHeight - this->actor.shape.feetPos[FOOT_LEFT].y, 7.0f, 5.0f); func_800286CC(play, &sp2C, &D_808545B4, &D_808545C0, 50, 30); @@ -7945,11 +8251,11 @@ s32 func_8084269C(PlayState* play, Player* this) { } void func_8084279C(Player* this, PlayState* play) { - func_80832CB0(play, this, D_80853914[PLAYER_ANIMGROUP_check_wait][this->modelAnimType]); + func_80832CB0(play, this, GET_PLAYER_ANIM(PLAYER_ANIMGROUP_check_wait, this->modelAnimType)); if (DECR(this->unk_850) == 0) { if (!func_8083B040(this, play)) { - func_8083A098(this, D_80853914[PLAYER_ANIMGROUP_check_end][this->modelAnimType], play); + func_8083A098(this, GET_PLAYER_ANIM(PLAYER_ANIMGROUP_check_end, this->modelAnimType), play); } this->actor.flags &= ~ACTOR_FLAG_PLAYER_TALKED_TO; @@ -7968,13 +8274,13 @@ s32 func_8084285C(Player* this, f32 arg1, f32 arg2, f32 arg3) { } s32 func_808428D8(Player* this, PlayState* play) { - if (Player_IsChildWithHylianShield(this) || !Player_GetMeleeWeaponHeld(this) || !D_80853614) { + if (Player_IsChildWithHylianShield(this) || !Player_GetMeleeWeaponHeld(this) || !sUseHeldItem) { return 0; } - func_80832264(play, this, &gPlayerAnim_link_normal_defense_kiru); + Player_AnimPlayOnce(play, this, &gPlayerAnim_link_normal_defense_kiru); this->unk_84F = 1; - this->meleeWeaponAnimation = 0xC; + this->meleeWeaponAnimation = PLAYER_MWA_STAB_1H; this->currentYaw = this->actor.shape.rot.y + this->unk_6BE; if (!CVarGetInteger("gCrouchStabHammerFix", 0)) { @@ -8003,7 +8309,7 @@ s32 func_80842964(Player* this, PlayState* play) { return func_8083B040(this, play) || func_8083B644(this, play) || func_8083E5A8(this, play); } -void func_808429B4(PlayState* play, s32 speed, s32 y, s32 countdown) { +void Player_RequestQuake(PlayState* play, s32 speed, s32 y, s32 countdown) { s32 quakeIdx = Quake_Add(Play_GetCamera(play, 0), 3); Quake_SetSpeed(quakeIdx, speed); @@ -8012,7 +8318,7 @@ void func_808429B4(PlayState* play, s32 speed, s32 y, s32 countdown) { } void func_80842A28(PlayState* play, Player* this) { - func_808429B4(play, 27767, 7, 20); + Player_RequestQuake(play, 27767, 7, 20); play->actorCtx.unk_02 = 4; Player_RequestRumble(this, 255, 20, 150, 0); Player_PlaySfx(&this->actor, NA_SE_IT_HAMMER_HIT); @@ -8021,7 +8327,7 @@ void func_80842A28(PlayState* play, Player* this) { void func_80842A88(PlayState* play, Player* this) { if (CVarGetInteger("gDekuStickCheat", DEKU_STICK_NORMAL) == DEKU_STICK_NORMAL) { Inventory_ChangeAmmo(ITEM_STICK, -1); - func_80835F44(play, this, ITEM_NONE); + Player_UseItem(play, this, ITEM_NONE); } } @@ -8074,9 +8380,9 @@ void func_80842D20(PlayState* play, Player* this) { s32 pad; s32 sp28; - if (func_80843188 != this->func_674) { + if (func_80843188 != this->actionFunc) { func_80832440(play, this); - func_80835C58(play, this, func_808505DC, 0); + Player_SetupAction(play, this, func_808505DC, 0); if (func_8008E9C4(this)) { sp28 = 2; @@ -8084,7 +8390,7 @@ void func_80842D20(PlayState* play, Player* this) { sp28 = 0; } - func_808322D0(play, this, D_808545CC[Player_HoldsTwoHandedWeapon(this) + sp28]); + Player_AnimPlayOnceAdjusted(play, this, D_808545CC[Player_HoldsTwoHandedWeapon(this) + sp28]); } Player_RequestRumble(this, 180, 20, 100, 0); @@ -8103,7 +8409,7 @@ s32 func_80842DF4(PlayState* play, Player* this) { s32 sp48; if (this->meleeWeaponState > 0) { - if (this->meleeWeaponAnimation < 0x18) { + if (this->meleeWeaponAnimation < PLAYER_MWA_SPIN_ATTACK_1H) { if (!(this->meleeWeaponQuads[0].base.atFlags & AT_BOUNCED) && !(this->meleeWeaponQuads[1].base.atFlags & AT_BOUNCED)) { if (this->skelAnime.curFrame >= 2.0f) { @@ -8159,7 +8465,7 @@ s32 func_80842DF4(PlayState* play, Player* this) { temp1 = (this->meleeWeaponQuads[0].base.atFlags & AT_HIT) || (this->meleeWeaponQuads[1].base.atFlags & AT_HIT); if (temp1) { - if (this->meleeWeaponAnimation < 0x18) { + if (this->meleeWeaponAnimation < PLAYER_MWA_SPIN_ATTACK_1H) { Actor* at = this->meleeWeaponQuads[temp1 ? 1 : 0].base.at; if ((at != NULL) && (at->id != ACTOR_EN_KANBAN)) { @@ -8194,7 +8500,7 @@ void func_80843188(Player* this, PlayState* play) { if (LinkAnimation_Update(play, &this->skelAnime)) { if (!Player_IsChildWithHylianShield(this)) { - func_80832284(play, this, D_80853914[PLAYER_ANIMGROUP_defense_wait][this->modelAnimType]); + Player_AnimPlayLoop(play, this, GET_PLAYER_ANIM(PLAYER_ANIMGROUP_defense_wait, this->modelAnimType)); } this->unk_850 = 1; this->unk_84F = 0; @@ -8202,7 +8508,7 @@ void func_80843188(Player* this, PlayState* play) { if (!Player_IsChildWithHylianShield(this)) { this->stateFlags1 |= PLAYER_STATE1_SHIELDING; - func_80836670(this, play); + Player_UpdateUpperBody(this, play); this->stateFlags1 &= ~PLAYER_STATE1_SHIELDING; } @@ -8257,12 +8563,12 @@ void func_80843188(Player* this, PlayState* play) { LinkAnimation_Change(play, &this->skelAnime, &gPlayerAnim_clink_normal_defense_ALL, 1.0f, Animation_GetLastFrame(&gPlayerAnim_clink_normal_defense_ALL), 0.0f, ANIMMODE_ONCE, 0.0f); - func_80832F54(play, this, 4); + Player_AnimReplaceApplyFlags(play, this, 4); } else { if (this->itemAction < 0) { func_8008EC70(this); } - func_8083A098(this, D_80853914[PLAYER_ANIMGROUP_defense_end][this->modelAnimType], play); + func_8083A098(this, GET_PLAYER_ANIM(PLAYER_ANIMGROUP_defense_end, this->modelAnimType), play); } Player_PlaySfx(&this->actor, NA_SE_IT_SHIELD_REMOVE); @@ -8287,17 +8593,17 @@ void func_808435C4(Player* this, PlayState* play) { func_8083721C(this); if (this->unk_84F == 0) { - D_808535E0 = func_80836670(this, play); - if ((func_80834B5C == this->func_82C) || (func_808374A0(play, this, &this->skelAnime2, 4.0f) > 0)) { - func_80835C58(play, this, func_80840450, 1); + D_808535E0 = Player_UpdateUpperBody(this, play); + if ((func_80834B5C == this->upperActionFunc) || (func_808374A0(play, this, &this->upperSkelAnime, 4.0f) > 0)) { + Player_SetupAction(play, this, func_80840450, 1); } } else { temp = func_808374A0(play, this, &this->skelAnime, 4.0f); if ((temp != 0) && ((temp > 0) || LinkAnimation_Update(play, &this->skelAnime))) { - func_80835C58(play, this, func_80843188, 1); + Player_SetupAction(play, this, func_80843188, 1); this->stateFlags1 |= PLAYER_STATE1_SHIELDING; Player_SetModelsForHoldingShield(this); - anim = D_80853914[PLAYER_ANIMGROUP_defense][this->modelAnimType]; + anim = GET_PLAYER_ANIM(PLAYER_ANIMGROUP_defense, this->modelAnimType); frames = Animation_GetLastFrame(anim); LinkAnimation_Change(play, &this->skelAnime, anim, 1.0f, frames, frames, ANIMMODE_ONCE, 0.0f); } @@ -8347,11 +8653,11 @@ void func_8084377C(Player* this, PlayState* play) { if (this->stateFlags1 & PLAYER_STATE1_IN_CUTSCENE) { this->unk_850++; } else { - func_80835C58(play, this, func_80843954, 0); + Player_SetupAction(play, this, func_80843954, 0); this->stateFlags1 |= PLAYER_STATE1_DAMAGED; } - func_80832264(play, this, + Player_AnimPlayOnce(play, this, (this->currentYaw != this->actor.shape.rot.y) ? &gPlayerAnim_link_normal_front_downB : &gPlayerAnim_link_normal_back_downB); func_80832698(this, NA_SE_VO_LI_FREEZE); @@ -8373,18 +8679,18 @@ void func_80843954(Player* this, PlayState* play) { if (this->stateFlags1 & PLAYER_STATE1_IN_CUTSCENE) { this->unk_850++; } else { - func_80835C58(play, this, func_80843A38, 0); + Player_SetupAction(play, this, func_80843A38, 0); this->stateFlags1 |= PLAYER_STATE1_DAMAGED; } - func_808322D0(play, this, + Player_AnimPlayOnceAdjusted(play, this, (this->currentYaw != this->actor.shape.rot.y) ? &gPlayerAnim_link_normal_front_down_wake : &gPlayerAnim_link_normal_back_down_wake); this->currentYaw = this->actor.shape.rot.y; } } -static struct_80832924 D_808545DC[] = { +static AnimSfxEntry D_808545DC[] = { { 0, 0x4014 }, { 0, -0x401E }, }; @@ -8404,7 +8710,7 @@ void func_80843A38(Player* this, PlayState* play) { } } - func_80832924(this, D_808545DC); + Player_ProcessAnimSfxList(this, D_808545DC); } static Vec3f D_808545E4 = { 0.0f, 0.0f, 5.0f }; @@ -8456,7 +8762,7 @@ void func_80843AE8(PlayState* play, Player* this) { } } -static struct_80832924 D_808545F0[] = { +static AnimSfxEntry D_808545F0[] = { { NA_SE_PL_BOUND, 0x103C }, { 0, 0x408C }, { 0, 0x40A4 }, @@ -8465,8 +8771,8 @@ static struct_80832924 D_808545F0[] = { void func_80843CEC(Player* this, PlayState* play) { if (this->currentTunic != PLAYER_TUNIC_GORON && CVarGetInteger("gSuperTunic", 0) == 0) { - if ((play->roomCtx.curRoom.behaviorType2 == ROOM_BEHAVIOR_TYPE2_3) || (D_808535E4 == 9) || - ((func_80838144(D_808535E4) >= 0) && + if ((play->roomCtx.curRoom.behaviorType2 == ROOM_BEHAVIOR_TYPE2_3) || (sFloorType == 9) || + ((func_80838144(sFloorType) >= 0) && !SurfaceType_IsWallDamage(&play->colCtx, this->actor.floorPoly, this->actor.floorBgId))) { func_8083821C(this); } @@ -8482,7 +8788,7 @@ void func_80843CEC(Player* this, PlayState* play) { } if (this->skelAnime.animation == &gPlayerAnim_link_derth_rebirth) { - func_80832924(this, D_808545F0); + Player_ProcessAnimSfxList(this, D_808545F0); } else if (this->skelAnime.animation == &gPlayerAnim_link_normal_electric_shock_end) { if (LinkAnimation_OnFrame(&this->skelAnime, 88.0f)) { func_80832770(this, NA_SE_PL_BOUND); @@ -8506,7 +8812,7 @@ static FallImpactInfo D_80854600[] = { s32 func_80843E64(PlayState* play, Player* this) { s32 sp34; - if ((D_808535E4 == 6) || (D_808535E4 == 9)) { + if ((sFloorType == 6) || (sFloorType == 9)) { sp34 = 0; } else { sp34 = this->fallDistance; @@ -8534,7 +8840,7 @@ s32 func_80843E64(PlayState* play, Player* this) { } func_80837AE0(this, 40); - func_808429B4(play, 32967, 2, 30); + Player_RequestQuake(play, 32967, 2, 30); Player_RequestRumble(this, impactInfo->unk_01, impactInfo->unk_02, impactInfo->unk_03, 0); Player_PlaySfx(&this->actor, NA_SE_PL_BODY_HIT); func_80832698(this, impactInfo->sfxId); @@ -8551,7 +8857,7 @@ s32 func_80843E64(PlayState* play, Player* this) { Player_RequestRumble(this, (u8)sp34, (u8)(sp34 * 0.1f), (u8)sp34, 0); - if (D_808535E4 == 6) { + if (sFloorType == 6) { func_80832698(this, NA_SE_VO_LI_CLIMB_END); } } @@ -8584,7 +8890,7 @@ void func_8084411C(Player* this, PlayState* play) { this->actor.gravity = -1.2f; } - func_80837268(this, &sp4C, &sp4A, 0.0f, play); + Player_GetMovementSpeedAndYaw(this, &sp4C, &sp4A, 0.0f, play); if (!(this->actor.bgCheckFlags & 1)) { if (this->stateFlags1 & PLAYER_STATE1_ITEM_OVER_HEAD) { @@ -8606,13 +8912,13 @@ void func_8084411C(Player* this, PlayState* play) { func_8083DFE0(this, &sp4C, &sp4A); } - func_80836670(this, play); + Player_UpdateUpperBody(this, play); if (((this->stateFlags2 & PLAYER_STATE2_HOPPING) && (this->unk_84F == 2)) || !func_8083BBA0(this, play)) { if (this->actor.velocity.y < 0.0f) { if (this->unk_850 >= 0) { if ((this->actor.bgCheckFlags & 8) || (this->unk_850 == 0) || (this->fallDistance > 0)) { - if ((D_80853600 > 800.0f) || (this->stateFlags1 & PLAYER_STATE1_HOOKSHOT_FALLING)) { + if ((sYDistToFloor > 800.0f) || (this->stateFlags1 & PLAYER_STATE1_HOOKSHOT_FALLING)) { func_80843E14(this, NA_SE_VO_LI_FALL_S); this->stateFlags1 &= ~PLAYER_STATE1_HOOKSHOT_FALLING; } @@ -8622,7 +8928,7 @@ void func_8084411C(Player* this, PlayState* play) { this->unk_850 = -1; } } else { - if ((this->unk_850 == -1) && (this->fallDistance > 120.0f) && (D_80853600 > 280.0f)) { + if ((this->unk_850 == -1) && (this->fallDistance > 120.0f) && (sYDistToFloor > 280.0f)) { this->unk_850 = -2; func_80843E14(this, NA_SE_VO_LI_FALL_L); } @@ -8630,10 +8936,10 @@ void func_8084411C(Player* this, PlayState* play) { if (!GameInteractor_GetDisableLedgeGrabsActive() && (this->actor.bgCheckFlags & 0x200) && !(this->stateFlags2 & PLAYER_STATE2_HOPPING) && !(this->stateFlags1 & (PLAYER_STATE1_ITEM_OVER_HEAD | PLAYER_STATE1_IN_WATER)) && (this->linearVelocity > 0.0f)) { - if ((this->wallHeight >= 150.0f) && (this->unk_84B[this->unk_846] == 0)) { - func_8083EC18(this, play, D_808535F0); - } else if ((this->unk_88C >= 2) && (this->wallHeight < 150.0f) && - (((this->actor.world.pos.y - this->actor.floorHeight) + this->wallHeight) > + if ((this->yDistToLedge >= 150.0f) && (this->unk_84B[this->unk_846] == 0)) { + func_8083EC18(this, play, sTouchedWallFlags); + } else if ((this->unk_88C >= 2) && (this->yDistToLedge < 150.0f) && + (((this->actor.world.pos.y - this->actor.floorHeight) + this->yDistToLedge) > (70.0f * this->ageProperties->unk_08))) { AnimationContext_DisableQueue(play); if (this->stateFlags1 & PLAYER_STATE1_HOOKSHOT_FALLING) { @@ -8641,9 +8947,9 @@ void func_8084411C(Player* this, PlayState* play) { } else { func_80832698(this, NA_SE_VO_LI_HANG); } - this->actor.world.pos.y += this->wallHeight; - func_8083A5C4(play, this, this->actor.wallPoly, this->wallDistance, - D_80853914[PLAYER_ANIMGROUP_jump_climb_hold][this->modelAnimType]); + this->actor.world.pos.y += this->yDistToLedge; + func_8083A5C4(play, this, this->actor.wallPoly, this->distToInteractWall, + GET_PLAYER_ANIM(PLAYER_ANIMGROUP_jump_climb_hold, this->modelAnimType)); this->actor.shape.rot.y = this->currentYaw += 0x8000; this->stateFlags1 |= PLAYER_STATE1_HANGING_OFF_LEDGE; } @@ -8652,7 +8958,7 @@ void func_8084411C(Player* this, PlayState* play) { } } } else { - LinkAnimationHeader* anim = D_80853914[PLAYER_ANIMGROUP_landing][this->modelAnimType]; + LinkAnimationHeader* anim = GET_PLAYER_ANIM(PLAYER_ANIMGROUP_landing, this->modelAnimType); s32 sp3C; if (this->stateFlags2 & PLAYER_STATE2_HOPPING) { @@ -8667,7 +8973,7 @@ void func_8084411C(Player* this, PlayState* play) { anim = &gPlayerAnim_link_anchor_landingR; func_80833C3C(this); } else if (this->fallDistance <= 80) { - anim = D_80853914[PLAYER_ANIMGROUP_short_landing][this->modelAnimType]; + anim = GET_PLAYER_ANIM(PLAYER_ANIMGROUP_short_landing, this->modelAnimType); } else if ((this->fallDistance < 800) && (this->unk_84B[this->unk_846] == 0) && !(this->stateFlags1 & PLAYER_STATE1_ITEM_OVER_HEAD)) { func_8083BC04(this, play); @@ -8677,7 +8983,7 @@ void func_8084411C(Player* this, PlayState* play) { sp3C = func_80843E64(play, this); if (sp3C > 0) { - func_8083A098(this, D_80853914[PLAYER_ANIMGROUP_landing][this->modelAnimType], play); + func_8083A098(this, GET_PLAYER_ANIM(PLAYER_ANIMGROUP_landing, this->modelAnimType), play); this->skelAnime.endFrame = 8.0f; if (sp3C == 1) { this->unk_850 = 10; @@ -8690,7 +8996,7 @@ void func_8084411C(Player* this, PlayState* play) { } } -static struct_80832924 D_8085460C[] = { +static AnimSfxEntry D_8085460C[] = { { NA_SE_VO_LI_SWORD_N, 0x2001 }, { NA_SE_PL_WALK_GROUND, 0x1806 }, { NA_SE_PL_ROLL, 0x806 }, @@ -8727,7 +9033,7 @@ void func_80844708(Player* this, PlayState* play) { f32 rand = Rand_ZeroOne(); uint8_t randomBonk = (rand <= .05) && GameInteractor_GetRandomBonksActive(); if (this->linearVelocity >= 7.0f) { - if (randomBonk || ((this->actor.bgCheckFlags & 0x200) && (D_8085360C < 0x2000)) || + if (randomBonk || ((this->actor.bgCheckFlags & 0x200) && (sWorldYawToTouchedWall < 0x2000)) || ((this->cylinder.base.ocFlags1 & OC1_HIT) && (cylinderOc = this->cylinder.base.oc, ((cylinderOc->id == ACTOR_EN_WOOD02) && @@ -8742,9 +9048,9 @@ void func_80844708(Player* this, PlayState* play) { } } - func_80832264(play, this, D_80853914[PLAYER_ANIMGROUP_hip_down][this->modelAnimType]); + Player_AnimPlayOnce(play, this, GET_PLAYER_ANIM(PLAYER_ANIMGROUP_hip_down, this->modelAnimType)); this->linearVelocity = -this->linearVelocity; - func_808429B4(play, 33267, 3, 12); + Player_RequestQuake(play, 33267, 3, 12); Player_RequestRumble(this, 255, 20, 150, 0); Player_PlaySfx(&this->actor, NA_SE_PL_BODY_HIT); func_80832698(this, NA_SE_VO_LI_CLIMB_END); @@ -8761,7 +9067,7 @@ void func_80844708(Player* this, PlayState* play) { return; } - func_80837268(this, &sp38, &sp36, 0.018f, play); + Player_GetMovementSpeedAndYaw(this, &sp38, &sp36, 0.018f, play); sp38 *= 1.5f; if ((sp38 < 3.0f) || (this->unk_84B[this->unk_846] != 0)) { @@ -8774,7 +9080,7 @@ void func_80844708(Player* this, PlayState* play) { func_8002F8F0(&this->actor, NA_SE_PL_ROLL_DUST - SFX_FLAG); } - func_80832924(this, D_8085460C); + Player_ProcessAnimSfxList(this, D_8085460C); } } } @@ -8784,7 +9090,7 @@ void func_80844A44(Player* this, PlayState* play) { this->stateFlags2 |= PLAYER_STATE2_DISABLE_ROTATION_Z_TARGET; if (LinkAnimation_Update(play, &this->skelAnime)) { - func_80832284(play, this, &gPlayerAnim_link_normal_run_jump_water_fall_wait); + Player_AnimPlayLoop(play, this, &gPlayerAnim_link_normal_run_jump_water_fall_wait); } Math_StepToF(&this->linearVelocity, 0.0f, 0.05f); @@ -8808,7 +9114,7 @@ void func_80844AF4(Player* this, PlayState* play) { func_8084285C(this, 6.0f, 7.0f, 99.0f); if (!(this->actor.bgCheckFlags & 1)) { - func_80837268(this, &sp2C, &sp2A, 0.0f, play); + Player_GetMovementSpeedAndYaw(this, &sp2C, &sp2A, 0.0f, play); func_8083DFE0(this, &sp2C, &this->currentYaw); return; } @@ -8825,7 +9131,7 @@ void func_80844AF4(Player* this, PlayState* play) { s32 func_80844BE4(Player* this, PlayState* play) { s32 temp; - if (func_8083ADD4(play, this)) { + if (Player_StartCsAction(play, this)) { this->stateFlags2 |= PLAYER_STATE2_SPIN_ATTACKING; } else { if (!CHECK_BTN_ALL(sControlInput->cur.button, BTN_B)) { @@ -8851,24 +9157,24 @@ s32 func_80844BE4(Player* this, PlayState* play) { } void func_80844CF8(Player* this, PlayState* play) { - func_80835C58(play, this, func_80845000, 1); + Player_SetupAction(play, this, func_80845000, 1); } void func_80844D30(Player* this, PlayState* play) { - func_80835C58(play, this, func_80845308, 1); + Player_SetupAction(play, this, func_80845308, 1); } void func_80844D68(Player* this, PlayState* play) { func_80839FFC(this, play); func_80832318(this); - func_80832B0C(play, this, D_80854368[Player_HoldsTwoHandedWeapon(this)]); + Player_AnimChangeOnceMorph(play, this, D_80854368[Player_HoldsTwoHandedWeapon(this)]); this->currentYaw = this->actor.shape.rot.y; } void func_80844DC8(Player* this, PlayState* play) { - func_80835C58(play, this, func_80844E68, 1); + Player_SetupAction(play, this, func_80844E68, 1); this->unk_868 = 0.0f; - func_80832284(play, this, D_80854360[Player_HoldsTwoHandedWeapon(this)]); + Player_AnimPlayLoop(play, this, D_80854360[Player_HoldsTwoHandedWeapon(this)]); this->unk_850 = 1; } @@ -8887,7 +9193,7 @@ void func_80844E68(Player* this, PlayState* play) { func_80832DBC(this); func_808355DC(this); this->stateFlags1 &= ~PLAYER_STATE1_TARGET_NOTHING; - func_80832284(play, this, D_80854360[Player_HoldsTwoHandedWeapon(this)]); + Player_AnimPlayLoop(play, this, D_80854360[Player_HoldsTwoHandedWeapon(this)]); this->unk_850 = -1; } @@ -8904,7 +9210,7 @@ void func_80844E68(Player* this, PlayState* play) { func_80844D68(this, play); } } else if (!func_80844BE4(this, play)) { - func_80837268(this, &sp34, &sp32, 0.0f, play); + Player_GetMovementSpeedAndYaw(this, &sp34, &sp32, 0.0f, play); temp = func_80840058(this, &sp34, &sp32, play); if (temp > 0) { @@ -8951,7 +9257,7 @@ void func_80845000(Player* this, PlayState* play) { if (!func_80842964(this, play) && !func_80844BE4(this, play)) { func_80844E3C(this); - func_80837268(this, &sp54, &sp52, 0.0f, play); + Player_GetMovementSpeedAndYaw(this, &sp54, &sp52, 0.0f, play); temp4 = func_80840058(this, &sp54, &sp52, play); @@ -9019,7 +9325,7 @@ void func_80845308(Player* this, PlayState* play) { if (!func_80842964(this, play) && !func_80844BE4(this, play)) { func_80844E3C(this); - func_80837268(this, &sp54, &sp52, 0.0f, play); + Player_GetMovementSpeedAndYaw(this, &sp54, &sp52, 0.0f, play); temp4 = func_80840058(this, &sp54, &sp52, play); @@ -9065,7 +9371,7 @@ void func_80845668(Player* this, PlayState* play) { this->linearVelocity = 1.0f; if (LinkAnimation_OnFrame(&this->skelAnime, 8.0f)) { - temp1 = this->wallHeight; + temp1 = this->yDistToLedge; if (temp1 > this->ageProperties->unk_0C) { temp1 = this->ageProperties->unk_0C; @@ -9132,7 +9438,7 @@ void func_808458D0(Player* this, PlayState* play) { LinkAnimation_Update(play, &this->skelAnime); if (((this->stateFlags1 & PLAYER_STATE1_ITEM_OVER_HEAD) && (this->heldActor != NULL) && (this->getItemId == GI_NONE)) || - !func_80836670(this, play)) { + !Player_UpdateUpperBody(this, play)) { this->func_A74(play, this); } } @@ -9178,18 +9484,18 @@ s32 func_80845964(PlayState* play, Player* this, CsCmdActorAction* arg2, f32 arg return 0; } -s32 func_80845BA0(PlayState* play, Player* arg1, f32* arg2, s32 arg3) { - f32 dx = arg1->unk_450.x - arg1->actor.world.pos.x; - f32 dz = arg1->unk_450.z - arg1->actor.world.pos.z; +s32 func_80845BA0(PlayState* play, Player* this, f32* arg2, s32 arg3) { + f32 dx = this->unk_450.x - this->actor.world.pos.x; + f32 dz = this->unk_450.z - this->actor.world.pos.z; s32 sp2C = sqrtf(SQ(dx) + SQ(dz)); - s16 yaw = Math_Vec3f_Yaw(&arg1->actor.world.pos, &arg1->unk_450); + s16 yaw = Math_Vec3f_Yaw(&this->actor.world.pos, &this->unk_450); if (sp2C < arg3) { *arg2 = 0.0f; - yaw = arg1->actor.shape.rot.y; + yaw = this->actor.shape.rot.y; } - if (func_80845964(play, arg1, NULL, *arg2, yaw, 2)) { + if (func_80845964(play, this, NULL, *arg2, yaw, 2)) { return 0; } @@ -9236,9 +9542,9 @@ void func_80845CA4(Player* this, PlayState* play) { if (this->stateFlags1 & PLAYER_STATE1_LOADING) { sp34 = gSaveContext.entranceSpeed; - if (D_808535F4 != 0) { - this->unk_450.x = (Math_SinS(D_808535FC) * 400.0f) + this->actor.world.pos.x; - this->unk_450.z = (Math_CosS(D_808535FC) * 400.0f) + this->actor.world.pos.z; + if (sConveyorSpeed != 0) { + this->unk_450.x = (Math_SinS(sConveyorYaw) * 400.0f) + this->actor.world.pos.x; + this->unk_450.z = (Math_CosS(sConveyorYaw) * 400.0f) + this->actor.world.pos.z; } } else if (this->unk_850 < 0) { this->unk_850++; @@ -9263,7 +9569,7 @@ void func_80845CA4(Player* this, PlayState* play) { } if (this->stateFlags1 & PLAYER_STATE1_ITEM_OVER_HEAD) { - func_80836670(this, play); + Player_UpdateUpperBody(this, play); } } @@ -9273,7 +9579,7 @@ void func_80845EF8(Player* this, PlayState* play) { this->stateFlags2 |= PLAYER_STATE2_DISABLE_ROTATION_Z_TARGET; sp2C = LinkAnimation_Update(play, &this->skelAnime); - func_80836670(this, play); + Player_UpdateUpperBody(this, play); if (sp2C) { if (this->unk_850 == 0) { @@ -9322,7 +9628,7 @@ void func_80846050(Player* this, PlayState* play) { Math_ScaledStepToS(&this->unk_3BC.y, 0, 4000); } -static struct_80832924 D_8085461C[] = { +static AnimSfxEntry D_8085461C[] = { { NA_SE_VO_LI_SWORD_L, 0x2031 }, { NA_SE_VO_LI_SWORD_N, -0x20E6 }, }; @@ -9356,18 +9662,18 @@ void func_80846120(Player* this, PlayState* play) { heldActor->velocity.y = Math_CosS(heldActor->shape.rot.x) * 40.0f; heldActor->gravity = -2.0f; heldActor->minVelocityY = -30.0f; - func_808323B4(play, this); + Player_DetachHeldActor(play, this); return; } - func_80832924(this, D_8085461C); + Player_ProcessAnimSfxList(this, D_8085461C); } void func_80846260(Player* this, PlayState* play) { func_8083721C(this); if (LinkAnimation_Update(play, &this->skelAnime)) { - func_80832284(play, this, &gPlayerAnim_link_silver_wait); + Player_AnimPlayLoop(play, this, &gPlayerAnim_link_silver_wait); this->unk_850 = 1; return; } @@ -9392,8 +9698,8 @@ void func_80846260(Player* this, PlayState* play) { } } else if (CHECK_BTN_ANY(sControlInput->press.button, buttonsToCheck)) { - func_80835C58(play, this, func_80846358, 1); - func_80832264(play, this, &gPlayerAnim_link_silver_throw); + Player_SetupAction(play, this, func_80846358, 1); + Player_AnimPlayOnce(play, this, &gPlayerAnim_link_silver_throw); } } @@ -9417,7 +9723,7 @@ void func_80846358(Player* this, PlayState* play) { void func_80846408(Player* this, PlayState* play) { if (LinkAnimation_Update(play, &this->skelAnime)) { - func_80832284(play, this, &gPlayerAnim_link_normal_nocarry_free_wait); + Player_AnimPlayLoop(play, this, &gPlayerAnim_link_normal_nocarry_free_wait); this->unk_850 = 15; return; } @@ -9461,7 +9767,7 @@ void func_80846578(Player* this, PlayState* play) { func_8083721C(this); if (LinkAnimation_Update(play, &this->skelAnime) || - ((this->skelAnime.curFrame >= 8.0f) && func_80837268(this, &sp34, &sp32, 0.018f, play))) { + ((this->skelAnime.curFrame >= 8.0f) && Player_GetMovementSpeedAndYaw(this, &sp34, &sp32, 0.018f, play))) { func_80839F90(this, play); return; } @@ -9540,7 +9846,7 @@ void func_80846648(PlayState* play, Player* this) { } void func_80846660(PlayState* play, Player* this) { - func_80835C58(play, this, func_8084F710, 0); + Player_SetupAction(play, this, func_8084F710, 0); if ((play->sceneNum == SCENE_LAKE_HYLIA) && (gSaveContext.sceneSetupIndex >= 4)) { this->unk_84F = 1; } @@ -9554,15 +9860,15 @@ static u8 D_808546F0[] = { ITEM_SWORD_MASTER, ITEM_SWORD_KOKIRI }; void func_80846720(PlayState* play, Player* this, s32 arg2) { s32 item = D_808546F0[(void)0, gSaveContext.linkAge]; - s32 actionParam = sItemActionParams[item]; + s32 itemAction = sItemActions[item]; - func_80835EFC(this); - func_808323B4(play, this); + Player_DestroyHookshot(this); + Player_DetachHeldActor(play, this); this->heldItemId = item; - this->nextModelGroup = Player_ActionToModelGroup(this, actionParam); + this->nextModelGroup = Player_ActionToModelGroup(this, itemAction); - func_8083399C(play, this, actionParam); + Player_InitItemAction(play, this, itemAction); func_80834644(play, this); if (arg2 != 0) { @@ -9573,13 +9879,13 @@ void func_80846720(PlayState* play, Player* this, s32 arg2) { static Vec3f D_808546F4 = { -1.0f, 69.0f, 20.0f }; void func_808467D4(PlayState* play, Player* this) { - func_80835C58(play, this, func_8084E9AC, 0); + Player_SetupAction(play, this, func_8084E9AC, 0); this->stateFlags1 |= PLAYER_STATE1_IN_CUTSCENE; Math_Vec3f_Copy(&this->actor.world.pos, &D_808546F4); this->currentYaw = this->actor.shape.rot.y = -0x8000; LinkAnimation_Change(play, &this->skelAnime, this->ageProperties->unk_A0, 2.0f / 3.0f, 0.0f, 0.0f, ANIMMODE_ONCE, 0.0f); - func_80832F54(play, this, 0x28F); + Player_AnimReplaceApplyFlags(play, this, 0x28F); if (LINK_IS_ADULT) { func_80846720(play, this, 0); } @@ -9587,13 +9893,13 @@ void func_808467D4(PlayState* play, Player* this) { } void func_808468A8(PlayState* play, Player* this) { - func_80835C58(play, this, func_8084F9A0, 0); - func_80832F54(play, this, 0x9B); + Player_SetupAction(play, this, func_8084F9A0, 0); + Player_AnimReplaceApplyFlags(play, this, 0x9B); } void func_808468E8(PlayState* play, Player* this) { func_808389E8(this, &gPlayerAnim_link_normal_jump, 12.0f, play); - func_80835C58(play, this, func_8084F9C0, 0); + Player_SetupAction(play, this, func_8084F9C0, 0); this->stateFlags1 |= PLAYER_STATE1_IN_CUTSCENE; this->fallStartHeight = this->actor.world.pos.y; OnePointCutscene_Init(play, 5110, 40, &this->actor, MAIN_CAM); @@ -9604,7 +9910,7 @@ void func_80846978(PlayState* play, Player* this) { } void func_808469BC(PlayState* play, Player* this) { - func_80835C58(play, this, func_8084F698, 0); + Player_SetupAction(play, this, func_8084F698, 0); this->actor.draw = NULL; this->stateFlags1 |= PLAYER_STATE1_IN_CUTSCENE; } @@ -9618,7 +9924,7 @@ Actor* func_80846A00(PlayState* play, Player* this, s32 arg2) { void func_80846A68(PlayState* play, Player* this) { this->actor.draw = NULL; - func_80835C58(play, this, func_8085076C, 0); + Player_SetupAction(play, this, func_8085076C, 0); this->stateFlags1 |= PLAYER_STATE1_IN_CUTSCENE; } @@ -9641,12 +9947,12 @@ void Player_InitCommon(Player* this, PlayState* play, FlexSkeletonHeader* skelHe this->currentYaw = this->actor.world.rot.y; func_80834644(play, this); - SkelAnime_InitLink(play, &this->skelAnime, skelHeader, D_80853914[PLAYER_ANIMGROUP_wait][this->modelAnimType], 9, + SkelAnime_InitLink(play, &this->skelAnime, skelHeader, GET_PLAYER_ANIM(PLAYER_ANIMGROUP_wait, this->modelAnimType), 9, this->jointTable, this->morphTable, PLAYER_LIMB_MAX); this->skelAnime.baseTransl = D_80854730; - SkelAnime_InitLink(play, &this->skelAnime2, skelHeader, func_80833338(this), 9, this->jointTable2, - this->morphTable2, PLAYER_LIMB_MAX); - this->skelAnime2.baseTransl = D_80854730; + SkelAnime_InitLink(play, &this->upperSkelAnime, skelHeader, func_80833338(this), 9, this->upperJointTable, + this->upperMorphTable, PLAYER_LIMB_MAX); + this->upperSkelAnime.baseTransl = D_80854730; Effect_Add(play, &this->meleeWeaponEffectIndex, EFFECT_BLURE2, 0, 0, &blureSword); ActorShape_Init(&this->actor.shape, 0.0f, ActorShadow_DrawFeet, this->ageProperties->unk_04); @@ -9692,7 +9998,7 @@ void Player_Init(Actor* thisx, PlayState* play2) { play->isPlayerDroppingFish = Player_IsDroppingFish; play->startPlayerFishing = Player_StartFishing; play->grabPlayer = func_80852F38; - play->startPlayerCutscene = func_80852FFC; + play->startPlayerCutscene = Player_TryCsAction; play->func_11D54 = func_80853080; play->damagePlayer = Player_InflictDamage; play->talkWithPlayer = func_80853148; @@ -9702,7 +10008,7 @@ void Player_Init(Actor* thisx, PlayState* play2) { this->itemAction = this->heldItemAction = -1; this->heldItemId = ITEM_NONE; - func_80835F44(play, this, ITEM_NONE); + Player_UseItem(play, this, ITEM_NONE); Player_SetEquipmentData(play, this); this->prevBoots = this->currentBoots; if (CVarGetInteger("gMMBunnyHood", BUNNY_HOOD_VANILLA) != BUNNY_HOOD_VANILLA) { @@ -9877,7 +10183,7 @@ void func_808473D4(PlayState* play, Player* this) { if (this->unk_860 == 2) { doAction = DO_ACTION_REEL; } - } else if ((func_8084E3C4 != this->func_674) && !(this->stateFlags2 & PLAYER_STATE2_CRAWLING)) { + } else if ((func_8084E3C4 != this->actionFunc) && !(this->stateFlags2 & PLAYER_STATE2_CRAWLING)) { if ((this->doorType != PLAYER_DOORTYPE_NONE) && (!(this->stateFlags1 & PLAYER_STATE1_ITEM_OVER_HEAD) || ((heldActor != NULL) && (heldActor->id == ACTOR_EN_RU1)))) { @@ -9899,7 +10205,7 @@ void func_808473D4(PlayState* play, Player* this) { (!(this->stateFlags1 & PLAYER_STATE1_ON_HORSE) && (this->rideActor != NULL))) { doAction = DO_ACTION_CLIMB; } else if ((this->stateFlags1 & PLAYER_STATE1_ON_HORSE) && !EN_HORSE_CHECK_4((EnHorse*)this->rideActor) && - (func_8084D3E4 != this->func_674)) { + (func_8084D3E4 != this->actionFunc)) { if ((this->stateFlags2 & PLAYER_STATE2_SPEAK_OR_CHECK) && (this->targetActor != NULL)) { if (this->targetActor->category == ACTORCAT_NPC) { doAction = DO_ACTION_SPEAK; @@ -9942,7 +10248,7 @@ void func_808473D4(PlayState* play, Player* this) { !Player_IsChildWithHylianShield(this))) { if ((!(this->stateFlags1 & PLAYER_STATE1_CLIMBING_LEDGE) && (sp20 <= 0) && (func_8008E9C4(this) || - ((D_808535E4 != 7) && (func_80833B2C(this) || + ((sFloorType != 7) && (func_80833B2C(this) || ((play->roomCtx.curRoom.behaviorType1 != ROOM_BEHAVIOR_TYPE1_2) && !(this->stateFlags1 & PLAYER_STATE1_SHIELDING) && (sp20 == 0))))))) { doAction = DO_ACTION_ATTACK; @@ -9984,7 +10290,17 @@ void func_808473D4(PlayState* play, Player* this) { } } -s32 func_80847A78(Player* this) { +/** + * Updates state related to the Hover Boots. + * Handles a special case where the Hover Boots are able to activate when standing on certain floor types even if the + * player is standing on the ground. + * + * If the player is not on the ground, regardless of the usage of the Hover Boots, various floor related variables are + * reset. + * + * @return true if not on the ground, false otherwise. Note this is independent of the Hover Boots state. + */ +s32 Player_UpdateHoverBoots(Player* this) { s32 cond; if ((this->currentBoots == PLAYER_BOOTS_HOVER || @@ -9997,7 +10313,7 @@ s32 func_80847A78(Player* this) { cond = (this->currentBoots == PLAYER_BOOTS_HOVER || (CVarGetInteger("gIvanCoopModeEnabled", 0) && this->ivanFloating)) && - ((this->actor.yDistToWater >= 0.0f) || (func_80838144(D_808535E4) >= 0) || func_8083816C(D_808535E4)); + ((this->actor.yDistToWater >= 0.0f) || (func_80838144(sFloorType) >= 0) || func_8083816C(sFloorType)); if (cond && (this->actor.bgCheckFlags & 1) && (this->hoverBootsTimer != 0)) { this->actor.bgCheckFlags &= ~1; @@ -10010,149 +10326,162 @@ s32 func_80847A78(Player* this) { return 0; } - D_808535E4 = 0; - this->unk_898 = this->unk_89A = D_80853610 = 0; + sFloorType = 0; + this->floorPitch = this->floorPitchAlt = sFloorShapePitch = 0; return 1; } -static Vec3f D_80854798 = { 0.0f, 18.0f, 0.0f }; - -void func_80847BA0(PlayState* play, Player* this) { - u8 spC7 = 0; - CollisionPoly* spC0; - Vec3f spB4; +/** + * Peforms various tasks related to scene collision. + * + * This includes: + * - Update BgCheckInfo, parameters adjusted due to various state flags + * - Update floor type, floor property and floor sfx offset + * - Update conveyor, reverb and light settings according to the current floor poly + * - Handle exits and voids + * - Update information relating to the "interact wall" + * - Update information for ledge climbing + * - Update hover boots + * - Calculate floor poly angles + * + */ +void Player_ProcessSceneCollision(PlayState* play, Player* this) { + static Vec3f sInteractWallCheckOffset = { 0.0f, 18.0f, 0.0f }; + u8 nextLedgeClimbType = 0; + CollisionPoly* floorPoly; + Vec3f unusedWorldPos; f32 spB0; f32 spAC; - f32 spA8; - u32 spA4; + f32 ceilingCheckHeight; + u32 flags; - D_80853604 = this->unk_A7A; + sPrevFloorProperty = this->unk_A7A; if (this->stateFlags2 & PLAYER_STATE2_CRAWLING) { spB0 = 10.0f; spAC = 15.0f; - spA8 = 30.0f; + ceilingCheckHeight = 30.0f; } else { spB0 = this->ageProperties->unk_38; spAC = 26.0f; - spA8 = this->ageProperties->unk_00; + ceilingCheckHeight = this->ageProperties->unk_00; } if (this->stateFlags1 & (PLAYER_STATE1_IN_CUTSCENE | PLAYER_STATE1_FLOOR_DISABLED)) { if (this->stateFlags1 & PLAYER_STATE1_FLOOR_DISABLED) { this->actor.bgCheckFlags &= ~1; - spA4 = 0x38; + flags = 0x38; } else if ((this->stateFlags1 & PLAYER_STATE1_LOADING) && ((this->unk_A84 - (s32)this->actor.world.pos.y) >= 100)) { - spA4 = 0x39; + flags = 0x39; } else if (!(this->stateFlags1 & PLAYER_STATE1_LOADING) && - ((func_80845EF8 == this->func_674) || (func_80845CA4 == this->func_674))) { + ((func_80845EF8 == this->actionFunc) || (func_80845CA4 == this->actionFunc))) { this->actor.bgCheckFlags &= ~0x208; - spA4 = 0x3C; + flags = 0x3C; } else { - spA4 = 0x3F; + flags = 0x3F; } } else { - spA4 = 0x3F; + flags = 0x3F; } if (this->stateFlags3 & PLAYER_STATE3_IGNORE_CEILING_FLOOR_WATER) { - spA4 &= ~6; + flags &= ~6; } - if (spA4 & 4) { + if (flags & 4) { this->stateFlags3 |= PLAYER_STATE3_CHECK_FLOOR_WATER_COLLISION; } - Math_Vec3f_Copy(&spB4, &this->actor.world.pos); - Actor_UpdateBgCheckInfo(play, &this->actor, spAC, spB0, spA8, spA4); + Math_Vec3f_Copy(&unusedWorldPos, &this->actor.world.pos); + Actor_UpdateBgCheckInfo(play, &this->actor, spAC, spB0, ceilingCheckHeight, flags); if (this->actor.bgCheckFlags & 0x10) { this->actor.velocity.y = 0.0f; } - D_80853600 = this->actor.world.pos.y - this->actor.floorHeight; - D_808535F4 = 0; + sYDistToFloor = this->actor.world.pos.y - this->actor.floorHeight; + sConveyorSpeed = 0; - spC0 = this->actor.floorPoly; + floorPoly = this->actor.floorPoly; - if (spC0 != NULL) { - this->unk_A7A = func_80041EA4(&play->colCtx, spC0, this->actor.floorBgId); - this->unk_A82 = this->unk_89E; + if (floorPoly != NULL) { + this->unk_A7A = func_80041EA4(&play->colCtx, floorPoly, this->actor.floorBgId); + this->unk_A82 = this->floorSfxOffset; if (this->actor.bgCheckFlags & 0x20) { if (this->actor.yDistToWater < 20.0f) { - this->unk_89E = 4; + this->floorSfxOffset = 4; } else { - this->unk_89E = 5; + this->floorSfxOffset = 5; } } else { if (this->stateFlags2 & PLAYER_STATE2_SPAWN_DUST) { - this->unk_89E = 1; + this->floorSfxOffset = 1; } else { - this->unk_89E = SurfaceType_GetSfx(&play->colCtx, spC0, this->actor.floorBgId); + this->floorSfxOffset = SurfaceType_GetSfx(&play->colCtx, floorPoly, this->actor.floorBgId); } } if (this->actor.category == ACTORCAT_PLAYER) { - Audio_SetCodeReverb(SurfaceType_GetEcho(&play->colCtx, spC0, this->actor.floorBgId)); + Audio_SetCodeReverb(SurfaceType_GetEcho(&play->colCtx, floorPoly, this->actor.floorBgId)); if (this->actor.floorBgId == BGCHECK_SCENE) { func_80074CE8(play, - SurfaceType_GetLightSettingIndex(&play->colCtx, spC0, this->actor.floorBgId)); + SurfaceType_GetLightSettingIndex(&play->colCtx, floorPoly, this->actor.floorBgId)); } else { func_80043508(&play->colCtx, this->actor.floorBgId); } } - D_808535F4 = SurfaceType_GetConveyorSpeed(&play->colCtx, spC0, this->actor.floorBgId); - if (D_808535F4 != 0) { - D_808535F8 = SurfaceType_IsConveyor(&play->colCtx, spC0, this->actor.floorBgId); - if (((D_808535F8 == 0) && (this->actor.yDistToWater > 20.0f) && + sConveyorSpeed = SurfaceType_GetConveyorSpeed(&play->colCtx, floorPoly, this->actor.floorBgId); + if (sConveyorSpeed != 0) { + sIsFloorConveyor = SurfaceType_IsConveyor(&play->colCtx, floorPoly, this->actor.floorBgId); + if (((sIsFloorConveyor == 0) && (this->actor.yDistToWater > 20.0f) && (this->currentBoots != PLAYER_BOOTS_IRON)) || - ((D_808535F8 != 0) && (this->actor.bgCheckFlags & 1))) { - D_808535FC = SurfaceType_GetConveyorDirection(&play->colCtx, spC0, this->actor.floorBgId) << 10; + ((sIsFloorConveyor != 0) && (this->actor.bgCheckFlags & 1))) { + sConveyorYaw = SurfaceType_GetConveyorDirection(&play->colCtx, floorPoly, this->actor.floorBgId) << 10; } else { - D_808535F4 = 0; + sConveyorSpeed = 0; } } } - func_80839034(play, this, spC0, this->actor.floorBgId); + Player_HandleExitsAndVoids(play, this, floorPoly, this->actor.floorBgId); this->actor.bgCheckFlags &= ~0x200; if (this->actor.bgCheckFlags & 8) { - CollisionPoly* spA0; - s32 sp9C; - s16 sp9A; + CollisionPoly* wallPoly; + s32 wallBgId; + s16 yawDiff; s32 pad; - D_80854798.y = 18.0f; - D_80854798.z = this->ageProperties->unk_38 + 10.0f; + sInteractWallCheckOffset.y = 18.0f; + sInteractWallCheckOffset.z = this->ageProperties->unk_38 + 10.0f; if (!(this->stateFlags2 & PLAYER_STATE2_CRAWLING) && - func_80839768(play, this, &D_80854798, &spA0, &sp9C, &D_80858AA8)) { + Player_PosVsWallLineTest(play, this, &sInteractWallCheckOffset, &wallPoly, &wallBgId, &sInteractWallCheckResult)) { this->actor.bgCheckFlags |= 0x200; - if (this->actor.wallPoly != spA0) { - this->actor.wallPoly = spA0; - this->actor.wallBgId = sp9C; - this->actor.wallYaw = Math_Atan2S(spA0->normal.z, spA0->normal.x); + if (this->actor.wallPoly != wallPoly) { + this->actor.wallPoly = wallPoly; + this->actor.wallBgId = wallBgId; + this->actor.wallYaw = Math_Atan2S(wallPoly->normal.z, wallPoly->normal.x); } } - sp9A = this->actor.shape.rot.y - (s16)(this->actor.wallYaw + 0x8000); + yawDiff = this->actor.shape.rot.y - (s16)(this->actor.wallYaw + 0x8000); - D_808535F0 = func_80041DB8(&play->colCtx, this->actor.wallPoly, this->actor.wallBgId); + sTouchedWallFlags = func_80041DB8(&play->colCtx, this->actor.wallPoly, this->actor.wallBgId); if (CVarGetInteger("gFixVineFall", 0)) { /* This fixes the "started climbing a wall and then immediately fell off" bug. * The main idea is if a climbing wall is detected, double-check that it will * still be valid once climbing begins by doing a second raycast with a small * margin to make sure it still hits a climbable poly. Then update the flags - * in D_808535F0 again and proceed as normal. + * in sTouchedWallFlags again and proceed as normal. */ - if (D_808535F0 & 8) { + if (sTouchedWallFlags & 8) { Vec3f checkPosA; Vec3f checkPosB; f32 yawCos; @@ -10168,12 +10497,12 @@ void func_80847BA0(PlayState* play, Player* this) { * any possible wobble. The end result is the player has to be further than * some epsilon distance from the edge of the climbing poly to actually * start the climb. I divide it by 2 to make that epsilon slightly smaller, - * mainly for visuals. Using the full sp9A leaves a noticeable gap on + * mainly for visuals. Using the full yawDiff leaves a noticeable gap on * the edges that can't be climbed. But with the half distance it looks like * the player is climbing right on the edge, and still works. */ - yawCos = Math_CosS(this->actor.wallYaw - (sp9A / 2) + 0x8000); - yawSin = Math_SinS(this->actor.wallYaw - (sp9A / 2) + 0x8000); + yawCos = Math_CosS(this->actor.wallYaw - (yawDiff / 2) + 0x8000); + yawSin = Math_SinS(this->actor.wallYaw - (yawDiff / 2) + 0x8000); checkPosA.x = this->actor.world.pos.x + (-20.0f * yawSin); checkPosA.z = this->actor.world.pos.z + (-20.0f * yawCos); checkPosB.x = this->actor.world.pos.x + (50.0f * yawSin); @@ -10181,26 +10510,26 @@ void func_80847BA0(PlayState* play, Player* this) { checkPosB.y = checkPosA.y = this->actor.world.pos.y + 26.0f; hitWall = BgCheck_EntityLineTest1(&play->colCtx, &checkPosA, &checkPosB, - &D_80858AA8, &spA0, true, false, false, true, &sp9C); + &sInteractWallCheckResult, &wallPoly, true, false, false, true, &wallBgId); if (hitWall) { - this->actor.wallPoly = spA0; - this->actor.wallBgId = sp9C; - this->actor.wallYaw = Math_Atan2S(spA0->normal.z, spA0->normal.x); - sp9A = this->actor.shape.rot.y - (s16)(this->actor.wallYaw + 0x8000); + this->actor.wallPoly = wallPoly; + this->actor.wallBgId = wallBgId; + this->actor.wallYaw = Math_Atan2S(wallPoly->normal.z, wallPoly->normal.x); + yawDiff = this->actor.shape.rot.y - (s16)(this->actor.wallYaw + 0x8000); - D_808535F0 = func_80041DB8(&play->colCtx, this->actor.wallPoly, this->actor.wallBgId); + sTouchedWallFlags = func_80041DB8(&play->colCtx, this->actor.wallPoly, this->actor.wallBgId); } } } - D_80853608 = ABS(sp9A); + sShapeYawToTouchedWall = ABS(yawDiff); - sp9A = this->currentYaw - (s16)(this->actor.wallYaw + 0x8000); + yawDiff = this->currentYaw - (s16)(this->actor.wallYaw + 0x8000); - D_8085360C = ABS(sp9A); + sWorldYawToTouchedWall = ABS(yawDiff); - spB0 = D_8085360C * 0.00008f; + spB0 = sWorldYawToTouchedWall * 0.00008f; if (!(this->actor.bgCheckFlags & 1) || spB0 >= 1.0f) { this->unk_880 = R_RUN_SPEED_LIMIT / 100.0f; } else { @@ -10211,14 +10540,14 @@ void func_80847BA0(PlayState* play, Player* this) { } } - if ((this->actor.bgCheckFlags & 0x200) && (D_80853608 < 0x3000)) { + if ((this->actor.bgCheckFlags & 0x200) && (sShapeYawToTouchedWall < 0x3000)) { CollisionPoly* wallPoly = this->actor.wallPoly; if ((ABS(wallPoly->normal.y) < 600) || (CVarGetInteger("gClimbEverything", 0) != 0)) { f32 sp8C = COLPOLY_GET_NORMAL(wallPoly->normal.x); f32 sp88 = COLPOLY_GET_NORMAL(wallPoly->normal.y); f32 sp84 = COLPOLY_GET_NORMAL(wallPoly->normal.z); - f32 wallHeight; + f32 yDistToLedge; CollisionPoly* sp7C; CollisionPoly* sp78; s32 sp74; @@ -10227,42 +10556,42 @@ void func_80847BA0(PlayState* play, Player* this) { f32 sp60; s32 temp3; - this->wallDistance = Math3D_UDistPlaneToPos(sp8C, sp88, sp84, wallPoly->dist, &this->actor.world.pos); + this->distToInteractWall = Math3D_UDistPlaneToPos(sp8C, sp88, sp84, wallPoly->dist, &this->actor.world.pos); - spB0 = this->wallDistance + 10.0f; + spB0 = this->distToInteractWall + 10.0f; sp68.x = this->actor.world.pos.x - (spB0 * sp8C); sp68.z = this->actor.world.pos.z - (spB0 * sp84); sp68.y = this->actor.world.pos.y + this->ageProperties->unk_0C; sp64 = BgCheck_EntityRaycastFloor1(&play->colCtx, &sp7C, &sp68); - wallHeight = sp64 - this->actor.world.pos.y; - this->wallHeight = wallHeight; + yDistToLedge = sp64 - this->actor.world.pos.y; + this->yDistToLedge = yDistToLedge; - if ((this->wallHeight < 18.0f) || + if ((this->yDistToLedge < 18.0f) || BgCheck_EntityCheckCeiling(&play->colCtx, &sp60, &this->actor.world.pos, (sp64 - this->actor.world.pos.y) + 20.0f, &sp78, &sp74, &this->actor)) { - this->wallHeight = 399.96002f; + this->yDistToLedge = 399.96002f; } else { - D_80854798.y = (sp64 + 5.0f) - this->actor.world.pos.y; + sInteractWallCheckOffset.y = (sp64 + 5.0f) - this->actor.world.pos.y; - if (func_80839768(play, this, &D_80854798, &sp78, &sp74, &D_80858AA8) && + if (Player_PosVsWallLineTest(play, this, &sInteractWallCheckOffset, &sp78, &sp74, &sInteractWallCheckResult) && (temp3 = this->actor.wallYaw - Math_Atan2S(sp78->normal.z, sp78->normal.x), ABS(temp3) < 0x4000) && !func_80041E18(&play->colCtx, sp78, sp74)) { - this->wallHeight = 399.96002f; + this->yDistToLedge = 399.96002f; } else if (func_80041DE4(&play->colCtx, wallPoly, this->actor.wallBgId) == 0) { - if (this->ageProperties->unk_1C <= this->wallHeight) { + if (this->ageProperties->unk_1C <= this->yDistToLedge) { if (ABS(sp7C->normal.y) > 28000) { - if (this->ageProperties->unk_14 <= this->wallHeight) { - spC7 = 4; - } else if (this->ageProperties->unk_18 <= this->wallHeight) { - spC7 = 3; + if (this->ageProperties->unk_14 <= this->yDistToLedge) { + nextLedgeClimbType = 4; + } else if (this->ageProperties->unk_18 <= this->yDistToLedge) { + nextLedgeClimbType = 3; } else { - spC7 = 2; + nextLedgeClimbType = 2; } } } else { - spC7 = 1; + nextLedgeClimbType = 1; } } } @@ -10271,22 +10600,22 @@ void func_80847BA0(PlayState* play, Player* this) { } else { this->unk_880 = R_RUN_SPEED_LIMIT / 100.0f; this->unk_88D = 0; - this->wallHeight = 0.0f; + this->yDistToLedge = 0.0f; } - if (spC7 == this->unk_88C) { + if (nextLedgeClimbType == this->unk_88C) { if ((this->linearVelocity != 0.0f) && (this->unk_88D < 100)) { this->unk_88D++; } } else { - this->unk_88C = spC7; + this->unk_88C = nextLedgeClimbType; this->unk_88D = 0; } if (this->actor.bgCheckFlags & 1) { - D_808535E4 = func_80041D4C(&play->colCtx, spC0, this->actor.floorBgId); + sFloorType = func_80041D4C(&play->colCtx, floorPoly, this->actor.floorBgId); - if (!func_80847A78(this)) { + if (!Player_UpdateHoverBoots(this)) { f32 sp58; f32 sp54; f32 sp50; @@ -10299,31 +10628,31 @@ void func_80847BA0(PlayState* play, Player* this) { func_800434C8(&play->colCtx, this->actor.floorBgId); } - sp58 = COLPOLY_GET_NORMAL(spC0->normal.x); - sp54 = 1.0f / COLPOLY_GET_NORMAL(spC0->normal.y); - sp50 = COLPOLY_GET_NORMAL(spC0->normal.z); + sp58 = COLPOLY_GET_NORMAL(floorPoly->normal.x); + sp54 = 1.0f / COLPOLY_GET_NORMAL(floorPoly->normal.y); + sp50 = COLPOLY_GET_NORMAL(floorPoly->normal.z); sp4C = Math_SinS(this->currentYaw); sp44 = Math_CosS(this->currentYaw); - this->unk_898 = Math_Atan2S(1.0f, (-(sp58 * sp4C) - (sp50 * sp44)) * sp54); - this->unk_89A = Math_Atan2S(1.0f, (-(sp58 * sp44) - (sp50 * sp4C)) * sp54); + this->floorPitch = Math_Atan2S(1.0f, (-(sp58 * sp4C) - (sp50 * sp44)) * sp54); + this->floorPitchAlt = Math_Atan2S(1.0f, (-(sp58 * sp44) - (sp50 * sp4C)) * sp54); sp4C = Math_SinS(this->actor.shape.rot.y); sp44 = Math_CosS(this->actor.shape.rot.y); - D_80853610 = Math_Atan2S(1.0f, (-(sp58 * sp4C) - (sp50 * sp44)) * sp54); + sFloorShapePitch = Math_Atan2S(1.0f, (-(sp58 * sp4C) - (sp50 * sp44)) * sp54); - func_8083E318(play, this, spC0); + Player_HandleSlopes(play, this, floorPoly); } } else { - func_80847A78(this); + Player_UpdateHoverBoots(this); } - if (this->unk_A7B == D_808535E4) { + if (this->unk_A7B == sFloorType) { this->unk_A79++; } else { - this->unk_A7B = D_808535E4; + this->unk_A7B = sFloorType; this->unk_A79 = 0; } } @@ -10337,13 +10666,13 @@ void Player_UpdateCamAndSeqModes(PlayState* play, Player* this) { if (this->actor.category == ACTORCAT_PLAYER) { seqMode = SEQ_MODE_DEFAULT; - if (this->csMode != 0) { + if (this->csAction != 0) { Camera_ChangeMode(Play_GetCamera(play, 0), CAM_MODE_NORMAL); } else if (!(this->stateFlags1 & PLAYER_STATE1_FIRST_PERSON)) { if ((this->actor.parent != NULL) && (this->stateFlags3 & PLAYER_STATE3_HOOKSHOT_TRAVELLING)) { camMode = CAM_MODE_HOOKSHOT; Camera_SetParam(Play_GetCamera(play, 0), 8, this->actor.parent); - } else if (func_8084377C == this->func_674) { + } else if (func_8084377C == this->actionFunc) { camMode = CAM_MODE_STILL; } else if (this->stateFlags2 & PLAYER_STATE2_GRABBING_DYNAPOLY) { camMode = CAM_MODE_PUSHPULL; @@ -10380,14 +10709,15 @@ void Player_UpdateCamAndSeqModes(PlayState* play, Player* this) { camMode = CAM_MODE_TARGET; } } else if (this->stateFlags1 & (PLAYER_STATE1_JUMPING | PLAYER_STATE1_CLIMBING_LADDER)) { - if ((func_80845668 == this->func_674) || (this->stateFlags1 & PLAYER_STATE1_CLIMBING_LADDER)) { + if ((func_80845668 == this->actionFunc) || (this->stateFlags1 & PLAYER_STATE1_CLIMBING_LADDER)) { camMode = CAM_MODE_CLIMB; } else { camMode = CAM_MODE_JUMP; } } else if (this->stateFlags1 & PLAYER_STATE1_FREEFALL) { camMode = CAM_MODE_FREEFALL; - } else if ((this->meleeWeaponState != 0) && (this->meleeWeaponAnimation >= 0) && (this->meleeWeaponAnimation < 0x18)) { + } else if ((this->meleeWeaponState != 0) && (this->meleeWeaponAnimation >= PLAYER_MWA_FORWARD_SLASH_1H) && + (this->meleeWeaponAnimation < PLAYER_MWA_SPIN_ATTACK_1H)) { camMode = CAM_MODE_STILL; } else { camMode = CAM_MODE_NORMAL; @@ -10433,7 +10763,7 @@ void func_80848A04(PlayState* play, Player* this) { } if (this->unk_85C == 0.0f && CVarGetInteger("gDekuStickCheat", DEKU_STICK_NORMAL) == DEKU_STICK_NORMAL) { - func_80835F44(play, this, 0xFF); + Player_UseItem(play, this, 0xFF); return; } @@ -10549,7 +10879,7 @@ void func_80848C74(PlayState* play, Player* this) { void func_80848EF8(Player* this, PlayState* play) { if (CHECK_QUEST_ITEM(QUEST_STONE_OF_AGONY)) { - f32 temp = 200000.0f - (this->unk_6A4 * 5.0f); + f32 temp = 200000.0f - (this->closestSecretDistSq * 5.0f); if (temp < 0.0f) { temp = 0.0f; @@ -10671,19 +11001,19 @@ void Player_UseTunicBoots(Player* this, PlayState* play) { // Boots and tunics equip despite state s32 i; s32 item; - s32 actionParam; + s32 itemAction; if (!(this->stateFlags1 & PLAYER_STATE1_INPUT_DISABLED || this->stateFlags1 & PLAYER_STATE1_IN_ITEM_CS || this->stateFlags1 & PLAYER_STATE1_IN_CUTSCENE || this->stateFlags1 & PLAYER_STATE1_TEXT_ON_SCREEN || this->stateFlags2 & PLAYER_STATE2_OCARINA_PLAYING)) { - for (i = 0; i < ARRAY_COUNT(D_80854388); i++) { - if (CHECK_BTN_ALL(sControlInput->press.button, D_80854388[i])) { + for (i = 0; i < ARRAY_COUNT(sItemButtons); i++) { + if (CHECK_BTN_ALL(sControlInput->press.button, sItemButtons[i])) { break; } } - item = func_80833CDC(play, i); + item = Player_GetItemOnButton(play, i); if (item >= ITEM_TUNIC_KOKIRI && item <= ITEM_BOOTS_HOVER) { this->heldItemButton = i; - actionParam = Player_ItemToItemAction(item); - if (actionParam >= PLAYER_IA_BOOTS_KOKIRI) { - u16 bootsValue = actionParam - PLAYER_IA_BOOTS_KOKIRI + 1; + itemAction = Player_ItemToItemAction(item); + if (itemAction >= PLAYER_IA_BOOTS_KOKIRI) { + u16 bootsValue = itemAction - PLAYER_IA_BOOTS_KOKIRI + 1; if (CUR_EQUIP_VALUE(EQUIP_TYPE_BOOTS) == bootsValue) { Inventory_ChangeEquipment(EQUIP_TYPE_BOOTS, EQUIP_VALUE_BOOTS_KOKIRI); } else { @@ -10692,8 +11022,8 @@ void Player_UseTunicBoots(Player* this, PlayState* play) { Player_SetEquipmentData(play, this); func_808328EC(this, CUR_EQUIP_VALUE(EQUIP_TYPE_BOOTS) == EQUIP_VALUE_BOOTS_IRON ? NA_SE_PL_WALK_HEAVYBOOTS : NA_SE_PL_CHANGE_ARMS); - } else if (actionParam >= PLAYER_IA_TUNIC_KOKIRI) { - u16 tunicValue = actionParam - PLAYER_IA_TUNIC_KOKIRI + 1; + } else if (itemAction >= PLAYER_IA_TUNIC_KOKIRI) { + u16 tunicValue = itemAction - PLAYER_IA_TUNIC_KOKIRI + 1; if (CUR_EQUIP_VALUE(EQUIP_TYPE_TUNIC) == tunicValue) { Inventory_ChangeEquipment(EQUIP_TYPE_TUNIC, EQUIP_VALUE_TUNIC_KOKIRI); } else { @@ -10772,7 +11102,7 @@ void Player_UpdateCommon(Player* this, PlayState* play, Input* input) { Actor_MoveForward(&this->actor); } - func_80847BA0(play, this); + Player_ProcessSceneCollision(play, this); } else { f32 temp_f0; f32 phi_f12; @@ -10801,8 +11131,8 @@ void Player_UpdateCommon(Player* this, PlayState* play, Input* input) { this->actor.parent = this->rideActor; func_8083A360(play, this); this->stateFlags1 |= PLAYER_STATE1_ON_HORSE; - func_80832264(play, this, &gPlayerAnim_link_uma_wait_1); - func_80832F54(play, this, 0x9B); + Player_AnimPlayOnce(play, this, &gPlayerAnim_link_uma_wait_1); + Player_AnimReplaceApplyFlags(play, this, 0x9B); this->unk_850 = 99; } @@ -10828,7 +11158,7 @@ void Player_UpdateCommon(Player* this, PlayState* play, Input* input) { } if (!(this->skelAnime.moveFlags & 0x80)) { - if (((this->actor.bgCheckFlags & 1) && (D_808535E4 == 5) && (this->currentBoots != PLAYER_BOOTS_IRON)) || + if (((this->actor.bgCheckFlags & 1) && (sFloorType == 5) && (this->currentBoots != PLAYER_BOOTS_IRON)) || ((this->currentBoots == PLAYER_BOOTS_HOVER || GameInteractor_GetSlipperyFloorActive()) && !(this->stateFlags1 & (PLAYER_STATE1_IN_WATER | PLAYER_STATE1_IN_CUTSCENE)))) { f32 sp70 = this->linearVelocity; @@ -10864,17 +11194,17 @@ void Player_UpdateCommon(Player* this, PlayState* play, Input* input) { func_8002D868(&this->actor); - if ((this->windSpeed != 0.0f) && !Player_InCsMode(play) && + if ((this->pushedSpeed != 0.0f) && !Player_InCsMode(play) && !(this->stateFlags1 & (PLAYER_STATE1_HANGING_OFF_LEDGE | PLAYER_STATE1_CLIMBING_LEDGE | PLAYER_STATE1_CLIMBING_LADDER)) && - (func_80845668 != this->func_674) && (func_808507F4 != this->func_674)) { - this->actor.velocity.x += this->windSpeed * Math_SinS(this->windDirection); - this->actor.velocity.z += this->windSpeed * Math_CosS(this->windDirection); + (func_80845668 != this->actionFunc) && (func_808507F4 != this->actionFunc)) { + this->actor.velocity.x += this->pushedSpeed * Math_SinS(this->pushedYaw); + this->actor.velocity.z += this->pushedSpeed * Math_CosS(this->pushedYaw); } func_8002D7EC(&this->actor); - func_80847BA0(play, this); + Player_ProcessSceneCollision(play, this); } else { - D_808535E4 = 0; + sFloorType = 0; this->unk_A7A = 0; if (!(this->stateFlags1 & PLAYER_STATE1_LOADING) && (this->stateFlags1 & PLAYER_STATE1_ON_HORSE)) { @@ -10890,7 +11220,7 @@ void Player_UpdateCommon(Player* this, PlayState* play, Input* input) { sp58 = rideActor->actor.floorBgId; } - if ((sp5C != NULL) && func_80839034(play, this, sp5C, sp58)) { + if ((sp5C != NULL) && Player_HandleExitsAndVoids(play, this, sp5C, sp58)) { if (DREG(25) != 0) { DREG(25) = 0; } else { @@ -10899,31 +11229,31 @@ void Player_UpdateCommon(Player* this, PlayState* play, Input* input) { } } - D_808535F4 = 0; - this->windSpeed = 0.0f; + sConveyorSpeed = 0; + this->pushedSpeed = 0.0f; } - if ((D_808535F4 != 0) && (this->currentBoots != PLAYER_BOOTS_IRON)) { + if ((sConveyorSpeed != 0) && (this->currentBoots != PLAYER_BOOTS_IRON)) { f32 sp48; - D_808535F4--; + sConveyorSpeed--; - if (D_808535F8 == 0) { - sp48 = D_80854820[D_808535F4]; + if (sIsFloorConveyor == 0) { + sp48 = D_80854820[sConveyorSpeed]; if (!(this->stateFlags1 & PLAYER_STATE1_IN_WATER)) { sp48 *= 0.25f; } } else { - sp48 = D_8085482C[D_808535F4]; + sp48 = D_8085482C[sConveyorSpeed]; } - Math_StepToF(&this->windSpeed, sp48, sp48 * 0.1f); + Math_StepToF(&this->pushedSpeed, sp48, sp48 * 0.1f); - Math_ScaledStepToS(&this->windDirection, D_808535FC, + Math_ScaledStepToS(&this->pushedYaw, sConveyorYaw, ((this->stateFlags1 & PLAYER_STATE1_IN_WATER) ? 400.0f : 800.0f) * sp48); - } else if (this->windSpeed != 0.0f) { - Math_StepToF(&this->windSpeed, 0.0f, (this->stateFlags1 & PLAYER_STATE1_IN_WATER) ? 0.5f : 1.0f); + } else if (this->pushedSpeed != 0.0f) { + Math_StepToF(&this->pushedSpeed, 0.0f, (this->stateFlags1 & PLAYER_STATE1_IN_WATER) ? 0.5f : 1.0f); } if (!Player_InBlockingCsMode(play, this) && !(this->stateFlags2 & PLAYER_STATE2_CRAWLING)) { @@ -10950,7 +11280,7 @@ void Player_UpdateCommon(Player* this, PlayState* play, Input* input) { } } - if ((play->csCtx.state != CS_STATE_IDLE) && (this->csMode != 6) && + if ((play->csCtx.state != CS_STATE_IDLE) && (this->csAction != 6) && !(this->stateFlags1 & PLAYER_STATE1_ON_HORSE) && !(this->stateFlags2 & PLAYER_STATE2_GRABBED_BY_ENEMY) && (this->actor.category == ACTORCAT_PLAYER)) { CsCmdActorAction* linkActionCsCmd = play->csCtx.linkAction; @@ -10958,22 +11288,22 @@ void Player_UpdateCommon(Player* this, PlayState* play, Input* input) { if ((linkActionCsCmd != NULL) && (D_808547C4[linkActionCsCmd->action] != 0)) { func_8002DF54(play, NULL, 6); Player_ZeroSpeedXZ(this); - } else if ((this->csMode == 0) && !(this->stateFlags2 & PLAYER_STATE2_UNDERWATER) && + } else if ((this->csAction == 0) && !(this->stateFlags2 & PLAYER_STATE2_UNDERWATER) && (play->csCtx.state != CS_STATE_UNSKIPPABLE_INIT)) { func_8002DF54(play, NULL, 0x31); Player_ZeroSpeedXZ(this); } } - if (this->csMode != 0) { - if ((this->csMode != 7) || + if (this->csAction != 0) { + if ((this->csAction != 7) || !(this->stateFlags1 & (PLAYER_STATE1_HANGING_OFF_LEDGE | PLAYER_STATE1_CLIMBING_LEDGE | PLAYER_STATE1_CLIMBING_LADDER | PLAYER_STATE1_DAMAGED))) { this->unk_6AD = 3; - } else if (func_80852E14 != this->func_674) { + } else if (func_80852E14 != this->actionFunc) { func_80852944(play, this, NULL); } } else { - this->prevCsMode = 0; + this->prevCsAction = 0; } func_8083D6EC(play, this); @@ -10989,7 +11319,7 @@ void Player_UpdateCommon(Player* this, PlayState* play, Input* input) { this->stateFlags3 &= ~PLAYER_STATE3_CHECK_FLOOR_WATER_COLLISION; func_80847298(this); - func_8083315C(play, this); + Player_ProcessControlStick(play, this); if (this->stateFlags1 & PLAYER_STATE1_IN_WATER) { D_808535E8 = 0.5f; @@ -10998,11 +11328,11 @@ void Player_UpdateCommon(Player* this, PlayState* play, Input* input) { } D_808535EC = 1.0f / D_808535E8; - D_80853614 = D_80853618 = 0; + sUseHeldItem = sHeldItemButtonIsHeldDown = 0; D_80858AA4 = this->currentMask; if (!(this->stateFlags3 & PLAYER_STATE3_PAUSE_ACTION_FUNC)) { - this->func_674(this, play); + this->actionFunc(this, play); Player_UseTunicBoots(this, play); } @@ -11039,7 +11369,7 @@ void Player_UpdateCommon(Player* this, PlayState* play, Input* input) { } this->stateFlags2 &= ~PLAYER_STATE2_NEAR_OCARINA_ACTOR; - this->unk_6A4 = FLT_MAX; + this->closestSecretDistSq = FLT_MAX; temp_f0 = this->actor.world.pos.y - this->actor.prevPos.y; @@ -11121,7 +11451,7 @@ void Player_Update(Actor* thisx, PlayState* play) { gSaveContext.dogParams = 0; } else { gSaveContext.dogParams &= 0x7FFF; - func_808395DC(this, &this->actor.world.pos, &D_80854838, &sDogSpawnPos); + Player_GetRelativePosition(this, &this->actor.world.pos, &D_80854838, &sDogSpawnPos); dogParams = gSaveContext.dogParams; dog = Actor_Spawn(&play->actorCtx, play, ACTOR_EN_DOG, sDogSpawnPos.x, sDogSpawnPos.y, @@ -11138,7 +11468,7 @@ void Player_Update(Actor* thisx, PlayState* play) { } if ((this->heldActor != NULL) && (this->heldActor->update == NULL)) { - func_808323B4(play, this); + Player_DetachHeldActor(play, this); } if (this->stateFlags1 & (PLAYER_STATE1_INPUT_DISABLED | PLAYER_STATE1_IN_CUTSCENE)) { @@ -11226,7 +11556,7 @@ void Player_Update(Actor* thisx, PlayState* play) { if (GameInteractor_GetRandomWindActive()) { Player* player = GET_PLAYER(play); - player->windSpeed = 3.0f; + player->pushedSpeed = 3.0f; // Play fan sound (too annoying) //func_8002F974(&player->actor, NA_SE_EV_WIND_TRAP - SFX_FLAG); } @@ -11234,7 +11564,13 @@ void Player_Update(Actor* thisx, PlayState* play) { GameInteractor_ExecuteOnPlayerUpdate(); } -static struct_80858AC8 D_80858AC8; +typedef struct { + /* 0x0 */ Vec3s rot; + /* 0x6 */ Vec3s angVel; +} BunnyEarKinematics; // size = 0xC + +static BunnyEarKinematics sBunnyEarKinematics; + static Vec3s D_80858AD8[25]; static Gfx* sMaskDlists[PLAYER_MASK_MAX - 1] = { @@ -11244,8 +11580,7 @@ static Gfx* sMaskDlists[PLAYER_MASK_MAX - 1] = { static Vec3s D_80854864 = { 0, 0, 0 }; -void Player_DrawGameplay(PlayState* play, Player* this, s32 lod, Gfx* cullDList, - OverrideLimbDrawOpa overrideLimbDraw) { +void Player_DrawGameplay(PlayState* play, Player* this, s32 lod, Gfx* cullDList, OverrideLimbDrawOpa overrideLimbDraw) { static s32 D_8085486C = 255; OPEN_DISPS(play->state.gfxCtx); @@ -11260,25 +11595,27 @@ void Player_DrawGameplay(PlayState* play, Player* this, s32 lod, Gfx* cullDList, if ((overrideLimbDraw == Player_OverrideLimbDrawGameplayDefault) && (this->currentMask != PLAYER_MASK_NONE)) { // Fixes a bug in vanilla where ice traps are rendered extremely large while wearing a bunny hood if (CVarGetInteger("gFixIceTrapWithBunnyHood", 1)) Matrix_Push(); - Mtx* sp70 = Graph_Alloc(play->state.gfxCtx, 2 * sizeof(Mtx)); + Mtx* bunnyEarMtx = Graph_Alloc(play->state.gfxCtx, 2 * sizeof(Mtx)); if (this->currentMask == PLAYER_MASK_BUNNY) { - Vec3s sp68; + Vec3s earRot; FrameInterpolation_RecordActorPosRotMatrix(); - gSPSegment(POLY_OPA_DISP++, 0x0B, sp70); + gSPSegment(POLY_OPA_DISP++, 0x0B, bunnyEarMtx); - sp68.x = D_80858AC8.unk_02 + 0x3E2; - sp68.y = D_80858AC8.unk_04 + 0xDBE; - sp68.z = D_80858AC8.unk_00 - 0x348A; - Matrix_SetTranslateRotateYXZ(97.0f, -1203.0f - CVarGetFloat("gCosmetics.BunnyHood_EarLength", 0.0f), -240.0f - CVarGetFloat("gCosmetics.BunnyHood_EarSpread", 0.0f), &sp68); - MATRIX_TOMTX(sp70++); + // Right ear + earRot.x = sBunnyEarKinematics.rot.y + 0x3E2; + earRot.y = sBunnyEarKinematics.rot.z + 0xDBE; + earRot.z = sBunnyEarKinematics.rot.x - 0x348A; + Matrix_SetTranslateRotateYXZ(97.0f, -1203.0f - CVarGetFloat("gCosmetics.BunnyHood_EarLength", 0.0f), -240.0f - CVarGetFloat("gCosmetics.BunnyHood_EarSpread", 0.0f), &earRot); + MATRIX_TOMTX(bunnyEarMtx++); - sp68.x = D_80858AC8.unk_02 - 0x3E2; - sp68.y = -0xDBE - D_80858AC8.unk_04; - sp68.z = D_80858AC8.unk_00 - 0x348A; - Matrix_SetTranslateRotateYXZ(97.0f, -1203.0f - CVarGetFloat("gCosmetics.BunnyHood_EarLength", 0.0f), 240.0f + CVarGetFloat("gCosmetics.BunnyHood_EarSpread", 0.0f), &sp68); - MATRIX_TOMTX(sp70); + // Left ear + earRot.x = sBunnyEarKinematics.rot.y - 0x3E2; + earRot.y = -0xDBE - sBunnyEarKinematics.rot.z; + earRot.z = sBunnyEarKinematics.rot.x - 0x348A; + Matrix_SetTranslateRotateYXZ(97.0f, -1203.0f - CVarGetFloat("gCosmetics.BunnyHood_EarLength", 0.0f), 240.0f + CVarGetFloat("gCosmetics.BunnyHood_EarSpread", 0.0f), &earRot); + MATRIX_TOMTX(bunnyEarMtx); } @@ -11369,7 +11706,7 @@ void Player_Draw(Actor* thisx, PlayState* play2) { s32 lod; s32 pad; - if ((this->csMode != 0) || (func_8008E9C4(this) && 0) || (this->actor.projectedPos.z < 160.0f)) { + if ((this->csAction != 0) || (func_8008E9C4(this) && 0) || (this->actor.projectedPos.z < 160.0f)) { lod = 0; } else { lod = 1; @@ -11472,7 +11809,7 @@ void Player_Destroy(Actor* thisx, PlayState* play) { gSaveContext.linkAge = play->linkAgeOnLoad; ResourceMgr_UnregisterSkeleton(&this->skelAnime); - ResourceMgr_UnregisterSkeleton(&this->skelAnime2); + ResourceMgr_UnregisterSkeleton(&this->upperSkelAnime); } //first person manipulate player actor @@ -11630,14 +11967,14 @@ void func_8084B1D8(Player* this, PlayState* play) { } if ((this->unk_6AD == 2) && (func_8002DD6C(this) || func_808332E4(this))) { - func_80836670(this, play); + Player_UpdateUpperBody(this, play); } u16 buttonsToCheck = BTN_A | BTN_B | BTN_R | BTN_CUP | BTN_CLEFT | BTN_CRIGHT | BTN_CDOWN; if (CVarGetInteger("gDpadEquips", 0) != 0) { buttonsToCheck |= BTN_DUP | BTN_DDOWN | BTN_DLEFT | BTN_DRIGHT; } - if ((this->csMode != 0) || (this->unk_6AD == 0) || (this->unk_6AD >= 4) || func_80833B54(this) || + if ((this->csAction != 0) || (this->unk_6AD == 0) || (this->unk_6AD >= 4) || func_80833B54(this) || (this->unk_664 != NULL) || !func_8083AD4C(play, this) || (((this->unk_6AD == 2) && (CHECK_BTN_ANY(sControlInput->press.button, BTN_A | BTN_B | BTN_R) || func_80833B2C(this) || (!func_8002DD78(this) && !func_808334B4(this)))) || @@ -11658,7 +11995,7 @@ void func_8084B1D8(Player* this, PlayState* play) { s32 func_8084B3CC(PlayState* play, Player* this) { if (play->shootingGalleryStatus != 0) { func_80832564(play, this); - func_80835C58(play, this, func_8084FA54, 0); + Player_SetupAction(play, this, func_8084FA54, 0); if (!func_8002DD6C(this) || Player_HoldsHookshot(this)) { s32 projectileItemToUse = ITEM_BOW; @@ -11666,11 +12003,11 @@ s32 func_8084B3CC(PlayState* play, Player* this) { projectileItemToUse = LINK_IS_ADULT ? ITEM_BOW : ITEM_SLINGSHOT; } - func_80835F44(play, this, projectileItemToUse); + Player_UseItem(play, this, projectileItemToUse); } this->stateFlags1 |= PLAYER_STATE1_FIRST_PERSON; - func_80832264(play, this, func_80833338(this)); + Player_AnimPlayOnce(play, this, func_80833338(this)); Player_ZeroSpeedXZ(this); func_8083B010(this); return 1; @@ -11698,7 +12035,7 @@ s32 func_8084B4D4(PlayState* play, Player* this) { void func_8084B530(Player* this, PlayState* play) { this->stateFlags2 |= PLAYER_STATE2_DISABLE_ROTATION_Z_TARGET; - func_80836670(this, play); + Player_UpdateUpperBody(this, play); if (Message_GetState(&play->msgCtx) == TEXT_STATE_CLOSING) { this->actor.flags &= ~ACTOR_FLAG_PLAYER_TALKED_TO; @@ -11709,7 +12046,7 @@ void func_8084B530(Player* this, PlayState* play) { func_8005B1A4(Play_GetCamera(play, 0)); - if (!func_8084B4D4(play, this) && !func_8084B3CC(play, this) && !func_8083ADD4(play, this)) { + if (!func_8084B4D4(play, this) && !func_8084B3CC(play, this) && !Player_StartCsAction(play, this)) { if ((this->targetActor != this->interactRangeActor) || !func_8083E5A8(this, play)) { if (this->stateFlags1 & PLAYER_STATE1_ON_HORSE) { s32 sp24 = this->unk_850; @@ -11736,12 +12073,12 @@ void func_8084B530(Player* this, PlayState* play) { func_80832DBC(this); if ((this->targetActor->category == ACTORCAT_NPC) && (this->heldItemAction != PLAYER_IA_FISHING_POLE)) { - func_808322D0(play, this, &gPlayerAnim_link_normal_talk_free); + Player_AnimPlayOnceAdjusted(play, this, &gPlayerAnim_link_normal_talk_free); } else { - func_80832284(play, this, func_80833338(this)); + Player_AnimPlayLoop(play, this, func_80833338(this)); } } else { - func_808322A4(play, this, &gPlayerAnim_link_normal_talk_free_wait); + Player_AnimPlayLoopAdjusted(play, this, &gPlayerAnim_link_normal_talk_free_wait); } } @@ -11760,7 +12097,7 @@ void func_8084B78C(Player* this, PlayState* play) { if (LinkAnimation_Update(play, &this->skelAnime)) { if (!func_8083F9D0(play, this)) { - func_80837268(this, &sp34, &sp32, 0.0f, play); + Player_GetMovementSpeedAndYaw(this, &sp34, &sp32, 0.0f, play); temp = func_8083FFB8(this, &sp34, &sp32); if (temp > 0) { func_8083FAB8(this, play); @@ -11781,7 +12118,7 @@ void func_8084B840(PlayState* play, Player* this, f32 arg2) { } } -static struct_80832924 D_80854870[] = { +static AnimSfxEntry D_80854870[] = { { NA_SE_PL_SLIP, 0x1003 }, { NA_SE_PL_SLIP, -0x1015 }, }; @@ -11801,11 +12138,11 @@ void func_8084B898(Player* this, PlayState* play) { } } - func_80832924(this, D_80854870); + Player_ProcessAnimSfxList(this, D_80854870); func_8083F524(play, this); if (!func_8083F9D0(play, this)) { - func_80837268(this, &sp34, &sp32, 0.0f, play); + Player_GetMovementSpeedAndYaw(this, &sp34, &sp32, 0.0f, play); temp = func_8083FFB8(this, &sp34, &sp32); if (temp < 0) { func_8083FB14(this, play); @@ -11822,7 +12159,7 @@ void func_8084B898(Player* this, PlayState* play) { } } -static struct_80832924 D_80854878[] = { +static AnimSfxEntry D_80854878[] = { { NA_SE_PL_SLIP, 0x1004 }, { NA_SE_PL_SLIP, -0x1018 }, }; @@ -11841,7 +12178,7 @@ void func_8084B9E4(Player* this, PlayState* play) { Vec3f sp44; Vec3f sp38; - anim = D_80853914[PLAYER_ANIMGROUP_pulling][this->modelAnimType]; + anim = GET_PLAYER_ANIM(PLAYER_ANIMGROUP_pulling, this->modelAnimType); this->stateFlags2 |= PLAYER_STATE2_DO_ACTION_GRAB | PLAYER_STATE2_DISABLE_ROTATION_ALWAYS | PLAYER_STATE2_GRABBING_DYNAPOLY; if (func_80832CB0(play, this, anim)) { @@ -11852,19 +12189,19 @@ void func_8084B9E4(Player* this, PlayState* play) { func_80832698(this, NA_SE_VO_LI_PUSH); } } else { - func_80832924(this, D_80854878); + Player_ProcessAnimSfxList(this, D_80854878); } } func_8083F524(play, this); if (!func_8083F9D0(play, this)) { - func_80837268(this, &sp70, &sp6E, 0.0f, play); + Player_GetMovementSpeedAndYaw(this, &sp70, &sp6E, 0.0f, play); temp1 = func_8083FFB8(this, &sp70, &sp6E); if (temp1 > 0) { func_8083FAB8(this, play); } else if (temp1 == 0) { - func_8083F72C(this, D_80853914[PLAYER_ANIMGROUP_pull_end][this->modelAnimType], play); + func_8083F72C(this, GET_PLAYER_ANIM(PLAYER_ANIMGROUP_pull_end, this->modelAnimType), play); } else { this->stateFlags2 |= PLAYER_STATE2_MOVING_DYNAPOLY; } @@ -11896,7 +12233,7 @@ void func_8084BBE4(Player* this, PlayState* play) { if (LinkAnimation_Update(play, &this->skelAnime)) { // clang-format off - anim = (this->unk_84F > 0) ? &gPlayerAnim_link_normal_fall_wait : D_80853914[PLAYER_ANIMGROUP_jump_climb_wait][this->modelAnimType]; func_80832284(play, this, anim); + anim = (this->unk_84F > 0) ? &gPlayerAnim_link_normal_fall_wait : GET_PLAYER_ANIM(PLAYER_ANIMGROUP_jump_climb_wait, this->modelAnimType); Player_AnimPlayLoop(play, this, anim); // clang-format on } else if (this->unk_84F == 0) { if (this->skelAnime.animation == &gPlayerAnim_link_normal_fall) { @@ -11918,12 +12255,12 @@ void func_8084BBE4(Player* this, PlayState* play) { Math_ScaledStepToS(&this->actor.shape.rot.y, this->currentYaw, 0x800); if (this->unk_84F != 0) { - func_80837268(this, &sp3C, &sp3A, 0.0f, play); + Player_GetMovementSpeedAndYaw(this, &sp3C, &sp3A, 0.0f, play); if (this->unk_847[this->unk_846] >= 0) { if (this->unk_84F > 0) { - anim = D_80853914[PLAYER_ANIMGROUP_fall_up][this->modelAnimType]; + anim = GET_PLAYER_ANIM(PLAYER_ANIMGROUP_fall_up, this->modelAnimType); } else { - anim = D_80853914[PLAYER_ANIMGROUP_jump_climb_up][this->modelAnimType]; + anim = GET_PLAYER_ANIM(PLAYER_ANIMGROUP_jump_climb_up, this->modelAnimType); } func_8083A9B8(this, anim, play); return; @@ -12047,7 +12384,7 @@ void func_8084BF1C(Player* this, PlayState* play) { } } else { this->skelAnime.prevTransl = this->ageProperties->unk_4A[sp68]; - func_80832264(play, this, this->ageProperties->unk_AC[sp68]); + Player_AnimPlayOnce(play, this, this->ageProperties->unk_AC[sp68]); } } else { if ((this->actor.world.pos.y - this->actor.floorHeight) < 15.0f) { @@ -12075,7 +12412,7 @@ void func_8084BF1C(Player* this, PlayState* play) { if (CVarGetInteger("gMirroredWorld", 0) ? (sp80 < 0) : (sp80 > 0)) { this->skelAnime.prevTransl = this->ageProperties->unk_7A[this->unk_850]; - func_80832264(play, this, anim2); + Player_AnimPlayOnce(play, this, anim2); } else { this->skelAnime.prevTransl = this->ageProperties->unk_86[this->unk_850]; LinkAnimation_Change(play, &this->skelAnime, anim2, -1.0f, Animation_GetLastFrame(anim2), @@ -12109,7 +12446,7 @@ void func_8084BF1C(Player* this, PlayState* play) { static f32 D_80854898[] = { 10.0f, 20.0f }; static f32 D_808548A0[] = { 40.0f, 50.0f }; -static struct_80832924 D_808548A8[] = { +static AnimSfxEntry D_808548A8[] = { { NA_SE_PL_WALK_LADDER, 0x80A }, { NA_SE_PL_WALK_LADDER, 0x814 }, { NA_SE_PL_WALK_LADDER, -0x81E }, @@ -12140,7 +12477,7 @@ void func_8084C5F8(Player* this, PlayState* play) { sp38 = D_80854898; if (this->unk_850 != 0) { - func_80832924(this, D_808548A8); + Player_ProcessAnimSfxList(this, D_808548A8); sp38 = D_808548A0; } @@ -12149,13 +12486,13 @@ void func_8084C5F8(Player* this, PlayState* play) { sp24.y = this->actor.world.pos.y + 20.0f; sp24.z = this->actor.world.pos.z; if (BgCheck_EntityRaycastFloor3(&play->colCtx, &sp34, &sp30, &sp24) != 0.0f) { - this->unk_89E = func_80041F10(&play->colCtx, sp34, sp30); + this->floorSfxOffset = func_80041F10(&play->colCtx, sp34, sp30); func_808328A0(this); } } } -static struct_80832924 D_808548B4[] = { +static AnimSfxEntry D_808548B4[] = { { 0, 0x3028 }, { 0, 0x3030 }, { 0, 0x3038 }, { 0, 0x3040 }, { 0, 0x3048 }, { 0, 0x3050 }, { 0, 0x3058 }, { 0, 0x3060 }, { 0, -0x3068 }, }; @@ -12170,17 +12507,17 @@ void func_8084C760(Player* this, PlayState* play) { return; } - if (!func_8083F570(this, play)) { + if (!Player_TryLeavingCrawlspace(this, play)) { this->linearVelocity = sControlInput->rel.stick_y * 0.03f; } } return; } - func_80832924(this, D_808548B4); + Player_ProcessAnimSfxList(this, D_808548B4); } -static struct_80832924 D_808548D8[] = { +static AnimSfxEntry D_808548D8[] = { { 0, 0x300A }, { 0, 0x3012 }, { 0, 0x301A }, { 0, 0x3022 }, { 0, 0x3034 }, { 0, 0x303C }, { 0, 0x3044 }, { 0, 0x304C }, { 0, -0x3054 }, }; @@ -12194,7 +12531,7 @@ void func_8084C81C(Player* this, PlayState* play) { return; } - func_80832924(this, D_808548D8); + Player_ProcessAnimSfxList(this, D_808548D8); } static Vec3f D_808548FC[] = { @@ -12227,8 +12564,8 @@ s32 func_8084C89C(PlayState* play, Player* this, s32 arg2, f32* arg3) { *arg3 = func_8083973C(play, this, &D_808548FC[arg2], &sp40); return (sp4C < *arg3) && (*arg3 < sp50) && - !func_80839768(play, this, &D_80854914[arg2], &sp30, &sp2C, &sp34) && - !func_80839768(play, this, &D_8085492C[arg2], &sp30, &sp2C, &sp34); + !Player_PosVsWallLineTest(play, this, &D_80854914[arg2], &sp30, &sp2C, &sp34) && + !Player_PosVsWallLineTest(play, this, &D_8085492C[arg2], &sp30, &sp2C, &sp34); } s32 func_8084C9BC(Player* this, PlayState* play) { @@ -12258,7 +12595,7 @@ s32 func_8084C9BC(Player* this, PlayState* play) { rideActor->actor.child = NULL; func_80835DAC(play, this, func_8084D3E4, 0); this->unk_878 = sp34 - rideActor->actor.world.pos.y; - func_80832264(play, this, + Player_AnimPlayOnce(play, this, (this->mountSide < 0) ? &gPlayerAnim_link_uma_left_down : &gPlayerAnim_link_uma_right_down); return 1; @@ -12326,7 +12663,7 @@ static u8 D_80854998[2][2] = { static Vec3s D_8085499C = { -69, 7146, -266 }; -static struct_80832924 D_808549A4[] = { +static AnimSfxEntry D_808549A4[] = { { NA_SE_PL_CALM_HIT, 0x830 }, { NA_SE_PL_CALM_HIT, 0x83A }, { NA_SE_PL_CALM_HIT, 0x844 }, { NA_SE_PL_CALM_PAT, 0x85C }, { NA_SE_PL_CALM_PAT, 0x86E }, { NA_SE_PL_CALM_PAT, 0x87E }, { NA_SE_PL_CALM_PAT, 0x884 }, { NA_SE_PL_CALM_PAT, -0x888 }, @@ -12378,7 +12715,7 @@ void func_8084CC98(Player* this, PlayState* play) { } else if (rand < 0.2f) { temp = 1; } - func_80832264(play, this, D_8085498C[temp]); + Player_AnimPlayOnce(play, this, D_8085498C[temp]); } else { this->skelAnime.animation = D_80854944[this->unk_850 - 2]; Animation_SetMorph(play, &this->skelAnime, 8.0f); @@ -12391,11 +12728,11 @@ void func_8084CC98(Player* this, PlayState* play) { if (this->unk_850 == 1) { if ((D_808535E0 != 0) || func_8083224C(play)) { - func_80832264(play, this, &gPlayerAnim_link_uma_wait_3); + Player_AnimPlayOnce(play, this, &gPlayerAnim_link_uma_wait_3); } else if (LinkAnimation_Update(play, &this->skelAnime)) { this->unk_850 = 99; } else if (this->skelAnime.animation == &gPlayerAnim_link_uma_wait_1) { - func_80832924(this, D_808549A4); + Player_ProcessAnimSfxList(this, D_808549A4); } } else { this->skelAnime.curFrame = rideActor->curFrame; @@ -12405,14 +12742,14 @@ void func_8084CC98(Player* this, PlayState* play) { AnimationContext_SetCopyAll(play, this->skelAnime.limbCount, this->skelAnime.morphTable, this->skelAnime.jointTable); - if ((play->csCtx.state != CS_STATE_IDLE) || (this->csMode != 0)) { - if (this->csMode == 7) { - this->csMode = 0; + if ((play->csCtx.state != CS_STATE_IDLE) || (this->csAction != 0)) { + if (this->csAction == 7) { + this->csAction = 0; } this->unk_6AD = 0; this->unk_84F = 0; } else if ((this->unk_850 < 2) || (this->unk_850 >= 4)) { - D_808535E0 = func_80836670(this, play); + D_808535E0 = Player_UpdateUpperBody(this, play); if (D_808535E0 != 0) { this->unk_84F = 0; } @@ -12424,32 +12761,32 @@ void func_8084CC98(Player* this, PlayState* play) { this->currentYaw = this->actor.shape.rot.y = rideActor->actor.shape.rot.y; - if ((this->csMode != 0) || + if ((this->csAction != 0) || (!func_8083224C(play) && ((rideActor->actor.speedXZ != 0.0f) || !func_8083B644(this, play)) && !func_8083C1DC(this, play))) { if (D_808535E0 == 0) { if (this->unk_84F != 0) { - if (LinkAnimation_Update(play, &this->skelAnime2)) { + if (LinkAnimation_Update(play, &this->upperSkelAnime)) { rideActor->stateFlags &= ~ENHORSE_FLAG_8; this->unk_84F = 0; } - if (this->skelAnime2.animation == &gPlayerAnim_link_uma_stop_muti) { - if (LinkAnimation_OnFrame(&this->skelAnime2, 23.0f)) { + if (this->upperSkelAnime.animation == &gPlayerAnim_link_uma_stop_muti) { + if (LinkAnimation_OnFrame(&this->upperSkelAnime, 23.0f)) { Player_PlaySfx(&this->actor, NA_SE_IT_LASH); func_80832698(this, NA_SE_VO_LI_LASH); } AnimationContext_SetCopyAll(play, this->skelAnime.limbCount, this->skelAnime.jointTable, - this->skelAnime2.jointTable); + this->upperSkelAnime.jointTable); } else { - if (LinkAnimation_OnFrame(&this->skelAnime2, 10.0f)) { + if (LinkAnimation_OnFrame(&this->upperSkelAnime, 10.0f)) { Player_PlaySfx(&this->actor, NA_SE_IT_LASH); func_80832698(this, NA_SE_VO_LI_LASH); } AnimationContext_SetCopyTrue(play, this->skelAnime.limbCount, this->skelAnime.jointTable, - this->skelAnime2.jointTable, D_80853410); + this->upperSkelAnime.jointTable, sUpperBodyLimbCopyMap); } } else { LinkAnimationHeader* anim = NULL; @@ -12463,7 +12800,7 @@ void func_8084CC98(Player* this, PlayState* play) { } if (anim != NULL) { - LinkAnimation_PlayOnce(play, &this->skelAnime2, anim); + LinkAnimation_PlayOnce(play, &this->upperSkelAnime, anim); this->unk_84F = 1; } } @@ -12482,7 +12819,7 @@ void func_8084CC98(Player* this, PlayState* play) { return; } - if ((this->csMode != 0) || (!func_8084C9BC(this, play) && !func_8083B040(this, play))) { + if ((this->csAction != 0) || (!func_8084C9BC(this, play) && !func_8083B040(this, play))) { if (this->unk_664 != NULL) { if (func_8002DD78(this) != 0) { this->unk_6BE = func_8083DB98(this, 1) - this->actor.shape.rot.y; @@ -12504,7 +12841,7 @@ void func_8084CC98(Player* this, PlayState* play) { } } -static struct_80832924 D_808549C4[] = { +static AnimSfxEntry D_808549C4[] = { { 0, 0x2800 }, { NA_SE_PL_GET_OFF_HORSE, 0x80A }, { NA_SE_PL_SLIPDOWN, -0x819 }, @@ -12536,28 +12873,28 @@ void func_8084D3E4(Player* this, PlayState* play) { } else { D_808549C4[0].field = 0x281D; } - func_80832924(this, D_808549C4); + Player_ProcessAnimSfxList(this, D_808549C4); } } -static struct_80832924 D_808549D0[] = { +static AnimSfxEntry D_808549D0[] = { { NA_SE_PL_SWIM, -0x800 }, }; void func_8084D530(Player* this, f32* arg1, f32 arg2, s16 arg3) { func_8084AEEC(this, arg1, arg2, arg3); - func_80832924(this, D_808549D0); + Player_ProcessAnimSfxList(this, D_808549D0); } void func_8084D574(PlayState* play, Player* this, s16 arg2) { - func_80835C58(play, this, func_8084D84C, 0); + Player_SetupAction(play, this, func_8084D84C, 0); this->actor.shape.rot.y = this->currentYaw = arg2; - func_80832C6C(play, this, &gPlayerAnim_link_swimer_swim); + Player_AnimChangeLoopSlowMorph(play, this, &gPlayerAnim_link_swimer_swim); } void func_8084D5CC(PlayState* play, Player* this) { - func_80835C58(play, this, func_8084DAB4, 0); - func_80832C6C(play, this, &gPlayerAnim_link_swimer_swim); + Player_SetupAction(play, this, func_8084DAB4, 0); + Player_AnimChangeLoopSlowMorph(play, this, &gPlayerAnim_link_swimer_swim); } void func_8084D610(Player* this, PlayState* play) { @@ -12567,7 +12904,7 @@ void func_8084D610(Player* this, PlayState* play) { func_80832CB0(play, this, &gPlayerAnim_link_swimer_swim_wait); func_8084B000(this); - if (!func_8083224C(play) && !func_80837348(play, this, D_80854444, 1) && + if (!func_8083224C(play) && !Player_TryActionChangeList(play, this, D_80854444, 1) && !func_8083D12C(play, this, sControlInput)) { if (this->unk_6AD != 1) { this->unk_6AD = 0; @@ -12578,11 +12915,11 @@ void func_8084D610(Player* this, PlayState* play) { sp32 = this->actor.shape.rot.y; if (this->actor.bgCheckFlags & 1) { - func_8083A098(this, D_80853914[PLAYER_ANIMGROUP_short_landing][this->modelAnimType], play); + func_8083A098(this, GET_PLAYER_ANIM(PLAYER_ANIMGROUP_short_landing, this->modelAnimType), play); func_808328A0(this); } } else { - func_80837268(this, &sp34, &sp32, 0.0f, play); + Player_GetMovementSpeedAndYaw(this, &sp34, &sp32, 0.0f, play); if (sp34 != 0.0f) { s16 temp = this->actor.shape.rot.y - sp32; @@ -12626,8 +12963,8 @@ void func_8084D84C(Player* this, PlayState* play) { func_8084B158(play, this, sControlInput, this->linearVelocity); func_8084B000(this); - if (!func_80837348(play, this, D_80854444, 1) && !func_8083D12C(play, this, sControlInput)) { - func_80837268(this, &sp34, &sp32, 0.0f, play); + if (!Player_TryActionChangeList(play, this, D_80854444, 1) && !func_8083D12C(play, this, sControlInput)) { + Player_GetMovementSpeedAndYaw(this, &sp34, &sp32, 0.0f, play); temp = this->actor.shape.rot.y - sp32; if ((sp34 == 0.0f) || (ABS(temp) > 0x6000) || (this->currentBoots == PLAYER_BOOTS_IRON)) { @@ -12671,7 +13008,7 @@ s32 func_8084D980(PlayState* play, Player* this, f32* arg2, s16* arg3) { } if (anim != this->skelAnime.animation) { - func_80832C6C(play, this, anim); + Player_AnimChangeLoopSlowMorph(play, this, anim); return 1; } @@ -12685,8 +13022,8 @@ void func_8084DAB4(Player* this, PlayState* play) { func_8084B158(play, this, sControlInput, this->linearVelocity); func_8084B000(this); - if (!func_80837348(play, this, D_80854444, 1) && !func_8083D12C(play, this, sControlInput)) { - func_80837268(this, &sp2C, &sp2A, 0.0f, play); + if (!Player_TryActionChangeList(play, this, D_80854444, 1) && !func_8083D12C(play, this, sControlInput)) { + Player_GetMovementSpeedAndYaw(this, &sp2C, &sp2A, 0.0f, play); if (sp2C == 0.0f) { func_80838F18(play, this); @@ -12704,7 +13041,7 @@ void func_8084DBC4(PlayState* play, Player* this, f32 arg2) { f32 sp2C; s16 sp2A; - func_80837268(this, &sp2C, &sp2A, 0.0f, play); + Player_GetMovementSpeedAndYaw(this, &sp2C, &sp2A, 0.0f, play); func_8084AEEC(this, &this->linearVelocity, sp2C * 0.5f, sp2A); func_8084AEEC(this, &this->actor.velocity.y, arg2, this->currentYaw); } @@ -12714,7 +13051,7 @@ void func_8084DC48(Player* this, PlayState* play) { this->stateFlags2 |= PLAYER_STATE2_DISABLE_ROTATION_Z_TARGET; this->actor.gravity = 0.0f; - func_80836670(this, play); + Player_UpdateUpperBody(this, play); if (!func_8083B040(this, play)) { if (this->currentBoots == PLAYER_BOOTS_IRON) { @@ -12743,7 +13080,7 @@ void func_8084DC48(Player* this, PlayState* play) { func_8084DBC4(play, this, -2.0f); } else { this->unk_84F++; - func_80832C6C(play, this, &gPlayerAnim_link_swimer_swim_wait); + Player_AnimChangeLoopSlowMorph(play, this, &gPlayerAnim_link_swimer_swim_wait); } } else if (this->unk_84F == 1) { LinkAnimation_Update(play, &this->skelAnime); @@ -12752,7 +13089,7 @@ void func_8084DC48(Player* this, PlayState* play) { if (this->unk_6C2 < 10000) { this->unk_84F++; this->unk_850 = this->actor.yDistToWater; - func_80832C6C(play, this, &gPlayerAnim_link_swimer_swim); + Player_AnimChangeLoopSlowMorph(play, this, &gPlayerAnim_link_swimer_swim); } } else if (!func_8083D12C(play, this, sControlInput)) { sp2C = (this->unk_850 * 0.018f) + 4.0f; @@ -12892,7 +13229,7 @@ s32 func_8084DFF4(PlayState* play, Player* this) { gSaveContext.nextCutsceneIndex = 0xFFF1; play->transitionType = TRANS_TYPE_SANDSTORM_END; this->stateFlags1 &= ~PLAYER_STATE1_IN_CUTSCENE; - func_80852FFC(play, NULL, 8); + Player_TryCsAction(play, NULL, 8); } // Set unk_862 to 0 early to not have the game draw non-custom colored models for a split second. @@ -12970,7 +13307,7 @@ static s16 sWarpSongEntrances[] = { void func_8084E3C4(Player* this, PlayState* play) { if (LinkAnimation_Update(play, &this->skelAnime)) { - func_808322A4(play, this, &gPlayerAnim_link_normal_okarina_swing); + Player_AnimPlayLoopAdjusted(play, this, &gPlayerAnim_link_normal_okarina_swing); this->unk_850 = 1; if (this->stateFlags2 & (PLAYER_STATE2_NEAR_OCARINA_ACTOR | PLAYER_STATE2_PLAY_FOR_ACTOR)) { this->stateFlags2 |= PLAYER_STATE2_ATTEMPT_PLAY_FOR_ACTOR; @@ -13004,10 +13341,10 @@ void func_8084E3C4(Player* this, PlayState* play) { gSaveContext.respawn[RESPAWN_MODE_RETURN].playerParams = 0x5FF; gSaveContext.respawn[RESPAWN_MODE_RETURN].data = play->msgCtx.lastPlayedSong; - this->csMode = 0; + this->csAction = 0; this->stateFlags1 &= ~PLAYER_STATE1_IN_CUTSCENE; - func_80852FFC(play, NULL, 8); + Player_TryCsAction(play, NULL, 8); play->mainCamera.unk_14C &= ~8; this->stateFlags1 |= PLAYER_STATE1_IN_ITEM_CS | PLAYER_STATE1_IN_CUTSCENE; @@ -13036,7 +13373,7 @@ void func_8084E604(Player* this, PlayState* play) { func_8083721C(this); } -static struct_80832924 D_808549E0[] = { +static AnimSfxEntry D_808549E0[] = { { 0, 0x3857 }, { NA_SE_VO_LI_CLIMB_END, 0x2057 }, { NA_SE_VO_LI_AUTO_JUMP, 0x2045 }, @@ -13092,9 +13429,9 @@ void func_8084E6D4(Player* this, PlayState* play) { } if (this->skelAnime.animation == &gPlayerAnim_link_normal_box_kick) { - func_808322D0(play, this, &gPlayerAnim_link_demo_get_itemB); + Player_AnimPlayOnceAdjusted(play, this, &gPlayerAnim_link_demo_get_itemB); } else { - func_808322D0(play, this, &gPlayerAnim_link_demo_get_itemA); + Player_AnimPlayOnceAdjusted(play, this, &gPlayerAnim_link_demo_get_itemA); } this->unk_850 = 2; @@ -13103,7 +13440,7 @@ void func_8084E6D4(Player* this, PlayState* play) { } else { if (this->unk_850 == 0) { if (!LINK_IS_ADULT) { - func_80832924(this, D_808549E0); + Player_ProcessAnimSfxList(this, D_808549E0); } return; } @@ -13118,15 +13455,15 @@ void func_8084E6D4(Player* this, PlayState* play) { } } -static struct_80832924 D_808549F0[] = { +static AnimSfxEntry D_808549F0[] = { { NA_SE_IT_MASTER_SWORD_SWING, -0x83C }, }; void func_8084E988(Player* this) { - func_80832924(this, D_808549F0); + Player_ProcessAnimSfxList(this, D_808549F0); } -static struct_80832924 D_808549F4[] = { +static AnimSfxEntry D_808549F4[] = { { NA_SE_VO_LI_AUTO_JUMP, 0x2005 }, { 0, -0x280F }, }; @@ -13148,7 +13485,7 @@ void func_8084E9AC(Player* this, PlayState* play) { } if (!LINK_IS_ADULT) { - func_80832924(this, D_808549F4); + Player_ProcessAnimSfxList(this, D_808549F4); } else { func_8084E988(this); } @@ -13266,7 +13603,7 @@ void func_8084EAC0(Player* this, PlayState* play) { } } - func_808322A4(play, this, &gPlayerAnim_link_bottle_drink_demo_wait); + Player_AnimPlayLoopAdjusted(play, this, &gPlayerAnim_link_bottle_drink_demo_wait); this->unk_850 = 1; return; } @@ -13275,7 +13612,7 @@ void func_8084EAC0(Player* this, PlayState* play) { func_8005B1A4(Play_GetCamera(play, 0)); } else if (this->unk_850 == 1) { if ((gSaveContext.healthAccumulator == 0) && (gSaveContext.magicState != MAGIC_STATE_FILL)) { - func_80832B78(play, this, &gPlayerAnim_link_bottle_drink_demo_end); + Player_AnimChangeOnceMorphAdjusted(play, this, &gPlayerAnim_link_bottle_drink_demo_end); this->unk_850 = 2; Player_UpdateBottleHeld(play, this, ITEM_BOTTLE, PLAYER_IA_BOTTLE); } @@ -13342,10 +13679,10 @@ void func_8084ECA4(Player* this, PlayState* play) { this->unk_84F = i + 1; this->unk_850 = 0; this->interactRangeActor->parent = &this->actor; - Player_UpdateBottleHeld(play, this, catchInfo->itemId, ABS(catchInfo->actionParam)); + Player_UpdateBottleHeld(play, this, catchInfo->itemId, ABS(catchInfo->itemAction)); if (!CVarGetInteger("gFastDrops", 0)) { this->stateFlags1 |= PLAYER_STATE1_IN_ITEM_CS | PLAYER_STATE1_IN_CUTSCENE; - func_808322D0(play, this, sp24->unk_04); + Player_AnimPlayOnceAdjusted(play, this, sp24->unk_04); func_80835EA4(play, 4); } } @@ -13355,6 +13692,9 @@ void func_8084ECA4(Player* this, PlayState* play) { } } + //! @bug If the animation is changed at any point above (such as by func_8083C0E8() or + //! Player_AnimPlayOnceAdjusted()), it will change the curFrame to 0. This causes this flag to be set for one frame, + //! at a time when it does not look like Player is swinging the bottle. if (this->skelAnime.curFrame <= 7.0f) { this->stateFlags1 |= PLAYER_STATE1_SWINGING_BOTTLE; } @@ -13394,7 +13734,7 @@ static BottleDropInfo D_80854A28[] = { { ACTOR_EN_INSECT, 2 }, }; -static struct_80832924 D_80854A34[] = { +static AnimSfxEntry D_80854A34[] = { { NA_SE_VO_LI_AUTO_JUMP, 0x2026 }, { NA_SE_EV_BOTTLE_CAP_OPEN, -0x828 }, }; @@ -13420,10 +13760,10 @@ void func_8084EFC0(Player* this, PlayState* play) { return; } - func_80832924(this, D_80854A34); + Player_ProcessAnimSfxList(this, D_80854A34); } -static struct_80832924 D_80854A3C[] = { +static AnimSfxEntry D_80854A3C[] = { { NA_SE_PL_PUT_OUT_ITEM, -0x81E }, }; @@ -13466,7 +13806,7 @@ void func_8084F104(Player* this, PlayState* play) { this->unk_862 = 0; if (this->unk_84F == 1) { - func_80832264(play, this, &gPlayerAnim_link_bottle_read_end); + Player_AnimPlayOnce(play, this, &gPlayerAnim_link_bottle_read_end); this->unk_850 = -1; } else { func_8083C0E8(this, play); @@ -13476,7 +13816,7 @@ void func_8084F104(Player* this, PlayState* play) { } } } else if (this->unk_850 >= 0) { - func_80832924(this, D_80854A3C); + Player_ProcessAnimSfxList(this, D_80854A3C); } if ((this->unk_84F == 0) && (this->unk_664 != NULL)) { @@ -13488,7 +13828,7 @@ void func_8084F308(Player* this, PlayState* play) { this->stateFlags2 |= PLAYER_STATE2_DISABLE_ROTATION_Z_TARGET | PLAYER_STATE2_DISABLE_ROTATION_ALWAYS; if (LinkAnimation_Update(play, &this->skelAnime)) { - func_80832284(play, this, &gPlayerAnim_link_normal_re_dead_attack_wait); + Player_AnimPlayLoop(play, this, &gPlayerAnim_link_normal_re_dead_attack_wait); } if (func_80832594(this, 0, 100)) { @@ -13519,7 +13859,7 @@ void func_8084F390(Player* this, PlayState* play) { return; } - func_8083E298(floorPoly, &sp38, &sp46); + Player_GetSlopeDirection(floorPoly, &sp38, &sp46); sp44 = sp46; if (this->unk_84F != 0) { @@ -13547,9 +13887,9 @@ void func_8084F390(Player* this, PlayState* play) { if (Math_AsymStepToF(&this->linearVelocity, sp50, sp4C, sp48) && (sp50 == 0)) { LinkAnimationHeader* anim; if (this->unk_84F == 0) { - anim = D_80853914[PLAYER_ANIMGROUP_down_slope_slip_end][this->modelAnimType]; + anim = GET_PLAYER_ANIM(PLAYER_ANIMGROUP_down_slope_slip_end, this->modelAnimType); } else { - anim = D_80853914[PLAYER_ANIMGROUP_up_slope_slip_end][this->modelAnimType]; + anim = GET_PLAYER_ANIM(PLAYER_ANIMGROUP_up_slope_slip_end, this->modelAnimType); } func_8083A098(this, anim, play); } @@ -13560,15 +13900,15 @@ void func_8084F390(Player* this, PlayState* play) { } void func_8084F608(Player* this, PlayState* play) { - if ((DECR(this->unk_850) == 0) && func_8083ADD4(play, this)) { + if ((DECR(this->unk_850) == 0) && Player_StartCsAction(play, this)) { func_80852280(play, this, NULL); - func_80835C58(play, this, func_80852E14, 0); + Player_SetupAction(play, this, func_80852E14, 0); func_80852E14(this, play); } } void func_8084F698(Player* this, PlayState* play) { - func_80835C58(play, this, func_8084F608, 0); + Player_SetupAction(play, this, func_8084F608, 0); this->unk_850 = 40; Actor_Spawn(&play->actorCtx, play, ACTOR_DEMO_KANKYO, 0.0f, 0.0f, 0.0f, 0, 0, 0, 0x10, true); } @@ -13579,7 +13919,7 @@ void func_8084F710(Player* this, PlayState* play) { if ((this->unk_84F != 0) && (play->csCtx.frames < 0x131)) { this->actor.gravity = 0.0f; this->actor.velocity.y = 0.0f; - } else if (D_80853600 < 150.0f) { + } else if (sYDistToFloor < 150.0f) { if (LinkAnimation_Update(play, &this->skelAnime)) { if (this->unk_850 == 0) { if (this->actor.bgCheckFlags & 1) { @@ -13588,7 +13928,7 @@ void func_8084F710(Player* this, PlayState* play) { this->unk_850 = 1; } } else { - if ((play->sceneNum == SCENE_KOKIRI_FOREST) && func_8083ADD4(play, this)) { + if ((play->sceneNum == SCENE_KOKIRI_FOREST) && Player_StartCsAction(play, this)) { return; } func_80853080(this, play); @@ -13597,7 +13937,7 @@ void func_8084F710(Player* this, PlayState* play) { Math_SmoothStepToF(&this->actor.velocity.y, 2.0f, 0.3f, 8.0f, 0.5f); } - if ((play->sceneNum == SCENE_CHAMBER_OF_THE_SAGES) && func_8083ADD4(play, this)) { + if ((play->sceneNum == SCENE_CHAMBER_OF_THE_SAGES) && Player_StartCsAction(play, this)) { return; } @@ -13661,7 +14001,7 @@ void func_8084FA54(Player* this, PlayState* play) { func_8083AD4C(play, this); LinkAnimation_Update(play, &this->skelAnime); - func_80836670(this, play); + Player_UpdateUpperBody(this, play); this->unk_6BE = func_8084ABD8(play, this, 1, 0) - this->actor.shape.rot.y; this->unk_6AE |= 0x80; @@ -13797,44 +14137,50 @@ void func_8084FF7C(Player* this) { } } +/** + * Updates the Bunny Hood's floppy ears' rotation and velocity. + */ void Player_UpdateBunnyEars(Player* this) { - s32 pad; - s16 sp2A; - s16 sp28; - s16 sp26; + Vec3s force; + s16 angle; - D_80858AC8.unk_06 -= D_80858AC8.unk_06 >> 3; - D_80858AC8.unk_08 -= D_80858AC8.unk_08 >> 3; - D_80858AC8.unk_06 += -D_80858AC8.unk_00 >> 2; - D_80858AC8.unk_08 += -D_80858AC8.unk_02 >> 2; + // Damping: decay by 1/8 the previous value each frame + sBunnyEarKinematics.angVel.x -= sBunnyEarKinematics.angVel.x >> 3; + sBunnyEarKinematics.angVel.y -= sBunnyEarKinematics.angVel.y >> 3; + + // Elastic restorative force + sBunnyEarKinematics.angVel.x += -sBunnyEarKinematics.rot.x >> 2; + sBunnyEarKinematics.angVel.y += -sBunnyEarKinematics.rot.y >> 2; - sp26 = this->actor.world.rot.y - this->actor.shape.rot.y; + // Forcing from motion relative to shape frame + angle = this->actor.world.rot.y - this->actor.shape.rot.y; + force.x = (s32)(this->actor.speedXZ * -200.0f * Math_CosS(angle) * (Rand_CenteredFloat(2.0f) + 10.0f)) & 0xFFFF; + force.y = (s32)(this->actor.speedXZ * 100.0f * Math_SinS(angle) * (Rand_CenteredFloat(2.0f) + 10.0f)) & 0xFFFF; - sp28 = (s32)(this->actor.speedXZ * -200.0f * Math_CosS(sp26) * (Rand_CenteredFloat(2.0f) + 10.0f)) & 0xFFFF; - sp2A = (s32)(this->actor.speedXZ * 100.0f * Math_SinS(sp26) * (Rand_CenteredFloat(2.0f) + 10.0f)) & 0xFFFF; + sBunnyEarKinematics.angVel.x += force.x >> 2; + sBunnyEarKinematics.angVel.y += force.y >> 2; - D_80858AC8.unk_06 += sp28 >> 2; - D_80858AC8.unk_08 += sp2A >> 2; - - if (D_80858AC8.unk_06 > 6000) { - D_80858AC8.unk_06 = 6000; - } else if (D_80858AC8.unk_06 < -6000) { - D_80858AC8.unk_06 = -6000; + // Clamp both angular velocities to [-6000, 6000] + if (sBunnyEarKinematics.angVel.x > 6000) { + sBunnyEarKinematics.angVel.x = 6000; + } else if (sBunnyEarKinematics.angVel.x < -6000) { + sBunnyEarKinematics.angVel.x = -6000; + } + if (sBunnyEarKinematics.angVel.y > 6000) { + sBunnyEarKinematics.angVel.y = 6000; + } else if (sBunnyEarKinematics.angVel.y < -6000) { + sBunnyEarKinematics.angVel.y = -6000; } - if (D_80858AC8.unk_08 > 6000) { - D_80858AC8.unk_08 = 6000; - } else if (D_80858AC8.unk_08 < -6000) { - D_80858AC8.unk_08 = -6000; - } + // Add angular velocity to rotations + sBunnyEarKinematics.rot.x += sBunnyEarKinematics.angVel.x; + sBunnyEarKinematics.rot.y += sBunnyEarKinematics.angVel.y; - D_80858AC8.unk_00 += D_80858AC8.unk_06; - D_80858AC8.unk_02 += D_80858AC8.unk_08; - - if (D_80858AC8.unk_00 < 0) { - D_80858AC8.unk_04 = D_80858AC8.unk_00 >> 1; + // swivel ears outwards if bending backwards + if (sBunnyEarKinematics.rot.x < 0) { + sBunnyEarKinematics.rot.z = sBunnyEarKinematics.rot.x >> 1; } else { - D_80858AC8.unk_04 = 0; + sBunnyEarKinematics.rot.z = 0; } } @@ -13845,7 +14191,7 @@ s32 func_80850224(Player* this, PlayState* play) { func_80837948(play, this, sp24); - if (sp24 >= 0x18) { + if (sp24 >= PLAYER_MWA_SPIN_ATTACK_1H) { this->stateFlags2 |= PLAYER_STATE2_SPIN_ATTACKING; func_80837530(play, this, 0); return 1; @@ -13906,7 +14252,8 @@ void func_808502D0(Player* this, PlayState* play) { this->stateFlags3 |= PLAYER_STATE3_FINISHED_ATTACKING; } } else if (this->heldItemAction == PLAYER_IA_HAMMER) { - if ((this->meleeWeaponAnimation == 0x16) || (this->meleeWeaponAnimation == 0x13)) { + if ((this->meleeWeaponAnimation == PLAYER_MWA_HAMMER_FORWARD) || + (this->meleeWeaponAnimation == PLAYER_MWA_JUMPSLASH_FINISH)) { static Vec3f zeroVec = { 0.0f, 0.0f, 0.0f }; Vec3f shockwavePos; f32 sp2C; @@ -13917,8 +14264,8 @@ void func_808502D0(Player* this, PlayState* play) { Math_ScaledStepToS(&this->actor.focus.rot.x, Math_Atan2S(45.0f, sp2C), 800); func_80836AB8(this, 1); - if ((((this->meleeWeaponAnimation == 0x16) && LinkAnimation_OnFrame(&this->skelAnime, 7.0f)) || - ((this->meleeWeaponAnimation == 0x13) && LinkAnimation_OnFrame(&this->skelAnime, 2.0f))) && + if ((((this->meleeWeaponAnimation == PLAYER_MWA_HAMMER_FORWARD) && LinkAnimation_OnFrame(&this->skelAnime, 7.0f)) || + ((this->meleeWeaponAnimation == PLAYER_MWA_JUMPSLASH_FINISH) && LinkAnimation_OnFrame(&this->skelAnime, 2.0f))) && (sp2C > -40.0f) && (sp2C < 40.0f)) { func_80842A28(play, this); EffectSsBlast_SpawnWhiteShockwave(play, &shockwavePos, &zeroVec, &zeroVec); @@ -13941,7 +14288,7 @@ void func_8085063C(Player* this, PlayState* play) { this->stateFlags2 |= PLAYER_STATE2_DISABLE_ROTATION_Z_TARGET; LinkAnimation_Update(play, &this->skelAnime); - func_80836670(this, play); + Player_UpdateUpperBody(this, play); if (this->unk_850 == 0) { Message_StartTextbox(play, 0x3B, &this->actor); @@ -14008,13 +14355,13 @@ static LinkAnimationHeader* D_80854A70[] = { static u8 D_80854A7C[] = { 70, 10, 10 }; -static struct_80832924 D_80854A80[] = { +static AnimSfxEntry D_80854A80[] = { { NA_SE_PL_SKIP, 0x814 }, { NA_SE_VO_LI_SWORD_N, 0x2014 }, { 0, -0x301A }, }; -static struct_80832924 D_80854A8C[][2] = { +static AnimSfxEntry D_80854A8C[][2] = { { { 0, 0x4014 }, { NA_SE_VO_LI_MAGIC_FROL, -0x201E }, @@ -14080,9 +14427,9 @@ void func_808507F4(Player* this, PlayState* play) { } } else if (this->unk_84F >= 0) { if (this->unk_850 == 0) { - func_80832924(this, D_80854A80); + Player_ProcessAnimSfxList(this, D_80854A80); } else if (this->unk_850 == 1) { - func_80832924(this, D_80854A8C[this->unk_84F]); + Player_ProcessAnimSfxList(this, D_80854A8C[this->unk_84F]); if ((this->unk_84F == 2) && LinkAnimation_OnFrame(&this->skelAnime, 30.0f)) { this->stateFlags1 &= ~(PLAYER_STATE1_IN_ITEM_CS | PLAYER_STATE1_IN_CUTSCENE); } @@ -14103,14 +14450,14 @@ void func_80850AEC(Player* this, PlayState* play) { this->stateFlags2 |= PLAYER_STATE2_DISABLE_ROTATION_Z_TARGET; if (LinkAnimation_Update(play, &this->skelAnime)) { - func_80832284(play, this, &gPlayerAnim_link_hook_fly_wait); + Player_AnimPlayLoop(play, this, &gPlayerAnim_link_hook_fly_wait); } Math_Vec3f_Sum(&this->actor.world.pos, &this->actor.velocity, &this->actor.world.pos); if (func_80834FBC(this)) { Math_Vec3f_Copy(&this->actor.prevPos, &this->actor.world.pos); - func_80847BA0(play, this); + Player_ProcessSceneCollision(play, this); temp = this->actor.world.pos.y - this->actor.floorHeight; if (temp > 20.0f) { @@ -14155,7 +14502,7 @@ void func_80850C68(Player* this, PlayState* play) { LinkAnimation_InterpJointMorph(play, &this->skelAnime, 0.5f); } else if (LinkAnimation_Update(play, &this->skelAnime)) { this->unk_860 = 2; - func_80832284(play, this, &gPlayerAnim_link_fishing_wait); + Player_AnimPlayLoop(play, this, &gPlayerAnim_link_fishing_wait); this->unk_850 = 1; } @@ -14164,8 +14511,8 @@ void func_80850C68(Player* this, PlayState* play) { if (this->unk_860 == 0) { func_80853080(this, play); } else if (this->unk_860 == 3) { - func_80835C58(play, this, func_80850E84, 0); - func_80832B0C(play, this, &gPlayerAnim_link_fishing_fish_catch); + Player_SetupAction(play, this, func_80850E84, 0); + Player_AnimChangeOnceMorph(play, this, &gPlayerAnim_link_fishing_fish_catch); } } @@ -14181,18 +14528,18 @@ static void (*D_80854AA4[])(PlayState*, Player*, void*) = { func_80851050, func_80851194, func_808511B4, func_80851248, func_808512E0, }; -static struct_80832924 D_80854AF0[] = { +static AnimSfxEntry D_80854AF0[] = { { 0, 0x2822 }, { NA_SE_PL_CALM_HIT, 0x82D }, { NA_SE_PL_CALM_HIT, 0x833 }, { NA_SE_PL_CALM_HIT, -0x840 }, }; -static struct_80832924 D_80854B00[] = { +static AnimSfxEntry D_80854B00[] = { { NA_SE_VO_LI_SURPRISE, 0x2003 }, { 0, 0x300F }, { 0, 0x3018 }, { 0, 0x301E }, { NA_SE_VO_LI_FALL_L, -0x201F }, }; -static struct_80832924 D_80854B14[] = { +static AnimSfxEntry D_80854B14[] = { { 0, -0x300A }, }; @@ -14408,22 +14755,22 @@ static struct_80854B18 D_80854E50[] = { { 12, &gPlayerAnim_demo_link_nwait }, }; -void func_80850ED8(PlayState* play, Player* this, LinkAnimationHeader* anim) { - func_80832DB0(this); - func_80832B0C(play, this, anim); +void Player_AnimChangeOnceMorphZeroRootYawSpeed(PlayState* play, Player* this, LinkAnimationHeader* anim) { + Player_ZeroRootLimbYaw(this); + Player_AnimChangeOnceMorph(play, this, anim); Player_ZeroSpeedXZ(this); } -void func_80850F1C(PlayState* play, Player* this, LinkAnimationHeader* anim) { - func_80832DB0(this); - LinkAnimation_Change(play, &this->skelAnime, anim, (2.0f / 3.0f), 0.0f, Animation_GetLastFrame(anim), +void Player_AnimChangeOnceMorphAdjustedZeroRootYawSpeed(PlayState* play, Player* this, LinkAnimationHeader* anim) { + Player_ZeroRootLimbYaw(this); + LinkAnimation_Change(play, &this->skelAnime, anim, PLAYER_ANIM_ADJUSTED_SPEED, 0.0f, Animation_GetLastFrame(anim), ANIMMODE_ONCE, -8.0f); Player_ZeroSpeedXZ(this); } -void func_80850F9C(PlayState* play, Player* this, LinkAnimationHeader* anim) { - func_80832DB0(this); - LinkAnimation_Change(play, &this->skelAnime, anim, (2.0f / 3.0f), 0.0f, 0.0f, ANIMMODE_LOOP, -8.0f); +void Player_AnimChangeLoopMorphAdjustedZeroRootYawSpeed(PlayState* play, Player* this, LinkAnimationHeader* anim) { + Player_ZeroRootLimbYaw(this); + LinkAnimation_Change(play, &this->skelAnime, anim, PLAYER_ANIM_ADJUSTED_SPEED, 0.0f, 0.0f, ANIMMODE_LOOP, -8.0f); Player_ZeroSpeedXZ(this); } @@ -14432,53 +14779,53 @@ void func_80851008(PlayState* play, Player* this, void* anim) { } void func_80851030(PlayState* play, Player* this, void* anim) { - func_80850ED8(play, this, anim); + Player_AnimChangeOnceMorphZeroRootYawSpeed(play, this, anim); } void func_80851050(PlayState* play, Player* this, void* anim) { - func_80832DB0(this); - func_80832C2C(play, this, anim); + Player_ZeroRootLimbYaw(this); + Player_AnimChangeFreeze(play, this, anim); Player_ZeroSpeedXZ(this); } void func_80851094(PlayState* play, Player* this, void* anim) { - func_80850F1C(play, this, anim); + Player_AnimChangeOnceMorphAdjustedZeroRootYawSpeed(play, this, anim); } void func_808510B4(PlayState* play, Player* this, void* anim) { - func_80850F9C(play, this, anim); + Player_AnimChangeLoopMorphAdjustedZeroRootYawSpeed(play, this, anim); } void func_808510D4(PlayState* play, Player* this, void* anim) { - func_8083308C(play, this, anim); + Player_AnimReplaceNormalPlayOnceAdjusted(play, this, anim); } void func_808510F4(PlayState* play, Player* this, void* anim) { - func_8083303C(play, this, anim, 0x9C); + Player_AnimReplacePlayOnce(play, this, anim, 0x9C); } void func_80851114(PlayState* play, Player* this, void* anim) { - func_8083313C(play, this, anim); + Player_AnimReplaceNormalPlayLoopAdjusted(play, this, anim); } void func_80851134(PlayState* play, Player* this, void* anim) { - func_808330EC(play, this, anim, 0x9C); + Player_AnimReplacePlayLoop(play, this, anim, 0x9C); } void func_80851154(PlayState* play, Player* this, void* anim) { - func_80832264(play, this, anim); + Player_AnimPlayOnce(play, this, anim); } void func_80851174(PlayState* play, Player* this, void* anim) { - func_80832284(play, this, anim); + Player_AnimPlayLoop(play, this, anim); } void func_80851194(PlayState* play, Player* this, void* anim) { - func_808322D0(play, this, anim); + Player_AnimPlayOnceAdjusted(play, this, anim); } void func_808511B4(PlayState* play, Player* this, void* anim) { - func_808322A4(play, this, anim); + Player_AnimPlayLoopAdjusted(play, this, anim); } void func_808511D4(PlayState* play, Player* this, void* anim) { @@ -14487,7 +14834,7 @@ void func_808511D4(PlayState* play, Player* this, void* anim) { void func_808511FC(PlayState* play, Player* this, void* anim) { if (LinkAnimation_Update(play, &this->skelAnime)) { - func_80850F9C(play, this, anim); + Player_AnimChangeLoopMorphAdjustedZeroRootYawSpeed(play, this, anim); this->unk_850 = 1; } } @@ -14495,28 +14842,28 @@ void func_808511FC(PlayState* play, Player* this, void* anim) { void func_80851248(PlayState* play, Player* this, void* anim) { if (LinkAnimation_Update(play, &this->skelAnime)) { func_80832DBC(this); - func_808322A4(play, this, anim); + Player_AnimPlayLoopAdjusted(play, this, anim); } } void func_80851294(PlayState* play, Player* this, void* anim) { if (LinkAnimation_Update(play, &this->skelAnime)) { - func_8083313C(play, this, anim); + Player_AnimReplaceNormalPlayLoopAdjusted(play, this, anim); this->unk_850 = 1; } } void func_808512E0(PlayState* play, Player* this, void* arg2) { LinkAnimation_Update(play, &this->skelAnime); - func_80832924(this, arg2); + Player_ProcessAnimSfxList(this, arg2); } void func_80851314(Player* this) { - if ((this->unk_448 == NULL) || (this->unk_448->update == NULL)) { - this->unk_448 = NULL; + if ((this->csActor == NULL) || (this->csActor->update == NULL)) { + this->csActor = NULL; } - this->unk_664 = this->unk_448; + this->unk_664 = this->csActor; if (this->unk_664 != NULL) { this->actor.shape.rot.y = func_8083DB98(this, 0); @@ -14528,7 +14875,7 @@ void func_80851368(PlayState* play, Player* this, CsCmdActorAction* arg2) { this->stateFlags2 |= PLAYER_STATE2_UNDERWATER; this->stateFlags1 &= ~(PLAYER_STATE1_JUMPING | PLAYER_STATE1_FREEFALL); - func_80832284(play, this, &gPlayerAnim_link_swimer_swim); + Player_AnimPlayLoop(play, this, &gPlayerAnim_link_swimer_swim); } void func_808513BC(PlayState* play, Player* this, CsCmdActorAction* arg2) { @@ -14547,9 +14894,9 @@ void func_808513BC(PlayState* play, Player* this, CsCmdActorAction* arg2) { if (LinkAnimation_Update(play, &this->skelAnime)) { if (this->unk_84F == 1) { - func_80832C6C(play, this, &gPlayerAnim_link_swimer_swim_wait); + Player_AnimChangeLoopSlowMorph(play, this, &gPlayerAnim_link_swimer_swim_wait); } else { - func_80832284(play, this, &gPlayerAnim_link_swimer_swim_wait); + Player_AnimPlayLoop(play, this, &gPlayerAnim_link_swimer_swim_wait); } } @@ -14568,7 +14915,7 @@ void func_808514C0(PlayState* play, Player* this, CsCmdActorAction* arg2) { LinkAnimation_Update(play, &this->skelAnime); if (func_8008F128(this) || (this->stateFlags1 & PLAYER_STATE1_ITEM_OVER_HEAD)) { - func_80836670(this, play); + Player_UpdateUpperBody(this, play); return; } @@ -14589,12 +14936,12 @@ void func_808515A4(PlayState* play, Player* this, CsCmdActorAction* arg2) { return; } - anim = D_80853914[PLAYER_ANIMGROUP_nwait][this->modelAnimType]; + anim = GET_PLAYER_ANIM(PLAYER_ANIMGROUP_nwait, this->modelAnimType); - if ((this->unk_446 == 6) || (this->unk_446 == 0x2E)) { - func_80832264(play, this, anim); + if ((this->cueId == 6) || (this->cueId == 0x2E)) { + Player_AnimPlayOnce(play, this, anim); } else { - func_80832DB0(this); + Player_ZeroRootLimbYaw(this); LinkAnimation_Change(play, &this->skelAnime, anim, (2.0f / 3.0f), 0.0f, Animation_GetLastFrame(anim), ANIMMODE_LOOP, -4.0f); } @@ -14604,7 +14951,7 @@ void func_808515A4(PlayState* play, Player* this, CsCmdActorAction* arg2) { void func_80851688(PlayState* play, Player* this, CsCmdActorAction* arg2) { if (func_8084B3CC(play, this) == 0) { - if ((this->csMode == 0x31) && (play->csCtx.state == CS_STATE_IDLE)) { + if ((this->csAction == 0x31) && (play->csCtx.state == CS_STATE_IDLE)) { func_8002DF54(play, NULL, 7); return; } @@ -14617,19 +14964,19 @@ void func_80851688(PlayState* play, Player* this, CsCmdActorAction* arg2) { LinkAnimation_Update(play, &this->skelAnime); if (func_8008F128(this) || (this->stateFlags1 & PLAYER_STATE1_ITEM_OVER_HEAD)) { - func_80836670(this, play); + Player_UpdateUpperBody(this, play); } } } -static struct_80832924 D_80855188[] = { +static AnimSfxEntry D_80855188[] = { { 0, 0x302A }, { 0, -0x3030 }, }; void func_80851750(PlayState* play, Player* this, CsCmdActorAction* arg2) { LinkAnimation_Update(play, &this->skelAnime); - func_80832924(this, D_80855188); + Player_ProcessAnimSfxList(this, D_80855188); } void func_80851788(PlayState* play, Player* this, CsCmdActorAction* arg2) { @@ -14664,7 +15011,7 @@ void func_80851828(PlayState* play, Player* this, CsCmdActorAction* arg2) { this->unk_850++; if (this->unk_850 > 20) { - this->csMode = 0xB; + this->csAction = 0xB; } } @@ -14677,7 +15024,7 @@ void func_8085190C(PlayState* play, Player* this, CsCmdActorAction* arg2) { if (this->unk_850 != 0) { if (LinkAnimation_Update(play, &this->skelAnime)) { - func_80832284(play, this, func_808334E4(this)); + Player_AnimPlayLoop(play, this, func_808334E4(this)); this->unk_850 = 0; } @@ -14706,8 +15053,8 @@ static Vec3f D_80855198 = { -1.0f, 70.0f, 20.0f }; void func_808519EC(PlayState* play, Player* this, CsCmdActorAction* arg2) { Math_Vec3f_Copy(&this->actor.world.pos, &D_80855198); this->actor.shape.rot.y = -0x8000; - func_808322D0(play, this, this->ageProperties->unk_9C); - func_80832F54(play, this, 0x28F); + Player_AnimPlayOnceAdjusted(play, this, this->ageProperties->unk_9C); + Player_AnimReplaceApplyFlags(play, this, 0x28F); } static struct_808551A4 D_808551A4[] = { @@ -14715,7 +15062,7 @@ static struct_808551A4 D_808551A4[] = { { NA_SE_IT_SWORD_STICK_STN, NA_SE_VO_LI_SWORD_N }, }; -static struct_80832924 D_808551AC[] = { +static AnimSfxEntry D_808551AC[] = { { 0, 0x401D }, { 0, -0x4027 }, }; @@ -14747,7 +15094,7 @@ void func_80851A50(PlayState* play, Player* this, CsCmdActorAction* arg2) { func_80832698(this, NA_SE_VO_LI_SWORD_L); } } else { - func_80832924(this, D_808551AC); + Player_ProcessAnimSfxList(this, D_808551AC); } } @@ -14756,7 +15103,7 @@ void func_80851B90(PlayState* play, Player* this, CsCmdActorAction* arg2) { ANIMMODE_ONCE, 0.0f); } -static struct_80832924 D_808551B4[] = { +static AnimSfxEntry D_808551B4[] = { { 0, -0x281E }, }; @@ -14770,13 +15117,13 @@ void func_80851BE8(PlayState* play, Player* this, CsCmdActorAction* arg2) { LinkAnimation_Change(play, &this->skelAnime, &gPlayerAnim_link_okarina_warp_goal, (2.0f / 3.0f), 10.0f, Animation_GetLastFrame(&gPlayerAnim_link_okarina_warp_goal), ANIMMODE_ONCE, -8.0f); } - func_80832924(this, D_808551B4); + Player_ProcessAnimSfxList(this, D_808551B4); } } void func_80851CA4(PlayState* play, Player* this, CsCmdActorAction* arg2) { if (LinkAnimation_Update(play, &this->skelAnime) && (this->unk_850 == 0) && (this->actor.bgCheckFlags & 1)) { - func_80832264(play, this, &gPlayerAnim_link_normal_back_downB); + Player_AnimPlayOnce(play, this, &gPlayerAnim_link_normal_back_downB); this->unk_850 = 1; } @@ -14786,12 +15133,12 @@ void func_80851CA4(PlayState* play, Player* this, CsCmdActorAction* arg2) { } void func_80851D2C(PlayState* play, Player* this, CsCmdActorAction* arg2) { - func_80850F1C(play, this, &gPlayerAnim_link_normal_okarina_start); + Player_AnimChangeOnceMorphAdjustedZeroRootYawSpeed(play, this, &gPlayerAnim_link_normal_okarina_start); func_8084B498(this); Player_SetModels(this, Player_ActionToModelGroup(this, this->itemAction)); } -static struct_80832924 D_808551B8[] = { +static AnimSfxEntry D_808551B8[] = { { NA_SE_IT_SWORD_PICKOUT, -0x80C }, }; @@ -14801,7 +15148,7 @@ void func_80851D80(PlayState* play, Player* this, CsCmdActorAction* arg2) { if (LinkAnimation_OnFrame(&this->skelAnime, 6.0f)) { func_80846720(play, this, 0); } else { - func_80832924(this, D_808551B8); + Player_ProcessAnimSfxList(this, D_808551B8); } } @@ -14816,26 +15163,26 @@ void func_80851E28(PlayState* play, Player* this, CsCmdActorAction* arg2) { } void func_80851E64(PlayState* play, Player* this, CsCmdActorAction* arg2) { - func_80833064(play, this, &gPlayerAnim_link_swimer_swim_get, 0x98); + Player_AnimReplacePlayOnceAdjusted(play, this, &gPlayerAnim_link_swimer_swim_get, 0x98); } void func_80851E90(PlayState* play, Player* this, CsCmdActorAction* arg2) { - func_8083303C(play, this, &gPlayerAnim_clink_op3_negaeri, 0x9C); + Player_AnimReplacePlayOnce(play, this, &gPlayerAnim_clink_op3_negaeri, 0x9C); func_80832698(this, NA_SE_VO_LI_GROAN); } void func_80851ECC(PlayState* play, Player* this, CsCmdActorAction* arg2) { if (LinkAnimation_Update(play, &this->skelAnime)) { - func_808330EC(play, this, &gPlayerAnim_clink_op3_wait2, 0x9C); + Player_AnimReplacePlayLoop(play, this, &gPlayerAnim_clink_op3_wait2, 0x9C); } } -void func_80851F14(PlayState* play, Player* this, LinkAnimationHeader* anim, struct_80832924* arg3) { +void func_80851F14(PlayState* play, Player* this, LinkAnimationHeader* anim, AnimSfxEntry* arg3) { if (LinkAnimation_Update(play, &this->skelAnime)) { - func_808322A4(play, this, anim); + Player_AnimPlayLoopAdjusted(play, this, anim); this->unk_850 = 1; } else if (this->unk_850 == 0) { - func_80832924(this, arg3); + Player_ProcessAnimSfxList(this, arg3); } } @@ -14844,7 +15191,7 @@ void func_80851F84(PlayState* play, Player* this, CsCmdActorAction* arg2) { func_80851134(play, this, &gPlayerAnim_clink_op3_wait1); } -static struct_80832924 D_808551BC[] = { +static AnimSfxEntry D_808551BC[] = { { NA_SE_VO_LI_RELAX, 0x2023 }, { NA_SE_PL_SLIPDOWN, 0x8EC }, { NA_SE_PL_SLIPDOWN, -0x900 }, @@ -14852,17 +15199,17 @@ static struct_80832924 D_808551BC[] = { void func_80851FB0(PlayState* play, Player* this, CsCmdActorAction* arg2) { if (LinkAnimation_Update(play, &this->skelAnime)) { - func_808330EC(play, this, &gPlayerAnim_clink_op3_wait3, 0x9C); + Player_AnimReplacePlayLoop(play, this, &gPlayerAnim_clink_op3_wait3, 0x9C); this->unk_850 = 1; } else if (this->unk_850 == 0) { - func_80832924(this, D_808551BC); + Player_ProcessAnimSfxList(this, D_808551BC); if (LinkAnimation_OnFrame(&this->skelAnime, 240.0f)) { this->actor.shape.shadowDraw = ActorShadow_DrawFeet; } } } -static struct_80832924 D_808551C8[] = { +static AnimSfxEntry D_808551C8[] = { { NA_SE_PL_LAND_LADDER, 0x843 }, { 0, 0x4854 }, { 0, 0x485A }, @@ -14871,11 +15218,11 @@ static struct_80832924 D_808551C8[] = { void func_80852048(PlayState* play, Player* this, CsCmdActorAction* arg2) { LinkAnimation_Update(play, &this->skelAnime); - func_80832924(this, D_808551C8); + Player_ProcessAnimSfxList(this, D_808551C8); } void func_80852080(PlayState* play, Player* this, CsCmdActorAction* arg2) { - func_80833064(play, this, &gPlayerAnim_clink_demo_futtobi, 0x9D); + Player_AnimReplacePlayOnceAdjusted(play, this, &gPlayerAnim_clink_demo_futtobi, 0x9D); func_80832698(this, NA_SE_VO_LI_FALL_L); } @@ -14893,7 +15240,7 @@ void func_808520BC(PlayState* play, Player* this, CsCmdActorAction* arg2) { this->actor.world.pos.z = distZ * sp4 + startZ; } -static struct_80832924 D_808551D8[] = { +static AnimSfxEntry D_808551D8[] = { { NA_SE_PL_BOUND, 0x1014 }, { NA_SE_PL_BOUND, -0x101E }, }; @@ -14901,7 +15248,7 @@ static struct_80832924 D_808551D8[] = { void func_80852174(PlayState* play, Player* this, CsCmdActorAction* arg2) { func_808520BC(play, this, arg2); LinkAnimation_Update(play, &this->skelAnime); - func_80832924(this, D_808551D8); + Player_ProcessAnimSfxList(this, D_808551D8); } void func_808521B8(PlayState* play, Player* this, CsCmdActorAction* arg2) { @@ -14912,7 +15259,7 @@ void func_808521B8(PlayState* play, Player* this, CsCmdActorAction* arg2) { } void func_808521F4(PlayState* play, Player* this, CsCmdActorAction* arg2) { - func_80832B0C(play, this, D_80853914[PLAYER_ANIMGROUP_nwait][this->modelAnimType]); + Player_AnimChangeOnceMorph(play, this, GET_PLAYER_ANIM(PLAYER_ANIMGROUP_nwait, this->modelAnimType)); Player_ZeroSpeedXZ(this); } @@ -14921,7 +15268,7 @@ void func_80852234(PlayState* play, Player* this, CsCmdActorAction* arg2) { } void func_8085225C(PlayState* play, Player* this, CsCmdActorAction* arg2) { - func_80832F54(play, this, 0x98); + Player_AnimReplaceApplyFlags(play, this, 0x98); } void func_80852280(PlayState* play, Player* this, CsCmdActorAction* arg2) { @@ -14930,7 +15277,7 @@ void func_80852280(PlayState* play, Player* this, CsCmdActorAction* arg2) { void func_80852298(PlayState* play, Player* this, CsCmdActorAction* arg2) { if (LinkAnimation_Update(play, &this->skelAnime)) { - func_8083313C(play, this, &gPlayerAnim_clink_demo_koutai_wait); + Player_AnimReplaceNormalPlayLoopAdjusted(play, this, &gPlayerAnim_clink_demo_koutai_wait); this->unk_850 = 1; } else if (this->unk_850 == 0) { if (LinkAnimation_OnFrame(&this->skelAnime, 10.0f)) { @@ -14939,7 +15286,7 @@ void func_80852298(PlayState* play, Player* this, CsCmdActorAction* arg2) { } } -static struct_80832924 D_808551E0[] = { +static AnimSfxEntry D_808551E0[] = { { 0, 0x300A }, { 0, -0x3018 }, }; @@ -14948,7 +15295,7 @@ void func_80852328(PlayState* play, Player* this, CsCmdActorAction* arg2) { func_80851F14(play, this, &gPlayerAnim_link_demo_furimuki2_wait, D_808551E0); } -static struct_80832924 D_808551E8[] = { +static AnimSfxEntry D_808551E8[] = { { 0, 0x400F }, { 0, -0x4023 }, }; @@ -14959,7 +15306,7 @@ void func_80852358(PlayState* play, Player* this, CsCmdActorAction* arg2) { void func_80852388(PlayState* play, Player* this, CsCmdActorAction* arg2) { if (LinkAnimation_Update(play, &this->skelAnime)) { - func_808322A4(play, this, &gPlayerAnim_demo_link_twait); + Player_AnimPlayLoopAdjusted(play, this, &gPlayerAnim_demo_link_twait); this->unk_850 = 1; } @@ -14970,14 +15317,14 @@ void func_80852388(PlayState* play, Player* this, CsCmdActorAction* arg2) { } } -void func_80852414(PlayState* play, Player* this, LinkAnimationHeader* anim, struct_80832924* arg3) { +void func_80852414(PlayState* play, Player* this, LinkAnimationHeader* anim, AnimSfxEntry* arg3) { func_80851294(play, this, anim); if (this->unk_850 == 0) { - func_80832924(this, arg3); + Player_ProcessAnimSfxList(this, arg3); } } -static struct_80832924 D_808551F0[] = { +static AnimSfxEntry D_808551F0[] = { { 0, 0x300F }, { 0, -0x3021 }, }; @@ -14986,7 +15333,7 @@ void func_80852450(PlayState* play, Player* this, CsCmdActorAction* arg2) { func_80852414(play, this, &gPlayerAnim_clink_demo_koutai_wait, D_808551F0); } -static struct_80832924 D_808551F8[] = { +static AnimSfxEntry D_808551F8[] = { { NA_SE_PL_KNOCK, -0x84E }, }; @@ -15019,7 +15366,7 @@ void func_80852564(PlayState* play, Player* this, CsCmdActorAction* arg2) { this->linearVelocity = 2.0f; this->actor.velocity.y = -1.0f; - func_80832264(play, this, &gPlayerAnim_link_normal_back_downA); + Player_AnimPlayOnce(play, this, &gPlayerAnim_link_normal_back_downA); func_80832698(this, NA_SE_VO_LI_FALL_L); } @@ -15035,7 +15382,7 @@ void func_808525C0(PlayState* play, Player* this, CsCmdActorAction* arg2) { void func_80852608(PlayState* play, Player* this, CsCmdActorAction* arg2) { func_80846720(play, this, 0); - func_808322D0(play, this, &gPlayerAnim_link_demo_return_to_past); + Player_AnimPlayOnceAdjusted(play, this, &gPlayerAnim_link_demo_return_to_past); } void func_80852648(PlayState* play, Player* this, CsCmdActorAction* arg2) { @@ -15131,7 +15478,7 @@ void func_80852944(PlayState* play, Player* this, CsCmdActorAction* arg2) { } } - this->csMode = 0; + this->csAction = 0; this->unk_6AD = 0; } @@ -15157,7 +15504,7 @@ void func_80852A54(PlayState* play, Player* this, CsCmdActorAction* arg2) { } this->skelAnime.moveFlags = 0; - func_80832DB0(this); + Player_ZeroRootLimbYaw(this); } void func_80852B4C(PlayState* play, Player* this, CsCmdActorAction* arg2, struct_80854B18* arg3) { @@ -15173,9 +15520,9 @@ void func_80852B4C(PlayState* play, Player* this, CsCmdActorAction* arg2, struct } } -void func_80852C0C(PlayState* play, Player* this, s32 csMode) { - if ((csMode != 1) && (csMode != 8) && (csMode != 0x31) && (csMode != 7)) { - func_808323B4(play, this); +void func_80852C0C(PlayState* play, Player* this, s32 csAction) { + if ((csAction != 1) && (csAction != 8) && (csAction != 0x31) && (csAction != 7)) { + Player_DetachHeldActor(play, this); } } @@ -15186,7 +15533,7 @@ void func_80852C50(PlayState* play, Player* this, CsCmdActorAction* arg2) { if (play->csCtx.state == CS_STATE_UNSKIPPABLE_INIT) { func_8002DF54(play, NULL, 7); - this->unk_446 = 0; + this->cueId = 0; Player_ZeroSpeedXZ(this); return; } @@ -15196,7 +15543,7 @@ void func_80852C50(PlayState* play, Player* this, CsCmdActorAction* arg2) { return; } - if (this->unk_446 != linkCsAction->action) { + if (this->cueId != linkCsAction->action) { sp24 = D_808547C4[linkCsAction->action]; if (sp24 >= 0) { if ((sp24 == 3) || (sp24 == 4)) { @@ -15215,10 +15562,10 @@ void func_80852C50(PlayState* play, Player* this, CsCmdActorAction* arg2) { this->unk_850 = 0; this->unk_84F = 0; - this->unk_446 = linkCsAction->action; + this->cueId = linkCsAction->action; } - sp24 = D_808547C4[this->unk_446]; + sp24 = D_808547C4[this->cueId]; func_80852B4C(play, this, linkCsAction, &D_80854E50[ABS(sp24)]); if (CVarGetInteger("gFixEyesOpenWhileSleeping", 0) && (play->csCtx.linkAction->action == 28 || play->csCtx.linkAction->action == 29)) { @@ -15227,30 +15574,30 @@ void func_80852C50(PlayState* play, Player* this, CsCmdActorAction* arg2) { } void func_80852E14(Player* this, PlayState* play) { - if (this->csMode != this->prevCsMode) { + if (this->csAction != this->prevCsAction) { D_80858AA0 = this->skelAnime.moveFlags; func_80832DBC(this); - this->prevCsMode = this->csMode; - osSyncPrintf("DEMO MODE=%d\n", this->csMode); - func_80852C0C(play, this, this->csMode); - func_80852B4C(play, this, NULL, &D_80854B18[this->csMode]); + this->prevCsAction = this->csAction; + osSyncPrintf("DEMO MODE=%d\n", this->csAction); + func_80852C0C(play, this, this->csAction); + func_80852B4C(play, this, NULL, &D_80854B18[this->csAction]); } - func_80852B4C(play, this, NULL, &D_80854E50[this->csMode]); + func_80852B4C(play, this, NULL, &D_80854E50[this->csAction]); } s32 Player_IsDroppingFish(PlayState* play) { Player* this = GET_PLAYER(play); - return (func_8084EFC0 == this->func_674) && (this->itemAction == PLAYER_IA_BOTTLE_FISH); + return (func_8084EFC0 == this->actionFunc) && (this->itemAction == PLAYER_IA_BOTTLE_FISH); } s32 Player_StartFishing(PlayState* play) { Player* this = GET_PLAYER(play); func_80832564(play, this); - func_80835F44(play, this, ITEM_FISHING_POLE); + Player_UseItem(play, this, ITEM_FISHING_POLE); return 1; } @@ -15258,8 +15605,8 @@ s32 func_80852F38(PlayState* play, Player* this) { if (!Player_InBlockingCsMode(play, this) && (this->invincibilityTimer >= 0) && !func_8008F128(this) && !(this->stateFlags3 & PLAYER_STATE3_HOOKSHOT_TRAVELLING)) { func_80832564(play, this); - func_80835C58(play, this, func_8084F308, 0); - func_80832264(play, this, &gPlayerAnim_link_normal_re_dead_attack); + Player_SetupAction(play, this, func_8084F308, 0); + Player_AnimPlayOnce(play, this, &gPlayerAnim_link_normal_re_dead_attack); this->stateFlags2 |= PLAYER_STATE2_GRABBED_BY_ENEMY; func_80832224(this); func_80832698(this, NA_SE_VO_LI_HELD); @@ -15269,15 +15616,22 @@ s32 func_80852F38(PlayState* play, Player* this) { return false; } -// Sets up player cutscene -s32 func_80852FFC(PlayState* play, Actor* actor, s32 csMode) { +/** + * Tries to starts a cutscene action specified by `csAction`. + * A cutscene action will only start if player is not already in another form of cutscene. + * + * No actors will be halted over the duration of the cutscene action. + * + * @return true if successful starting a `csAction`, false if not + */ +s32 Player_TryCsAction(PlayState* play, Actor* actor, s32 csAction) { Player* this = GET_PLAYER(play); if (!Player_InBlockingCsMode(play, this)) { func_80832564(play, this); - func_80835C58(play, this, func_80852E14, 0); - this->csMode = csMode; - this->unk_448 = actor; + Player_SetupAction(play, this, func_80852E14, 0); + this->csAction = csAction; + this->csActor = actor; func_80832224(this); return 1; } @@ -15286,8 +15640,8 @@ s32 func_80852FFC(PlayState* play, Actor* actor, s32 csMode) { } void func_80853080(Player* this, PlayState* play) { - func_80835C58(play, this, func_80840BC8, 1); - func_80832B0C(play, this, func_80833338(this)); + Player_SetupAction(play, this, func_80840BC8, 1); + Player_AnimChangeOnceMorph(play, this, func_80833338(this)); this->currentYaw = this->actor.shape.rot.y; } @@ -15341,26 +15695,26 @@ void func_80853148(PlayState* play, Actor* actor) { } else { if (func_808332B8(this)) { func_80836898(play, this, func_8083A2F8); - func_80832C6C(play, this, &gPlayerAnim_link_swimer_swim_wait); + Player_AnimChangeLoopSlowMorph(play, this, &gPlayerAnim_link_swimer_swim_wait); } else if ((actor->category != ACTORCAT_NPC) || (this->heldItemAction == PLAYER_IA_FISHING_POLE)) { func_8083A2F8(play, this); if (!func_8008E9C4(this)) { if ((actor != this->naviActor) && (actor->xzDistToPlayer < 40.0f)) { - func_808322D0(play, this, &gPlayerAnim_link_normal_backspace); + Player_AnimPlayOnceAdjusted(play, this, &gPlayerAnim_link_normal_backspace); } else { - func_80832284(play, this, func_80833338(this)); + Player_AnimPlayLoop(play, this, func_80833338(this)); } } } else { func_80836898(play, this, func_8083A2F8); - func_808322D0(play, this, + Player_AnimPlayOnceAdjusted(play, this, (actor->xzDistToPlayer < 40.0f) ? &gPlayerAnim_link_normal_backspace : &gPlayerAnim_link_normal_talk_free); } if (this->skelAnime.animation == &gPlayerAnim_link_normal_backspace) { - func_80832F54(play, this, 0x19); + Player_AnimReplaceApplyFlags(play, this, 0x19); } func_80832224(this); From b39e6ec5afd63e9351bbc0290f7e58d0b4d10112 Mon Sep 17 00:00:00 2001 From: briaguya <70942617+briaguya-ai@users.noreply.github.com> Date: Wed, 29 Nov 2023 02:27:19 -0500 Subject: [PATCH 018/113] bump to latest lus main --- libultraship | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libultraship b/libultraship index 1b41afa9e..4600eedcc 160000 --- a/libultraship +++ b/libultraship @@ -1 +1 @@ -Subproject commit 1b41afa9eaedb19a9073f5dd1eca2cda4dea59c8 +Subproject commit 4600eedcc18f496319c99e07b8b2b4f11a0f6e64 From 1fea642f337ef1424d2aa1068d485c01ab31af10 Mon Sep 17 00:00:00 2001 From: Garrett Cox Date: Mon, 4 Dec 2023 13:26:55 +0000 Subject: [PATCH 019/113] Fix OnItemReceive hook for items in the extendedVanillaGetItem table (#3063) --- soh/soh/OTRGlobals.cpp | 44 ++++++++++++++++++++++++++++++++------ soh/soh/OTRGlobals.h | 3 ++- soh/src/code/z_parameter.c | 32 +++++++++++++++++++-------- 3 files changed, 63 insertions(+), 16 deletions(-) diff --git a/soh/soh/OTRGlobals.cpp b/soh/soh/OTRGlobals.cpp index 7bf6785a5..177a43834 100644 --- a/soh/soh/OTRGlobals.cpp +++ b/soh/soh/OTRGlobals.cpp @@ -665,7 +665,7 @@ extern "C" void VanillaItemTable_Init() { } } -std::unordered_map ItemIDtoGetItemID{ +std::unordered_map ItemIDtoGetItemIDMap { { ITEM_ARROWS_LARGE, GI_ARROWS_LARGE }, { ITEM_ARROWS_MEDIUM, GI_ARROWS_MEDIUM }, { ITEM_ARROWS_SMALL, GI_ARROWS_SMALL }, @@ -695,7 +695,8 @@ std::unordered_map ItemIDtoGetItemID{ { ITEM_BUG, GI_BUGS }, { ITEM_BULLET_BAG_30, GI_BULLET_BAG_30 }, { ITEM_BULLET_BAG_40, GI_BULLET_BAG_40 }, - { ITEM_BULLET_BAG_50, GI_BULLET_BAG_50 }, { ITEM_CHICKEN, GI_CHICKEN }, + { ITEM_BULLET_BAG_50, GI_BULLET_BAG_50 }, + { ITEM_CHICKEN, GI_CHICKEN }, { ITEM_CLAIM_CHECK, GI_CLAIM_CHECK }, { ITEM_COJIRO, GI_COJIRO }, { ITEM_COMPASS, GI_COMPASS }, @@ -791,11 +792,42 @@ std::unordered_map ItemIDtoGetItemID{ { ITEM_WEIRD_EGG, GI_WEIRD_EGG } }; -extern "C" int32_t GetGIID(uint32_t itemID) { - if (ItemIDtoGetItemID.contains(itemID)) { - return ItemIDtoGetItemID.at(itemID); +extern "C" GetItemID RetrieveGetItemIDFromItemID(ItemID itemID) { + if (ItemIDtoGetItemIDMap.contains(itemID)) { + return ItemIDtoGetItemIDMap.at(itemID); } - return -1; + return GI_MAX; +} + +std::unordered_map ItemIDtoRandomizerGetMap { + { ITEM_SONG_MINUET, RG_MINUET_OF_FOREST }, + { ITEM_SONG_BOLERO, RG_BOLERO_OF_FIRE }, + { ITEM_SONG_SERENADE, RG_SERENADE_OF_WATER }, + { ITEM_SONG_REQUIEM, RG_REQUIEM_OF_SPIRIT }, + { ITEM_SONG_NOCTURNE, RG_NOCTURNE_OF_SHADOW }, + { ITEM_SONG_PRELUDE, RG_PRELUDE_OF_LIGHT }, + { ITEM_SONG_LULLABY, RG_ZELDAS_LULLABY }, + { ITEM_SONG_EPONA, RG_EPONAS_SONG }, + { ITEM_SONG_SARIA, RG_SARIAS_SONG }, + { ITEM_SONG_SUN, RG_SUNS_SONG }, + { ITEM_SONG_TIME, RG_SONG_OF_TIME }, + { ITEM_SONG_STORMS, RG_SONG_OF_STORMS }, + { ITEM_MEDALLION_FOREST, RG_FOREST_MEDALLION }, + { ITEM_MEDALLION_FIRE, RG_FIRE_MEDALLION }, + { ITEM_MEDALLION_WATER, RG_WATER_MEDALLION }, + { ITEM_MEDALLION_SPIRIT, RG_SPIRIT_MEDALLION }, + { ITEM_MEDALLION_SHADOW, RG_SHADOW_MEDALLION }, + { ITEM_MEDALLION_LIGHT, RG_LIGHT_MEDALLION }, + { ITEM_KOKIRI_EMERALD, RG_KOKIRI_EMERALD }, + { ITEM_GORON_RUBY, RG_GORON_RUBY }, + { ITEM_ZORA_SAPPHIRE, RG_ZORA_SAPPHIRE }, +}; + +extern "C" RandomizerGet RetrieveRandomizerGetFromItemID(ItemID itemID) { + if (ItemIDtoRandomizerGetMap.contains(itemID)) { + return ItemIDtoRandomizerGetMap.at(itemID); + } + return RG_MAX; } extern "C" void OTRExtScanner() { diff --git a/soh/soh/OTRGlobals.h b/soh/soh/OTRGlobals.h index 403d493f5..48cd0cd48 100644 --- a/soh/soh/OTRGlobals.h +++ b/soh/soh/OTRGlobals.h @@ -180,7 +180,8 @@ void SaveManager_ThreadPoolWait(); void CheckTracker_OnMessageClose(); void SoH_ProcessDroppedFiles(); -int32_t GetGIID(uint32_t itemID); +GetItemID RetrieveGetItemIDFromItemID(ItemID itemID); +RandomizerGet RetrieveRandomizerGetFromItemID(ItemID itemID); #endif #ifdef __cplusplus diff --git a/soh/src/code/z_parameter.c b/soh/src/code/z_parameter.c index d7675fd90..552d28e73 100644 --- a/soh/src/code/z_parameter.c +++ b/soh/src/code/z_parameter.c @@ -1804,12 +1804,22 @@ u8 Return_Item(u8 itemID, ModIndex modId, ItemID returnItem) { GetItemEntry gie = { ITEM_SOLD_OUT, 0, 0, 0, 0, 0, 0, 0, false, ITEM_FROM_NPC, ITEM_CATEGORY_LESSER, NULL }; return Return_Item_Entry(gie, returnItem); } - int32_t get = GetGIID(itemID); - if (get == -1) { - modId = MOD_RANDOMIZER; - get = itemID; + + GetItemID getItemID = RetrieveGetItemIDFromItemID(itemID); + if (getItemID != GI_MAX) { + // Vanilla ItemID with an associated GetItemID + return Return_Item_Entry(ItemTable_RetrieveEntry(modId, getItemID), returnItem); } - return Return_Item_Entry(ItemTable_RetrieveEntry(modId, get), returnItem); + + RandomizerGet randomizerGet = RetrieveRandomizerGetFromItemID(itemID); + if (randomizerGet != RG_MAX) { + // Vanilla ItemID with an associated RandomizerGet (These are items in extendedVanillaGetItemTable) + return Return_Item_Entry(ItemTable_RetrieveEntry(MOD_RANDOMIZER, randomizerGet), returnItem); + } + + // All randomizer items should go through Randomizer_Item_Give, so this should never be reached + // but leaving this here just in case, as it was in the original behavior + return Return_Item_Entry(ItemTable_RetrieveEntry(MOD_RANDOMIZER, itemID), returnItem); } /** @@ -6556,11 +6566,15 @@ void Interface_Update(PlayState* play) { gSaveContext.pendingSale = ITEM_NONE; gSaveContext.pendingSaleMod = MOD_NONE; if (tempSaleMod == MOD_NONE) { - s16 giid = GetGIID(tempSaleItem); - if (giid == -1) { - tempSaleMod = MOD_RANDOMIZER; + GetItemID getItemID = RetrieveGetItemIDFromItemID(tempSaleItem); + RandomizerGet randomizerGet = RetrieveRandomizerGetFromItemID(tempSaleItem); + if (getItemID != GI_MAX) { + tempSaleItem = getItemID; } else { - tempSaleItem = giid; + if (randomizerGet != RG_MAX) { + tempSaleItem = randomizerGet; + } + tempSaleMod = MOD_RANDOMIZER; } } GameInteractor_ExecuteOnSaleEndHooks(ItemTable_RetrieveEntry(tempSaleMod, tempSaleItem)); From 365afe78338c9cd85c93e8590781eb4f0b8eb70c Mon Sep 17 00:00:00 2001 From: Garrett Cox Date: Mon, 4 Dec 2023 13:52:39 +0000 Subject: [PATCH 020/113] Add tableId to getItemEntry (#3064) --- .../Enhancements/item-tables/ItemTableTypes.h | 10 +++-- .../Enhancements/randomizer/randomizer.cpp | 42 +++++++++---------- .../Enhancements/randomizer/randomizerTypes.h | 9 +++- soh/src/code/z_parameter.c | 2 +- 4 files changed, 37 insertions(+), 26 deletions(-) diff --git a/soh/soh/Enhancements/item-tables/ItemTableTypes.h b/soh/soh/Enhancements/item-tables/ItemTableTypes.h index f16762db9..6282275b1 100644 --- a/soh/soh/Enhancements/item-tables/ItemTableTypes.h +++ b/soh/soh/Enhancements/item-tables/ItemTableTypes.h @@ -30,10 +30,13 @@ typedef enum GetItemCategory { } GetItemCategory; #define GET_ITEM(itemId, objectId, drawId, textId, field, chestAnim, itemCategory, modIndex, getItemId) \ - { itemId, field, (chestAnim != CHEST_ANIM_SHORT ? 1 : -1) * (drawId + 1), textId, objectId, modIndex, getItemId, drawId, true, ITEM_FROM_NPC, itemCategory, NULL } + { itemId, field, (chestAnim != CHEST_ANIM_SHORT ? 1 : -1) * (drawId + 1), textId, objectId, modIndex, modIndex, getItemId, drawId, true, ITEM_FROM_NPC, itemCategory, NULL } + +#define GET_ITEM_CUSTOM_TABLE(itemId, objectId, drawId, textId, field, chestAnim, itemCategory, modIndex, tableId, getItemId) \ + { itemId, field, (chestAnim != CHEST_ANIM_SHORT ? 1 : -1) * (drawId + 1), textId, objectId, modIndex, tableId, getItemId, drawId, true, ITEM_FROM_NPC, itemCategory, NULL } #define GET_ITEM_NONE \ - { ITEM_NONE, 0, 0, 0, 0, 0, 0, 0, false, ITEM_FROM_NPC, ITEM_CATEGORY_JUNK, NULL } + { ITEM_NONE, 0, 0, 0, 0, 0, 0, 0, 0, false, ITEM_FROM_NPC, ITEM_CATEGORY_JUNK, NULL } typedef struct PlayState PlayState; typedef struct GetItemEntry GetItemEntry; @@ -46,7 +49,8 @@ typedef struct GetItemEntry { /* 0x02 */ int16_t gi; // defines the draw id and chest opening animation /* 0x03 */ uint16_t textId; /* 0x04 */ uint16_t objectId; - /* 0x06 */ uint16_t modIndex; // 0 = Vanilla, 1 = Randomizer, future mods will increment up? + /* 0x06 */ uint16_t modIndex; // Primarily used for determining whether to use Item_Give or Randomizer_Item_Give + /* 0x07 */ uint16_t tableId; // GetItemEntry table this entry is in (usually the same as modIndex, but not always) /* 0x08 */ int16_t getItemId; /* 0x0A */ uint16_t gid; // Stores the GID value unmodified for future reference. /* 0x0C */ uint16_t collectable; // determines whether the item can be collected on the overworld. Will be true in most cases. diff --git a/soh/soh/Enhancements/randomizer/randomizer.cpp b/soh/soh/Enhancements/randomizer/randomizer.cpp index acc97cd34..ccebd33d9 100644 --- a/soh/soh/Enhancements/randomizer/randomizer.cpp +++ b/soh/soh/Enhancements/randomizer/randomizer.cpp @@ -6138,30 +6138,30 @@ class ExtendedVanillaTableInvalidItemIdException: public std::exception { void InitRandoItemTable() { // These entries have ItemIDs from vanilla, but not GetItemIDs or entries in the old sGetItemTable static GetItemEntry extendedVanillaGetItemTable[] = { - GET_ITEM(ITEM_MEDALLION_LIGHT, OBJECT_GI_MEDAL, GID_MEDALLION_LIGHT, 0x40, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_NONE, RG_LIGHT_MEDALLION), - GET_ITEM(ITEM_MEDALLION_FOREST, OBJECT_GI_MEDAL, GID_MEDALLION_FOREST, 0x3E, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_NONE, RG_FOREST_MEDALLION), - GET_ITEM(ITEM_MEDALLION_FIRE, OBJECT_GI_MEDAL, GID_MEDALLION_FIRE, 0x3C, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_NONE, RG_FIRE_MEDALLION), - GET_ITEM(ITEM_MEDALLION_WATER, OBJECT_GI_MEDAL, GID_MEDALLION_WATER, 0x3D, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_NONE, RG_WATER_MEDALLION), - GET_ITEM(ITEM_MEDALLION_SHADOW, OBJECT_GI_MEDAL, GID_MEDALLION_SHADOW, 0x41, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_NONE, RG_SHADOW_MEDALLION), - GET_ITEM(ITEM_MEDALLION_SPIRIT, OBJECT_GI_MEDAL, GID_MEDALLION_SPIRIT, 0x3F, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_NONE, RG_SPIRIT_MEDALLION), + GET_ITEM_CUSTOM_TABLE(ITEM_MEDALLION_LIGHT, OBJECT_GI_MEDAL, GID_MEDALLION_LIGHT, 0x40, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_NONE, TABLE_RANDOMIZER, RG_LIGHT_MEDALLION), + GET_ITEM_CUSTOM_TABLE(ITEM_MEDALLION_FOREST, OBJECT_GI_MEDAL, GID_MEDALLION_FOREST, 0x3E, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_NONE, TABLE_RANDOMIZER, RG_FOREST_MEDALLION), + GET_ITEM_CUSTOM_TABLE(ITEM_MEDALLION_FIRE, OBJECT_GI_MEDAL, GID_MEDALLION_FIRE, 0x3C, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_NONE, TABLE_RANDOMIZER, RG_FIRE_MEDALLION), + GET_ITEM_CUSTOM_TABLE(ITEM_MEDALLION_WATER, OBJECT_GI_MEDAL, GID_MEDALLION_WATER, 0x3D, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_NONE, TABLE_RANDOMIZER, RG_WATER_MEDALLION), + GET_ITEM_CUSTOM_TABLE(ITEM_MEDALLION_SHADOW, OBJECT_GI_MEDAL, GID_MEDALLION_SHADOW, 0x41, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_NONE, TABLE_RANDOMIZER, RG_SHADOW_MEDALLION), + GET_ITEM_CUSTOM_TABLE(ITEM_MEDALLION_SPIRIT, OBJECT_GI_MEDAL, GID_MEDALLION_SPIRIT, 0x3F, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_NONE, TABLE_RANDOMIZER, RG_SPIRIT_MEDALLION), - GET_ITEM(ITEM_KOKIRI_EMERALD, OBJECT_GI_JEWEL, GID_KOKIRI_EMERALD, 0x80, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_NONE, RG_KOKIRI_EMERALD), - GET_ITEM(ITEM_GORON_RUBY, OBJECT_GI_JEWEL, GID_GORON_RUBY, 0x81, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_NONE, RG_GORON_RUBY), - GET_ITEM(ITEM_ZORA_SAPPHIRE, OBJECT_GI_JEWEL, GID_ZORA_SAPPHIRE, 0x82, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_NONE, RG_ZORA_SAPPHIRE), + GET_ITEM_CUSTOM_TABLE(ITEM_KOKIRI_EMERALD, OBJECT_GI_JEWEL, GID_KOKIRI_EMERALD, 0x80, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_NONE, TABLE_RANDOMIZER, RG_KOKIRI_EMERALD), + GET_ITEM_CUSTOM_TABLE(ITEM_GORON_RUBY, OBJECT_GI_JEWEL, GID_GORON_RUBY, 0x81, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_NONE, TABLE_RANDOMIZER, RG_GORON_RUBY), + GET_ITEM_CUSTOM_TABLE(ITEM_ZORA_SAPPHIRE, OBJECT_GI_JEWEL, GID_ZORA_SAPPHIRE, 0x82, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_NONE, TABLE_RANDOMIZER, RG_ZORA_SAPPHIRE), - GET_ITEM(ITEM_SONG_LULLABY, OBJECT_GI_MELODY, GID_SONG_ZELDA, 0xD4, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_NONE, RG_ZELDAS_LULLABY), - GET_ITEM(ITEM_SONG_SUN, OBJECT_GI_MELODY, GID_SONG_SUN, 0xD3, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_NONE, RG_SUNS_SONG), - GET_ITEM(ITEM_SONG_EPONA, OBJECT_GI_MELODY, GID_SONG_EPONA, 0xD2, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_NONE, RG_EPONAS_SONG), - GET_ITEM(ITEM_SONG_STORMS, OBJECT_GI_MELODY, GID_SONG_STORM, 0xD6, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_NONE, RG_SONG_OF_STORMS), - GET_ITEM(ITEM_SONG_TIME, OBJECT_GI_MELODY, GID_SONG_TIME, 0xD5, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_NONE, RG_SONG_OF_TIME), - GET_ITEM(ITEM_SONG_SARIA, OBJECT_GI_MELODY, GID_SONG_SARIA, 0xD1, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_NONE, RG_SARIAS_SONG), + GET_ITEM_CUSTOM_TABLE(ITEM_SONG_LULLABY, OBJECT_GI_MELODY, GID_SONG_ZELDA, 0xD4, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_NONE, TABLE_RANDOMIZER, RG_ZELDAS_LULLABY), + GET_ITEM_CUSTOM_TABLE(ITEM_SONG_SUN, OBJECT_GI_MELODY, GID_SONG_SUN, 0xD3, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_NONE, TABLE_RANDOMIZER, RG_SUNS_SONG), + GET_ITEM_CUSTOM_TABLE(ITEM_SONG_EPONA, OBJECT_GI_MELODY, GID_SONG_EPONA, 0xD2, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_NONE, TABLE_RANDOMIZER, RG_EPONAS_SONG), + GET_ITEM_CUSTOM_TABLE(ITEM_SONG_STORMS, OBJECT_GI_MELODY, GID_SONG_STORM, 0xD6, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_NONE, TABLE_RANDOMIZER, RG_SONG_OF_STORMS), + GET_ITEM_CUSTOM_TABLE(ITEM_SONG_TIME, OBJECT_GI_MELODY, GID_SONG_TIME, 0xD5, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_NONE, TABLE_RANDOMIZER, RG_SONG_OF_TIME), + GET_ITEM_CUSTOM_TABLE(ITEM_SONG_SARIA, OBJECT_GI_MELODY, GID_SONG_SARIA, 0xD1, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_NONE, TABLE_RANDOMIZER, RG_SARIAS_SONG), - GET_ITEM(ITEM_SONG_MINUET, OBJECT_GI_MELODY, GID_SONG_MINUET, 0x73, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_NONE, RG_MINUET_OF_FOREST), - GET_ITEM(ITEM_SONG_BOLERO, OBJECT_GI_MELODY, GID_SONG_BOLERO, 0x74, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_NONE, RG_BOLERO_OF_FIRE), - GET_ITEM(ITEM_SONG_SERENADE, OBJECT_GI_MELODY, GID_SONG_SERENADE, 0x75, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_NONE, RG_SERENADE_OF_WATER), - GET_ITEM(ITEM_SONG_NOCTURNE, OBJECT_GI_MELODY, GID_SONG_NOCTURNE, 0x77, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_NONE, RG_NOCTURNE_OF_SHADOW), - GET_ITEM(ITEM_SONG_REQUIEM, OBJECT_GI_MELODY, GID_SONG_REQUIEM, 0x76, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_NONE, RG_REQUIEM_OF_SPIRIT), - GET_ITEM(ITEM_SONG_PRELUDE, OBJECT_GI_MELODY, GID_SONG_PRELUDE, 0x78, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_NONE, RG_PRELUDE_OF_LIGHT), + GET_ITEM_CUSTOM_TABLE(ITEM_SONG_MINUET, OBJECT_GI_MELODY, GID_SONG_MINUET, 0x73, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_NONE, TABLE_RANDOMIZER, RG_MINUET_OF_FOREST), + GET_ITEM_CUSTOM_TABLE(ITEM_SONG_BOLERO, OBJECT_GI_MELODY, GID_SONG_BOLERO, 0x74, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_NONE, TABLE_RANDOMIZER, RG_BOLERO_OF_FIRE), + GET_ITEM_CUSTOM_TABLE(ITEM_SONG_SERENADE, OBJECT_GI_MELODY, GID_SONG_SERENADE, 0x75, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_NONE, TABLE_RANDOMIZER, RG_SERENADE_OF_WATER), + GET_ITEM_CUSTOM_TABLE(ITEM_SONG_NOCTURNE, OBJECT_GI_MELODY, GID_SONG_NOCTURNE, 0x77, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_NONE, TABLE_RANDOMIZER, RG_NOCTURNE_OF_SHADOW), + GET_ITEM_CUSTOM_TABLE(ITEM_SONG_REQUIEM, OBJECT_GI_MELODY, GID_SONG_REQUIEM, 0x76, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_NONE, TABLE_RANDOMIZER, RG_REQUIEM_OF_SPIRIT), + GET_ITEM_CUSTOM_TABLE(ITEM_SONG_PRELUDE, OBJECT_GI_MELODY, GID_SONG_PRELUDE, 0x78, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_NONE, TABLE_RANDOMIZER, RG_PRELUDE_OF_LIGHT), }; // These do not have ItemIDs or GetItemIDs from vanilla, so I'm using their diff --git a/soh/soh/Enhancements/randomizer/randomizerTypes.h b/soh/soh/Enhancements/randomizer/randomizerTypes.h index ce0659170..5437de269 100644 --- a/soh/soh/Enhancements/randomizer/randomizerTypes.h +++ b/soh/soh/Enhancements/randomizer/randomizerTypes.h @@ -9,7 +9,14 @@ // This should probably go in a less rando-specific location // but the best location will probably be in the modding engine // which doesn't exist yet. -typedef enum { MOD_NONE, MOD_RANDOMIZER } ModIndex; +typedef enum { + MOD_NONE, + MOD_RANDOMIZER +} ModIndex; +typedef enum { + TABLE_VANILLA = MOD_NONE, + TABLE_RANDOMIZER = MOD_RANDOMIZER +} TableIndex; typedef struct { char tex[512]; diff --git a/soh/src/code/z_parameter.c b/soh/src/code/z_parameter.c index 552d28e73..3bc7c9c6a 100644 --- a/soh/src/code/z_parameter.c +++ b/soh/src/code/z_parameter.c @@ -1801,7 +1801,7 @@ u8 Return_Item_Entry(GetItemEntry itemEntry, ItemID returnItem ) { u8 Return_Item(u8 itemID, ModIndex modId, ItemID returnItem) { // ITEM_SOLD_OUT doesn't have an ItemTable entry, so pass custom entry instead if (itemID == ITEM_SOLD_OUT) { - GetItemEntry gie = { ITEM_SOLD_OUT, 0, 0, 0, 0, 0, 0, 0, false, ITEM_FROM_NPC, ITEM_CATEGORY_LESSER, NULL }; + GetItemEntry gie = { ITEM_SOLD_OUT, 0, 0, 0, 0, 0, 0, 0, 0, false, ITEM_FROM_NPC, ITEM_CATEGORY_LESSER, NULL }; return Return_Item_Entry(gie, returnItem); } From 6297df98e976c615e6f70bf129c0b3b0b60f9a6f Mon Sep 17 00:00:00 2001 From: aMannus Date: Mon, 4 Dec 2023 15:22:35 +0100 Subject: [PATCH 021/113] Fix GBK check for vanilla (#3473) --- soh/soh/Enhancements/mods.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/soh/soh/Enhancements/mods.cpp b/soh/soh/Enhancements/mods.cpp index 13d90a393..039d11f16 100644 --- a/soh/soh/Enhancements/mods.cpp +++ b/soh/soh/Enhancements/mods.cpp @@ -659,7 +659,7 @@ void RegisterTriforceHunt() { void RegisterGrantGanonsBossKey() { GameInteractor::Instance->RegisterGameHook([]() { // Triforce Hunt needs the check if the player isn't being teleported to the credits scene. - if (!GameInteractor::IsGameplayPaused() && + if (!GameInteractor::IsGameplayPaused() && IS_RANDO && Flags_GetRandomizerInf(RAND_INF_GRANT_GANONS_BOSSKEY) && gPlayState->transitionTrigger != TRANS_TRIGGER_START && (1 << 0 & gSaveContext.inventory.dungeonItems[SCENE_GANONS_TOWER]) == 0) { GetItemEntry getItemEntry = From 2d22a3ebcc9d735eeccc4df6eb6e78a4a31cfb91 Mon Sep 17 00:00:00 2001 From: Garrett Cox Date: Mon, 4 Dec 2023 17:29:48 +0000 Subject: [PATCH 022/113] Add vanilla logic option (#2191) --- .../Enhancements/randomizer/3drando/fill.cpp | 2 + .../randomizer/3drando/item_location.cpp | 8 +- .../Enhancements/randomizer/3drando/menu.cpp | 19 ++-- .../randomizer/3drando/settings.cpp | 96 ++++++++++++++----- .../randomizer/3drando/settings.hpp | 7 +- .../Enhancements/randomizer/randomizer.cpp | 52 +++++++--- .../Enhancements/randomizer/randomizerTypes.h | 1 + .../randomizer/randomizer_check_tracker.cpp | 2 +- 8 files changed, 136 insertions(+), 51 deletions(-) diff --git a/soh/soh/Enhancements/randomizer/3drando/fill.cpp b/soh/soh/Enhancements/randomizer/3drando/fill.cpp index f9d3a9592..7063a3191 100644 --- a/soh/soh/Enhancements/randomizer/3drando/fill.cpp +++ b/soh/soh/Enhancements/randomizer/3drando/fill.cpp @@ -913,6 +913,8 @@ void VanillaFill() { ShuffleAllEntrances(); printf("\x1b[7;32HDone"); } + // Populate the playthrough for entrances so they are placed in the spoiler log + GeneratePlaythrough(); //Finish up CreateItemOverrides(); CreateEntranceOverrides(); diff --git a/soh/soh/Enhancements/randomizer/3drando/item_location.cpp b/soh/soh/Enhancements/randomizer/3drando/item_location.cpp index 0ab29d869..850157ad8 100644 --- a/soh/soh/Enhancements/randomizer/3drando/item_location.cpp +++ b/soh/soh/Enhancements/randomizer/3drando/item_location.cpp @@ -26,7 +26,7 @@ void LocationTable_Init() { locationTable[LW_NEAR_SHORTCUTS_GROTTO_CHEST] = ItemLocation::Chest (RC_LW_NEAR_SHORTCUTS_GROTTO_CHEST, 0x3E, 0x14, "LW Near Shortcuts Grotto Chest", LW_NEAR_SHORTCUTS_GROTTO_CHEST, BLUE_RUPEE, {}, SpoilerCollectionCheckGroup::GROUP_LOST_WOODS); locationTable[LW_SKULL_KID] = ItemLocation::Base (RC_LW_SKULL_KID, 0x5B, "LW Skull Kid", LW_SKULL_KID, PIECE_OF_HEART, {}, SpoilerCollectionCheck::ItemGetInf(22), SpoilerCollectionCheckGroup::GROUP_LOST_WOODS); locationTable[LW_TRADE_COJIRO] = ItemLocation::Base (RC_LW_TRADE_COJIRO, 0x5B, "LW Trade Cojiro", LW_TRADE_COJIRO, ODD_MUSHROOM, {Category::cAdultTrade}, SpoilerCollectionCheck::RandomizerInf(), SpoilerCollectionCheckGroup::GROUP_LOST_WOODS); - locationTable[LW_TRADE_ODD_POTION] = ItemLocation::Base (RC_LW_TRADE_ODD_POTION, 0x5B, "LW Trade Odd Potion", LW_TRADE_ODD_POTION, ODD_POTION, {Category::cAdultTrade}, SpoilerCollectionCheck::ItemGetInf(49), SpoilerCollectionCheckGroup::GROUP_LOST_WOODS); + locationTable[LW_TRADE_ODD_POTION] = ItemLocation::Base (RC_LW_TRADE_ODD_POTION, 0x5B, "LW Trade Odd Potion", LW_TRADE_ODD_POTION, POACHERS_SAW, {Category::cAdultTrade}, SpoilerCollectionCheck::ItemGetInf(49), SpoilerCollectionCheckGroup::GROUP_LOST_WOODS); locationTable[LW_OCARINA_MEMORY_GAME] = ItemLocation::Base (RC_LW_OCARINA_MEMORY_GAME, 0x5B, "LW Ocarina Memory Game", LW_OCARINA_MEMORY_GAME, PIECE_OF_HEART, {}, SpoilerCollectionCheck::ItemGetInf(23), SpoilerCollectionCheckGroup::GROUP_LOST_WOODS); locationTable[LW_TARGET_IN_WOODS] = ItemLocation::Base (RC_LW_TARGET_IN_WOODS, 0x5B, "LW Target in Woods", LW_TARGET_IN_WOODS, PROGRESSIVE_SLINGSHOT, {}, SpoilerCollectionCheck::ItemGetInf(29), SpoilerCollectionCheckGroup::GROUP_LOST_WOODS); locationTable[LW_DEKU_SCRUB_NEAR_DEKU_THEATER_RIGHT] = ItemLocation::Base (RC_LW_DEKU_SCRUB_NEAR_DEKU_THEATER_RIGHT, 0x5B, "LW Deku Scrub Near Deku Theater Right",LW_DEKU_SCRUB_NEAR_DEKU_THEATER_RIGHT, BUY_DEKU_NUT_5, {Category::cDekuScrub}, SpoilerCollectionCheck::Scrub(), SpoilerCollectionCheckGroup::GROUP_LOST_WOODS); @@ -120,7 +120,7 @@ void LocationTable_Init() { locationTable[KAK_SHOOTING_GALLERY_REWARD] = ItemLocation::Base (RC_KAK_SHOOTING_GALLERY_REWARD, 0x42, "Kak Shooting Gallery Reward", KAK_SHOOTING_GALLERY_REWARD, PROGRESSIVE_BOW, {}, SpoilerCollectionCheck::Chest(0x42, 0x1F), SpoilerCollectionCheckGroup::GROUP_KAKARIKO); locationTable[KAK_TRADE_ODD_MUSHROOM] = ItemLocation::Base (RC_KAK_TRADE_ODD_MUSHROOM, 0x4E, "Kak Trade Odd Mushroom", KAK_TRADE_ODD_MUSHROOM, ODD_POTION, {Category::cAdultTrade}, SpoilerCollectionCheck::ItemGetInf(48), SpoilerCollectionCheckGroup::GROUP_KAKARIKO); locationTable[KAK_GRANNYS_SHOP] = ItemLocation::Base (RC_KAK_GRANNYS_SHOP, 0x4E, "Kak Granny's Shop", KAK_GRANNYS_SHOP, BLUE_POTION_REFILL, {Category::cMerchant}, SpoilerCollectionCheck::RandomizerInf(), SpoilerCollectionCheckGroup::GROUP_KAKARIKO); - locationTable[KAK_ANJU_AS_ADULT] = ItemLocation::Base (RC_KAK_ANJU_AS_ADULT, 0x52, "Kak Anju as Adult", KAK_ANJU_AS_ADULT, CLAIM_CHECK, {}, SpoilerCollectionCheck::ItemGetInf(44), SpoilerCollectionCheckGroup::GROUP_KAKARIKO); + locationTable[KAK_ANJU_AS_ADULT] = ItemLocation::Base (RC_KAK_ANJU_AS_ADULT, 0x52, "Kak Anju as Adult", KAK_ANJU_AS_ADULT, POCKET_EGG, {}, SpoilerCollectionCheck::ItemGetInf(44), SpoilerCollectionCheckGroup::GROUP_KAKARIKO); locationTable[KAK_ANJU_AS_CHILD] = ItemLocation::Base (RC_KAK_ANJU_AS_CHILD, 0x52, "Kak Anju as Child", KAK_ANJU_AS_CHILD, EMPTY_BOTTLE, {}, SpoilerCollectionCheck::ItemGetInf(12), SpoilerCollectionCheckGroup::GROUP_KAKARIKO); locationTable[KAK_TRADE_POCKET_CUCCO] = ItemLocation::Base (RC_KAK_TRADE_POCKET_CUCCO, 0x52, "Kak Trade Pocket Cucco", KAK_TRADE_POCKET_CUCCO, COJIRO, {Category::cAdultTrade}, SpoilerCollectionCheck::ItemGetInf(46), SpoilerCollectionCheckGroup::GROUP_KAKARIKO); locationTable[KAK_IMPAS_HOUSE_FREESTANDING_POH] = ItemLocation::Collectable(RC_KAK_IMPAS_HOUSE_FREESTANDING_POH, 0x37, 0x01, "Kak Impas House Freestanding PoH", KAK_IMPAS_HOUSE_FREESTANDING_POH, PIECE_OF_HEART, {}, SpoilerCollectionCheckGroup::GROUP_KAKARIKO); @@ -492,7 +492,7 @@ void LocationTable_Init() { locationTable[GERUDO_TRAINING_GROUNDS_MQ_MAZE_PATH_THIRD_CHEST] = ItemLocation::Chest (RC_GERUDO_TRAINING_GROUND_MQ_MAZE_PATH_THIRD_CHEST, 0x0B, 0x09, "Gerudo Training Grounds MQ Maze Path Third Chest", GERUDO_TRAINING_GROUNDS_MQ_MAZE_PATH_THIRD_CHEST, TREASURE_GAME_GREEN_RUPEE, {}, SpoilerCollectionCheckGroup::GROUP_GERUDO_TRAINING_GROUND); locationTable[GERUDO_TRAINING_GROUNDS_MQ_MAZE_PATH_SECOND_CHEST] = ItemLocation::Chest (RC_GERUDO_TRAINING_GROUND_MQ_MAZE_PATH_SECOND_CHEST, 0x0B, 0x0A, "Gerudo Training Grounds MQ Maze Path Second Chest", GERUDO_TRAINING_GROUNDS_MQ_MAZE_PATH_SECOND_CHEST, RED_RUPEE, {}, SpoilerCollectionCheckGroup::GROUP_GERUDO_TRAINING_GROUND); locationTable[GERUDO_TRAINING_GROUNDS_MQ_HIDDEN_CEILING_CHEST] = ItemLocation::Chest (RC_GERUDO_TRAINING_GROUND_MQ_HIDDEN_CEILING_CHEST, 0x0B, 0x0B, "Gerudo Training Grounds MQ Hidden Ceiling Chest", GERUDO_TRAINING_GROUNDS_MQ_HIDDEN_CEILING_CHEST, PURPLE_RUPEE, {}, SpoilerCollectionCheckGroup::GROUP_GERUDO_TRAINING_GROUND); - locationTable[GERUDO_TRAINING_GROUNDS_MQ_UNDERWATER_SILVER_RUPEE_CHEST] = ItemLocation::Chest (RC_GERUDO_TRAINING_GROUND_MQ_UNDERWATER_SILVER_RUPEE_CHEST, 0x0B, 0x0D, "Gerudo Training Grounds MQ Underwater Silver Rupee Chest",GERUDO_TRAINING_GROUNDS_MQ_UNDERWATER_SILVER_RUPEE_CHEST, TREASURE_GAME_GREEN_RUPEE, {Category::cVanillaSmallKey}, SpoilerCollectionCheckGroup::GROUP_GERUDO_TRAINING_GROUND); + locationTable[GERUDO_TRAINING_GROUNDS_MQ_UNDERWATER_SILVER_RUPEE_CHEST] = ItemLocation::Chest (RC_GERUDO_TRAINING_GROUND_MQ_UNDERWATER_SILVER_RUPEE_CHEST, 0x0B, 0x0D, "Gerudo Training Grounds MQ Underwater Silver Rupee Chest",GERUDO_TRAINING_GROUNDS_MQ_UNDERWATER_SILVER_RUPEE_CHEST, GERUDO_TRAINING_GROUNDS_SMALL_KEY, {Category::cVanillaSmallKey}, SpoilerCollectionCheckGroup::GROUP_GERUDO_TRAINING_GROUND); locationTable[GERUDO_TRAINING_GROUNDS_MQ_HEAVY_BLOCK_CHEST] = ItemLocation::Chest (RC_GERUDO_TRAINING_GROUND_MQ_HEAVY_BLOCK_CHEST, 0x0B, 0x02, "Gerudo Training Grounds MQ Heavy Block Chest", GERUDO_TRAINING_GROUNDS_MQ_HEAVY_BLOCK_CHEST, PURPLE_RUPEE, {}, SpoilerCollectionCheckGroup::GROUP_GERUDO_TRAINING_GROUND); //Ganons Castle Shared @@ -918,7 +918,7 @@ void LocationTable_Init() { locationTable[DMC_UPPER_GROTTO_GOSSIP_STONE] = ItemLocation::HintStone(RC_DMC_UPPER_GROTTO_GOSSIP_STONE, "DMC Upper Grotto Gossip Stone"); locationTable[GANONDORF_HINT] = ItemLocation::OtherHint(RC_GANONDORF_HINT, "Ganondorf Hint"); - locationTable[TRIFORCE_COMPLETED] = ItemLocation::Reward (RC_TRIFORCE_COMPLETED, 0xFF, "Completed Triforce", NONE, TRIFORCE_COMPLETED, {}, SpoilerCollectionCheck::None(), SpoilerCollectionCheckGroup::GROUP_NO_GROUP); + locationTable[TRIFORCE_COMPLETED] = ItemLocation::Reward (RC_TRIFORCE_COMPLETED, 0xFF, "Completed Triforce", NONE, NONE, {}, SpoilerCollectionCheck::None(), SpoilerCollectionCheckGroup::GROUP_NO_GROUP); for (int i = NONE; i != KEY_ENUM_MAX; i++) locationLookupTable.insert(std::make_pair(locationTable[i].GetRandomizerCheck(), static_cast(i))); diff --git a/soh/soh/Enhancements/randomizer/3drando/menu.cpp b/soh/soh/Enhancements/randomizer/3drando/menu.cpp index 5da2b618c..9f6cc2796 100644 --- a/soh/soh/Enhancements/randomizer/3drando/menu.cpp +++ b/soh/soh/Enhancements/randomizer/3drando/menu.cpp @@ -22,6 +22,14 @@ std::vector presetEntries; Option* currentSetting; } // namespace +static void RestoreOverrides() { + if (Settings::Logic.Is(LOGIC_VANILLA)) { + for (auto overridePair : Settings::vanillaLogicOverrides) { + overridePair.first->RestoreDelayedOption(); + } + } +} + std::string GenerateRandomizer(std::unordered_map cvarSettings, std::set excludedLocations, std::set enabledTricks, std::string seedString) { @@ -52,20 +60,17 @@ std::string GenerateRandomizer(std::unordered_map printf("\n\nFailed to generate after 5 tries.\nPress B to go back to the menu.\nA different seed might be " "successful."); SPDLOG_DEBUG("\nRANDOMIZATION FAILED COMPLETELY. PLZ FIX\n"); + RestoreOverrides(); return ""; } else { printf("\n\nError %d with fill.\nPress Select to exit or B to go back to the menu.\n", ret); + RestoreOverrides(); return ""; } } - // Restore settings that were set to a specific value for vanilla logic - if (Settings::Logic.Is(LOGIC_VANILLA)) { - for (Option* setting : Settings::vanillaLogicDefaults) { - setting->RestoreDelayedOption(); - } - Settings::Keysanity.RestoreDelayedOption(); - } + RestoreOverrides(); + std::ostringstream fileNameStream; for (int i = 0; i < Settings::hashIconIndexes.size(); i++) { if (i) { diff --git a/soh/soh/Enhancements/randomizer/3drando/settings.cpp b/soh/soh/Enhancements/randomizer/3drando/settings.cpp index 08d09cfa8..684e3ec9a 100644 --- a/soh/soh/Enhancements/randomizer/3drando/settings.cpp +++ b/soh/soh/Enhancements/randomizer/3drando/settings.cpp @@ -2060,21 +2060,65 @@ namespace Settings { } //Options that should be saved, set to default, then restored after finishing when vanilla logic is enabled - std::vector