diff --git a/.github/workflows/generate-builds.yml b/.github/workflows/generate-builds.yml index cd8a6fd9b..c54d017a2 100644 --- a/.github/workflows/generate-builds.yml +++ b/.github/workflows/generate-builds.yml @@ -32,17 +32,6 @@ jobs: make -j 10 sudo make install sudo cp -av /usr/local/lib/libSDL* /lib/x86_64-linux-gnu/ - - name: Install latest SDL_net - if: ${{ !vars.LINUX_RUNNER }} - run: | - export PATH="/usr/lib/ccache:/usr/local/opt/ccache/libexec:$PATH" - wget https://www.libsdl.org/projects/SDL_net/release/SDL2_net-2.2.0.tar.gz - tar -xzf SDL2_net-2.2.0.tar.gz - cd SDL2_net-2.2.0 - ./configure - make -j 10 - sudo make install - sudo cp -av /usr/local/lib/libSDL* /lib/x86_64-linux-gnu/ - name: Generate soh.otr run: | export PATH="/usr/lib/ccache:/usr/local/opt/ccache/libexec:$PATH" @@ -102,7 +91,7 @@ jobs: - name: Build SoH run: | export PATH="/usr/lib/ccache:/usr/local/opt/ccache/libexec:$PATH" - cmake --no-warn-unused-cli -H. -Bbuild-cmake -GNinja -DCMAKE_BUILD_TYPE:STRING=Release -DCMAKE_OSX_ARCHITECTURES="x86_64;arm64" + cmake --no-warn-unused-cli -H. -Bbuild-cmake -GNinja -DCMAKE_BUILD_TYPE:STRING=Release -DCMAKE_OSX_ARCHITECTURES="x86_64;arm64" -DBUILD_REMOTE_CONTROL=1 cmake --build build-cmake --config Release --parallel 10 mv soh.otr build-cmake/soh (cd build-cmake && cpack) @@ -171,7 +160,7 @@ jobs: - name: Build SoH run: | export PATH="/usr/lib/ccache:/usr/local/opt/ccache/libexec:$PATH" - cmake --no-warn-unused-cli -H. -Bbuild-cmake -GNinja -DCMAKE_BUILD_TYPE:STRING=Release + cmake --no-warn-unused-cli -H. -Bbuild-cmake -GNinja -DCMAKE_BUILD_TYPE:STRING=Release -DBUILD_REMOTE_CONTROL=1 cmake --build build-cmake --config Release -j3 (cd build-cmake && cpack -G External) @@ -281,16 +270,23 @@ 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 + 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 -DBUILD_REMOTE_CONTROL=1 cmake --build build-windows --config Release --parallel 10 mkdir soh-windows diff --git a/.github/workflows/macports-deps.txt b/.github/workflows/macports-deps.txt index 02c11cc68..6f5948557 100644 --- a/.github/workflows/macports-deps.txt +++ b/.github/workflows/macports-deps.txt @@ -1 +1 @@ -libsdl2 +universal libpng +universal glew +universal +libsdl2 +universal libsdl2_net +universal libpng +universal glew +universal diff --git a/CMakeLists.txt b/CMakeLists.txt index 0633ab80a..0cabaef20 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -5,20 +5,14 @@ set(CMAKE_CXX_STANDARD 20 CACHE STRING "The C++ standard to use") set(CMAKE_OSX_DEPLOYMENT_TARGET "10.15" CACHE STRING "Minimum OS X deployment version") -project(Ship VERSION 8.0.0 LANGUAGES C CXX) -set(PROJECT_BUILD_NAME "MacReady Alfa" CACHE STRING "") +project(Ship VERSION 8.0.4 LANGUAGES C CXX) +set(PROJECT_BUILD_NAME "MacReady Echo" CACHE STRING "") set(PROJECT_TEAM "github.com/harbourmasters" CACHE STRING "") set_property(DIRECTORY ${CMAKE_SOURCE_DIR} PROPERTY VS_STARTUP_PROJECT soh) add_compile_options($<$:/MP>) add_compile_options($<$:/utf-8>) -if (CMAKE_SYSTEM_NAME MATCHES "Windows|Linux") - if(NOT DEFINED BUILD_CROWD_CONTROL) - set(BUILD_CROWD_CONTROL ON) - endif() -endif() - if (CMAKE_SYSTEM_NAME STREQUAL "Windows") include(CMake/automate-vcpkg.cmake) diff --git a/OTRExporter b/OTRExporter index 0d8f5570a..04b85b95f 160000 --- a/OTRExporter +++ b/OTRExporter @@ -1 +1 @@ -Subproject commit 0d8f5570a8e57f302ec6633d65615ee21ab39454 +Subproject commit 04b85b95fab07a394b62dcd28a502a3040f08e0c diff --git a/README.md b/README.md index ef96bd8e4..ad80f7f2f 100644 --- a/README.md +++ b/README.md @@ -92,7 +92,7 @@ If you want to playtest a continuous integration build, you can find them at the * [Windows](https://nightly.link/HarbourMasters/Shipwright/workflows/generate-builds/develop/soh-windows.zip) * [macOS](https://nightly.link/HarbourMasters/Shipwright/workflows/generate-builds/develop/soh-mac.zip) * [Linux (performance)](https://nightly.link/HarbourMasters/Shipwright/workflows/generate-builds/develop/soh-linux-performance.zip) _(requires `glibc 2.35` or newer, but will be more performant than the compatibility build.)_ -* [Linux (compatibility)](https://nightly.link/HarbourMasters/Shipwright/workflows/generate-builds/develop/soh-linux-compatiblity.zip) _(compatible with most Linux distributions, but may not be as performant as the performance build.)_ +* [Linux (compatibility)](https://nightly.link/HarbourMasters/Shipwright/workflows/generate-builds/develop/soh-linux-compatibility.zip) _(compatible with most Linux distributions, but may not be as performant as the performance build.)_ * [Switch](https://nightly.link/HarbourMasters/Shipwright/workflows/generate-builds/develop/soh-switch.zip) * [Wii U](https://nightly.link/HarbourMasters/Shipwright/workflows/generate-builds/develop/soh-wiiu.zip) diff --git a/libultraship b/libultraship index c75ff3653..15d57d806 160000 --- a/libultraship +++ b/libultraship @@ -1 +1 @@ -Subproject commit c75ff3653f699cb1a8c017b10e4b3986259d8cf0 +Subproject commit 15d57d806e39d7f19783e26acc1a062d402169c7 diff --git a/scripts/linux/appimage/soh.sh.in b/scripts/linux/appimage/soh.sh.in index bfc3cfec6..71121a5ff 100644 --- a/scripts/linux/appimage/soh.sh.in +++ b/scripts/linux/appimage/soh.sh.in @@ -21,12 +21,17 @@ fi while [[ (! -e "$SHIP_HOME"/oot.otr) || (! -e "$SHIP_HOME"/oot-mq.otr) ]]; do for romfile in "$SHIP_HOME"/*.*64 do - if [[ -e $romfile ]]; then + if [[ -e "$romfile" ]] || [[ -L "$romfile" ]]; then export ASSETDIR="$(mktemp -d /tmp/assets-XXXXX)" - ln -s "$HERE"/usr/bin/{assets,soh.elf,ZAPD} "$ASSETDIR" + ln -s "$SHIP_BIN_DIR"/{assets,soh.elf,ZAPD} "$ASSETDIR" export OLDPWD="$PWD" mkdir -p "$ASSETDIR"/tmp - ln -s "$romfile" "$ASSETDIR"/tmp/rom.z64 + if [[ -e "$romfile" ]]; then + ln -s "$romfile" "$ASSETDIR"/tmp/rom.z64 + else + ORIG_ROM_PATH=$(readlink "$romfile") + ln -s "$ORIG_ROM_PATH" "$ASSETDIR"/tmp/rom.z64 + fi cd "$ASSETDIR" ROMHASH=$(sha1sum -b "$ASSETDIR"/tmp/rom.z64 | awk '{ print $1 }') diff --git a/soh/CMakeLists.txt b/soh/CMakeLists.txt index fd0c6ac25..ffc128bcd 100644 --- a/soh/CMakeLists.txt +++ b/soh/CMakeLists.txt @@ -154,7 +154,7 @@ list(FILTER soh__Enhancements EXCLUDE REGEX "soh/Enhancements/gfx.*") # handle crowd control removals list(REMOVE_ITEM soh__Enhancements "soh/Enhancements/crowd-control/soh.cs") list(REMOVE_ITEM soh__Enhancements "soh/Enhancements/crowd-control/soh.ccpak") -if (!BUILD_CROWD_CONTROL) +if (!BUILD_REMOTE_CONTROL) list(FILTER soh__Enhancements EXCLUDE REGEX "soh/Enhancements/crowd-control/*") endif() @@ -328,7 +328,7 @@ endif() include(FetchContent) FetchContent_Declare( Boost - URL https://boostorg.jfrog.io/artifactory/main/release/1.81.0/source/boost_1_81_0.tar.gz + URL https://sourceforge.net/projects/boost/files/boost/1.81.0/boost_1_81_0.tar.gz URL_HASH SHA256=205666dea9f6a7cfed87c7a6dfbeb52a2c1b9de55712c9c1a87735d7181452b6 SOURCE_SUBDIR "null" # Set to a nonexistent directory so boost is not built (we don't need to build it) DOWNLOAD_EXTRACT_TIMESTAMP false # supress timestamp warning, not needed since the url wont change @@ -354,7 +354,7 @@ endif() find_package(SDL2) set(SDL2-INCLUDE ${SDL2_INCLUDE_DIRS}) -if (BUILD_CROWD_CONTROL) +if (BUILD_REMOTE_CONTROL) find_package(SDL2_net) set(SDL2-NET-INCLUDE ${SDL_NET_INCLUDE_DIRS}) endif() @@ -408,9 +408,8 @@ if (CMAKE_SYSTEM_NAME STREQUAL "Windows") "$<$:" "NDEBUG" ">" - "$<$:ENABLE_CROWD_CONTROL>" + "$<$:ENABLE_REMOTE_CONTROL>" "INCLUDE_GAME_PRINTF;" - "ENABLE_CROWD_CONTROL;" "UNICODE;" "_UNICODE" STORMLIB_NO_AUTO_LINK @@ -455,7 +454,7 @@ elseif ("${CMAKE_CXX_COMPILER_ID}" MATCHES "GNU|Clang|AppleClang") "$<$:" "NDEBUG" ">" - "$<$:ENABLE_CROWD_CONTROL>" + "$<$:ENABLE_REMOTE_CONTROL>" "SPDLOG_ACTIVE_LEVEL=0;" "_CONSOLE;" "_CRT_SECURE_NO_WARNINGS;" @@ -689,7 +688,7 @@ if (CMAKE_SYSTEM_NAME STREQUAL "Windows") "glu32;" "SDL2::SDL2;" "SDL2::SDL2main;" - "$<$:SDL2_net::SDL2_net-static>" + "$<$:SDL2_net::SDL2_net-static>" "glfw;" "winmm;" "imm32;" @@ -742,7 +741,7 @@ else() "ZAPDUtils;" "ZAPDLib;" SDL2::SDL2 - "$<$:SDL2_net::SDL2_net>" + "$<$:SDL2_net::SDL2_net>" ${CMAKE_DL_LIBS} Threads::Threads ) diff --git a/soh/assets/custom/accessibility/texts/scenes_fra.json b/soh/assets/custom/accessibility/texts/scenes_fra.json index fa36c8840..3f73410e7 100644 --- a/soh/assets/custom/accessibility/texts/scenes_fra.json +++ b/soh/assets/custom/accessibility/texts/scenes_fra.json @@ -1,5 +1,5 @@ { - "0": "Abre Mojo", + "0": "Arbre Mojo", "1": "Caverne Dodongo", "2": "Ventre de Jabu-Jabu", "3": "Temple de la Forêt", @@ -58,9 +58,9 @@ "56": "Laboratoire du Lac", "57": "", // Tente du Marathonien (No title card) "58": "Cabane du fossoyeur", - "59": "Fountaine Royale des Fées", - "60": "Fountaine des Fées", - "61": "Fountaine Royale des Fées", + "59": "Fontaine Royale des Fées", + "60": "Fontaine des Fées", + "61": "Fontaine Royale des Fées", "62": "", // Grottes (No title card) "63": "", // Tombe 1 (No title card) "64": "", // Tombe 2 (No title card) @@ -109,4 +109,4 @@ "107": "", "108": "", // Debug: SRD Room (No title card) "109": "" // Debug: Treasure Chest Warp (No title card) -} \ No newline at end of file +} diff --git a/soh/assets/xml/GC_MQ_D/objects/object_mo.xml b/soh/assets/xml/GC_MQ_D/objects/object_mo.xml index f25286df8..f31a345d6 100644 --- a/soh/assets/xml/GC_MQ_D/objects/object_mo.xml +++ b/soh/assets/xml/GC_MQ_D/objects/object_mo.xml @@ -79,7 +79,7 @@ - + diff --git a/soh/assets/xml/GC_MQ_D/overlays/ovl_Boss_Dodongo.xml b/soh/assets/xml/GC_MQ_D/overlays/ovl_Boss_Dodongo.xml index f2ee5b7b8..0e2c84f57 100644 --- a/soh/assets/xml/GC_MQ_D/overlays/ovl_Boss_Dodongo.xml +++ b/soh/assets/xml/GC_MQ_D/overlays/ovl_Boss_Dodongo.xml @@ -1,6 +1,6 @@ - + diff --git a/soh/assets/xml/GC_MQ_PAL_F/objects/object_mo.xml b/soh/assets/xml/GC_MQ_PAL_F/objects/object_mo.xml index 2a6247c9f..b4528ef31 100644 --- a/soh/assets/xml/GC_MQ_PAL_F/objects/object_mo.xml +++ b/soh/assets/xml/GC_MQ_PAL_F/objects/object_mo.xml @@ -8,7 +8,7 @@ - + @@ -69,17 +69,17 @@ - + - + - + diff --git a/soh/assets/xml/GC_MQ_PAL_F/overlays/ovl_Boss_Dodongo.xml b/soh/assets/xml/GC_MQ_PAL_F/overlays/ovl_Boss_Dodongo.xml index 0e1303c17..8a1c4ee94 100644 --- a/soh/assets/xml/GC_MQ_PAL_F/overlays/ovl_Boss_Dodongo.xml +++ b/soh/assets/xml/GC_MQ_PAL_F/overlays/ovl_Boss_Dodongo.xml @@ -1,6 +1,6 @@ - - + + diff --git a/soh/assets/xml/GC_MQ_PAL_F/text/message_data_static.xml b/soh/assets/xml/GC_MQ_PAL_F/text/message_data_static.xml index 400a27e27..5241e3ef7 100644 --- a/soh/assets/xml/GC_MQ_PAL_F/text/message_data_static.xml +++ b/soh/assets/xml/GC_MQ_PAL_F/text/message_data_static.xml @@ -1,14 +1,14 @@ - + - + - + - + diff --git a/soh/assets/xml/GC_NMQ_D/objects/object_mo.xml b/soh/assets/xml/GC_NMQ_D/objects/object_mo.xml index 2a6247c9f..b4528ef31 100644 --- a/soh/assets/xml/GC_NMQ_D/objects/object_mo.xml +++ b/soh/assets/xml/GC_NMQ_D/objects/object_mo.xml @@ -8,7 +8,7 @@ - + @@ -69,17 +69,17 @@ - + - + - + diff --git a/soh/assets/xml/GC_NMQ_D/overlays/ovl_Boss_Dodongo.xml b/soh/assets/xml/GC_NMQ_D/overlays/ovl_Boss_Dodongo.xml index f6a52f044..d31e4abcc 100644 --- a/soh/assets/xml/GC_NMQ_D/overlays/ovl_Boss_Dodongo.xml +++ b/soh/assets/xml/GC_NMQ_D/overlays/ovl_Boss_Dodongo.xml @@ -1,6 +1,6 @@ - + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_mo.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_mo.xml index 2a6247c9f..b4528ef31 100644 --- a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_mo.xml +++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_mo.xml @@ -8,7 +8,7 @@ - + @@ -69,17 +69,17 @@ - + - + - + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/overlays/ovl_Boss_Dodongo.xml b/soh/assets/xml/GC_NMQ_PAL_F/overlays/ovl_Boss_Dodongo.xml index f2ee5b7b8..67d85d168 100644 --- a/soh/assets/xml/GC_NMQ_PAL_F/overlays/ovl_Boss_Dodongo.xml +++ b/soh/assets/xml/GC_NMQ_PAL_F/overlays/ovl_Boss_Dodongo.xml @@ -1,6 +1,6 @@ - - - + + + diff --git a/soh/assets/xml/N64_PAL_10/objects/object_mo.xml b/soh/assets/xml/N64_PAL_10/objects/object_mo.xml index 2a6247c9f..b4528ef31 100644 --- a/soh/assets/xml/N64_PAL_10/objects/object_mo.xml +++ b/soh/assets/xml/N64_PAL_10/objects/object_mo.xml @@ -8,7 +8,7 @@ - + @@ -69,17 +69,17 @@ - + - + - + diff --git a/soh/assets/xml/N64_PAL_10/overlays/ovl_Boss_Dodongo.xml b/soh/assets/xml/N64_PAL_10/overlays/ovl_Boss_Dodongo.xml index 8f0c7612c..5e4975bc1 100644 --- a/soh/assets/xml/N64_PAL_10/overlays/ovl_Boss_Dodongo.xml +++ b/soh/assets/xml/N64_PAL_10/overlays/ovl_Boss_Dodongo.xml @@ -1,6 +1,6 @@ - + diff --git a/soh/assets/xml/N64_PAL_11/objects/object_mo.xml b/soh/assets/xml/N64_PAL_11/objects/object_mo.xml index 2a6247c9f..b4528ef31 100644 --- a/soh/assets/xml/N64_PAL_11/objects/object_mo.xml +++ b/soh/assets/xml/N64_PAL_11/objects/object_mo.xml @@ -8,7 +8,7 @@ - + @@ -69,17 +69,17 @@ - + - + - + diff --git a/soh/assets/xml/N64_PAL_11/overlays/ovl_Boss_Dodongo.xml b/soh/assets/xml/N64_PAL_11/overlays/ovl_Boss_Dodongo.xml index cd9069e13..d6f77448d 100644 --- a/soh/assets/xml/N64_PAL_11/overlays/ovl_Boss_Dodongo.xml +++ b/soh/assets/xml/N64_PAL_11/overlays/ovl_Boss_Dodongo.xml @@ -1,6 +1,6 @@ - + diff --git a/soh/include/functions.h b/soh/include/functions.h index 3a1aa8ae2..3898ea63d 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); @@ -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); @@ -2171,7 +2171,7 @@ void func_800FA18C(u8, u8); void Audio_SetVolScale(u8 playerIdx, u8 scaleIdx, u8 targetVol, u8 volFadeTimer); void func_800FA3DC(void); u8 func_800FAD34(void); -void func_800FADF8(void); +void Audio_ResetActiveSequences(void); void func_800FAEB4(void); void GfxPrint_SetColor(GfxPrint* this, u32 r, u32 g, u32 b, u32 a); void GfxPrint_SetPosPx(GfxPrint* this, s32 x, s32 y); @@ -2210,6 +2210,14 @@ s8 PadUtils_GetRelYImpl(Input* input); s8 PadUtils_GetRelX(Input* input); s8 PadUtils_GetRelY(Input* input); void PadUtils_UpdateRelXY(Input* input); +s8 PadUtils_GetCurRX(Input* input); +s8 PadUtils_GetCurRY(Input* input); +void PadUtils_SetRelRXY(Input* input, s32 x, s32 y); +s8 PadUtils_GetRelRXImpl(Input* input); +s8 PadUtils_GetRelRYImpl(Input* input); +s8 PadUtils_GetRelRX(Input* input); +s8 PadUtils_GetRelRY(Input* input); +void PadUtils_UpdateRelRXY(Input* input); s32 PadSetup_Init(OSMesgQueue* mq, u8* outMask, OSContStatus* status); f32 Math_FTanF(f32 x); f32 Math_FFloorF(f32 x); 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/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..9fd6b7247 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 @@ -224,7 +224,7 @@ extern "C" extern u16 gAudioSfxSwapSource[10]; extern u16 gAudioSfxSwapTarget[10]; extern u8 gAudioSfxSwapMode[10]; - extern unk_D_8016E750 D_8016E750[4]; + extern ActiveSequence gActiveSeqs[4]; extern AudioContext gAudioContext; extern void(*D_801755D0)(void); diff --git a/soh/include/z64.h b/soh/include/z64.h index 23ffcfb17..e668b2e7a 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; @@ -1510,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/z64audio.h b/soh/include/z64audio.h index a7587ea2c..81775feba 100644 --- a/soh/include/z64audio.h +++ b/soh/include/z64audio.h @@ -970,43 +970,43 @@ typedef struct { } AudioContextInitSizes; // size = 0xC typedef struct { - /* 0x00 */ f32 unk_00; - /* 0x04 */ f32 unk_04; - /* 0x08 */ f32 unk_08; - /* 0x0C */ u16 unk_0C; - /* 0x10 */ f32 unk_10; - /* 0x14 */ f32 unk_14; - /* 0x18 */ f32 unk_18; - /* 0x1C */ u16 unk_1C; -} unk_50_s; // size = 0x20 + /* 0x00 */ f32 volCur; + /* 0x04 */ f32 volTarget; + /* 0x08 */ f32 volStep; + /* 0x0C */ u16 volTimer; + /* 0x10 */ f32 freqScaleCur; + /* 0x14 */ f32 freqScaleTarget; + /* 0x18 */ f32 freqScaleStep; + /* 0x1C */ u16 freqScaleTimer; +} ActiveSequenceChannelData; // size = 0x20 typedef struct { /* 0x000 */ f32 volCur; /* 0x004 */ f32 volTarget; - /* 0x008 */ f32 unk_08; - /* 0x00C */ u16 unk_0C; - /* 0x00E */ u8 volScales[0x4]; + /* 0x008 */ f32 volStep; + /* 0x00C */ u16 volTimer; + /* 0x00E */ u8 volScales[4]; /* 0x012 */ u8 volFadeTimer; /* 0x013 */ u8 fadeVolUpdate; - /* 0x014 */ u32 unk_14; - /* 0x018 */ u16 unk_18; - /* 0x01C */ f32 unk_1C; - /* 0x020 */ f32 unk_20; - /* 0x024 */ f32 unk_24; - /* 0x028 */ u16 unk_28; - /* 0x02C */ u32 unk_2C[8]; - /* 0x04C */ u8 unk_4C; - /* 0x04D */ u8 unk_4D; - /* 0x04E */ u8 unk_4E; - /* 0x050 */ unk_50_s unk_50[0x10]; - /* 0x250 */ u16 unk_250; - /* 0x252 */ u16 unk_252; - /* 0x254 */ u16 unk_254; - /* 0x256 */ u16 unk_256; - /* 0x258 */ u16 unk_258; - /* 0x25C */ u32 unk_25C; - /* 0x260 */ u8 unk_260; -} unk_D_8016E750; // size = 0x264 + /* 0x014 */ u32 tempoCmd; + /* 0x018 */ u16 tempoOriginal; // stores the original tempo before modifying it (to reset back to) + /* 0x01C */ f32 tempoCur; + /* 0x020 */ f32 tempoTarget; + /* 0x024 */ f32 tempoStep; + /* 0x028 */ u16 tempoTimer; + /* 0x02C */ u32 setupCmd[8]; // a queue of cmds to execute once the player is disabled + /* 0x04C */ u8 setupCmdTimer; // only execute setup commands when the timer is at 0. + /* 0x04D */ u8 setupCmdNum; // number of setup commands requested once the player is disabled + /* 0x04E */ u8 setupFadeTimer; + /* 0x050 */ ActiveSequenceChannelData channelData[16]; + /* 0x250 */ u16 freqScaleChannelFlags; + /* 0x252 */ u16 volChannelFlags; + /* 0x254 */ u16 seqId; // active seqId currently playing. Resets when sequence stops + /* 0x256 */ u16 prevSeqId; // last seqId played on a player. Does not reset when sequence stops + /* 0x258 */ u16 channelPortMask; + /* 0x25C */ u32 startSeqCmd; // This name comes from MM + /* 0x260 */ u8 isWaitingForFonts; // This name comes from MM +} ActiveSequence; // size = 0x264 typedef enum { /* 0 */ BANK_PLAYER, 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/z64player.h b/soh/include/z64player.h index ff30cc170..e5f4b826d 100644 --- a/soh/include/z64player.h +++ b/soh/include/z64player.h @@ -132,16 +132,6 @@ typedef enum { /* 0x40 */ PLAYER_IA_MASK_GERUDO, /* 0x41 */ PLAYER_IA_MASK_TRUTH, /* 0x42 */ PLAYER_IA_LENS_OF_TRUTH, - // Upstream TODO: Document why these entries were added - /* 0x43 */ PLAYER_IA_SHIELD_DEKU, - /* 0x44 */ PLAYER_IA_SHIELD_HYLIAN, - /* 0x45 */ PLAYER_IA_SHIELD_MIRROR, - /* 0x46 */ PLAYER_IA_TUNIC_KOKIRI, - /* 0x47 */ PLAYER_IA_TUNIC_GORON, - /* 0x48 */ PLAYER_IA_TUNIC_ZORA, - /* 0x49 */ PLAYER_IA_BOOTS_KOKIRI, - /* 0x4A */ PLAYER_IA_BOOTS_IRON, - /* 0x4B */ PLAYER_IA_BOOTS_HOVER, /* 0x4C */ PLAYER_IA_MAX } PlayerItemAction; @@ -494,8 +484,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 +502,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 +538,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 +557,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 +571,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 +586,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 +621,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 +633,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/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/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/macosx/Info.plist.in b/soh/macosx/Info.plist.in index dd0a49e8f..61316a18f 100644 --- a/soh/macosx/Info.plist.in +++ b/soh/macosx/Info.plist.in @@ -33,5 +33,10 @@ public.app-category.games LSMinimumSystemVersion 10.15 + LSArchitecturePriority + + arm64 + x86_64 + diff --git a/soh/macosx/soh-macos.sh.in b/soh/macosx/soh-macos.sh.in index 0983f63b1..867d2395d 100755 --- a/soh/macosx/soh-macos.sh.in +++ b/soh/macosx/soh-macos.sh.in @@ -248,11 +248,6 @@ fi cd "$SNAME" -arch_name="$(uname -m)" -launch_arch="arm64" -if [ "${arch_name}" = "x86_64" ] && [ "$(sysctl -in sysctl.proc_translated)" != "1" ]; then - launch_arch="x86_64" -fi +"$RESPATH"/soh-macos -arch -${launch_arch} "$RESPATH"/soh-macos exit diff --git a/soh/soh/ActorDB.cpp b/soh/soh/ActorDB.cpp index 2cf4d8fe7..ea8450ac4 100644 --- a/soh/soh/ActorDB.cpp +++ b/soh/soh/ActorDB.cpp @@ -74,7 +74,7 @@ static std::unordered_map actorDescriptions = { { ACTOR_EN_BUBBLE, "Shabom" }, { ACTOR_DOOR_SHUTTER, "Shutter Door" }, { ACTOR_EN_DODOJR, "Baby Dodongo" }, - { ACTOR_EN_BDFIRE, "Empty" }, + { ACTOR_EN_BDFIRE, "King Dodongo's Fire Breath" }, { ACTOR_EN_BOOM, "Boomerang" }, { ACTOR_EN_TORCH2, "Dark Link" }, { ACTOR_EN_BILI, "Biri" }, @@ -132,7 +132,7 @@ static std::unordered_map actorDescriptions = { { ACTOR_BG_TOKI_HIKARI, "Windows (Temple of Time)" }, { ACTOR_EN_YUKABYUN, "Flying Floor Tile" }, { ACTOR_BG_TOKI_SWD, "Master Sword" }, - { ACTOR_EN_FHG_FIRE, "Empty" }, + { ACTOR_EN_FHG_FIRE, "Phantom Ganon's Lighting Attack" }, { ACTOR_BG_MJIN, "Warp Song Pad" }, { ACTOR_BG_HIDAN_KOUSI, "Sliding Metal Gate" }, { ACTOR_DOOR_TOKI, "Door of Time Collision" }, @@ -439,7 +439,7 @@ static std::unordered_map actorDescriptions = { { ACTOR_EN_DAIKU_KAKARIKO, "Carpenters (Kakariko)" }, { ACTOR_BG_BOWL_WALL, "Bombchu Bowling Alley Wall" }, { ACTOR_EN_WALL_TUBO, "Bombchu Bowling Alley Bullseyes" }, - { ACTOR_EN_PO_DESERT, "Poe Guide (Desert Wasteland)" }, + { ACTOR_EN_PO_DESERT, "Poe Guide (Haunted Wasteland)" }, { ACTOR_EN_CROW, "Guay" }, { ACTOR_DOOR_KILLER, "Fake Door" }, { ACTOR_BG_SPOT11_OASIS, "Oasis (Desert Colossus)" }, @@ -548,6 +548,10 @@ int ActorDB::RetrieveId(const std::string& name) { return entry->second; } +int ActorDB::GetEntryCount() { + return db.size(); +} + ActorDB::Entry::Entry() { entry.name = nullptr; entry.desc = nullptr; diff --git a/soh/soh/ActorDB.h b/soh/soh/ActorDB.h index afb033a2f..8bcbb3f6a 100644 --- a/soh/soh/ActorDB.h +++ b/soh/soh/ActorDB.h @@ -64,6 +64,7 @@ public: static void AddBuiltInCustomActors(); + int GetEntryCount(); private: Entry& AddEntry(const std::string& name, const std::string& desc, size_t index); Entry& AddEntry(const std::string& name, const std::string& desc, const ActorInit& init); diff --git a/soh/soh/Enhancements/audio/AudioCollection.cpp b/soh/soh/Enhancements/audio/AudioCollection.cpp index a5499bd4f..9da742f91 100644 --- a/soh/soh/Enhancements/audio/AudioCollection.cpp +++ b/soh/soh/Enhancements/audio/AudioCollection.cpp @@ -400,8 +400,9 @@ void AudioCollection::InitializeShufflePool() { if (shufflePoolInitialized) return; for (auto& [seqId, seqInfo] : sequenceMap) { + if (!seqInfo.canBeUsedAsReplacement) continue; const std::string cvarKey = "gAudioEditor.Excluded." + seqInfo.sfxKey; - if (CVarGetInteger(cvarKey.c_str(), 0) && !seqInfo.canBeUsedAsReplacement) { + if (CVarGetInteger(cvarKey.c_str(), 0)) { excludedSequences.insert(&seqInfo); } else { includedSequences.insert(&seqInfo); diff --git a/soh/soh/Enhancements/audio/AudioEditor.cpp b/soh/soh/Enhancements/audio/AudioEditor.cpp index 8b0615a83..654446005 100644 --- a/soh/soh/Enhancements/audio/AudioEditor.cpp +++ b/soh/soh/Enhancements/audio/AudioEditor.cpp @@ -422,8 +422,8 @@ void AudioEditor::DrawElement() { ImGui::PopItemWidth(); ImGui::NewLine(); ImGui::PopItemWidth(); - UIWidgets::EnhancementSliderFloat("Link's voice pitch multiplier: %f", "##linkVoiceFreqMultiplier", - "gLinkVoiceFreqMultiplier", 0.4, 2.5, "", 1.0, false, false); + UIWidgets::EnhancementSliderFloat("Link's voice pitch multiplier: %.1f %%", "##linkVoiceFreqMultiplier", + "gLinkVoiceFreqMultiplier", 0.4, 2.5, "", 1.0, true, true); ImGui::SameLine(); const std::string resetButton = "Reset##linkVoiceFreqMultiplier"; if (ImGui::Button(resetButton.c_str())) { diff --git a/soh/soh/Enhancements/audio/AudioEditor.h b/soh/soh/Enhancements/audio/AudioEditor.h index dc058371d..766006ecc 100644 --- a/soh/soh/Enhancements/audio/AudioEditor.h +++ b/soh/soh/Enhancements/audio/AudioEditor.h @@ -4,6 +4,9 @@ #ifdef __cplusplus #include +#ifndef IMGUI_DEFINE_MATH_OPERATORS +#define IMGUI_DEFINE_MATH_OPERATORS +#endif #include class AudioEditor : public LUS::GuiWindow { diff --git a/soh/soh/Enhancements/boss-rush/BossRush.cpp b/soh/soh/Enhancements/boss-rush/BossRush.cpp index e9d94c503..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,10 +216,10 @@ 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->sceneLoadFlag = 0x14; - play->fadeTransition = 3; + 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/controls/GameControlEditor.cpp b/soh/soh/Enhancements/controls/GameControlEditor.cpp index 935935c48..46366135f 100644 --- a/soh/soh/Enhancements/controls/GameControlEditor.cpp +++ b/soh/soh/Enhancements/controls/GameControlEditor.cpp @@ -7,6 +7,9 @@ #include #include +#ifndef IMGUI_DEFINE_MATH_OPERATORS +#define IMGUI_DEFINE_MATH_OPERATORS +#endif #include #include #include @@ -14,6 +17,8 @@ #include #include +#include "macros.h" + #include "../../UIWidgets.hpp" namespace GameControlEditor { @@ -214,16 +219,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; @@ -233,6 +228,10 @@ namespace GameControlEditor { window->BeginGroupPanelPublic("Aiming/First-Person Camera", ImGui::GetContentRegionAvail()); UIWidgets::PaddedEnhancementCheckbox("Right Stick Aiming", "gRightStickAiming"); DrawHelpIcon("Allows for aiming with the right stick in:\n-First-Person/C-Up view\n-Weapon Aiming"); + if (CVarGetInteger("gRightStickAiming", 0)) { + UIWidgets::PaddedEnhancementCheckbox("Allow moving while in first person mode", "gMoveWhileFirstPerson"); + DrawHelpIcon("Changes the left stick to move the player while in first person mode"); + } UIWidgets::PaddedEnhancementCheckbox("Invert Aiming X Axis", "gInvertAimingXAxis"); DrawHelpIcon("Inverts the Camera X Axis in:\n-First-Person/C-Up view\n-Weapon Aiming"); UIWidgets::PaddedEnhancementCheckbox("Invert Aiming Y Axis", "gInvertAimingYAxis", true, true, false, "", UIWidgets::CheckboxGraphics::Cross, true); @@ -241,17 +240,20 @@ namespace GameControlEditor { DrawHelpIcon("Inverts the Shield Aiming Y Axis"); UIWidgets::PaddedEnhancementCheckbox("Invert Shield Aiming X Axis", "gInvertShieldAimingXAxis"); DrawHelpIcon("Inverts the Shield Aiming X Axis"); + UIWidgets::PaddedEnhancementCheckbox("Invert Z-Weapon Aiming Y Axis", "gInvertZAimingYAxis", true, true, false, "", UIWidgets::CheckboxGraphics::Cross, true); + DrawHelpIcon("Inverts the Camera Y Axis in:\n-Z-Weapon Aiming"); UIWidgets::PaddedEnhancementCheckbox("Disable Auto-Centering in First-Person View", "gDisableAutoCenterViewFirstPerson"); DrawHelpIcon("Prevents the C-Up view from auto-centering, allowing for Gyro Aiming"); if (UIWidgets::PaddedEnhancementCheckbox("Enable Custom Aiming/First-Person sensitivity", "gEnableFirstPersonSensitivity", true, false)) { if (!CVarGetInteger("gEnableFirstPersonSensitivity", 0)) { - CVarClear("gFirstPersonCameraSensitivity"); + CVarClear("gFirstPersonCameraSensitivityX"); + CVarClear("gFirstPersonCameraSensitivityY"); } } if (CVarGetInteger("gEnableFirstPersonSensitivity", 0)) { - UIWidgets::EnhancementSliderFloat("Aiming/First-Person Horizontal Sensitivity: %d %%", "##FirstPersonSensitivity Horizontal", + UIWidgets::EnhancementSliderFloat("Aiming/First-Person Horizontal Sensitivity: %.0f %%", "##FirstPersonSensitivity Horizontal", "gFirstPersonCameraSensitivityX", 0.01f, 5.0f, "", 1.0f, true); - UIWidgets::EnhancementSliderFloat("Aiming/First-Person Vertical Sensitivity: %d %%", "##FirstPersonSensitivity Vertical", + UIWidgets::EnhancementSliderFloat("Aiming/First-Person Vertical Sensitivity: %.0f %%", "##FirstPersonSensitivity Vertical", "gFirstPersonCameraSensitivityY", 0.01f, 5.0f, "", 1.0f, true); } UIWidgets::Spacer(0); @@ -268,9 +270,9 @@ namespace GameControlEditor { UIWidgets::PaddedEnhancementCheckbox("Invert Camera Y Axis", "gInvertYAxis", true, true, false, "", UIWidgets::CheckboxGraphics::Cross, true); DrawHelpIcon("Inverts the Camera Y Axis in:\n-Free camera"); UIWidgets::Spacer(0); - UIWidgets::PaddedEnhancementSliderFloat("Third-Person Horizontal Sensitivity: %d %%", "##ThirdPersonSensitivity Horizontal", + UIWidgets::PaddedEnhancementSliderFloat("Third-Person Horizontal Sensitivity: %.0f %%", "##ThirdPersonSensitivity Horizontal", "gThirdPersonCameraSensitivityX", 0.01f, 5.0f, "", 1.0f, true, true, false, true); - UIWidgets::PaddedEnhancementSliderFloat("Third-Person Vertical Sensitivity: %d %%", "##ThirdPersonSensitivity Vertical", + UIWidgets::PaddedEnhancementSliderFloat("Third-Person Vertical Sensitivity: %.0f %%", "##ThirdPersonSensitivity Vertical", "gThirdPersonCameraSensitivityY", 0.01f, 5.0f, "", 1.0f, true, true, false, true); UIWidgets::PaddedEnhancementSliderInt("Camera Distance: %d", "##CamDist", "gFreeCameraDistMax", 100, 900, "", 185, true, false, true); @@ -312,6 +314,7 @@ namespace GameControlEditor { DrawHelpIcon("Allows the cursor on the pause menu to be over any slot. Sometimes required in rando to select " "certain items."); UIWidgets::Spacer(0); + ImGui::BeginDisabled(CVarGetInteger("gDisableChangingSettings", 0)); UIWidgets::PaddedEnhancementCheckbox("Enable walk speed modifiers", "gEnableWalkModify", true, false); DrawHelpIcon("Hold the assigned button to change the maximum walking speed\nTo change the assigned button, go into the Ports tabs above"); if (CVarGetInteger("gEnableWalkModify", 0)) { @@ -319,80 +322,25 @@ namespace GameControlEditor { window->BeginGroupPanelPublic("Walk Modifier", ImGui::GetContentRegionAvail()); UIWidgets::PaddedEnhancementCheckbox("Toggle modifier instead of holding", "gWalkSpeedToggle", true, false); UIWidgets::PaddedEnhancementCheckbox("Don't affect jump distance/velocity", "gWalkModifierDoesntChangeJump", true, false); - UIWidgets::PaddedEnhancementSliderFloat("Modifier 1: %d %%", "##WalkMod1", "gWalkModifierOne", 0.0f, 5.0f, "", 1.0f, true, true, false, true); - UIWidgets::PaddedEnhancementSliderFloat("Modifier 2: %d %%", "##WalkMod2", "gWalkModifierTwo", 0.0f, 5.0f, "", 1.0f, true, true, false, true); + UIWidgets::PaddedEnhancementSliderFloat("Modifier 1: %.0f %%", "##WalkMod1", "gWalkModifierOne", 0.0f, 5.0f, "", 1.0f, true, true, false, true); + UIWidgets::PaddedEnhancementSliderFloat("Modifier 2: %.0f %%", "##WalkMod2", "gWalkModifierTwo", 0.0f, 5.0f, "", 1.0f, true, true, false, true); window->EndGroupPanelPublic(0); } + ImGui::EndDisabled(); UIWidgets::Spacer(0); UIWidgets::PaddedEnhancementCheckbox("Answer Navi Prompt with L Button", "gNaviOnL"); DrawHelpIcon("Speak to Navi with L but enter first-person camera with C-Up"); 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..a5ecc39dc --- /dev/null +++ b/soh/soh/Enhancements/controls/SohInputEditorWindow.cpp @@ -0,0 +1,1941 @@ +#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("Sensitivity:"); + + int32_t sensitivityPercentage = controllerStick->GetSensitivityPercentage(); + if (sensitivityPercentage == 0) { + ImGui::BeginDisabled(); + } + ImGui::PushButtonRepeat(true); + if (ImGui::Button(StringHelper::Sprintf("-##Sensitivity%d", id).c_str())) { + controllerStick->SetSensitivity(sensitivityPercentage - 1); + } + ImGui::PopButtonRepeat(); + if (sensitivityPercentage == 0) { + ImGui::EndDisabled(); + } + ImGui::SameLine(0.0f, 0.0f); + ImGui::SetNextItemWidth(SCALE_IMGUI_SIZE(160.0f)); + if (ImGui::SliderInt(StringHelper::Sprintf("##Sensitivity%d", id).c_str(), &sensitivityPercentage, 0, 200, "%d%%", + ImGuiSliderFlags_AlwaysClamp)) { + controllerStick->SetSensitivity(sensitivityPercentage); + } + ImGui::SameLine(0.0f, 0.0f); + if (sensitivityPercentage == 200) { + ImGui::BeginDisabled(); + } + ImGui::PushButtonRepeat(true); + if (ImGui::Button(StringHelper::Sprintf("+##Sensitivity%d", id).c_str())) { + controllerStick->SetSensitivity(sensitivityPercentage + 1); + } + ImGui::PopButtonRepeat(); + if (sensitivityPercentage == 200) { + ImGui::EndDisabled(); + } + if (!controllerStick->SensitivityIsDefault()) { + ImGui::SameLine(); + if (ImGui::Button(StringHelper::Sprintf("Reset to Default###resetStickSensitivity%d", id).c_str())) { + controllerStick->ResetSensitivityToDefault(); + } + } + + 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: %.1f %%", "##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..32443bb54 --- /dev/null +++ b/soh/soh/Enhancements/controls/SohInputEditorWindow.h @@ -0,0 +1,89 @@ +#pragma once + +#include "stdint.h" +#include +#ifndef IMGUI_DEFINE_MATH_OPERATORS +#define IMGUI_DEFINE_MATH_OPERATORS +#endif +#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/Enhancements/cosmetics/CosmeticsEditor.cpp b/soh/soh/Enhancements/cosmetics/CosmeticsEditor.cpp index 8c2707453..50b5c5b27 100644 --- a/soh/soh/Enhancements/cosmetics/CosmeticsEditor.cpp +++ b/soh/soh/Enhancements/cosmetics/CosmeticsEditor.cpp @@ -1485,12 +1485,13 @@ void Draw_Placements(){ } void DrawSillyTab() { + ImGui::BeginDisabled(CVarGetInteger("gDisableChangingSettings", 0)); if (CVarGetInteger("gLetItSnow", 0)) { if (UIWidgets::EnhancementCheckbox("Let It Snow", "gLetItSnow")) { LUS::Context::GetInstance()->GetWindow()->GetGui()->SaveConsoleVariablesOnNextTick(); } } - if (UIWidgets::EnhancementSliderFloat("Link Body Scale: %f", "##Link_BodyScale", "gCosmetics.Link_BodyScale.Value", 0.001f, 0.025f, "", 0.01f, true)) { + if (UIWidgets::EnhancementSliderFloat("Link Body Scale: %.3fx", "##Link_BodyScale", "gCosmetics.Link_BodyScale.Value", 0.001f, 0.025f, "", 0.01f, true)) { CVarSetInteger("gCosmetics.Link_BodyScale.Changed", 1); } ImGui::SameLine(); @@ -1505,7 +1506,7 @@ void DrawSillyTab() { player->actor.scale.z = 0.01f; } } - if (UIWidgets::EnhancementSliderFloat("Link Head Scale: %f", "##Link_HeadScale", "gCosmetics.Link_HeadScale.Value", 0.4f, 4.0f, "", 1.0f, false)) { + if (UIWidgets::EnhancementSliderFloat("Link Head Scale: %.2fx", "##Link_HeadScale", "gCosmetics.Link_HeadScale.Value", 0.4f, 4.0f, "", 1.0f, false)) { CVarSetInteger("gCosmetics.Link_HeadScale.Changed", 1); } ImGui::SameLine(); @@ -1514,7 +1515,7 @@ void DrawSillyTab() { CVarClear("gCosmetics.Link_HeadScale.Changed"); LUS::Context::GetInstance()->GetWindow()->GetGui()->SaveConsoleVariablesOnNextTick(); } - if (UIWidgets::EnhancementSliderFloat("Link Sword Scale: %f", "##Link_SwordScale", "gCosmetics.Link_SwordScale.Value", 1.0f, 2.5f, "", 1.0f, false)) { + if (UIWidgets::EnhancementSliderFloat("Link Sword Scale: %.3fx", "##Link_SwordScale", "gCosmetics.Link_SwordScale.Value", 1.0f, 2.5f, "", 1.0f, false)) { CVarSetInteger("gCosmetics.Link_SwordScale.Changed", 1); } ImGui::SameLine(); @@ -1523,44 +1524,44 @@ void DrawSillyTab() { CVarClear("gCosmetics.Link_SwordScale.Changed"); LUS::Context::GetInstance()->GetWindow()->GetGui()->SaveConsoleVariablesOnNextTick(); } - UIWidgets::EnhancementSliderFloat("Bunny Hood Length: %f", "##BunnyHood_EarLength", "gCosmetics.BunnyHood_EarLength", -300.0f, 1000.0f, "", 0.0f, false); + UIWidgets::EnhancementSliderFloat("Bunny Hood Length: %.0f", "##BunnyHood_EarLength", "gCosmetics.BunnyHood_EarLength", -300.0f, 1000.0f, "", 0.0f, false); ImGui::SameLine(); if (ImGui::Button("Reset##BunnyHood_EarLength")) { CVarClear("gCosmetics.BunnyHood_EarLength"); LUS::Context::GetInstance()->GetWindow()->GetGui()->SaveConsoleVariablesOnNextTick(); } - UIWidgets::EnhancementSliderFloat("Bunny Hood Spread: %f", "##BunnyHood_EarSpread", "gCosmetics.BunnyHood_EarSpread", -300.0f, 500.0f, "", 0.0f, false); + UIWidgets::EnhancementSliderFloat("Bunny Hood Spread: %.0f", "##BunnyHood_EarSpread", "gCosmetics.BunnyHood_EarSpread", -300.0f, 500.0f, "", 0.0f, false); ImGui::SameLine(); if (ImGui::Button("Reset##BunnyHood_EarSpread")) { CVarClear("gCosmetics.BunnyHood_EarSpread"); LUS::Context::GetInstance()->GetWindow()->GetGui()->SaveConsoleVariablesOnNextTick(); } - UIWidgets::EnhancementSliderFloat("Goron Neck Length: %f", "##Goron_NeckLength", "gCosmetics.Goron_NeckLength", 0.0f, 5000.0f, "", 0.0f, false); + UIWidgets::EnhancementSliderFloat("Goron Neck Length: %.0f", "##Goron_NeckLength", "gCosmetics.Goron_NeckLength", 0.0f, 5000.0f, "", 0.0f, false); ImGui::SameLine(); if (ImGui::Button("Reset##Goron_NeckLength")) { CVarClear("gCosmetics.Goron_NeckLength"); LUS::Context::GetInstance()->GetWindow()->GetGui()->SaveConsoleVariablesOnNextTick(); } UIWidgets::EnhancementCheckbox("Unfix Goron Spin", "gUnfixGoronSpin"); - UIWidgets::EnhancementSliderFloat("Fairies Size: %f", "##Fairies_Size", "gCosmetics.Fairies_Size", 0.25f, 5.0f, "", 1.0f, false); + UIWidgets::EnhancementSliderFloat("Fairies Size: %.2fx", "##Fairies_Size", "gCosmetics.Fairies_Size", 0.25f, 5.0f, "", 1.0f, false); ImGui::SameLine(); if (ImGui::Button("Reset##Fairies_Size")) { CVarClear("gCosmetics.Fairies_Size"); LUS::Context::GetInstance()->GetWindow()->GetGui()->SaveConsoleVariablesOnNextTick(); } - UIWidgets::EnhancementSliderFloat("N64 Logo Spin Speed: %f", "##N64Logo_SpinSpeed", "gCosmetics.N64Logo_SpinSpeed", 0.25f, 5.0f, "", 1.0f, false); + UIWidgets::EnhancementSliderFloat("N64 Logo Spin Speed: %.2fx", "##N64Logo_SpinSpeed", "gCosmetics.N64Logo_SpinSpeed", 0.25f, 5.0f, "", 1.0f, false); ImGui::SameLine(); if (ImGui::Button("Reset##N64Logo_SpinSpeed")) { CVarClear("gCosmetics.N64Logo_SpinSpeed"); LUS::Context::GetInstance()->GetWindow()->GetGui()->SaveConsoleVariablesOnNextTick(); } - UIWidgets::EnhancementSliderFloat("Moon Size: %f", "##Moon_Size", "gCosmetics.Moon_Size", 0.5f, 2.0f, "", 1.0f, false); + UIWidgets::EnhancementSliderFloat("Moon Size: %.1f %%", "##Moon_Size", "gCosmetics.Moon_Size", 0.5f, 2.0f, "", 1.0f, true); ImGui::SameLine(); if (ImGui::Button("Reset##Moon_Size")) { CVarClear("gCosmetics.Moon_Size"); LUS::Context::GetInstance()->GetWindow()->GetGui()->SaveConsoleVariablesOnNextTick(); } - if (UIWidgets::EnhancementSliderFloat("Kak Windmill Speed: %f", "##Kak_Windmill_Speed", "gCosmetics.Kak_Windmill_Speed.Value", 100.0f, 6000.0f, "", 100.0f, false)) { + if (UIWidgets::EnhancementSliderFloat("Kak Windmill Speed: %.0f", "##Kak_Windmill_Speed", "gCosmetics.Kak_Windmill_Speed.Value", 100.0f, 6000.0f, "", 100.0f, false)) { CVarSetInteger("gCosmetics.Kak_Windmill_Speed.Changed", 1); } ImGui::SameLine(); @@ -1569,6 +1570,7 @@ void DrawSillyTab() { CVarClear("gCosmetics.Kak_Windmill_Speed.Changed"); LUS::Context::GetInstance()->GetWindow()->GetGui()->SaveConsoleVariablesOnNextTick(); } + ImGui::EndDisabled(); } // Copies the RGB values from one cosmetic option to another, multiplied by the passed in amount, this @@ -1767,6 +1769,10 @@ void CosmeticsEditorWindow::DrawElement() { ImGui::SameLine(); UIWidgets::EnhancementCombobox("gCosmetics.DefaultColorScheme", colorSchemes, COLORSCHEME_N64); UIWidgets::EnhancementCheckbox("Advanced Mode", "gCosmetics.AdvancedMode"); + UIWidgets::InsertHelpHoverText( + "Some cosmetic options may not apply if you have any mods that provide custom models for the cosmetic option.\n\n" + "For example, if you have custom Link model, then the Link's Hair color option will most likely not apply." + ); if (CVarGetInteger("gCosmetics.AdvancedMode", 0)) { if (ImGui::Button("Lock All Advanced", ImVec2(ImGui::GetContentRegionAvail().x / 2, 30.0f))) { for (auto& [id, cosmeticOption] : cosmeticOptions) { @@ -1787,7 +1793,7 @@ void CosmeticsEditorWindow::DrawElement() { } } UIWidgets::EnhancementCheckbox("Sync Rainbow colors", "gCosmetics.RainbowSync"); - UIWidgets::EnhancementSliderFloat("Rainbow Speed: %f", "##rainbowSpeed", "gCosmetics.RainbowSpeed", 0.03f, 1.0f, "", 0.6f, false); + UIWidgets::EnhancementSliderFloat("Rainbow Speed: %.3f", "##rainbowSpeed", "gCosmetics.RainbowSpeed", 0.03f, 1.0f, "", 0.6f, false, true); if (ImGui::Button("Randomize All", ImVec2(ImGui::GetContentRegionAvail().x / 2, 30.0f))) { for (auto& [id, cosmeticOption] : cosmeticOptions) { if (!CVarGetInteger(cosmeticOption.lockedCvar, 0) && (!cosmeticOption.advancedOption || CVarGetInteger("gCosmetics.AdvancedMode", 0))) { diff --git a/soh/soh/Enhancements/crowd-control/CrowdControl.cpp b/soh/soh/Enhancements/crowd-control/CrowdControl.cpp index a9f3b1f19..9c0d5cb2d 100644 --- a/soh/soh/Enhancements/crowd-control/CrowdControl.cpp +++ b/soh/soh/Enhancements/crowd-control/CrowdControl.cpp @@ -1,4 +1,4 @@ -#ifdef ENABLE_CROWD_CONTROL +#ifdef ENABLE_REMOTE_CONTROL #include "CrowdControl.h" #include "CrowdControlTypes.h" @@ -17,25 +17,17 @@ extern "C" { extern PlayState* gPlayState; } -void CrowdControl::Init() { - SDLNet_Init(); -} - -void CrowdControl::Shutdown() { - SDLNet_Quit(); -} - void CrowdControl::Enable() { if (isEnabled) { return; } - if (SDLNet_ResolveHost(&ip, "127.0.0.1", 43384) == -1) { - SPDLOG_ERROR("[CrowdControl] SDLNet_ResolveHost: {}", SDLNet_GetError()); - } - isEnabled = true; - ccThreadReceive = std::thread(&CrowdControl::ListenToServer, this); + GameInteractor::Instance->EnableRemoteInteractor(); + GameInteractor::Instance->RegisterRemoteJsonHandler([&](nlohmann::json payload) { + HandleRemoteData(payload); + }); + ccThreadProcess = std::thread(&CrowdControl::ProcessActiveEffects, this); } @@ -45,87 +37,42 @@ void CrowdControl::Disable() { } isEnabled = false; - ccThreadReceive.join(); ccThreadProcess.join(); + GameInteractor::Instance->DisableRemoteInteractor(); } -void CrowdControl::ListenToServer() { - while (isEnabled) { - while (!connected && isEnabled) { - SPDLOG_TRACE("[CrowdControl] Attempting to make connection to server..."); - tcpsock = SDLNet_TCP_Open(&ip); +void CrowdControl::HandleRemoteData(nlohmann::json payload) { + Effect* incomingEffect = ParseMessage(payload); + if (!incomingEffect) { + return; + } - if (tcpsock) { - connected = true; - SPDLOG_TRACE("[CrowdControl] Connection to server established!"); + // If effect is not a timed effect, execute and return result. + if (!incomingEffect->timeRemaining) { + EffectResult result = CrowdControl::ExecuteEffect(incomingEffect); + EmitMessage(incomingEffect->id, incomingEffect->timeRemaining, result); + } else { + // If another timed effect is already active that conflicts with the incoming effect. + bool isConflictingEffectActive = false; + for (Effect* effect : activeEffects) { + if (effect != incomingEffect && effect->category == incomingEffect->category && effect->id < incomingEffect->id) { + isConflictingEffectActive = true; + EmitMessage(incomingEffect->id, incomingEffect->timeRemaining, EffectResult::Retry); break; } } - SDLNet_SocketSet socketSet = SDLNet_AllocSocketSet(1); - if (tcpsock) { - SDLNet_TCP_AddSocket(socketSet, tcpsock); - } - - // Listen to socket messages - while (connected && tcpsock && isEnabled) { - // we check first if socket has data, to not block in the TCP_Recv - int socketsReady = SDLNet_CheckSockets(socketSet, 0); - - if (socketsReady == -1) { - SPDLOG_ERROR("[CrowdControl] SDLNet_CheckSockets: {}", SDLNet_GetError()); - break; + if (!isConflictingEffectActive) { + // Check if effect can be applied, if it can't, let CC know. + EffectResult result = CrowdControl::CanApplyEffect(incomingEffect); + if (result == EffectResult::Retry || result == EffectResult::Failure) { + EmitMessage(incomingEffect->id, incomingEffect->timeRemaining, result); + return; } - if (socketsReady == 0) { - continue; - } - - int len = SDLNet_TCP_Recv(tcpsock, &received, sizeof(received)); - if (!len || !tcpsock || len == -1) { - SPDLOG_ERROR("[CrowdControl] SDLNet_TCP_Recv: {}", SDLNet_GetError()); - break; - } - - Effect* incomingEffect = ParseMessage(received); - if (!incomingEffect) { - continue; - } - - // If effect is not a timed effect, execute and return result. - if (!incomingEffect->timeRemaining) { - EffectResult result = CrowdControl::ExecuteEffect(incomingEffect); - EmitMessage(tcpsock, incomingEffect->id, incomingEffect->timeRemaining, result); - } else { - // If another timed effect is already active that conflicts with the incoming effect. - bool isConflictingEffectActive = false; - for (Effect* effect : activeEffects) { - if (effect != incomingEffect && effect->category == incomingEffect->category && effect->id < incomingEffect->id) { - isConflictingEffectActive = true; - EmitMessage(tcpsock, incomingEffect->id, incomingEffect->timeRemaining, EffectResult::Retry); - break; - } - } - - if (!isConflictingEffectActive) { - // Check if effect can be applied, if it can't, let CC know. - EffectResult result = CrowdControl::CanApplyEffect(incomingEffect); - if (result == EffectResult::Retry || result == EffectResult::Failure) { - EmitMessage(tcpsock, incomingEffect->id, incomingEffect->timeRemaining, result); - continue; - } - - activeEffectsMutex.lock(); - activeEffects.push_back(incomingEffect); - activeEffectsMutex.unlock(); - } - } - } - - if (connected) { - SDLNet_TCP_Close(tcpsock); - connected = false; - SPDLOG_TRACE("[CrowdControl] Ending Listen thread..."); + activeEffectsMutex.lock(); + activeEffects.push_back(incomingEffect); + activeEffectsMutex.unlock(); } } } @@ -147,13 +94,13 @@ void CrowdControl::ProcessActiveEffects() { if (effect->timeRemaining <= 0) { it = activeEffects.erase(std::remove(activeEffects.begin(), activeEffects.end(), effect), activeEffects.end()); - GameInteractor::RemoveEffect(effect->giEffect); + GameInteractor::RemoveEffect(dynamic_cast(effect->giEffect)); delete effect; } else { // If we have a success after previously being paused, tell CC to resume timer. if (effect->isPaused) { effect->isPaused = false; - EmitMessage(tcpsock, effect->id, effect->timeRemaining, EffectResult::Resumed); + EmitMessage(effect->id, effect->timeRemaining, EffectResult::Resumed); // If not paused before, subtract time from the timer and send a Success event if // the result is different from the last time this was ran. // Timed events are put on a thread that runs once per second. @@ -161,7 +108,7 @@ void CrowdControl::ProcessActiveEffects() { effect->timeRemaining -= 1000; if (result != effect->lastExecutionResult) { effect->lastExecutionResult = result; - EmitMessage(tcpsock, effect->id, effect->timeRemaining, EffectResult::Success); + EmitMessage(effect->id, effect->timeRemaining, EffectResult::Success); } } it++; @@ -169,7 +116,7 @@ void CrowdControl::ProcessActiveEffects() { } else { // Timed effects only do Success or Retry if (!effect->isPaused && effect->timeRemaining > 0) { effect->isPaused = true; - EmitMessage(tcpsock, effect->id, effect->timeRemaining, EffectResult::Paused); + EmitMessage(effect->id, effect->timeRemaining, EffectResult::Paused); } it++; } @@ -182,7 +129,7 @@ void CrowdControl::ProcessActiveEffects() { SPDLOG_TRACE("[CrowdControl] Ending Process thread..."); } -void CrowdControl::EmitMessage(TCPsocket socket, uint32_t eventId, long timeRemaining, EffectResult status) { +void CrowdControl::EmitMessage(uint32_t eventId, long timeRemaining, EffectResult status) { nlohmann::json payload; payload["id"] = eventId; @@ -190,8 +137,9 @@ void CrowdControl::EmitMessage(TCPsocket socket, uint32_t eventId, long timeRema payload["timeRemaining"] = timeRemaining; payload["status"] = status; - std::string jsonPayload = payload.dump(); - SDLNet_TCP_Send(socket, jsonPayload.c_str(), jsonPayload.size() + 1); + SPDLOG_INFO("[CrowdControl] Sending payload:\n{}", payload.dump()); + + GameInteractor::Instance->TransmitJsonToRemote(payload); } CrowdControl::EffectResult CrowdControl::ExecuteEffect(Effect* effect) { @@ -229,13 +177,14 @@ CrowdControl::EffectResult CrowdControl::TranslateGiEnum(GameInteractionEffectQu return result; } -CrowdControl::Effect* CrowdControl::ParseMessage(char payload[512]) { - nlohmann::json dataReceived = nlohmann::json::parse(payload, nullptr, false); - if (dataReceived.is_discarded()) { - SPDLOG_ERROR("Error parsing JSON"); +CrowdControl::Effect* CrowdControl::ParseMessage(nlohmann::json dataReceived) { + if (!dataReceived.contains("id") || !dataReceived.contains("type")) { + SPDLOG_ERROR("[CrowdControl] Invalid payload received:\n{}", dataReceived); return nullptr; } + SPDLOG_INFO("[CrowdControl] Received payload:\n{}", dataReceived.dump()); + Effect* effect = new Effect(); effect->lastExecutionResult = EffectResult::Initiate; effect->id = dataReceived["id"]; @@ -333,13 +282,13 @@ CrowdControl::Effect* CrowdControl::ParseMessage(char payload[512]) { effect->category = kEffectCatDamageTaken; effect->timeRemaining = 30000; effect->giEffect = new GameInteractionEffect::ModifyDefenseModifier(); - effect->giEffect->parameters[0] = 2; + dynamic_cast(effect->giEffect)->parameters[0] = 2; break; case kEffectTakeDoubleDamage: effect->category = kEffectCatDamageTaken; effect->timeRemaining = 30000; effect->giEffect = new GameInteractionEffect::ModifyDefenseModifier(); - effect->giEffect->parameters[0] = -2; + dynamic_cast(effect->giEffect)->parameters[0] = -2; break; case kEffectOneHitKo: effect->category = kEffectCatDamageTaken; @@ -356,37 +305,37 @@ CrowdControl::Effect* CrowdControl::ParseMessage(char payload[512]) { effect->category = kEffectCatSpeed; effect->timeRemaining = 30000; effect->giEffect = new GameInteractionEffect::ModifyRunSpeedModifier(); - effect->giEffect->parameters[0] = 2; + dynamic_cast(effect->giEffect)->parameters[0] = 2; break; case kEffectDecreaseSpeed: effect->category = kEffectCatSpeed; effect->timeRemaining = 30000; effect->giEffect = new GameInteractionEffect::ModifyRunSpeedModifier(); - effect->giEffect->parameters[0] = -2; + dynamic_cast(effect->giEffect)->parameters[0] = -2; break; case kEffectLowGravity: effect->category = kEffectCatGravity; effect->timeRemaining = 30000; effect->giEffect = new GameInteractionEffect::ModifyGravity(); - effect->giEffect->parameters[0] = GI_GRAVITY_LEVEL_LIGHT; + dynamic_cast(effect->giEffect)->parameters[0] = GI_GRAVITY_LEVEL_LIGHT; break; case kEffectHighGravity: effect->category = kEffectCatGravity; effect->timeRemaining = 30000; effect->giEffect = new GameInteractionEffect::ModifyGravity(); - effect->giEffect->parameters[0] = GI_GRAVITY_LEVEL_HEAVY; + dynamic_cast(effect->giEffect)->parameters[0] = GI_GRAVITY_LEVEL_HEAVY; break; case kEffectForceIronBoots: effect->category = kEffectCatBoots; effect->timeRemaining = 30000; effect->giEffect = new GameInteractionEffect::ForceEquipBoots(); - effect->giEffect->parameters[0] = PLAYER_BOOTS_IRON; + dynamic_cast(effect->giEffect)->parameters[0] = EQUIP_VALUE_BOOTS_IRON; break; case kEffectForceHoverBoots: effect->category = kEffectCatBoots; effect->timeRemaining = 30000; effect->giEffect = new GameInteractionEffect::ForceEquipBoots(); - effect->giEffect->parameters[0] = PLAYER_BOOTS_HOVER; + dynamic_cast(effect->giEffect)->parameters[0] = EQUIP_VALUE_BOOTS_HOVER; break; case kEffectSlipperyFloor: effect->category = kEffectCatSlipperyFloor; @@ -412,23 +361,23 @@ CrowdControl::Effect* CrowdControl::ParseMessage(char payload[512]) { // Hurt or Heal Link case kEffectEmptyHeart: effect->giEffect = new GameInteractionEffect::ModifyHealth(); - effect->giEffect->parameters[0] = receivedParameter * -1; + dynamic_cast(effect->giEffect)->parameters[0] = receivedParameter * -1; break; case kEffectFillHeart: effect->giEffect = new GameInteractionEffect::ModifyHealth(); - effect->giEffect->parameters[0] = receivedParameter; + dynamic_cast(effect->giEffect)->parameters[0] = receivedParameter; break; case kEffectKnockbackLinkWeak: effect->giEffect = new GameInteractionEffect::KnockbackPlayer(); - effect->giEffect->parameters[0] = 1; + dynamic_cast(effect->giEffect)->parameters[0] = 1; break; case kEffectKnockbackLinkStrong: effect->giEffect = new GameInteractionEffect::KnockbackPlayer(); - effect->giEffect->parameters[0] = 3; + dynamic_cast(effect->giEffect)->parameters[0] = 3; break; case kEffectKnockbackLinkMega: effect->giEffect = new GameInteractionEffect::KnockbackPlayer(); - effect->giEffect->parameters[0] = 6; + dynamic_cast(effect->giEffect)->parameters[0] = 6; break; case kEffectBurnLink: effect->giEffect = new GameInteractionEffect::BurnPlayer(); @@ -441,109 +390,109 @@ CrowdControl::Effect* CrowdControl::ParseMessage(char payload[512]) { break; case kEffectKillLink: effect->giEffect = new GameInteractionEffect::SetPlayerHealth(); - effect->giEffect->parameters[0] = 0; + dynamic_cast(effect->giEffect)->parameters[0] = 0; break; // Give Items and Consumables case kEffectAddHeartContainer: effect->giEffect = new GameInteractionEffect::ModifyHeartContainers(); - effect->giEffect->parameters[0] = 1; + dynamic_cast(effect->giEffect)->parameters[0] = 1; break; case kEffectFillMagic: effect->giEffect = new GameInteractionEffect::FillMagic(); break; case kEffectAddRupees: effect->giEffect = new GameInteractionEffect::ModifyRupees(); - effect->giEffect->parameters[0] = receivedParameter; + dynamic_cast(effect->giEffect)->parameters[0] = receivedParameter; break; case kEffectGiveDekuShield: effect->giEffect = new GameInteractionEffect::GiveOrTakeShield(); - effect->giEffect->parameters[0] = ITEM_SHIELD_DEKU; + dynamic_cast(effect->giEffect)->parameters[0] = ITEM_SHIELD_DEKU; break; case kEffectGiveHylianShield: effect->giEffect = new GameInteractionEffect::GiveOrTakeShield(); - effect->giEffect->parameters[0] = ITEM_SHIELD_HYLIAN; + dynamic_cast(effect->giEffect)->parameters[0] = ITEM_SHIELD_HYLIAN; break; case kEffectRefillSticks: effect->giEffect = new GameInteractionEffect::AddOrTakeAmmo(); - effect->giEffect->parameters[0] = receivedParameter; - effect->giEffect->parameters[1] = ITEM_STICK; + dynamic_cast(effect->giEffect)->parameters[0] = receivedParameter; + dynamic_cast(effect->giEffect)->parameters[1] = ITEM_STICK; break; case kEffectRefillNuts: effect->giEffect = new GameInteractionEffect::AddOrTakeAmmo(); - effect->giEffect->parameters[0] = receivedParameter; - effect->giEffect->parameters[1] = ITEM_NUT; + dynamic_cast(effect->giEffect)->parameters[0] = receivedParameter; + dynamic_cast(effect->giEffect)->parameters[1] = ITEM_NUT; break; case kEffectRefillBombs: effect->giEffect = new GameInteractionEffect::AddOrTakeAmmo(); - effect->giEffect->parameters[0] = receivedParameter; - effect->giEffect->parameters[1] = ITEM_BOMB; + dynamic_cast(effect->giEffect)->parameters[0] = receivedParameter; + dynamic_cast(effect->giEffect)->parameters[1] = ITEM_BOMB; break; case kEffectRefillSeeds: effect->giEffect = new GameInteractionEffect::AddOrTakeAmmo(); - effect->giEffect->parameters[0] = receivedParameter; - effect->giEffect->parameters[1] = ITEM_SLINGSHOT; + dynamic_cast(effect->giEffect)->parameters[0] = receivedParameter; + dynamic_cast(effect->giEffect)->parameters[1] = ITEM_SLINGSHOT; break; case kEffectRefillArrows: effect->giEffect = new GameInteractionEffect::AddOrTakeAmmo(); - effect->giEffect->parameters[0] = receivedParameter; - effect->giEffect->parameters[1] = ITEM_BOW; + dynamic_cast(effect->giEffect)->parameters[0] = receivedParameter; + dynamic_cast(effect->giEffect)->parameters[1] = ITEM_BOW; break; case kEffectRefillBombchus: effect->giEffect = new GameInteractionEffect::AddOrTakeAmmo(); - effect->giEffect->parameters[0] = receivedParameter; - effect->giEffect->parameters[1] = ITEM_BOMBCHU; + dynamic_cast(effect->giEffect)->parameters[0] = receivedParameter; + dynamic_cast(effect->giEffect)->parameters[1] = ITEM_BOMBCHU; break; // Take Items and Consumables case kEffectRemoveHeartContainer: effect->giEffect = new GameInteractionEffect::ModifyHeartContainers(); - effect->giEffect->parameters[0] = -1; + dynamic_cast(effect->giEffect)->parameters[0] = -1; break; case kEffectEmptyMagic: effect->giEffect = new GameInteractionEffect::EmptyMagic(); break; case kEffectRemoveRupees: effect->giEffect = new GameInteractionEffect::ModifyRupees(); - effect->giEffect->parameters[0] = receivedParameter * -1; + dynamic_cast(effect->giEffect)->parameters[0] = receivedParameter * -1; break; case kEffectTakeDekuShield: effect->giEffect = new GameInteractionEffect::GiveOrTakeShield(); - effect->giEffect->parameters[0] = -ITEM_SHIELD_DEKU; + dynamic_cast(effect->giEffect)->parameters[0] = -ITEM_SHIELD_DEKU; break; case kEffectTakeHylianShield: effect->giEffect = new GameInteractionEffect::GiveOrTakeShield(); - effect->giEffect->parameters[0] = -ITEM_SHIELD_HYLIAN; + dynamic_cast(effect->giEffect)->parameters[0] = -ITEM_SHIELD_HYLIAN; break; case kEffectTakeSticks: effect->giEffect = new GameInteractionEffect::AddOrTakeAmmo(); - effect->giEffect->parameters[0] = receivedParameter * -1; - effect->giEffect->parameters[1] = ITEM_STICK; + dynamic_cast(effect->giEffect)->parameters[0] = receivedParameter * -1; + dynamic_cast(effect->giEffect)->parameters[1] = ITEM_STICK; break; case kEffectTakeNuts: effect->giEffect = new GameInteractionEffect::AddOrTakeAmmo(); - effect->giEffect->parameters[0] = receivedParameter * -1; - effect->giEffect->parameters[1] = ITEM_NUT; + dynamic_cast(effect->giEffect)->parameters[0] = receivedParameter * -1; + dynamic_cast(effect->giEffect)->parameters[1] = ITEM_NUT; break; case kEffectTakeBombs: effect->giEffect = new GameInteractionEffect::AddOrTakeAmmo(); - effect->giEffect->parameters[0] = receivedParameter * -1; - effect->giEffect->parameters[1] = ITEM_BOMB; + dynamic_cast(effect->giEffect)->parameters[0] = receivedParameter * -1; + dynamic_cast(effect->giEffect)->parameters[1] = ITEM_BOMB; break; case kEffectTakeSeeds: effect->giEffect = new GameInteractionEffect::AddOrTakeAmmo(); - effect->giEffect->parameters[0] = receivedParameter * -1; - effect->giEffect->parameters[1] = ITEM_SLINGSHOT; + dynamic_cast(effect->giEffect)->parameters[0] = receivedParameter * -1; + dynamic_cast(effect->giEffect)->parameters[1] = ITEM_SLINGSHOT; break; case kEffectTakeArrows: effect->giEffect = new GameInteractionEffect::AddOrTakeAmmo(); - effect->giEffect->parameters[0] = receivedParameter * -1; - effect->giEffect->parameters[1] = ITEM_BOW; + dynamic_cast(effect->giEffect)->parameters[0] = receivedParameter * -1; + dynamic_cast(effect->giEffect)->parameters[1] = ITEM_BOW; break; case kEffectTakeBombchus: effect->giEffect = new GameInteractionEffect::AddOrTakeAmmo(); - effect->giEffect->parameters[0] = receivedParameter * -1; - effect->giEffect->parameters[1] = ITEM_BOMBCHU; + dynamic_cast(effect->giEffect)->parameters[0] = receivedParameter * -1; + dynamic_cast(effect->giEffect)->parameters[1] = ITEM_BOMBCHU; break; // Link Size Modifiers @@ -551,25 +500,25 @@ CrowdControl::Effect* CrowdControl::ParseMessage(char payload[512]) { effect->category = kEffectCatLinkSize; effect->timeRemaining = 30000; effect->giEffect = new GameInteractionEffect::ModifyLinkSize(); - effect->giEffect->parameters[0] = GI_LINK_SIZE_GIANT; + dynamic_cast(effect->giEffect)->parameters[0] = GI_LINK_SIZE_GIANT; break; case kEffectMinishLink: effect->category = kEffectCatLinkSize; effect->timeRemaining = 30000; effect->giEffect = new GameInteractionEffect::ModifyLinkSize(); - effect->giEffect->parameters[0] = GI_LINK_SIZE_MINISH; + dynamic_cast(effect->giEffect)->parameters[0] = GI_LINK_SIZE_MINISH; break; case kEffectPaperLink: effect->category = kEffectCatLinkSize; effect->timeRemaining = 30000; effect->giEffect = new GameInteractionEffect::ModifyLinkSize(); - effect->giEffect->parameters[0] = GI_LINK_SIZE_PAPER; + dynamic_cast(effect->giEffect)->parameters[0] = GI_LINK_SIZE_PAPER; break; case kEffectSquishedLink: effect->category = kEffectCatLinkSize; effect->timeRemaining = 30000; effect->giEffect = new GameInteractionEffect::ModifyLinkSize(); - effect->giEffect->parameters[0] = GI_LINK_SIZE_SQUISHED; + dynamic_cast(effect->giEffect)->parameters[0] = GI_LINK_SIZE_SQUISHED; break; case kEffectInvisibleLink: effect->category = kEffectCatLinkSize; @@ -585,11 +534,11 @@ CrowdControl::Effect* CrowdControl::ParseMessage(char payload[512]) { break; case kEffectSetTimeToDawn: effect->giEffect = new GameInteractionEffect::SetTimeOfDay(); - effect->giEffect->parameters[0] = GI_TIMEOFDAY_DAWN; + dynamic_cast(effect->giEffect)->parameters[0] = GI_TIMEOFDAY_DAWN; break; case kEffectSetTimeToDusk: effect->giEffect = new GameInteractionEffect::SetTimeOfDay(); - effect->giEffect->parameters[0] = GI_TIMEOFDAY_DUSK; + dynamic_cast(effect->giEffect)->parameters[0] = GI_TIMEOFDAY_DUSK; break; // Visual Effects @@ -632,186 +581,186 @@ CrowdControl::Effect* CrowdControl::ParseMessage(char payload[512]) { effect->category = kEffectCatRandomButtons; effect->timeRemaining = 30000; effect->giEffect = new GameInteractionEffect::PressRandomButton(); - effect->giEffect->parameters[0] = 30; + dynamic_cast(effect->giEffect)->parameters[0] = 30; break; case kEffectClearCbuttons: effect->giEffect = new GameInteractionEffect::ClearAssignedButtons(); - effect->giEffect->parameters[0] = GI_BUTTONS_CBUTTONS; + dynamic_cast(effect->giEffect)->parameters[0] = GI_BUTTONS_CBUTTONS; break; case kEffectClearDpad: effect->giEffect = new GameInteractionEffect::ClearAssignedButtons(); - effect->giEffect->parameters[0] = GI_BUTTONS_DPAD; + dynamic_cast(effect->giEffect)->parameters[0] = GI_BUTTONS_DPAD; break; // Teleport Player case kEffectTpLinksHouse: effect->giEffect = new GameInteractionEffect::TeleportPlayer(); - effect->giEffect->parameters[0] = GI_TP_DEST_LINKSHOUSE; + dynamic_cast(effect->giEffect)->parameters[0] = GI_TP_DEST_LINKSHOUSE; break; case kEffectTpMinuet: effect->giEffect = new GameInteractionEffect::TeleportPlayer(); - effect->giEffect->parameters[0] = GI_TP_DEST_MINUET; + dynamic_cast(effect->giEffect)->parameters[0] = GI_TP_DEST_MINUET; break; case kEffectTpBolero: effect->giEffect = new GameInteractionEffect::TeleportPlayer(); - effect->giEffect->parameters[0] = GI_TP_DEST_BOLERO; + dynamic_cast(effect->giEffect)->parameters[0] = GI_TP_DEST_BOLERO; break; case kEffectTpSerenade: effect->giEffect = new GameInteractionEffect::TeleportPlayer(); - effect->giEffect->parameters[0] = GI_TP_DEST_SERENADE; + dynamic_cast(effect->giEffect)->parameters[0] = GI_TP_DEST_SERENADE; break; case kEffectTpRequiem: effect->giEffect = new GameInteractionEffect::TeleportPlayer(); - effect->giEffect->parameters[0] = GI_TP_DEST_REQUIEM; + dynamic_cast(effect->giEffect)->parameters[0] = GI_TP_DEST_REQUIEM; break; case kEffectTpNocturne: effect->giEffect = new GameInteractionEffect::TeleportPlayer(); - effect->giEffect->parameters[0] = GI_TP_DEST_NOCTURNE; + dynamic_cast(effect->giEffect)->parameters[0] = GI_TP_DEST_NOCTURNE; break; case kEffectTpPrelude: effect->giEffect = new GameInteractionEffect::TeleportPlayer(); - effect->giEffect->parameters[0] = GI_TP_DEST_PRELUDE; + dynamic_cast(effect->giEffect)->parameters[0] = GI_TP_DEST_PRELUDE; break; // Tunic Color (Bidding War) case kEffectTunicRed: effect->giEffect = new GameInteractionEffect::SetCosmeticsColor(); - effect->giEffect->parameters[0] = GI_COSMETICS_TUNICS; - effect->giEffect->parameters[1] = GI_COLOR_RED; + dynamic_cast(effect->giEffect)->parameters[0] = GI_COSMETICS_TUNICS; + dynamic_cast(effect->giEffect)->parameters[1] = GI_COLOR_RED; break; case kEffectTunicGreen: effect->giEffect = new GameInteractionEffect::SetCosmeticsColor(); - effect->giEffect->parameters[0] = GI_COSMETICS_TUNICS; - effect->giEffect->parameters[1] = GI_COLOR_GREEN; + dynamic_cast(effect->giEffect)->parameters[0] = GI_COSMETICS_TUNICS; + dynamic_cast(effect->giEffect)->parameters[1] = GI_COLOR_GREEN; break; case kEffectTunicBlue: effect->giEffect = new GameInteractionEffect::SetCosmeticsColor(); - effect->giEffect->parameters[0] = GI_COSMETICS_TUNICS; - effect->giEffect->parameters[1] = GI_COLOR_BLUE; + dynamic_cast(effect->giEffect)->parameters[0] = GI_COSMETICS_TUNICS; + dynamic_cast(effect->giEffect)->parameters[1] = GI_COLOR_BLUE; break; case kEffectTunicOrange: effect->giEffect = new GameInteractionEffect::SetCosmeticsColor(); - effect->giEffect->parameters[0] = GI_COSMETICS_TUNICS; - effect->giEffect->parameters[1] = GI_COLOR_ORANGE; + dynamic_cast(effect->giEffect)->parameters[0] = GI_COSMETICS_TUNICS; + dynamic_cast(effect->giEffect)->parameters[1] = GI_COLOR_ORANGE; break; case kEffectTunicYellow: effect->giEffect = new GameInteractionEffect::SetCosmeticsColor(); - effect->giEffect->parameters[0] = GI_COSMETICS_TUNICS; - effect->giEffect->parameters[1] = GI_COLOR_YELLOW; + dynamic_cast(effect->giEffect)->parameters[0] = GI_COSMETICS_TUNICS; + dynamic_cast(effect->giEffect)->parameters[1] = GI_COLOR_YELLOW; break; case kEffectTunicPurple: effect->giEffect = new GameInteractionEffect::SetCosmeticsColor(); - effect->giEffect->parameters[0] = GI_COSMETICS_TUNICS; - effect->giEffect->parameters[1] = GI_COLOR_PURPLE; + dynamic_cast(effect->giEffect)->parameters[0] = GI_COSMETICS_TUNICS; + dynamic_cast(effect->giEffect)->parameters[1] = GI_COLOR_PURPLE; break; case kEffectTunicPink: effect->giEffect = new GameInteractionEffect::SetCosmeticsColor(); - effect->giEffect->parameters[0] = GI_COSMETICS_TUNICS; - effect->giEffect->parameters[1] = GI_COLOR_PINK; + dynamic_cast(effect->giEffect)->parameters[0] = GI_COSMETICS_TUNICS; + dynamic_cast(effect->giEffect)->parameters[1] = GI_COLOR_PINK; break; case kEffectTunicBrown: effect->giEffect = new GameInteractionEffect::SetCosmeticsColor(); - effect->giEffect->parameters[0] = GI_COSMETICS_TUNICS; - effect->giEffect->parameters[1] = GI_COLOR_BROWN; + dynamic_cast(effect->giEffect)->parameters[0] = GI_COSMETICS_TUNICS; + dynamic_cast(effect->giEffect)->parameters[1] = GI_COLOR_BROWN; break; case kEffectTunicBlack: effect->giEffect = new GameInteractionEffect::SetCosmeticsColor(); - effect->giEffect->parameters[0] = GI_COSMETICS_TUNICS; - effect->giEffect->parameters[1] = GI_COLOR_BLACK; + dynamic_cast(effect->giEffect)->parameters[0] = GI_COSMETICS_TUNICS; + dynamic_cast(effect->giEffect)->parameters[1] = GI_COLOR_BLACK; break; // Navi Color (Bidding War) case kEffectNaviRed: effect->giEffect = new GameInteractionEffect::SetCosmeticsColor(); - effect->giEffect->parameters[0] = GI_COSMETICS_NAVI; - effect->giEffect->parameters[1] = GI_COLOR_RED; + dynamic_cast(effect->giEffect)->parameters[0] = GI_COSMETICS_NAVI; + dynamic_cast(effect->giEffect)->parameters[1] = GI_COLOR_RED; break; case kEffectNaviGreen: effect->giEffect = new GameInteractionEffect::SetCosmeticsColor(); - effect->giEffect->parameters[0] = GI_COSMETICS_NAVI; - effect->giEffect->parameters[1] = GI_COLOR_GREEN; + dynamic_cast(effect->giEffect)->parameters[0] = GI_COSMETICS_NAVI; + dynamic_cast(effect->giEffect)->parameters[1] = GI_COLOR_GREEN; break; case kEffectNaviBlue: effect->giEffect = new GameInteractionEffect::SetCosmeticsColor(); - effect->giEffect->parameters[0] = GI_COSMETICS_NAVI; - effect->giEffect->parameters[1] = GI_COLOR_BLUE; + dynamic_cast(effect->giEffect)->parameters[0] = GI_COSMETICS_NAVI; + dynamic_cast(effect->giEffect)->parameters[1] = GI_COLOR_BLUE; break; case kEffectNaviOrange: effect->giEffect = new GameInteractionEffect::SetCosmeticsColor(); - effect->giEffect->parameters[0] = GI_COSMETICS_NAVI; - effect->giEffect->parameters[1] = GI_COLOR_ORANGE; + dynamic_cast(effect->giEffect)->parameters[0] = GI_COSMETICS_NAVI; + dynamic_cast(effect->giEffect)->parameters[1] = GI_COLOR_ORANGE; break; case kEffectNaviYellow: effect->giEffect = new GameInteractionEffect::SetCosmeticsColor(); - effect->giEffect->parameters[0] = GI_COSMETICS_NAVI; - effect->giEffect->parameters[1] = GI_COLOR_YELLOW; + dynamic_cast(effect->giEffect)->parameters[0] = GI_COSMETICS_NAVI; + dynamic_cast(effect->giEffect)->parameters[1] = GI_COLOR_YELLOW; break; case kEffectNaviPurple: effect->giEffect = new GameInteractionEffect::SetCosmeticsColor(); - effect->giEffect->parameters[0] = GI_COSMETICS_NAVI; - effect->giEffect->parameters[1] = GI_COLOR_PURPLE; + dynamic_cast(effect->giEffect)->parameters[0] = GI_COSMETICS_NAVI; + dynamic_cast(effect->giEffect)->parameters[1] = GI_COLOR_PURPLE; break; case kEffectNaviPink: effect->giEffect = new GameInteractionEffect::SetCosmeticsColor(); - effect->giEffect->parameters[0] = GI_COSMETICS_NAVI; - effect->giEffect->parameters[1] = GI_COLOR_PINK; + dynamic_cast(effect->giEffect)->parameters[0] = GI_COSMETICS_NAVI; + dynamic_cast(effect->giEffect)->parameters[1] = GI_COLOR_PINK; break; case kEffectNaviBrown: effect->giEffect = new GameInteractionEffect::SetCosmeticsColor(); - effect->giEffect->parameters[0] = GI_COSMETICS_NAVI; - effect->giEffect->parameters[1] = GI_COLOR_BROWN; + dynamic_cast(effect->giEffect)->parameters[0] = GI_COSMETICS_NAVI; + dynamic_cast(effect->giEffect)->parameters[1] = GI_COLOR_BROWN; break; case kEffectNaviBlack: effect->giEffect = new GameInteractionEffect::SetCosmeticsColor(); - effect->giEffect->parameters[0] = GI_COSMETICS_NAVI; - effect->giEffect->parameters[1] = GI_COLOR_BLACK; + dynamic_cast(effect->giEffect)->parameters[0] = GI_COSMETICS_NAVI; + dynamic_cast(effect->giEffect)->parameters[1] = GI_COLOR_BLACK; break; // Link's Hair Color (Bidding War) case kEffectHairRed: effect->giEffect = new GameInteractionEffect::SetCosmeticsColor(); - effect->giEffect->parameters[0] = GI_COSMETICS_HAIR; - effect->giEffect->parameters[1] = GI_COLOR_RED; + dynamic_cast(effect->giEffect)->parameters[0] = GI_COSMETICS_HAIR; + dynamic_cast(effect->giEffect)->parameters[1] = GI_COLOR_RED; break; case kEffectHairGreen: effect->giEffect = new GameInteractionEffect::SetCosmeticsColor(); - effect->giEffect->parameters[0] = GI_COSMETICS_HAIR; - effect->giEffect->parameters[1] = GI_COLOR_GREEN; + dynamic_cast(effect->giEffect)->parameters[0] = GI_COSMETICS_HAIR; + dynamic_cast(effect->giEffect)->parameters[1] = GI_COLOR_GREEN; break; case kEffectHairBlue: effect->giEffect = new GameInteractionEffect::SetCosmeticsColor(); - effect->giEffect->parameters[0] = GI_COSMETICS_HAIR; - effect->giEffect->parameters[1] = GI_COLOR_BLUE; + dynamic_cast(effect->giEffect)->parameters[0] = GI_COSMETICS_HAIR; + dynamic_cast(effect->giEffect)->parameters[1] = GI_COLOR_BLUE; break; case kEffectHairOrange: effect->giEffect = new GameInteractionEffect::SetCosmeticsColor(); - effect->giEffect->parameters[0] = GI_COSMETICS_HAIR; - effect->giEffect->parameters[1] = GI_COLOR_ORANGE; + dynamic_cast(effect->giEffect)->parameters[0] = GI_COSMETICS_HAIR; + dynamic_cast(effect->giEffect)->parameters[1] = GI_COLOR_ORANGE; break; case kEffectHairYellow: effect->giEffect = new GameInteractionEffect::SetCosmeticsColor(); - effect->giEffect->parameters[0] = GI_COSMETICS_HAIR; - effect->giEffect->parameters[1] = GI_COLOR_YELLOW; + dynamic_cast(effect->giEffect)->parameters[0] = GI_COSMETICS_HAIR; + dynamic_cast(effect->giEffect)->parameters[1] = GI_COLOR_YELLOW; break; case kEffectHairPurple: effect->giEffect = new GameInteractionEffect::SetCosmeticsColor(); - effect->giEffect->parameters[0] = GI_COSMETICS_HAIR; - effect->giEffect->parameters[1] = GI_COLOR_PURPLE; + dynamic_cast(effect->giEffect)->parameters[0] = GI_COSMETICS_HAIR; + dynamic_cast(effect->giEffect)->parameters[1] = GI_COLOR_PURPLE; break; case kEffectHairPink: effect->giEffect = new GameInteractionEffect::SetCosmeticsColor(); - effect->giEffect->parameters[0] = GI_COSMETICS_HAIR; - effect->giEffect->parameters[1] = GI_COLOR_PINK; + dynamic_cast(effect->giEffect)->parameters[0] = GI_COSMETICS_HAIR; + dynamic_cast(effect->giEffect)->parameters[1] = GI_COLOR_PINK; break; case kEffectHairBrown: effect->giEffect = new GameInteractionEffect::SetCosmeticsColor(); - effect->giEffect->parameters[0] = GI_COSMETICS_HAIR; - effect->giEffect->parameters[1] = GI_COLOR_BROWN; + dynamic_cast(effect->giEffect)->parameters[0] = GI_COSMETICS_HAIR; + dynamic_cast(effect->giEffect)->parameters[1] = GI_COLOR_BROWN; break; case kEffectHairBlack: effect->giEffect = new GameInteractionEffect::SetCosmeticsColor(); - effect->giEffect->parameters[0] = GI_COSMETICS_HAIR; - effect->giEffect->parameters[1] = GI_COLOR_BLACK; + dynamic_cast(effect->giEffect)->parameters[0] = GI_COSMETICS_HAIR; + dynamic_cast(effect->giEffect)->parameters[1] = GI_COLOR_BLACK; break; default: diff --git a/soh/soh/Enhancements/crowd-control/CrowdControl.h b/soh/soh/Enhancements/crowd-control/CrowdControl.h index 672e6d361..bb06cc5b1 100644 --- a/soh/soh/Enhancements/crowd-control/CrowdControl.h +++ b/soh/soh/Enhancements/crowd-control/CrowdControl.h @@ -1,4 +1,4 @@ -#ifdef ENABLE_CROWD_CONTROL +#ifdef ENABLE_REMOTE_CONTROL #ifndef _CROWDCONTROL_C #define _CROWDCONTROL_C @@ -73,33 +73,24 @@ class CrowdControl { EffectResult lastExecutionResult; } Effect; - std::thread ccThreadReceive; std::thread ccThreadProcess; - TCPsocket tcpsock; - IPaddress ip; - bool isEnabled; - bool connected; - - char received[512]; std::vector activeEffects; std::mutex activeEffectsMutex; - void ListenToServer(); + void HandleRemoteData(nlohmann::json payload); void ProcessActiveEffects(); - void EmitMessage(TCPsocket socket, uint32_t eventId, long timeRemaining, EffectResult status); - Effect* ParseMessage(char payload[512]); + void EmitMessage(uint32_t eventId, long timeRemaining, EffectResult status); + Effect* ParseMessage(nlohmann::json payload); EffectResult ExecuteEffect(Effect* effect); EffectResult CanApplyEffect(Effect *effect); EffectResult TranslateGiEnum(GameInteractionEffectQueryResult giResult); public: static CrowdControl* Instance; - void Init(); - void Shutdown(); void Enable(); void Disable(); }; diff --git a/soh/soh/Enhancements/custom-message/CustomMessageTypes.h b/soh/soh/Enhancements/custom-message/CustomMessageTypes.h index 916e1a7f8..d93bae983 100644 --- a/soh/soh/Enhancements/custom-message/CustomMessageTypes.h +++ b/soh/soh/Enhancements/custom-message/CustomMessageTypes.h @@ -51,6 +51,7 @@ typedef enum { TEXT_WARP_NOCTURNE_OF_SHADOW = 0x891, TEXT_WARP_PRELUDE_OF_LIGHT = 0x892, TEXT_WARP_RANDOM_REPLACED_TEXT = 0x9200, + TEXT_SHOOTING_GALLERY_MAN_COME_BACK_WITH_BOW = 0x9210, TEXT_LAKE_HYLIA_WATER_SWITCH_SIGN = 0x346, // 0x3yy for cuttable sign range TEXT_LAKE_HYLIA_WATER_SWITCH_NAVI = 0x1B3, // 0x1yy for Navi msg range } TextIDs; diff --git a/soh/soh/Enhancements/debugconsole.cpp b/soh/soh/Enhancements/debugconsole.cpp index 3e61505b2..2c910a067 100644 --- a/soh/soh/Enhancements/debugconsole.cpp +++ b/soh/soh/Enhancements/debugconsole.cpp @@ -17,6 +17,10 @@ #include #include +#ifndef IMGUI_DEFINE_MATH_OPERATORS +#define IMGUI_DEFINE_MATH_OPERATORS +#endif +#include #include #undef PATH_HACK #undef Path @@ -99,7 +103,7 @@ static bool ActorSpawnHandler(std::shared_ptr Console, const std:: static bool KillPlayerHandler(std::shared_ptr Console, const std::vector&, std::string* output) { GameInteractionEffectBase* effect = new GameInteractionEffect::SetPlayerHealth(); - effect->parameters[0] = 0; + dynamic_cast(effect)->parameters[0] = 0; GameInteractionEffectQueryResult result = GameInteractor::ApplyEffect(effect); if (result == GameInteractionEffectQueryResult::Possible) { INFO_MESSAGE("[SOH] You've met with a terrible fate, haven't you?"); @@ -130,7 +134,7 @@ static bool SetPlayerHealthHandler(std::shared_ptr Console, const } GameInteractionEffectBase* effect = new GameInteractionEffect::SetPlayerHealth(); - effect->parameters[0] = health; + dynamic_cast(effect)->parameters[0] = health; GameInteractionEffectQueryResult result = GameInteractor::ApplyEffect(effect); if (result == GameInteractionEffectQueryResult::Possible) { INFO_MESSAGE("[SOH] Player health updated to %d", health); @@ -207,6 +211,7 @@ static bool ResetHandler(std::shared_ptr Console, std::vectorgameplayFrames = 0; SET_NEXT_GAMESTATE(&gPlayState->state, TitleSetup_Init, GameState); gPlayState->state.running = false; GameInteractor::Instance->ExecuteHooks(gSaveContext.fileNum); @@ -246,8 +251,8 @@ static bool AddAmmoHandler(std::shared_ptr Console, const std::vec } GameInteractionEffectBase* effect = new GameInteractionEffect::AddOrTakeAmmo(); - effect->parameters[0] = amount; - effect->parameters[1] = it->second; + dynamic_cast(effect)->parameters[0] = amount; + dynamic_cast(effect)->parameters[1] = it->second; GameInteractionEffectQueryResult result = GameInteractor::ApplyEffect(effect); if (result == GameInteractionEffectQueryResult::Possible) { @@ -286,8 +291,8 @@ static bool TakeAmmoHandler(std::shared_ptr Console, const std::ve } GameInteractionEffectBase* effect = new GameInteractionEffect::AddOrTakeAmmo(); - effect->parameters[0] = -amount; - effect->parameters[1] = it->second; + dynamic_cast(effect)->parameters[0] = -amount; + dynamic_cast(effect)->parameters[1] = it->second; GameInteractionEffectQueryResult result = GameInteractor::ApplyEffect(effect); if (result == GameInteractionEffectQueryResult::Possible) { @@ -396,9 +401,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) { @@ -406,10 +411,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; @@ -420,9 +425,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; @@ -456,9 +461,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; @@ -576,7 +581,7 @@ static bool InvisibleHandler(std::shared_ptr Console, const std::v return 1; } - GameInteractionEffectBase* effect = new GameInteractionEffect::InvisibleLink(); + RemovableGameInteractionEffect* effect = new GameInteractionEffect::InvisibleLink(); GameInteractionEffectQueryResult result = state ? GameInteractor::ApplyEffect(effect) : GameInteractor::RemoveEffect(effect); if (result == GameInteractionEffectQueryResult::Possible) { @@ -603,8 +608,8 @@ static bool GiantLinkHandler(std::shared_ptr Console, const std::v return 1; } - GameInteractionEffectBase* effect = new GameInteractionEffect::ModifyLinkSize(); - effect->parameters[0] = GI_LINK_SIZE_GIANT; + RemovableGameInteractionEffect* effect = new GameInteractionEffect::ModifyLinkSize(); + dynamic_cast(effect)->parameters[0] = GI_LINK_SIZE_GIANT; GameInteractionEffectQueryResult result = state ? GameInteractor::ApplyEffect(effect) : GameInteractor::RemoveEffect(effect); if (result == GameInteractionEffectQueryResult::Possible) { @@ -631,8 +636,8 @@ static bool MinishLinkHandler(std::shared_ptr Console, const std:: return 1; } - GameInteractionEffectBase* effect = new GameInteractionEffect::ModifyLinkSize(); - effect->parameters[0] = GI_LINK_SIZE_MINISH; + RemovableGameInteractionEffect* effect = new GameInteractionEffect::ModifyLinkSize(); + dynamic_cast(effect)->parameters[0] = GI_LINK_SIZE_MINISH; GameInteractionEffectQueryResult result = state ? GameInteractor::ApplyEffect(effect) : GameInteractor::RemoveEffect(effect); if (result == GameInteractionEffectQueryResult::Possible) { @@ -665,7 +670,7 @@ static bool AddHeartContainerHandler(std::shared_ptr Console, cons } GameInteractionEffectBase* effect = new GameInteractionEffect::ModifyHeartContainers(); - effect->parameters[0] = hearts; + dynamic_cast(effect)->parameters[0] = hearts; GameInteractionEffectQueryResult result = GameInteractor::ApplyEffect(effect); if (result == GameInteractionEffectQueryResult::Possible) { INFO_MESSAGE("[SOH] Added %d heart containers", hearts); @@ -696,7 +701,7 @@ static bool RemoveHeartContainerHandler(std::shared_ptr Console, c } GameInteractionEffectBase* effect = new GameInteractionEffect::ModifyHeartContainers(); - effect->parameters[0] = -hearts; + dynamic_cast(effect)->parameters[0] = -hearts; GameInteractionEffectQueryResult result = GameInteractor::ApplyEffect(effect); if (result == GameInteractionEffectQueryResult::Possible) { INFO_MESSAGE("[SOH] Removed %d heart containers", hearts); @@ -716,7 +721,7 @@ static bool GravityHandler(std::shared_ptr Console, const std::vec GameInteractionEffectBase* effect = new GameInteractionEffect::ModifyGravity(); try { - effect->parameters[0] = LUS::Math::clamp(std::stoi(args[1], nullptr, 10), GI_GRAVITY_LEVEL_LIGHT, GI_GRAVITY_LEVEL_HEAVY); + dynamic_cast(effect)->parameters[0] = LUS::Math::clamp(std::stoi(args[1], nullptr, 10), GI_GRAVITY_LEVEL_LIGHT, GI_GRAVITY_LEVEL_HEAVY); } catch (std::invalid_argument const& ex) { ERROR_MESSAGE("[SOH] Gravity value must be a number."); return 1; @@ -746,7 +751,7 @@ static bool NoUIHandler(std::shared_ptr Console, const std::vector return 1; } - GameInteractionEffectBase* effect = new GameInteractionEffect::NoUI(); + RemovableGameInteractionEffect* effect = new GameInteractionEffect::NoUI(); GameInteractionEffectQueryResult result = state ? GameInteractor::ApplyEffect(effect) : GameInteractor::RemoveEffect(effect); @@ -781,7 +786,7 @@ static bool DefenseModifierHandler(std::shared_ptr Console, const GameInteractionEffectBase* effect = new GameInteractionEffect::ModifyDefenseModifier(); try { - effect->parameters[0] = std::stoi(args[1], nullptr, 10); + dynamic_cast(effect)->parameters[0] = std::stoi(args[1], nullptr, 10); } catch (std::invalid_argument const& ex) { ERROR_MESSAGE("[SOH] Defense modifier value must be a number."); return 1; @@ -789,7 +794,7 @@ static bool DefenseModifierHandler(std::shared_ptr Console, const GameInteractionEffectQueryResult result = GameInteractor::ApplyEffect(effect); if (result == GameInteractionEffectQueryResult::Possible) { - INFO_MESSAGE("[SOH] Defense modifier set to %d", effect->parameters[0]); + INFO_MESSAGE("[SOH] Defense modifier set to %d", dynamic_cast(effect)->parameters[0]); return 0; } else { INFO_MESSAGE("[SOH] Command failed: Could not set defense modifier."); @@ -811,7 +816,7 @@ static bool DamageHandler(std::shared_ptr Console, const std::vect return 1; } - effect->parameters[0] = -value; + dynamic_cast(effect)->parameters[0] = -value; } catch (std::invalid_argument const& ex) { ERROR_MESSAGE("[SOH] Damage value must be a number."); return 1; @@ -841,7 +846,7 @@ static bool HealHandler(std::shared_ptr Console, const std::vector return 1; } - effect->parameters[0] = value; + dynamic_cast(effect)->parameters[0] = value; } catch (std::invalid_argument const& ex) { ERROR_MESSAGE("[SOH] Damage value must be a number."); return 1; @@ -897,7 +902,7 @@ static bool NoZHandler(std::shared_ptr Console, const std::vector< return 1; } - GameInteractionEffectBase* effect = new GameInteractionEffect::DisableZTargeting(); + RemovableGameInteractionEffect* effect = new GameInteractionEffect::DisableZTargeting(); GameInteractionEffectQueryResult result = state ? GameInteractor::ApplyEffect(effect) : GameInteractor::RemoveEffect(effect); @@ -925,7 +930,7 @@ static bool OneHitKOHandler(std::shared_ptr Console, const std::ve return 1; } - GameInteractionEffectBase* effect = new GameInteractionEffect::OneHitKO(); + RemovableGameInteractionEffect* effect = new GameInteractionEffect::OneHitKO(); GameInteractionEffectQueryResult result = state ? GameInteractor::ApplyEffect(effect) : GameInteractor::RemoveEffect(effect); @@ -953,7 +958,7 @@ static bool PacifistHandler(std::shared_ptr Console, const std::ve return 1; } - GameInteractionEffectBase* effect = new GameInteractionEffect::PacifistMode(); + RemovableGameInteractionEffect* effect = new GameInteractionEffect::PacifistMode(); GameInteractionEffectQueryResult result = state ? GameInteractor::ApplyEffect(effect) : GameInteractor::RemoveEffect(effect); @@ -981,8 +986,8 @@ static bool PaperLinkHandler(std::shared_ptr Console, const std::v return 1; } - GameInteractionEffectBase* effect = new GameInteractionEffect::ModifyLinkSize(); - effect->parameters[0] = GI_LINK_SIZE_PAPER; + RemovableGameInteractionEffect* effect = new GameInteractionEffect::ModifyLinkSize(); + dynamic_cast(effect)->parameters[0] = GI_LINK_SIZE_PAPER; GameInteractionEffectQueryResult result = state ? GameInteractor::ApplyEffect(effect) : GameInteractor::RemoveEffect(effect); @@ -1010,7 +1015,7 @@ static bool RainstormHandler(std::shared_ptr Console, const std::v return 1; } - GameInteractionEffectBase* effect = new GameInteractionEffect::WeatherRainstorm(); + RemovableGameInteractionEffect* effect = new GameInteractionEffect::WeatherRainstorm(); GameInteractionEffectQueryResult result = state ? GameInteractor::ApplyEffect(effect) : GameInteractor::RemoveEffect(effect); @@ -1038,7 +1043,7 @@ static bool ReverseControlsHandler(std::shared_ptr Console, const return 1; } - GameInteractionEffectBase* effect = new GameInteractionEffect::ReverseControls(); + RemovableGameInteractionEffect* effect = new GameInteractionEffect::ReverseControls(); GameInteractionEffectQueryResult result = state ? GameInteractor::ApplyEffect(effect) : GameInteractor::RemoveEffect(effect); @@ -1061,7 +1066,7 @@ static bool UpdateRupeesHandler(std::shared_ptr Console, const std GameInteractionEffectBase* effect = new GameInteractionEffect::ModifyRupees(); try { - effect->parameters[0] = std::stoi(args[1], nullptr, 10); + dynamic_cast(effect)->parameters[0] = std::stoi(args[1], nullptr, 10); } catch (std::invalid_argument const& ex) { ERROR_MESSAGE("[SOH] Rupee value must be a number."); return 1; @@ -1085,7 +1090,7 @@ static bool SpeedModifierHandler(std::shared_ptr Console, const st GameInteractionEffectBase* effect = new GameInteractionEffect::ModifyRunSpeedModifier(); try { - effect->parameters[0] = std::stoi(args[1], nullptr, 10); + dynamic_cast(effect)->parameters[0] = std::stoi(args[1], nullptr, 10); } catch (std::invalid_argument const& ex) { ERROR_MESSAGE("[SOH] Speed modifier value must be a number."); return 1; @@ -1120,7 +1125,7 @@ static bool BootsHandler(std::shared_ptr Console, const std::vecto } GameInteractionEffectBase* effect = new GameInteractionEffect::ForceEquipBoots(); - effect->parameters[0] = it->second; + dynamic_cast(effect)->parameters[0] = it->second; GameInteractionEffectQueryResult result = GameInteractor::ApplyEffect(effect); if (result == GameInteractionEffectQueryResult::Possible) { @@ -1151,7 +1156,7 @@ static bool GiveShieldHandler(std::shared_ptr Console, const std:: } GameInteractionEffectBase* effect = new GameInteractionEffect::GiveOrTakeShield(); - effect->parameters[0] = it->second; + dynamic_cast(effect)->parameters[0] = it->second; GameInteractionEffectQueryResult result = GameInteractor::ApplyEffect(effect); if (result == GameInteractionEffectQueryResult::Possible) { @@ -1176,7 +1181,7 @@ static bool TakeShieldHandler(std::shared_ptr Console, const std:: } GameInteractionEffectBase* effect = new GameInteractionEffect::GiveOrTakeShield(); - effect->parameters[0] = it->second * -1; + dynamic_cast(effect)->parameters[0] = it->second * -1; GameInteractionEffectQueryResult result = GameInteractor::ApplyEffect(effect); if (result == GameInteractionEffectQueryResult::Possible) { @@ -1202,7 +1207,7 @@ static bool KnockbackHandler(std::shared_ptr Console, const std::v return 1; } - effect->parameters[0] = value; + dynamic_cast(effect)->parameters[0] = value; } catch (std::invalid_argument const& ex) { ERROR_MESSAGE("[SOH] Knockback value must be a number."); return 1; diff --git a/soh/soh/Enhancements/debugger/actorViewer.cpp b/soh/soh/Enhancements/debugger/actorViewer.cpp index f83449efe..e2b45a419 100644 --- a/soh/soh/Enhancements/debugger/actorViewer.cpp +++ b/soh/soh/Enhancements/debugger/actorViewer.cpp @@ -8,6 +8,7 @@ #include #include #include +#include #include #include #include @@ -24,6 +25,7 @@ extern PlayState* gPlayState; #include "textures/icon_item_24_static/icon_item_24_static.h" } +#define DEKUNUTS_FLOWER 10 #define DEBUG_ACTOR_NAMETAG_TAG "debug_actor_viewer" typedef struct { @@ -107,6 +109,783 @@ void PopulateActorDropdown(int i, std::vector& data) { } } +//actors that don't use params at all +static std::vector noParamsActors = { + ACTOR_ARMS_HOOK, + ACTOR_ARROW_FIRE, + ACTOR_ARROW_ICE, + ACTOR_ARROW_LIGHT, + ACTOR_BG_BOM_GUARD, + ACTOR_BG_DY_YOSEIZO, + ACTOR_BG_GATE_SHUTTER, + ACTOR_BG_GJYO_BRIDGE, + ACTOR_BG_HIDAN_FSLIFT, + ACTOR_BG_HIDAN_RSEKIZOU, + ACTOR_BG_HIDAN_SYOKU, + ACTOR_BG_JYA_GOROIWA, + ACTOR_BG_MIZU_UZU, + ACTOR_BG_MORI_RAKKATENJO, + ACTOR_BG_PUSHBOX, + ACTOR_BG_SPOT01_FUSYA, + ACTOR_BG_SPOT01_IDOHASHIRA, + ACTOR_BG_SPOT01_IDOMIZU, + ACTOR_BG_SPOT01_IDOSOKO, + ACTOR_BG_SPOT11_OASIS, + ACTOR_BG_SPOT15_SAKU, + ACTOR_BG_SPOT18_FUTA, + ACTOR_BG_TOKI_SWD, + ACTOR_BG_TREEMOUTH, + ACTOR_BG_VB_SIMA, + ACTOR_BOSS_DODONGO, + ACTOR_BOSS_FD, + ACTOR_BOSS_GOMA, + ACTOR_DEMO_EXT, + ACTOR_DEMO_SHD, + ACTOR_DEMO_TRE_LGT, + ACTOR_DOOR_TOKI, + ACTOR_EFC_ERUPC, + ACTOR_EN_ANI, + ACTOR_EN_AROW_TRAP, + ACTOR_EN_BIRD, + ACTOR_EN_BLKOBJ, + ACTOR_EN_BOM_BOWL_MAN, + ACTOR_EN_BOM_BOWL_PIT, + ACTOR_EN_BOM_CHU, + ACTOR_EN_BUBBLE, + ACTOR_EN_DIVING_GAME, + ACTOR_EN_DNT_DEMO, + ACTOR_EN_DNT_JIJI, + ACTOR_EN_DS, + ACTOR_EN_DU, + ACTOR_EN_EG, + ACTOR_EN_FU, + ACTOR_EN_GB, + ACTOR_EN_GE3, + ACTOR_EN_GUEST, + ACTOR_EN_HATA, + ACTOR_EN_HORSE_GANON, + ACTOR_EN_HORSE_LINK_CHILD, + ACTOR_EN_HORSE_ZELDA, + ACTOR_EN_HS2, + ACTOR_EN_JS, + ACTOR_EN_KAKASI, + ACTOR_EN_KAKASI3, + ACTOR_EN_MA1, + ACTOR_EN_MA2, + ACTOR_EN_MA3, + ACTOR_EN_MAG, + ACTOR_EN_MK, + ACTOR_EN_MS, + ACTOR_EN_NIW_LADY, + ACTOR_EN_NWC, + ACTOR_EN_OE2, + ACTOR_EN_OKARINA_EFFECT, + ACTOR_EN_RR, + ACTOR_EN_SA, + ACTOR_EN_SCENE_CHANGE, + ACTOR_EN_SKJNEEDLE, + ACTOR_EN_SYATEKI_ITM, + ACTOR_EN_SYATEKI_MAN, + ACTOR_EN_TAKARA_MAN, + ACTOR_EN_TORYO, + ACTOR_EN_VASE, + ACTOR_EN_ZL1, + ACTOR_MAGIC_DARK, + ACTOR_MAGIC_FIRE, + ACTOR_OBJ_DEKUJR, + ACTOR_OCEFF_SPOT, + + ACTOR_UNSET_1, + ACTOR_UNSET_3, + ACTOR_UNSET_5, + ACTOR_UNSET_6, + ACTOR_UNSET_17, + ACTOR_UNSET_1A, + ACTOR_UNSET_1F, + ACTOR_UNSET_22, + ACTOR_UNSET_31, + ACTOR_UNSET_36, + ACTOR_UNSET_53, + ACTOR_UNSET_73, + ACTOR_UNSET_74, + ACTOR_UNSET_75, + ACTOR_UNSET_76, + ACTOR_UNSET_78, + ACTOR_UNSET_79, + ACTOR_UNSET_7A, + ACTOR_UNSET_7B, + ACTOR_UNSET_7E, + ACTOR_UNSET_7F, + ACTOR_UNSET_83, + ACTOR_UNSET_A0, + ACTOR_UNSET_B2, + ACTOR_UNSET_CE, + ACTOR_UNSET_D8, + ACTOR_UNSET_EA, + ACTOR_UNSET_EB, + ACTOR_UNSET_F2, + ACTOR_UNSET_F3, + ACTOR_UNSET_FB, + ACTOR_UNSET_109, + ACTOR_UNSET_10D, + ACTOR_UNSET_10E, + ACTOR_UNSET_128, + ACTOR_UNSET_129, + ACTOR_UNSET_134, + ACTOR_UNSET_154, + ACTOR_UNSET_15D, + ACTOR_UNSET_161, + ACTOR_UNSET_180, + ACTOR_UNSET_1AA +}; + +static std::unordered_map> actorSpecificData; + +void CreateActorSpecificData() { + if (!actorSpecificData.empty()) { + return; + } + + actorSpecificData[ACTOR_EN_DEKUNUTS] = [](s16 params) -> s16 { + bool isFlower = params == DEKUNUTS_FLOWER; + s16 shotsPerRound = (params >> 8) & 0xFF; + if (shotsPerRound == 0xFF || shotsPerRound == 0) { + shotsPerRound = 1; + } + ImGui::Checkbox("Flower", &isFlower); + if (!isFlower) { + ImGui::InputScalar("Shots Per Round", ImGuiDataType_S16, &shotsPerRound); + } + + return isFlower ? DEKUNUTS_FLOWER : (shotsPerRound << 8); + }; + + actorSpecificData[ACTOR_EN_TITE] = [](s16 params) -> s16 { + static const char* items[] = { "Blue", "Red" }; + if (params == 0) { + params = -2; + } + //the + 2 is because the params are -2 & -1 instead of 0 & 1 + int selectedItem = params + 2; + if (ImGui::Combo("Type", &selectedItem, items, IM_ARRAYSIZE(items))) { + return selectedItem - 2; + } + + return params; + }; + + actorSpecificData[ACTOR_EN_AM] = [](s16 params) -> s16 { + static const char* items[] = { "Statue", "Enemy" }; + int selectedItem = params; + if (ImGui::Combo("Type", &selectedItem, items, IM_ARRAYSIZE(items))) { + return selectedItem; + } + + return params; + }; + + actorSpecificData[ACTOR_BG_ICE_TURARA] = [](s16 params) -> s16 { + static const char* items[] = { "Stalagmite", "Stalactite", "Stalactite (Regrow)" }; + int selectedItem = params; + if (ImGui::Combo("Type", &selectedItem, items, IM_ARRAYSIZE(items))) { + return selectedItem; + } + + return params; + }; + + actorSpecificData[ACTOR_BG_BREAKWALL] = [](s16 params) -> s16 { + static const char* items[] = { "DC Entrance", "Wall", "KD Floor", "KD Lava Cover" }; + int selectedItem = params; + if (ImGui::Combo("Type", &selectedItem, items, IM_ARRAYSIZE(items))) { + return selectedItem; + } + + return params; + }; + + actorSpecificData[ACTOR_EN_TEST] = [](s16 params) -> s16 { + static const char* items[] = { "Invisible", "1", "2", "Ceiling", "4", "5" }; + int selectedItem = params; + if (ImGui::Combo("Type", &selectedItem, items, IM_ARRAYSIZE(items))) { + return selectedItem; + } + + return params; + }; + + actorSpecificData[ACTOR_EN_TANA] = [](s16 params) -> s16 { + static const char* items[] = { "Wooden", "Stone (1)", "Stone (2)" }; + int selectedItem = params; + if (ImGui::Combo("Type", &selectedItem, items, IM_ARRAYSIZE(items))) { + return selectedItem; + } + + return params; + }; + + actorSpecificData[ACTOR_EN_XC] = [](s16 params) -> s16 { + static const char* items[] = { "0", "1", "2", "3", "4", "5", "Minuet", "Bolero", "Serenade", "9" }; + int selectedItem = params; + if (ImGui::Combo("Type", &selectedItem, items, IM_ARRAYSIZE(items))) { + return selectedItem; + } + + return params; + }; + + actorSpecificData[ACTOR_SHOT_SUN] = [](s16 params) -> s16 { + static const char* items[] = { "Sun's Song", "Song of Storms", "LH Sun" }; + if (params == 0) { + params = 0x40; + } + //the - 0x40 is because the params are 0x40 & 0x41 instead of 0 & 1 + int selectedItem = params - 0x40; + if (ImGui::Combo("Type", &selectedItem, items, IM_ARRAYSIZE(items))) { + return selectedItem + 0x40; + } + + return params; + }; + + actorSpecificData[ACTOR_EN_HONOTRAP] = [](s16 params) -> s16 { + static const char* items[] = { "Eye", "Flame Move", "Flame Drop" }; + int selectedItem = params; + if (ImGui::Combo("Type", &selectedItem, items, IM_ARRAYSIZE(items))) { + return selectedItem; + } + + return params; + }; + + actorSpecificData[ACTOR_EN_REEBA] = [](s16 params) -> s16 { + bool isBig = params != 0; + ImGui::Checkbox("Big", &isBig); + + return isBig; + }; + + actorSpecificData[ACTOR_EN_TK] = [](s16 params) -> s16 { + bool canTurn = params >= 0; + ImGui::Checkbox("Can Turn", &canTurn); + + return canTurn ? 0 : -1; + }; + + actorSpecificData[ACTOR_EN_ITEM00] = [](s16 params) -> s16 { + bool autoCollect = params & 0x8000; + ImGui::Checkbox("Automatically Collect", &autoCollect); + u8 collectibleFlag = (params & 0x3F00) >> 8; + ImGui::InputScalar("Collectible Flag", ImGuiDataType_U8, &collectibleFlag); + if (collectibleFlag > 0x3F) { + collectibleFlag = 0x3F; + } + + static const char* items[] = { + "Green Rupee", + "Blue Rupee", + "Red Rupee", + "Recovery Heart", + "Bombs (A)", + "Arrow", + "Heart Piece", + "Heart Container", + "Arrows (5)", + "Arrows (10)", + "Arrows (30)", + "Bombs (B)", + "Deku Nuts (5)", + "Deku Stick", + "Magic (Large)", + "Magic (Small)", + "Deku Seeds (5)", + "Small Key", + "Flexible", + "Gold Rupee", + "Purple Rupee", + "Deku Shield", + "Hylian Shield", + "Zora Tunic", + "Goron Tunic", + "Bombs (Special)", + "Bombchus" + }; + + int selectedItem = params & 0xFF; + ImGui::Combo("Item", &selectedItem, items, IM_ARRAYSIZE(items)); + + return autoCollect * 0x8000 + (collectibleFlag << 8) + selectedItem; + }; + + actorSpecificData[ACTOR_OBJ_COMB] = [](s16 params) -> s16 { + static const char* items[] = { + "Green Rupee", + "Blue Rupee", + "Red Rupee", + "Recovery Heart", + "Bombs (A)", + "Arrow", + "Heart Piece", + "Heart Container", + "Arrows (5)", + "Arrows (10)", + "Arrows (30)", + "Bombs (B)", + "Deku Nuts (5)", + "Deku Stick", + "Magic (Large)", + "Magic (Small)", + "Deku Seeds (5)", + "Small Key", + "Flexible", + "Gold Rupee", + "Purple Rupee", + "Deku Shield", + "Hylian Shield", + "Zora Tunic", + "Goron Tunic", + "Bombs (Special)", + "Bombchus" + }; + + int selectedItem = params & 0xFF; + ImGui::Combo("Item Drop", &selectedItem, items, IM_ARRAYSIZE(items)); + + u8 collectibleFlag = (params & 0x3F00) >> 8; + if (selectedItem == 6) { + ImGui::InputScalar("PoH Collectible Flag", ImGuiDataType_U8, &collectibleFlag); + if (collectibleFlag > 0x3F) { + collectibleFlag = 0x3F; + } + } + + return (collectibleFlag << 8) + selectedItem; + }; + + actorSpecificData[ACTOR_EN_GM] = [](s16 params) -> s16 { + u8 switchFlag = (params & 0x3F00) >> 8; + + ImGui::InputScalar("Switch Flag", ImGuiDataType_U8, &switchFlag); + if (switchFlag > 0x3F) { + switchFlag = 0x3F; + } + + return switchFlag << 8; + }; + + actorSpecificData[ACTOR_EN_GIRLA] = [](s16 params) -> s16 { + static const char* items[] = { + "Deku Nuts (5)", + "Arrows (30)", + "Arrows (50)", + "Bombs (5) (25 Rupees)", + "Deku Nuts (10)", + "Deku Stick", + "Bombs (10)", + "Fish", + "Red Potion (30 Rupees)", + "Green Potion", + "Blue Potion", + "Longsword", + "Hylian Shield", + "Deku Shield", + "Goron Tunic", + "Zora Tunic", + "Heart", + "Milk Bottle", + "Weird Egg", + "19", + "20", + "Bomchu (10) [1]", + "Bomchu (20) [1]", + "Bomchu (20) [2]", + "Bomchu (10) [2]", + "Bomchu (10) [3]", + "Bomchu (20) [3]", + "Bomchu (20) [4]", + "Bomchu (10) [4]", + "Deku Seeds (30)", + "Keaton Mask", + "Spooky Mask", + "Skull Mask", + "Bunny Hood", + "Mask Of Truth", + "Zora Mask", + "Goron Mask", + "Gerudo Mask", + "Sold Out", + "Blue Fire", + "Bugs", + "Big Poe", + "Poe", + "Fairy", + "Arrows (10)", + "Bombs (20)", + "Bombs (30)", + "Bombs (5) (35 Rupees)", + "Red Potion (40 Rupees)", + "Red Potion (50 Rupees)", + "Randomizer Item" + }; + int selectedItem = params; + if (ImGui::Combo("Type", &selectedItem, items, IM_ARRAYSIZE(items))) { + return selectedItem; + } + + return params; + }; + + actorSpecificData[ACTOR_EN_FIRE_ROCK] = [](s16 params) -> s16 { + static const char* items[] = { + "Spawned Falling (1)", + "Broken Piece (1)", + "Broken Piece (2)", + "Spawned Falling (2)", + //"INVALID", + "Ceiling Spot Spawner", + "On Floor" + }; + int selectedItem = params > 3 ? params - 1 : params; + if (ImGui::Combo("Type", &selectedItem, items, IM_ARRAYSIZE(items))) { + return selectedItem > 3 ? selectedItem + 1 : selectedItem; + } + + return params; + }; + + actorSpecificData[ACTOR_EN_EX_ITEM] = [](s16 params) -> s16 { + static const char* items[] = { + "Bomb Bag Bowling", + "Heart Piece Bowling", + "Bombchus Bowling", + "Bombs Bowling", + "Purple Rupee Bowling", + "Bomb Bag Counter", + "Heart Piece Counter", + "Bombchus Counter", + "Bombs Counter", + "Purple Rupee Counter", + "Green Rupee Chest", + "Blue Rupee Chest", + "Red Rupee Chest", + "13", + "14", + "Small Key Chest", + "Magic Fire", + "Magic Wind", + "Magic Dark", + "Bullet Bag" + }; + int selectedItem = params; + if (ImGui::Combo("Type", &selectedItem, items, IM_ARRAYSIZE(items))) { + return selectedItem; + } + + return params; + }; + + actorSpecificData[ACTOR_EN_ELF] = [](s16 params) -> s16 { + static const char* items[] = { + "Navi", + "Revive Bottle", + "Heal Timed", + "Kokiri", + "Spawner", + "Revive Death", + "Heal", + "Heal Big" + }; + int selectedItem = params; + if (ImGui::Combo("Type", &selectedItem, items, IM_ARRAYSIZE(items))) { + return selectedItem; + } + + return params; + }; + + actorSpecificData[ACTOR_EN_CLEAR_TAG] = [](s16 params) -> s16 { + static const char* items[] = { + "Cutscene", //0 + "Normal", //1 + "Laser" //100 + }; + int selectedItem = params == 100 ? 2 : params; + if (ImGui::Combo("Type", &selectedItem, items, IM_ARRAYSIZE(items))) { + return selectedItem == 2 ? 100 : selectedItem; + } + + return params; + }; + + actorSpecificData[ACTOR_EN_BOMBF] = [](s16 params) -> s16 { + static const char* items[] = { "Flower", "Body", "Explosion" }; + //the + 1 is because the params are -1, 0 & 1 instead of 0, 1 & 2 + int selectedItem = params + 1; + if (ImGui::Combo("Type", &selectedItem, items, IM_ARRAYSIZE(items))) { + return selectedItem - 1; + } + + return params; + }; + + actorSpecificData[ACTOR_EN_BOM] = [](s16 params) -> s16 { + static const char* items[] = { "Body", "Explosion" }; + + int selectedItem = params; + if (ImGui::Combo("Type", &selectedItem, items, IM_ARRAYSIZE(items))) { + return selectedItem; + } + + return params; + }; + + actorSpecificData[ACTOR_DOOR_WARP1] = [](s16 params) -> s16 { + static const char* items[] = { + "Blue Crystal", // -2 + "Dungeon Adult", + "Dungeon Child", + "Clear Flag", // Activate on temp clear flag + "Sages", // Used by sages warping into chamber of sages during their cutscene + "Purple Crystal", + "Yellow", // The colored variants don't warp, they are cutscene setpieces + "Blue Ruto", + "Destination", // Spawning in after having taken a warp + "UNK 7", + "Orange", + "Green", + "Red" + }; + int selectedItem = params + 2; + if (ImGui::Combo("Type", &selectedItem, items, IM_ARRAYSIZE(items))) { + return selectedItem - 2; + } + + return params; + }; + + actorSpecificData[ACTOR_EN_DY_EXTRA] = [](s16 params) -> s16 { + static const char* items[] = { "Orange", "Green" }; + + int selectedItem = params; + if (ImGui::Combo("Color", &selectedItem, items, IM_ARRAYSIZE(items))) { + return selectedItem; + } + + return params; + }; + + actorSpecificData[ACTOR_EN_SKB] = [](s16 params) -> s16 { + u8 size = params; + ImGui::InputScalar("Size", ImGuiDataType_U8, &size); + + return size; + }; + + actorSpecificData[ACTOR_EN_WF] = [](s16 params) -> s16 { + static const char* items[] = { "Normal", "White" }; + + int selectedItem = params; + ImGui::Combo("Type", &selectedItem, items, IM_ARRAYSIZE(items)); + + u8 switchFlag = (params & 0x3F00) >> 8; + ImGui::InputScalar("Switch Flag", ImGuiDataType_U8, &switchFlag); + return (switchFlag << 8) + selectedItem; + }; + + actorSpecificData[ACTOR_EN_BOX] = [](s16 params) -> s16 { + /* + trasureFlag = params & 0x1F; //0b0000 0000 0001 1111 + itemId = (params >> 5) & 0x7F; //0b0000 1111 1110 0000 + type = (params >> 12) & 0xF; //0b1111 0000 0000 0000 + */ + u8 treasureFlag = params & 0x1F; + ImGui::InputScalar("Treasure Flag", ImGuiDataType_U8, &treasureFlag); + if (treasureFlag > 0x1F) { + treasureFlag = 0x1F; + } + + u8 itemId = (params >> 5) & 0x7F; + ImGui::InputScalar("Item Id", ImGuiDataType_U8, &itemId); + if (itemId > 0x7F) { + itemId = 0x7F; + } + + static const char* items[] = { + "Big (Default)", + "Room Clear Big", + "Decorated Big", + "Switch Flag Fall Big", + "4", + "Small", + "6", + "Room Clear Small", + "Switch Flag Fall Small", + "9", + "10", + "Switch Flag Big" + }; + + int type = (params >> 12) & 0xF; + ImGui::Combo("Type", &type, items, IM_ARRAYSIZE(items)); + if (type > 0xF) { + type = 0xF; + } + + return (type << 12) + (itemId << 5) + treasureFlag; + }; + + actorSpecificData[ACTOR_EN_DOOR] = [](s16 params) -> s16 { + /** + * Actor Parameters + * + * | | | | + * | Transition Index | Type | Double Door | Switch Flag OR Text Id - 0x0200 + * |------------------|-------|-------------|--------------------------------- + * | 0 0 0 0 0 0 | 0 0 0 | 0 | 0 0 0 0 0 0 + * | 6 | 3 | 1 | 6 + * | + * + * Transition Index 1111110000000000 Set by the actor engine when the door is spawned + * Type 0000001110000000 + * Double Door 0000000001000000 + * Switch Flag 0000000000111111 For use with the `DOOR_LOCKED` type + * Text id - 0x0200 0000000000111111 For use with the `DOOR_CHECKABLE` type + * + */ + u8 transitionIndex = params >> 10; + ImGui::InputScalar("Transition Index", ImGuiDataType_U8, &transitionIndex); + if (transitionIndex > 0x3F) { + transitionIndex = 0x3F; + } + + static const char* items[] = { + "Room Load", // loads rooms + "Locked", // small key locked door + "Room Load (2)", // loads rooms + "Scene Exit", // doesn't load rooms, used for doors paired with scene transition polygons + "Ajar", // open slightly but slams shut if Link gets too close + "Checkable", // doors that display a textbox when interacting + "Evening", // unlocked between 18:00 and 21:00, Dampé's hut + "Room Load (7)" // loads rooms + }; + + int type = (params >> 7) & 7; + ImGui::Combo("Type", &type, items, IM_ARRAYSIZE(items)); + if (type > 7) { + type = 7; + } + + bool doubleDoor = ((params >> 6) & 1) != 0; + ImGui::Checkbox("Double Door", &doubleDoor); + + u8 lowerBits = params & 0x3F; + if (type == 1) { + ImGui::InputScalar("Switch Flag", ImGuiDataType_U8, &lowerBits); + if (lowerBits > 0x3F) { + lowerBits = 0x3F; + } + } else if (type == 5) { + ImGui::InputScalar("Text ID - 0x200", ImGuiDataType_U8, &lowerBits); + if (lowerBits > 0x3F) { + lowerBits = 0x3F; + } + } else { + lowerBits = 0; + } + + return (transitionIndex << 10) + (type << 7) + (doubleDoor << 6) + lowerBits; + }; + + actorSpecificData[ACTOR_EN_PO_DESERT] = [](s16 params) -> s16 { + u8 switchFlag = params >> 8; + + ImGui::InputScalar("Path", ImGuiDataType_U8, &switchFlag); + + return switchFlag << 8; + }; + + actorSpecificData[ACTOR_EN_KANBAN] = [](s16 params) -> s16 { + bool piece = params == (s16)0xFFDD; + bool fishingSign = params == 0x300; + if (ImGui::Checkbox("Piece", &piece)) { + fishingSign = false; + } + if (ImGui::Checkbox("Fishing Sign", &fishingSign)) { + piece = false; + } + + u8 textId = params; + if (!piece && !fishingSign) { + if (ImGui::InputScalar("Text ID", ImGuiDataType_U8, &textId)) { + textId |= 0x300; + } + } + + return piece ? (s16)0xFFDD : (fishingSign ? 0x300 : textId); + }; + + actorSpecificData[ACTOR_EN_KUSA] = [](s16 params) -> s16 { + static const char* items[] = { + "0", + "1", + "2" + }; + + int type = params & 3; + ImGui::Combo("Type", &type, items, IM_ARRAYSIZE(items)); + + bool bugs = ((params >> 4) & 1) != 0; + ImGui::Checkbox("Bugs", &bugs); + + u8 drop = (params >> 8) & 0xF; + if (type == 2) { + ImGui::InputScalar("Random Drop Params", ImGuiDataType_U8, &drop); + if (drop > 0xD) { + drop = 0xD; + } + } else { + drop = 0; + } + + return (drop << 8) + (bugs << 4) + type; + }; + + actorSpecificData[ActorDB::Instance->RetrieveId("En_Partner")] = [](s16 params) -> s16 { + static const char* items[] = { + "Port 1", + "Port 2", + "Port 3", + "Port 4" + }; + int selectedItem = params; + if (ImGui::Combo("Controller Port", &selectedItem, items, IM_ARRAYSIZE(items))) { + return selectedItem; + } + + return params; + }; +} + +std::vector GetActorsWithDescriptionContainingString(std::string s) { + std::locale loc; + for (size_t i = 0; i < s.length(); i += 1) { + s[i] = std::tolower(s[i], loc); + } + + std::vector actors; + for (int i = 0; i < ActorDB::Instance->GetEntryCount(); i += 1) { + ActorDB::Entry actorEntry = ActorDB::Instance->RetrieveEntry(i); + std::string desc = actorEntry.desc; + for (size_t j = 0; j < desc.length(); j += 1) { + desc[j] = std::tolower(desc[j], loc); + } + if (desc.find(s) != std::string::npos) { + actors.push_back((u16)i); + } + } + return actors; +} + void ActorViewer_AddTagForActor(Actor* actor) { int val = CVarGetInteger("gDebugActorViewerNameTags", ACTORVIEWER_NAMETAGS_NONE); auto entry = ActorDB::Instance->RetrieveEntry(actor->id); @@ -163,6 +942,9 @@ void ActorViewerWindow::DrawElement() { static std::string filler = "Please select"; static std::vector list; static u16 lastSceneId = 0; + static char searchString[64] = ""; + static s16 currentSelectedInDropdown; + static std::vector actors; if (gPlayState != nullptr) { needs_reset = lastSceneId != gPlayState->sceneNum; @@ -173,6 +955,11 @@ void ActorViewerWindow::DrawElement() { filler = "Please Select"; list.clear(); needs_reset = false; + for (size_t i = 0; i < ARRAY_COUNT(searchString); i += 1) { + searchString[i] = 0; + } + currentSelectedInDropdown = -1; + actors.clear(); } lastSceneId = gPlayState->sceneNum; if (ImGui::BeginCombo("Actor Type", acMapping[category])) { @@ -316,9 +1103,48 @@ void ActorViewerWindow::DrawElement() { if (ImGui::TreeNode("New...")) { ImGui::PushItemWidth(ImGui::GetFontSize() * 10); + if (ImGui::InputText("Search Actor", searchString, ARRAY_COUNT(searchString))) { + actors = GetActorsWithDescriptionContainingString(std::string(searchString)); + currentSelectedInDropdown = -1; + } + + if (searchString[0] != 0 && !actors.empty()) { + std::string preview = currentSelectedInDropdown == -1 ? "Please Select" : ActorDB::Instance->RetrieveEntry(actors[currentSelectedInDropdown]).desc; + if (ImGui::BeginCombo("Results", preview.c_str())) { + for (u8 i = 0; i < actors.size(); i++) { + if (ImGui::Selectable( + ActorDB::Instance->RetrieveEntry(actors[i]).desc.c_str(), + i == currentSelectedInDropdown + )) { + currentSelectedInDropdown = i; + newActor.id = actors[i]; + } + } + ImGui::EndCombo(); + } + } + ImGui::Text("%s", GetActorDescription(newActor.id).c_str()); - ImGui::InputScalar("ID", ImGuiDataType_S16, &newActor.id, &one); - ImGui::InputScalar("params", ImGuiDataType_S16, &newActor.params, &one); + if (ImGui::InputScalar("ID", ImGuiDataType_S16, &newActor.id, &one)) { + newActor.params = 0; + } + + UIWidgets::EnhancementCheckbox("Advanced mode", "gActorViewerAdvancedParams"); + UIWidgets::InsertHelpHoverText("Changes the actor specific param menus with a direct input"); + + if (CVarGetInteger("gActorViewerAdvancedParams", 0)) { + ImGui::InputScalar("params", ImGuiDataType_S16, &newActor.params, &one); + } else if (std::find(noParamsActors.begin(), noParamsActors.end(), newActor.id) == noParamsActors.end()) { + CreateActorSpecificData(); + if (actorSpecificData.find(newActor.id) == actorSpecificData.end()) { + ImGui::InputScalar("params", ImGuiDataType_S16, &newActor.params, &one); + } else { + DrawGroupWithBorder([&]() { + ImGui::Text("Actor Specific Data"); + newActor.params = actorSpecificData[newActor.id](newActor.params); + }); + } + } ImGui::PushItemWidth(ImGui::GetFontSize() * 6); @@ -401,6 +1227,11 @@ void ActorViewerWindow::DrawElement() { filler = "Please Select"; list.clear(); needs_reset = false; + for (size_t i = 0; i < ARRAY_COUNT(searchString); i += 1) { + searchString[i] = 0; + } + currentSelectedInDropdown = -1; + actors.clear(); } } diff --git a/soh/soh/Enhancements/debugger/debugSaveEditor.cpp b/soh/soh/Enhancements/debugger/debugSaveEditor.cpp index 9af4eadb7..f90ab739c 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."); } @@ -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/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/debugger/dlViewer.cpp b/soh/soh/Enhancements/debugger/dlViewer.cpp index 2fce8860a..9ed250615 100644 --- a/soh/soh/Enhancements/debugger/dlViewer.cpp +++ b/soh/soh/Enhancements/debugger/dlViewer.cpp @@ -9,6 +9,7 @@ #include #include #include +#include #include #include "dlViewer.h" @@ -18,15 +19,13 @@ extern "C" { #include "variables.h" #include "functions.h" #include "macros.h" -extern PlayState* gPlayState; - -char** ResourceMgr_ListFiles(const char* searchMask, int* resultSize); } char searchString[64] = ""; -int displayListsSearchResultsCount; -char** displayListsSearchResults; -char* activeDisplayList = nullptr; +std::string activeDisplayList = ""; +std::vector displayListSearchResults; +int16_t searchDebounceFrames = -1; +bool doSearch = false; std::map cmdMap = { { G_SETPRIMCOLOR, "gsDPSetPrimColor" }, @@ -36,8 +35,63 @@ std::map cmdMap = { { G_SETINTENSITY, "gsDPSetGrayscaleColor" }, { G_LOADTLUT, "gsDPLoadTLUT" }, { G_ENDDL, "gsSPEndDisplayList" }, + { G_TEXTURE, "gsSPTexture" }, + { G_SETTIMG, "gsDPSetTextureImage" }, + { G_SETTIMG_OTR_HASH, "gsDPSetTextureImage" }, + { G_SETTIMG_OTR_FILEPATH, "gsDPSetTextureImage" }, + { G_RDPTILESYNC, "gsDPTileSync" }, + { G_SETTILE, "gsDPSetTile" }, + { G_RDPLOADSYNC, "gsDPLoadSync" }, + { G_LOADBLOCK, "gsDPLoadBlock" }, + { G_SETTILESIZE, "gsDPSetTileSize" }, + { G_DL, "gsSPDisplayList" }, + { G_DL_OTR_FILEPATH, "gsSPDisplayList" }, + { G_DL_OTR_HASH, "gsSPDisplayList" }, + { G_MTX, "gsSPMatrix" }, + { G_MTX_OTR, "gsSPMatrix" }, + { G_VTX, "gsSPVertex" }, + { G_VTX_OTR_FILEPATH, "gsSPVertex" }, + { G_VTX_OTR_HASH, "gsSPVertex" }, + { G_GEOMETRYMODE, "gsSPSetGeometryMode" }, + { G_SETOTHERMODE_H, "gsSPSetOtherMode_H" }, + { G_SETOTHERMODE_L, "gsSPSetOtherMode_L" }, + { G_TRI1, "gsSP1Triangle" }, + { G_TRI1_OTR, "gsSP1Triangle" }, + { G_TRI2, "gsSP2Triangles" }, + { G_SETCOMBINE, "gsDPSetCombineLERP" }, + { G_CULLDL, "gsSPCullDisplayList" }, + { G_NOOP, "gsDPNoOp" }, + { G_SPNOOP, "gsSPNoOp" }, + { G_MARKER, "LUS Custom Marker" }, }; +void PerformDisplayListSearch() { + auto result = LUS::Context::GetInstance()->GetResourceManager()->GetArchive()->ListFiles("*" + std::string(searchString) + "*DL*"); + + std::regex dlSearch(".*((DL)|(DL_.*))$"); + + displayListSearchResults.clear(); + + // Filter the file results even further as StormLib can only use wildcard searching + for (size_t i = 0; i < result->size(); i++) { + std::string val = result->at(i); + if (std::regex_search(val.c_str(), dlSearch)) { + displayListSearchResults.push_back(val); + } + } + + // Sort the final list + std::sort(displayListSearchResults.begin(), displayListSearchResults.end(), [](const std::string& a, const std::string& b) { + return std::lexicographical_compare( + a.begin(), a.end(), + b.begin(), b.end(), + [](char c1, char c2) { + return std::tolower(c1) < std::tolower(c2); + } + ); + }); +} + void DLViewerWindow::DrawElement() { ImGui::SetNextWindowSize(ImVec2(520, 600), ImGuiCond_FirstUseEver); if (!ImGui::Begin("Display List Viewer", &mIsVisible, ImGuiWindowFlags_NoFocusOnAppearing)) { @@ -45,22 +99,50 @@ void DLViewerWindow::DrawElement() { return; } + ImGui::Text("%d", searchDebounceFrames); + + // Debounce the search field as listing otr files is expensive if (ImGui::InputText("Search Display Lists", searchString, ARRAY_COUNT(searchString))) { - displayListsSearchResults = ResourceMgr_ListFiles(("*" + std::string(searchString) + "*DL").c_str(), &displayListsSearchResultsCount); + doSearch = true; + searchDebounceFrames = 30; } - if (ImGui::BeginCombo("Active Display List", activeDisplayList)) { - for (int i = 0; i < displayListsSearchResultsCount; i++) { - if (ImGui::Selectable(displayListsSearchResults[i])) { - activeDisplayList = displayListsSearchResults[i]; + if (doSearch) { + if (searchDebounceFrames == 0) { + doSearch = false; + PerformDisplayListSearch(); + } + + searchDebounceFrames--; + } + + if (ImGui::BeginCombo("Active Display List", activeDisplayList.c_str())) { + for (size_t i = 0; i < displayListSearchResults.size(); i++) { + if (ImGui::Selectable(displayListSearchResults[i].c_str())) { + activeDisplayList = displayListSearchResults[i]; break; } } ImGui::EndCombo(); } - if (activeDisplayList != nullptr) { + + if (activeDisplayList == "") { + ImGui::End(); + return; + } + + try { auto res = std::static_pointer_cast(LUS::Context::GetInstance()->GetResourceManager()->LoadResource(activeDisplayList)); - for (int i = 0; i < res->Instructions.size(); i++) { + + if (res->GetInitData()->Type != LUS::ResourceType::DisplayList) { + ImGui::Text("Resource type is not a Display List. Please choose another."); + ImGui::End(); + return; + } + + ImGui::Text("Total Instruction Size: %lu", res->Instructions.size()); + + for (size_t i = 0; i < res->Instructions.size(); i++) { std::string id = "##CMD" + std::to_string(i); Gfx* gfx = (Gfx*)&res->Instructions[i]; int cmd = gfx->words.w0 >> 24; @@ -70,10 +152,11 @@ void DLViewerWindow::DrawElement() { ImGui::BeginGroup(); ImGui::PushItemWidth(25.0f); - ImGui::Text("%d", i); + ImGui::Text("%lu", i); ImGui::PopItemWidth(); ImGui::SameLine(); - ImGui::PushItemWidth(150.0f); + ImGui::PushItemWidth(175.0f); + if (ImGui::BeginCombo(("CMD" + id).c_str(), cmdLabel.c_str())) { if (ImGui::Selectable("gsDPSetPrimColor") && cmd != G_SETPRIMCOLOR) { *gfx = gsDPSetPrimColor(0, 0, 0, 0, 0, 255); @@ -92,8 +175,10 @@ void DLViewerWindow::DrawElement() { } ImGui::EndCombo(); } + ImGui::PopItemWidth(); - if (gfx->words.w0 >> 24 == G_SETPRIMCOLOR || gfx->words.w0 >> 24 == G_SETINTENSITY || gfx->words.w0 >> 24 == G_SETENVCOLOR) { + + if (cmd == G_SETPRIMCOLOR || cmd == G_SETINTENSITY || cmd == G_SETENVCOLOR) { uint8_t r = _SHIFTR(gfx->words.w1, 24, 8); uint8_t g = _SHIFTR(gfx->words.w1, 16, 8); uint8_t b = _SHIFTR(gfx->words.w1, 8, 8); @@ -117,21 +202,141 @@ void DLViewerWindow::DrawElement() { } ImGui::PopItemWidth(); } - if (gfx->words.w0 >> 24 == G_RDPPIPESYNC) { + if (cmd == G_RDPPIPESYNC) { } - if (gfx->words.w0 >> 24 == G_SETGRAYSCALE) { + if (cmd == G_SETGRAYSCALE) { bool* state = (bool*)&gfx->words.w1; ImGui::SameLine(); if (ImGui::Checkbox(("state" + id).c_str(), state)) { // } } + if (cmd == G_SETTILE) { + ImGui::SameLine(); + ImGui::Text("FMT: %u", _SHIFTR(gfx->words.w0, 21, 3)); + ImGui::SameLine(); + ImGui::Text("SIZ: %u", _SHIFTR(gfx->words.w0, 19, 2)); + ImGui::SameLine(); + ImGui::Text("LINE: %u", _SHIFTR(gfx->words.w0, 9, 9)); + ImGui::SameLine(); + ImGui::Text("TMEM: %u", _SHIFTR(gfx->words.w0, 0, 9)); + ImGui::SameLine(); + ImGui::Text("TILE: %u", _SHIFTR(gfx->words.w1, 24, 3)); + ImGui::SameLine(); + ImGui::Text("PAL: %u", _SHIFTR(gfx->words.w1, 20, 4)); + ImGui::SameLine(); + ImGui::Text("CMT: %u", _SHIFTR(gfx->words.w1, 18, 2)); + ImGui::SameLine(); + ImGui::Text("MASKT: %u", _SHIFTR(gfx->words.w1, 14, 4)); + ImGui::SameLine(); + ImGui::Text("SHIFT: %u", _SHIFTR(gfx->words.w1, 10, 4)); + ImGui::SameLine(); + ImGui::Text("CMS: %u", _SHIFTR(gfx->words.w1, 8, 2)); + ImGui::SameLine(); + ImGui::Text("MASKS: %u", _SHIFTR(gfx->words.w1, 4, 4)); + ImGui::SameLine(); + ImGui::Text("SHIFTS: %u", _SHIFTR(gfx->words.w1, 0, 4)); + } + if (cmd == G_SETTIMG) { + ImGui::SameLine(); + ImGui::Text("FMT: %u", _SHIFTR(gfx->words.w0, 21, 3)); + ImGui::SameLine(); + ImGui::Text("SIZ: %u", _SHIFTR(gfx->words.w0, 19, 2)); + ImGui::SameLine(); + ImGui::Text("WIDTH: %u", _SHIFTR(gfx->words.w0, 0, 10)); + ImGui::SameLine(); + } + if (cmd == G_SETTIMG_OTR_HASH) { + gfx++; + uint64_t hash = ((uint64_t)gfx->words.w0 << 32) + (uint64_t)gfx->words.w1; + const char* fileName = ResourceGetNameByCrc(hash); + + gfx--; + ImGui::SameLine(); + ImGui::Text("FMT: %u", _SHIFTR(gfx->words.w0, 21, 3)); + ImGui::SameLine(); + ImGui::Text("SIZ: %u", _SHIFTR(gfx->words.w0, 19, 2)); + ImGui::SameLine(); + ImGui::Text("WIDTH: %u", _SHIFTR(gfx->words.w0, 0, 10)); + ImGui::SameLine(); + ImGui::Text("Texture Name: %s", fileName); + } + if (cmd == G_SETTIMG_OTR_FILEPATH) { + char* fileName = (char*)gfx->words.w1; + gfx++; + ImGui::SameLine(); + ImGui::Text("FMT: %u", _SHIFTR(gfx->words.w0, 21, 3)); + ImGui::SameLine(); + ImGui::Text("SIZ: %u", _SHIFTR(gfx->words.w0, 19, 2)); + ImGui::SameLine(); + ImGui::Text("WIDTH: %u", _SHIFTR(gfx->words.w0, 0, 10)); + ImGui::SameLine(); + ImGui::Text("Texture Name: %s", fileName); + } + if (cmd == G_VTX) { + ImGui::SameLine(); + ImGui::Text("Num VTX: %u", _SHIFTR(gfx->words.w0, 12, 8)); + ImGui::SameLine(); + ImGui::Text("Offset: %u", _SHIFTR(gfx->words.w0, 1, 7) - _SHIFTR(gfx->words.w0, 12, 8)); + } + if (cmd == G_VTX_OTR_HASH) { + gfx++; + uint64_t hash = ((uint64_t)gfx->words.w0 << 32) + (uint64_t)gfx->words.w1; + const char* fileName = ResourceGetNameByCrc(hash); + + gfx--; + ImGui::SameLine(); + ImGui::Text("Num VTX: %u", _SHIFTR(gfx->words.w0, 12, 8)); + ImGui::SameLine(); + ImGui::Text("Offset: %u", _SHIFTR(gfx->words.w0, 1, 7) - _SHIFTR(gfx->words.w0, 12, 8)); + + ImGui::SameLine(); + ImGui::Text("Vertex Name: %s", fileName); + } + if (cmd == G_VTX_OTR_FILEPATH) { + char* fileName = (char*)gfx->words.w1; + + gfx++; + ImGui::SameLine(); + ImGui::Text("Num VTX: %u", _SHIFTR(gfx->words.w0, 12, 8)); + ImGui::SameLine(); + ImGui::Text("Offset: %u", _SHIFTR(gfx->words.w0, 1, 7) - _SHIFTR(gfx->words.w0, 12, 8)); + + ImGui::SameLine(); + ImGui::Text("Vertex Name: %s", fileName); + } + if (cmd == G_DL) { + } + if (cmd == G_DL_OTR_HASH) { + gfx++; + uint64_t hash = ((uint64_t)gfx->words.w0 << 32) + (uint64_t)gfx->words.w1; + const char* fileName = ResourceGetNameByCrc(hash); + ImGui::SameLine(); + ImGui::Text("DL Name: %s", fileName); + } + if (cmd == G_DL_OTR_FILEPATH) { + char* fileName = (char*)gfx->words.w1; + ImGui::SameLine(); + ImGui::Text("DL Name: %s", fileName); + } + + // Skip second half of instructions that are over 128-bit wide + if (cmd == G_SETTIMG_OTR_HASH || cmd == G_DL_OTR_HASH || cmd == G_VTX_OTR_HASH || + cmd == G_BRANCH_Z_OTR || cmd == G_MARKER || cmd == G_MTX_OTR) { + i++; + ImGui::Text("%lu - Reserved - Second half of %s", i, cmdLabel.c_str()); + } ImGui::EndGroup(); } + } catch (const std::exception& e) { + ImGui::Text("Error displaying DL instructions."); + ImGui::End(); + return; } + ImGui::End(); } void DLViewerWindow::InitElement() { - displayListsSearchResults = ResourceMgr_ListFiles("*DL", &displayListsSearchResultsCount); + PerformDisplayListSearch(); } 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/Enhancements/enhancementTypes.h b/soh/soh/Enhancements/enhancementTypes.h index 529ebed81..c8461bbf1 100644 --- a/soh/soh/Enhancements/enhancementTypes.h +++ b/soh/soh/Enhancements/enhancementTypes.h @@ -1,3 +1,6 @@ +#ifndef _ENHANCEMENT_TYPES_H_ +#define _ENHANCEMENT_TYPES_H_ + typedef enum { WARP_MODE_OVERRIDE_OFF, WARP_MODE_OVERRIDE_MQ_AS_VANILLA, @@ -74,3 +77,5 @@ typedef enum { DEKU_STICK_UNBREAKABLE, DEKU_STICK_UNBREAKABLE_AND_ALWAYS_ON_FIRE, } DekuStickType; + +#endif diff --git a/soh/soh/Enhancements/game-interactor/GameInteractionEffect.cpp b/soh/soh/Enhancements/game-interactor/GameInteractionEffect.cpp index 206b26426..a0469d0c3 100644 --- a/soh/soh/Enhancements/game-interactor/GameInteractionEffect.cpp +++ b/soh/soh/Enhancements/game-interactor/GameInteractionEffect.cpp @@ -31,11 +31,11 @@ GameInteractionEffectQueryResult GameInteractionEffectBase::Apply() { } /// For most effects, CanBeRemoved is the same as CanBeApplied. When its not: please override `CanBeRemoved`. -GameInteractionEffectQueryResult GameInteractionEffectBase::CanBeRemoved() { +GameInteractionEffectQueryResult RemovableGameInteractionEffect::CanBeRemoved() { return CanBeApplied(); } -GameInteractionEffectQueryResult GameInteractionEffectBase::Remove() { +GameInteractionEffectQueryResult RemovableGameInteractionEffect::Remove() { GameInteractionEffectQueryResult result = CanBeRemoved(); if (result != GameInteractionEffectQueryResult::Possible) { return result; diff --git a/soh/soh/Enhancements/game-interactor/GameInteractionEffect.h b/soh/soh/Enhancements/game-interactor/GameInteractionEffect.h index c4a7f7eac..ebc1b6fac 100644 --- a/soh/soh/Enhancements/game-interactor/GameInteractionEffect.h +++ b/soh/soh/Enhancements/game-interactor/GameInteractionEffect.h @@ -15,38 +15,46 @@ enum GameInteractionEffectQueryResult { class GameInteractionEffectBase { public: virtual GameInteractionEffectQueryResult CanBeApplied() = 0; - virtual GameInteractionEffectQueryResult CanBeRemoved(); GameInteractionEffectQueryResult Apply(); - GameInteractionEffectQueryResult Remove(); - int32_t parameters[3]; - - protected: +protected: virtual void _Apply() = 0; +}; + +class RemovableGameInteractionEffect: public GameInteractionEffectBase { +public: + virtual GameInteractionEffectQueryResult CanBeRemoved(); + GameInteractionEffectQueryResult Remove(); +protected: virtual void _Remove() {}; }; +class ParameterizedGameInteractionEffect { +public: + int32_t parameters[3]; +}; + namespace GameInteractionEffect { - class SetSceneFlag: public GameInteractionEffectBase { + class SetSceneFlag: public GameInteractionEffectBase, public ParameterizedGameInteractionEffect { GameInteractionEffectQueryResult CanBeApplied() override; void _Apply() override; }; - class UnsetSceneFlag: public GameInteractionEffectBase { + class UnsetSceneFlag: public GameInteractionEffectBase, public ParameterizedGameInteractionEffect { GameInteractionEffectQueryResult CanBeApplied() override; void _Apply() override; }; - class SetFlag: public GameInteractionEffectBase { + class SetFlag: public GameInteractionEffectBase, public ParameterizedGameInteractionEffect { GameInteractionEffectQueryResult CanBeApplied() override; void _Apply() override; }; - class UnsetFlag: public GameInteractionEffectBase { + class UnsetFlag: public GameInteractionEffectBase, public ParameterizedGameInteractionEffect { GameInteractionEffectQueryResult CanBeApplied() override; void _Apply() override; }; - class ModifyHeartContainers: public GameInteractionEffectBase { + class ModifyHeartContainers: public GameInteractionEffectBase, public ParameterizedGameInteractionEffect { GameInteractionEffectQueryResult CanBeApplied() override; void _Apply() override; }; @@ -61,29 +69,29 @@ namespace GameInteractionEffect { void _Apply() override; }; - class ModifyRupees: public GameInteractionEffectBase { + class ModifyRupees: public GameInteractionEffectBase, public ParameterizedGameInteractionEffect { GameInteractionEffectQueryResult CanBeApplied() override; void _Apply() override; }; - class NoUI: public GameInteractionEffectBase { + class NoUI: public RemovableGameInteractionEffect { GameInteractionEffectQueryResult CanBeApplied() override; void _Apply() override; void _Remove() override; }; - class ModifyGravity: public GameInteractionEffectBase { + class ModifyGravity: public RemovableGameInteractionEffect, public ParameterizedGameInteractionEffect { GameInteractionEffectQueryResult CanBeApplied() override; void _Apply() override; void _Remove() override; }; - class ModifyHealth: public GameInteractionEffectBase { + class ModifyHealth: public GameInteractionEffectBase, public ParameterizedGameInteractionEffect { GameInteractionEffectQueryResult CanBeApplied() override; void _Apply() override; }; - class SetPlayerHealth: public GameInteractionEffectBase { + class SetPlayerHealth: public GameInteractionEffectBase, public ParameterizedGameInteractionEffect { GameInteractionEffectQueryResult CanBeApplied() override; void _Apply() override; }; @@ -103,98 +111,98 @@ namespace GameInteractionEffect { void _Apply() override; }; - class KnockbackPlayer: public GameInteractionEffectBase { + class KnockbackPlayer: public GameInteractionEffectBase, public ParameterizedGameInteractionEffect { GameInteractionEffectQueryResult CanBeApplied() override; void _Apply() override; }; - class ModifyLinkSize: public GameInteractionEffectBase { + class ModifyLinkSize: public RemovableGameInteractionEffect, public ParameterizedGameInteractionEffect { GameInteractionEffectQueryResult CanBeApplied() override; void _Apply() override; void _Remove() override; }; - class InvisibleLink : public GameInteractionEffectBase { + class InvisibleLink : public RemovableGameInteractionEffect, public ParameterizedGameInteractionEffect { GameInteractionEffectQueryResult CanBeApplied() override; void _Apply() override; void _Remove() override; }; - class PacifistMode : public GameInteractionEffectBase { + class PacifistMode : public RemovableGameInteractionEffect { GameInteractionEffectQueryResult CanBeApplied() override; void _Apply() override; void _Remove() override; }; - class DisableZTargeting: public GameInteractionEffectBase { + class DisableZTargeting: public RemovableGameInteractionEffect, public ParameterizedGameInteractionEffect { GameInteractionEffectQueryResult CanBeApplied() override; void _Apply() override; void _Remove() override; }; - class WeatherRainstorm: public GameInteractionEffectBase { + class WeatherRainstorm: public RemovableGameInteractionEffect { GameInteractionEffectQueryResult CanBeApplied() override; void _Apply() override; void _Remove() override; }; - class ReverseControls: public GameInteractionEffectBase { + class ReverseControls: public RemovableGameInteractionEffect { GameInteractionEffectQueryResult CanBeApplied() override; void _Apply() override; void _Remove() override; }; - class ForceEquipBoots: public GameInteractionEffectBase { + class ForceEquipBoots: public RemovableGameInteractionEffect, public ParameterizedGameInteractionEffect { GameInteractionEffectQueryResult CanBeApplied() override; void _Apply() override; void _Remove() override; }; - class ModifyRunSpeedModifier: public GameInteractionEffectBase { + class ModifyRunSpeedModifier: public RemovableGameInteractionEffect, public ParameterizedGameInteractionEffect { GameInteractionEffectQueryResult CanBeApplied() override; void _Apply() override; void _Remove() override; }; - class OneHitKO : public GameInteractionEffectBase { + class OneHitKO : public RemovableGameInteractionEffect { GameInteractionEffectQueryResult CanBeApplied() override; void _Apply() override; void _Remove() override; }; - class ModifyDefenseModifier: public GameInteractionEffectBase { + class ModifyDefenseModifier: public RemovableGameInteractionEffect, public ParameterizedGameInteractionEffect { GameInteractionEffectQueryResult CanBeApplied() override; void _Apply() override; void _Remove() override; }; - class GiveOrTakeShield: public GameInteractionEffectBase { + class GiveOrTakeShield: public GameInteractionEffectBase, public ParameterizedGameInteractionEffect { GameInteractionEffectQueryResult CanBeApplied() override; void _Apply() override; }; - class TeleportPlayer: public GameInteractionEffectBase { + class TeleportPlayer: public GameInteractionEffectBase, public ParameterizedGameInteractionEffect { GameInteractionEffectQueryResult CanBeApplied() override; void _Apply() override; }; - class ClearAssignedButtons: public GameInteractionEffectBase { + class ClearAssignedButtons: public GameInteractionEffectBase, public ParameterizedGameInteractionEffect { GameInteractionEffectQueryResult CanBeApplied() override; void _Apply() override; }; - class SetTimeOfDay: public GameInteractionEffectBase { + class SetTimeOfDay: public GameInteractionEffectBase, public ParameterizedGameInteractionEffect { GameInteractionEffectQueryResult CanBeApplied() override; void _Apply() override; }; - class SetCollisionViewer: public GameInteractionEffectBase { + class SetCollisionViewer: public RemovableGameInteractionEffect { GameInteractionEffectQueryResult CanBeApplied() override; void _Apply() override; void _Remove() override; }; - class SetCosmeticsColor: public GameInteractionEffectBase { + class SetCosmeticsColor: public GameInteractionEffectBase, public ParameterizedGameInteractionEffect { GameInteractionEffectQueryResult CanBeApplied() override; void _Apply() override; }; @@ -204,52 +212,52 @@ namespace GameInteractionEffect { void _Apply() override; }; - class PressButton: public GameInteractionEffectBase { + class PressButton: public GameInteractionEffectBase, public ParameterizedGameInteractionEffect { GameInteractionEffectQueryResult CanBeApplied() override; void _Apply() override; }; - class PressRandomButton: public GameInteractionEffectBase { + class PressRandomButton: public GameInteractionEffectBase, public ParameterizedGameInteractionEffect { GameInteractionEffectQueryResult CanBeApplied() override; void _Apply() override; }; - class AddOrTakeAmmo: public GameInteractionEffectBase { + class AddOrTakeAmmo: public GameInteractionEffectBase, public ParameterizedGameInteractionEffect { GameInteractionEffectQueryResult CanBeApplied() override; void _Apply() override; }; - class RandomBombFuseTimer: public GameInteractionEffectBase { + class RandomBombFuseTimer: public RemovableGameInteractionEffect { GameInteractionEffectQueryResult CanBeApplied() override; void _Apply() override; void _Remove() override; }; - class DisableLedgeGrabs: public GameInteractionEffectBase { + class DisableLedgeGrabs: public RemovableGameInteractionEffect { GameInteractionEffectQueryResult CanBeApplied() override; void _Apply() override; void _Remove() override; }; - class RandomWind: public GameInteractionEffectBase { + class RandomWind: public RemovableGameInteractionEffect { GameInteractionEffectQueryResult CanBeApplied() override; void _Apply() override; void _Remove() override; }; - class RandomBonks: public GameInteractionEffectBase { + class RandomBonks: public RemovableGameInteractionEffect { GameInteractionEffectQueryResult CanBeApplied() override; void _Apply() override; void _Remove() override; }; - class PlayerInvincibility: public GameInteractionEffectBase { + class PlayerInvincibility: public RemovableGameInteractionEffect { GameInteractionEffectQueryResult CanBeApplied() override; void _Apply() override; void _Remove() override; }; - class SlipperyFloor: public GameInteractionEffectBase { + class SlipperyFloor: public RemovableGameInteractionEffect { GameInteractionEffectQueryResult CanBeApplied() override; void _Apply() override; void _Remove() override; diff --git a/soh/soh/Enhancements/game-interactor/GameInteractor.cpp b/soh/soh/Enhancements/game-interactor/GameInteractor.cpp index eb330947b..d6641133c 100644 --- a/soh/soh/Enhancements/game-interactor/GameInteractor.cpp +++ b/soh/soh/Enhancements/game-interactor/GameInteractor.cpp @@ -31,7 +31,7 @@ GameInteractionEffectQueryResult GameInteractor::ApplyEffect(GameInteractionEffe return effect->Apply(); } -GameInteractionEffectQueryResult GameInteractor::RemoveEffect(GameInteractionEffectBase* effect) { +GameInteractionEffectQueryResult GameInteractor::RemoveEffect(RemovableGameInteractionEffect* effect) { return effect->Remove(); } diff --git a/soh/soh/Enhancements/game-interactor/GameInteractor.h b/soh/soh/Enhancements/game-interactor/GameInteractor.h index 8f81e8b53..fedf13dc9 100644 --- a/soh/soh/Enhancements/game-interactor/GameInteractor.h +++ b/soh/soh/Enhancements/game-interactor/GameInteractor.h @@ -5,6 +5,12 @@ #include "GameInteractionEffect.h" #include "soh/Enhancements/item-tables/ItemTableTypes.h" +#include + +typedef enum { + GI_SCHEME_SAIL, + GI_SCHEME_CROWD_CONTROL, +} GIScheme; typedef enum { /* 0x00 */ GI_LINK_SIZE_NORMAL, @@ -52,13 +58,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 @@ -91,9 +97,15 @@ void GameInteractor_SetTriforceHuntCreditsWarpActive(uint8_t state); #ifdef __cplusplus - +#include #include #include +#include + +#ifdef ENABLE_REMOTE_CONTROL +#include +#include +#endif #define DEFINE_HOOK(name, type) \ struct name { \ @@ -131,10 +143,24 @@ public: static void SetPacifistMode(bool active); }; + #ifdef ENABLE_REMOTE_CONTROL + bool isRemoteInteractorEnabled; + bool isRemoteInteractorConnected; + + void EnableRemoteInteractor(); + void DisableRemoteInteractor(); + void RegisterRemoteDataHandler(std::function method); + void RegisterRemoteJsonHandler(std::function method); + void RegisterRemoteConnectedHandler(std::function method); + void RegisterRemoteDisconnectedHandler(std::function method); + void TransmitDataToRemote(const char* payload); + void TransmitJsonToRemote(nlohmann::json packet); + #endif + // Effects static GameInteractionEffectQueryResult CanApplyEffect(GameInteractionEffectBase* effect); static GameInteractionEffectQueryResult ApplyEffect(GameInteractionEffectBase* effect); - static GameInteractionEffectQueryResult RemoveEffect(GameInteractionEffectBase* effect); + static GameInteractionEffectQueryResult RemoveEffect(RemovableGameInteractionEffect* effect); // Game Hooks template struct RegisteredGameHooks { inline static std::vector functions; }; @@ -195,6 +221,9 @@ public: DEFINE_HOOK(OnSetGameLanguage, void()); DEFINE_HOOK(OnGameStillFrozen, void()); + DEFINE_HOOK(OnFileDropped, void(std::string filePath)); + DEFINE_HOOK(OnAssetAltChange, void()); + // Helpers static bool IsSaveLoaded(); static bool IsGameplayPaused(); @@ -237,6 +266,21 @@ public: static GameInteractionEffectQueryResult SpawnEnemyWithOffset(uint32_t enemyId, int32_t enemyParams); static GameInteractionEffectQueryResult SpawnActor(uint32_t actorId, int32_t actorParams); }; + + private: + #ifdef ENABLE_REMOTE_CONTROL + IPaddress remoteIP; + TCPsocket remoteSocket; + std::thread remoteThreadReceive; + std::function remoteDataHandler; + std::function remoteJsonHandler; + std::function remoteConnectedHandler; + std::function remoteDisconnectedHandler; + + void ReceiveFromServer(); + void HandleRemoteData(char payload[512]); + void HandleRemoteJson(std::string payload); + #endif }; #endif /* __cplusplus */ diff --git a/soh/soh/Enhancements/game-interactor/GameInteractor_Hooks.cpp b/soh/soh/Enhancements/game-interactor/GameInteractor_Hooks.cpp index ff1575a28..3954f8d37 100644 --- a/soh/soh/Enhancements/game-interactor/GameInteractor_Hooks.cpp +++ b/soh/soh/Enhancements/game-interactor/GameInteractor_Hooks.cpp @@ -183,7 +183,16 @@ void GameInteractor_ExecuteOnUpdateFileNameSelection(int16_t charCode) { void GameInteractor_ExecuteOnSetGameLanguage() { GameInteractor::Instance->ExecuteHooks(); } + void GameInteractor_ExecuteOnGameStillFrozen() { GameInteractor::Instance->ExecuteHooks(); -} \ No newline at end of file +} + + +// MARK: - System + +void GameInteractor_RegisterOnAssetAltChange(void (*fn)(void)) { + GameInteractor::Instance->RegisterGameHook(fn); +} + diff --git a/soh/soh/Enhancements/game-interactor/GameInteractor_Hooks.h b/soh/soh/Enhancements/game-interactor/GameInteractor_Hooks.h index fba7bf3f5..506d02120 100644 --- a/soh/soh/Enhancements/game-interactor/GameInteractor_Hooks.h +++ b/soh/soh/Enhancements/game-interactor/GameInteractor_Hooks.h @@ -58,7 +58,14 @@ void GameInteractor_ExecuteOnUpdateFileNameSelection(int16_t charCode); // MARK: - Game void GameInteractor_ExecuteOnSetGameLanguage(); + void GameInteractor_ExecuteOnGameStillFrozen(); + + +// MARK: - System +void GameInteractor_RegisterOnAssetAltChange(void (*fn)(void)); + + #ifdef __cplusplus } #endif diff --git a/soh/soh/Enhancements/game-interactor/GameInteractor_RawAction.cpp b/soh/soh/Enhancements/game-interactor/GameInteractor_RawAction.cpp index 54a3b8e7b..854b7dc11 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) { @@ -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/soh/Enhancements/game-interactor/GameInteractor_Remote.cpp b/soh/soh/Enhancements/game-interactor/GameInteractor_Remote.cpp new file mode 100644 index 000000000..2cbd6b379 --- /dev/null +++ b/soh/soh/Enhancements/game-interactor/GameInteractor_Remote.cpp @@ -0,0 +1,182 @@ +#ifdef ENABLE_REMOTE_CONTROL + +#include "GameInteractor.h" +#include +#include +#include +#include +#include +#include +#include + +// MARK: - Remote + +void GameInteractor::EnableRemoteInteractor() { + if (isRemoteInteractorEnabled) { + return; + } + + if (SDLNet_ResolveHost(&remoteIP, CVarGetString("gRemote.IP", "127.0.0.1"), CVarGetInteger("gRemote.Port", 43384)) == -1) { + SPDLOG_ERROR("[GameInteractor] SDLNet_ResolveHost: {}", SDLNet_GetError()); + } + + isRemoteInteractorEnabled = true; + + // First check if there is a thread running, if so, join it + if (remoteThreadReceive.joinable()) { + remoteThreadReceive.join(); + } + + remoteThreadReceive = std::thread(&GameInteractor::ReceiveFromServer, this); +} + +/** + * Raw data handler + * + * If you are developing a new remote, you should probably use the json methods instead. This + * method requires you to parse the data and ensure packets are complete manually, we cannot + * gaurentee that the data will be complete, or that it will only contain one packet with this + */ +void GameInteractor::RegisterRemoteDataHandler(std::function method) { + remoteDataHandler = method; +} + +/** + * Json handler + * + * This method will be called when a complete json packet is received. All json packets must + * be delimited by a null terminator (\0). + */ +void GameInteractor::RegisterRemoteJsonHandler(std::function method) { + remoteJsonHandler = method; +} + +void GameInteractor::RegisterRemoteConnectedHandler(std::function method) { + remoteConnectedHandler = method; +} + +void GameInteractor::RegisterRemoteDisconnectedHandler(std::function method) { + remoteDisconnectedHandler = method; +} + +void GameInteractor::DisableRemoteInteractor() { + if (!isRemoteInteractorEnabled) { + return; + } + + isRemoteInteractorEnabled = false; + remoteThreadReceive.join(); + remoteDataHandler = nullptr; + remoteJsonHandler = nullptr; + remoteConnectedHandler = nullptr; + remoteDisconnectedHandler = nullptr; +} + +void GameInteractor::TransmitDataToRemote(const char* payload) { + SDLNet_TCP_Send(remoteSocket, payload, strlen(payload) + 1); +} + +// Appends a newline character to the end of the json payload and sends it to the remote +void GameInteractor::TransmitJsonToRemote(nlohmann::json payload) { + TransmitDataToRemote(payload.dump().c_str()); +} + +// MARK: - Private + +std::string receivedData; + +void GameInteractor::ReceiveFromServer() { + while (isRemoteInteractorEnabled) { + while (!isRemoteInteractorConnected && isRemoteInteractorEnabled) { + SPDLOG_TRACE("[GameInteractor] Attempting to make connection to server..."); + remoteSocket = SDLNet_TCP_Open(&remoteIP); + + if (remoteSocket) { + isRemoteInteractorConnected = true; + SPDLOG_INFO("[GameInteractor] Connection to server established!"); + + if (remoteConnectedHandler) { + remoteConnectedHandler(); + } + break; + } + } + + SDLNet_SocketSet socketSet = SDLNet_AllocSocketSet(1); + if (remoteSocket) { + SDLNet_TCP_AddSocket(socketSet, remoteSocket); + } + + // Listen to socket messages + while (isRemoteInteractorConnected && remoteSocket && isRemoteInteractorEnabled) { + // we check first if socket has data, to not block in the TCP_Recv + int socketsReady = SDLNet_CheckSockets(socketSet, 0); + + if (socketsReady == -1) { + SPDLOG_ERROR("[GameInteractor] SDLNet_CheckSockets: {}", SDLNet_GetError()); + break; + } + + if (socketsReady == 0) { + continue; + } + + char remoteDataReceived[512]; + memset(remoteDataReceived, 0, sizeof(remoteDataReceived)); + int len = SDLNet_TCP_Recv(remoteSocket, &remoteDataReceived, sizeof(remoteDataReceived)); + if (!len || !remoteSocket || len == -1) { + SPDLOG_ERROR("[GameInteractor] SDLNet_TCP_Recv: {}", SDLNet_GetError()); + break; + } + + HandleRemoteData(remoteDataReceived); + + receivedData.append(remoteDataReceived, len); + + // Proess all complete packets + size_t delimiterPos = receivedData.find('\0'); + while (delimiterPos != std::string::npos) { + // Extract the complete packet until the delimiter + std::string packet = receivedData.substr(0, delimiterPos); + // Remove the packet (including the delimiter) from the received data + receivedData.erase(0, delimiterPos + 1); + HandleRemoteJson(packet); + // Find the next delimiter + delimiterPos = receivedData.find('\0'); + } + } + + if (isRemoteInteractorConnected) { + SDLNet_TCP_Close(remoteSocket); + isRemoteInteractorConnected = false; + if (remoteDisconnectedHandler) { + remoteDisconnectedHandler(); + } + SPDLOG_INFO("[GameInteractor] Ending receiving thread..."); + } + } +} + +void GameInteractor::HandleRemoteData(char payload[512]) { + if (remoteDataHandler) { + remoteDataHandler(payload); + return; + } +} + +void GameInteractor::HandleRemoteJson(std::string payload) { + nlohmann::json jsonPayload; + try { + jsonPayload = nlohmann::json::parse(payload); + } catch (const std::exception& e) { + SPDLOG_ERROR("[GameInteractor] Failed to parse json: \n{}\n{}\n", payload, e.what()); + return; + } + + if (remoteJsonHandler) { + remoteJsonHandler(jsonPayload); + return; + } +} + +#endif diff --git a/soh/soh/Enhancements/game-interactor/GameInteractor_Sail.cpp b/soh/soh/Enhancements/game-interactor/GameInteractor_Sail.cpp new file mode 100644 index 000000000..a209d8c50 --- /dev/null +++ b/soh/soh/Enhancements/game-interactor/GameInteractor_Sail.cpp @@ -0,0 +1,471 @@ +#ifdef ENABLE_REMOTE_CONTROL + +#include "GameInteractor_Sail.h" +#include +#include +#include + +template +bool IsType(const SrcType* src) { + return dynamic_cast(src) != nullptr; +} + +void GameInteractorSail::Enable() { + if (isEnabled) { + return; + } + + isEnabled = true; + GameInteractor::Instance->EnableRemoteInteractor(); + GameInteractor::Instance->RegisterRemoteJsonHandler([&](nlohmann::json payload) { + HandleRemoteJson(payload); + }); + GameInteractor::Instance->RegisterRemoteConnectedHandler([&]() { + RegisterHooks(); + }); +} + +void GameInteractorSail::Disable() { + if (!isEnabled) { + return; + } + + isEnabled = false; + GameInteractor::Instance->DisableRemoteInteractor(); +} + +void GameInteractorSail::HandleRemoteJson(nlohmann::json payload) { + SPDLOG_INFO("[GameInteractorSail] Received payload: \n{}", payload.dump()); + + nlohmann::json responsePayload; + responsePayload["type"] = "result"; + responsePayload["status"] = "failure"; + + try { + if (!payload.contains("id")) { + SPDLOG_ERROR("[GameInteractorSail] Received payload without ID"); + GameInteractor::Instance->TransmitJsonToRemote(responsePayload); + return; + } + + responsePayload["id"] = payload["id"]; + + if (!payload.contains("type")) { + SPDLOG_ERROR("[GameInteractorSail] Received payload without type"); + GameInteractor::Instance->TransmitJsonToRemote(responsePayload); + return; + } + + std::string payloadType = payload["type"].get(); + + if (payloadType == "command") { + if (!payload.contains("command")) { + SPDLOG_ERROR("[GameInteractorSail] Received command payload without command"); + GameInteractor::Instance->TransmitJsonToRemote(responsePayload); + return; + } + + std::string command = payload["command"].get(); + std::reinterpret_pointer_cast(LUS::Context::GetInstance()->GetWindow()->GetGui()->GetGuiWindow("Console"))->Dispatch(command); + responsePayload["status"] = "success"; + GameInteractor::Instance->TransmitJsonToRemote(responsePayload); + return; + } else if (payloadType == "effect") { + if (!payload.contains("effect") || !payload["effect"].contains("type")) { + SPDLOG_ERROR("[GameInteractorSail] Received effect payload without effect type"); + GameInteractor::Instance->TransmitJsonToRemote(responsePayload); + return; + } + + std::string effectType = payload["effect"]["type"].get(); + + // Special case for "command" effect, so we can also run commands from the `simple_twitch_sail` script + if (effectType == "command") { + if (!payload["effect"].contains("command")) { + SPDLOG_ERROR("[GameInteractorSail] Received command effect payload without command"); + GameInteractor::Instance->TransmitJsonToRemote(responsePayload); + return; + } + + std::string command = payload["effect"]["command"].get(); + std::reinterpret_pointer_cast(LUS::Context::GetInstance()->GetWindow()->GetGui()->GetGuiWindow("Console"))->Dispatch(command); + responsePayload["status"] = "success"; + GameInteractor::Instance->TransmitJsonToRemote(responsePayload); + return; + } + + if (effectType != "apply" && effectType != "remove") { + SPDLOG_ERROR("[GameInteractorSail] Received effect payload with unknown effect type: {}", effectType); + GameInteractor::Instance->TransmitJsonToRemote(responsePayload); + return; + } + + if (!GameInteractor::IsSaveLoaded()) { + responsePayload["status"] = "try_again"; + GameInteractor::Instance->TransmitJsonToRemote(responsePayload); + return; + } + + GameInteractionEffectBase* giEffect = EffectFromJson(payload["effect"]); + if (giEffect) { + GameInteractionEffectQueryResult result; + if (effectType == "remove") { + if (IsType(giEffect)) { + result = dynamic_cast(giEffect)->Remove(); + } else { + result = GameInteractionEffectQueryResult::NotPossible; + } + } else { + result = giEffect->Apply(); + } + + if (result == GameInteractionEffectQueryResult::Possible) { + responsePayload["status"] = "success"; + } else if (result == GameInteractionEffectQueryResult::TemporarilyNotPossible) { + responsePayload["status"] = "try_again"; + } + GameInteractor::Instance->TransmitJsonToRemote(responsePayload); + return; + } + } else { + SPDLOG_ERROR("[GameInteractorSail] Unknown payload type: {}", payloadType); + GameInteractor::Instance->TransmitJsonToRemote(responsePayload); + return; + } + + // If we get here, something went wrong, send the failure response + SPDLOG_ERROR("[GameInteractorSail] Failed to handle remote JSON, sending failure response"); + GameInteractor::Instance->TransmitJsonToRemote(responsePayload); + } catch (const std::exception& e) { + SPDLOG_ERROR("[GameInteractorSail] Exception handling remote JSON: {}", e.what()); + } catch (...) { + SPDLOG_ERROR("[GameInteractorSail] Unknown exception handling remote JSON"); + } +} + +GameInteractionEffectBase* GameInteractorSail::EffectFromJson(nlohmann::json payload) { + if (!payload.contains("name")) { + return nullptr; + } + + std::string name = payload["name"].get(); + + if (name == "SetSceneFlag") { + auto effect = new GameInteractionEffect::SetSceneFlag(); + if (payload.contains("parameters")) { + effect->parameters[0] = payload["parameters"][0].get(); + effect->parameters[1] = payload["parameters"][1].get(); + effect->parameters[2] = payload["parameters"][2].get(); + } + return effect; + } else if (name == "UnsetSceneFlag") { + auto effect = new GameInteractionEffect::UnsetSceneFlag(); + if (payload.contains("parameters")) { + effect->parameters[0] = payload["parameters"][0].get(); + effect->parameters[1] = payload["parameters"][1].get(); + effect->parameters[2] = payload["parameters"][2].get(); + } + return effect; + } else if (name == "SetFlag") { + auto effect = new GameInteractionEffect::SetFlag(); + if (payload.contains("parameters")) { + effect->parameters[0] = payload["parameters"][0].get(); + effect->parameters[1] = payload["parameters"][1].get(); + } + return effect; + } else if (name == "UnsetFlag") { + auto effect = new GameInteractionEffect::UnsetFlag(); + if (payload.contains("parameters")) { + effect->parameters[0] = payload["parameters"][0].get(); + effect->parameters[1] = payload["parameters"][1].get(); + } + return effect; + } else if (name == "ModifyHeartContainers") { + auto effect = new GameInteractionEffect::ModifyHeartContainers(); + if (payload.contains("parameters")) { + effect->parameters[0] = payload["parameters"][0].get(); + } + return effect; + } else if (name == "FillMagic") { + return new GameInteractionEffect::FillMagic(); + } else if (name == "EmptyMagic") { + return new GameInteractionEffect::EmptyMagic(); + } else if (name == "ModifyRupees") { + auto effect = new GameInteractionEffect::ModifyRupees(); + if (payload.contains("parameters")) { + effect->parameters[0] = payload["parameters"][0].get(); + } + return effect; + } else if (name == "NoUI") { + return new GameInteractionEffect::NoUI(); + } else if (name == "ModifyGravity") { + auto effect = new GameInteractionEffect::ModifyGravity(); + if (payload.contains("parameters")) { + effect->parameters[0] = payload["parameters"][0].get(); + } + return effect; + } else if (name == "ModifyHealth") { + auto effect = new GameInteractionEffect::ModifyHealth(); + if (payload.contains("parameters")) { + effect->parameters[0] = payload["parameters"][0].get(); + } + return effect; + } else if (name == "SetPlayerHealth") { + auto effect = new GameInteractionEffect::SetPlayerHealth(); + if (payload.contains("parameters")) { + effect->parameters[0] = payload["parameters"][0].get(); + } + return effect; + } else if (name == "FreezePlayer") { + return new GameInteractionEffect::FreezePlayer(); + } else if (name == "BurnPlayer") { + return new GameInteractionEffect::BurnPlayer(); + } else if (name == "ElectrocutePlayer") { + return new GameInteractionEffect::ElectrocutePlayer(); + } else if (name == "KnockbackPlayer") { + auto effect = new GameInteractionEffect::KnockbackPlayer(); + if (payload.contains("parameters")) { + effect->parameters[0] = payload["parameters"][0].get(); + } + return effect; + } else if (name == "ModifyLinkSize") { + auto effect = new GameInteractionEffect::ModifyLinkSize(); + if (payload.contains("parameters")) { + effect->parameters[0] = payload["parameters"][0].get(); + } + return effect; + } else if (name == "InvisibleLink") { + return new GameInteractionEffect::InvisibleLink(); + } else if (name == "PacifistMode") { + return new GameInteractionEffect::PacifistMode(); + } else if (name == "DisableZTargeting") { + return new GameInteractionEffect::DisableZTargeting(); + } else if (name == "WeatherRainstorm") { + return new GameInteractionEffect::WeatherRainstorm(); + } else if (name == "ReverseControls") { + return new GameInteractionEffect::ReverseControls(); + } else if (name == "ForceEquipBoots") { + auto effect = new GameInteractionEffect::ForceEquipBoots(); + if (payload.contains("parameters")) { + effect->parameters[0] = payload["parameters"][0].get(); + } + return effect; + } else if (name == "ModifyRunSpeedModifier") { + auto effect = new GameInteractionEffect::ModifyRunSpeedModifier(); + if (payload.contains("parameters")) { + effect->parameters[0] = payload["parameters"][0].get(); + } + return effect; + } else if (name == "OneHitKO") { + return new GameInteractionEffect::OneHitKO(); + } else if (name == "ModifyDefenseModifier") { + auto effect = new GameInteractionEffect::ModifyDefenseModifier(); + if (payload.contains("parameters")) { + effect->parameters[0] = payload["parameters"][0].get(); + } + return effect; + } else if (name == "GiveOrTakeShield") { + auto effect = new GameInteractionEffect::GiveOrTakeShield(); + if (payload.contains("parameters")) { + effect->parameters[0] = payload["parameters"][0].get(); + } + return effect; + } else if (name == "TeleportPlayer") { + auto effect = new GameInteractionEffect::TeleportPlayer(); + if (payload.contains("parameters")) { + effect->parameters[0] = payload["parameters"][0].get(); + } + return effect; + } else if (name == "ClearAssignedButtons") { + auto effect = new GameInteractionEffect::ClearAssignedButtons(); + if (payload.contains("parameters")) { + effect->parameters[0] = payload["parameters"][0].get(); + } + return effect; + } else if (name == "SetTimeOfDay") { + auto effect = new GameInteractionEffect::SetTimeOfDay(); + if (payload.contains("parameters")) { + effect->parameters[0] = payload["parameters"][0].get(); + } + return effect; + } else if (name == "SetCollisionViewer") { + return new GameInteractionEffect::SetCollisionViewer(); + } else if (name == "SetCosmeticsColor") { + auto effect = new GameInteractionEffect::SetCosmeticsColor(); + if (payload.contains("parameters")) { + effect->parameters[0] = payload["parameters"][0].get(); + effect->parameters[1] = payload["parameters"][1].get(); + } + return effect; + } else if (name == "RandomizeCosmetics") { + return new GameInteractionEffect::RandomizeCosmetics(); + } else if (name == "PressButton") { + auto effect = new GameInteractionEffect::PressButton(); + if (payload.contains("parameters")) { + effect->parameters[0] = payload["parameters"][0].get(); + } + return effect; + } else if (name == "PressRandomButton") { + auto effect = new GameInteractionEffect::PressRandomButton(); + if (payload.contains("parameters")) { + effect->parameters[0] = payload["parameters"][0].get(); + } + return effect; + } else if (name == "AddOrTakeAmmo") { + auto effect = new GameInteractionEffect::AddOrTakeAmmo(); + if (payload.contains("parameters")) { + effect->parameters[0] = payload["parameters"][0].get(); + effect->parameters[1] = payload["parameters"][1].get(); + } + return effect; + } else if (name == "RandomBombFuseTimer") { + return new GameInteractionEffect::RandomBombFuseTimer(); + } else if (name == "DisableLedgeGrabs") { + return new GameInteractionEffect::DisableLedgeGrabs(); + } else if (name == "RandomWind") { + return new GameInteractionEffect::RandomWind(); + } else if (name == "RandomBonks") { + return new GameInteractionEffect::RandomBonks(); + } else if (name == "PlayerInvincibility") { + return new GameInteractionEffect::PlayerInvincibility(); + } else if (name == "SlipperyFloor") { + return new GameInteractionEffect::SlipperyFloor(); + } else { + SPDLOG_INFO("[GameInteractorSail] Unknown effect name: {}", name); + return nullptr; + } +} + +// Workaround until we have a way to unregister hooks +static bool hasRegisteredHooks = false; + +void GameInteractorSail::RegisterHooks() { + if (hasRegisteredHooks) { + return; + } + hasRegisteredHooks = true; + + GameInteractor::Instance->RegisterGameHook([](int32_t sceneNum) { + if (!GameInteractor::Instance->isRemoteInteractorConnected || !GameInteractor::IsSaveLoaded()) return; + + nlohmann::json payload; + payload["id"] = std::rand(); + payload["type"] = "hook"; + payload["hook"]["type"] = "OnTransitionEnd"; + payload["hook"]["sceneNum"] = sceneNum; + + GameInteractor::Instance->TransmitJsonToRemote(payload); + }); + GameInteractor::Instance->RegisterGameHook([](int32_t fileNum) { + if (!GameInteractor::Instance->isRemoteInteractorConnected || !GameInteractor::IsSaveLoaded()) return; + + nlohmann::json payload; + payload["id"] = std::rand(); + payload["type"] = "hook"; + payload["hook"]["type"] = "OnLoadGame"; + payload["hook"]["fileNum"] = fileNum; + + GameInteractor::Instance->TransmitJsonToRemote(payload); + }); + GameInteractor::Instance->RegisterGameHook([](int32_t fileNum) { + if (!GameInteractor::Instance->isRemoteInteractorConnected || !GameInteractor::IsSaveLoaded()) return; + + nlohmann::json payload; + payload["id"] = std::rand(); + payload["type"] = "hook"; + payload["hook"]["type"] = "OnExitGame"; + payload["hook"]["fileNum"] = fileNum; + + GameInteractor::Instance->TransmitJsonToRemote(payload); + }); + GameInteractor::Instance->RegisterGameHook([](GetItemEntry itemEntry) { + if (!GameInteractor::Instance->isRemoteInteractorConnected || !GameInteractor::IsSaveLoaded()) return; + + nlohmann::json payload; + payload["id"] = std::rand(); + payload["type"] = "hook"; + payload["hook"]["type"] = "OnItemReceive"; + payload["hook"]["tableId"] = itemEntry.tableId; + payload["hook"]["getItemId"] = itemEntry.getItemId; + + GameInteractor::Instance->TransmitJsonToRemote(payload); + }); + GameInteractor::Instance->RegisterGameHook([](void* refActor) { + if (!GameInteractor::Instance->isRemoteInteractorConnected || !GameInteractor::IsSaveLoaded()) return; + + Actor* actor = (Actor*)refActor; + nlohmann::json payload; + payload["id"] = std::rand(); + payload["type"] = "hook"; + payload["hook"]["type"] = "OnEnemyDefeat"; + payload["hook"]["actorId"] = actor->id; + payload["hook"]["params"] = actor->params; + + GameInteractor::Instance->TransmitJsonToRemote(payload); + }); + GameInteractor::Instance->RegisterGameHook([](void* refActor) { + if (!GameInteractor::Instance->isRemoteInteractorConnected || !GameInteractor::IsSaveLoaded()) return; + + Actor* actor = (Actor*)refActor; + nlohmann::json payload; + payload["id"] = std::rand(); + payload["type"] = "hook"; + payload["hook"]["type"] = "OnActorInit"; + payload["hook"]["actorId"] = actor->id; + payload["hook"]["params"] = actor->params; + + GameInteractor::Instance->TransmitJsonToRemote(payload); + }); + GameInteractor::Instance->RegisterGameHook([](int16_t flagType, int16_t flag) { + if (!GameInteractor::Instance->isRemoteInteractorConnected || !GameInteractor::IsSaveLoaded()) return; + + nlohmann::json payload; + payload["id"] = std::rand(); + payload["type"] = "hook"; + payload["hook"]["type"] = "OnFlagSet"; + payload["hook"]["flagType"] = flagType; + payload["hook"]["flag"] = flag; + + GameInteractor::Instance->TransmitJsonToRemote(payload); + }); + GameInteractor::Instance->RegisterGameHook([](int16_t flagType, int16_t flag) { + if (!GameInteractor::Instance->isRemoteInteractorConnected || !GameInteractor::IsSaveLoaded()) return; + + nlohmann::json payload; + payload["id"] = std::rand(); + payload["type"] = "hook"; + payload["hook"]["type"] = "OnFlagUnset"; + payload["hook"]["flagType"] = flagType; + payload["hook"]["flag"] = flag; + + GameInteractor::Instance->TransmitJsonToRemote(payload); + }); + GameInteractor::Instance->RegisterGameHook([](int16_t sceneNum, int16_t flagType, int16_t flag) { + if (!GameInteractor::Instance->isRemoteInteractorConnected || !GameInteractor::IsSaveLoaded()) return; + + nlohmann::json payload; + payload["id"] = std::rand(); + payload["type"] = "hook"; + payload["hook"]["type"] = "OnSceneFlagSet"; + payload["hook"]["flagType"] = flagType; + payload["hook"]["flag"] = flag; + payload["hook"]["sceneNum"] = sceneNum; + + GameInteractor::Instance->TransmitJsonToRemote(payload); + }); + GameInteractor::Instance->RegisterGameHook([](int16_t sceneNum, int16_t flagType, int16_t flag) { + if (!GameInteractor::Instance->isRemoteInteractorConnected || !GameInteractor::IsSaveLoaded()) return; + + nlohmann::json payload; + payload["id"] = std::rand(); + payload["type"] = "hook"; + payload["hook"]["type"] = "OnSceneFlagUnset"; + payload["hook"]["flagType"] = flagType; + payload["hook"]["flag"] = flag; + payload["hook"]["sceneNum"] = sceneNum; + + GameInteractor::Instance->TransmitJsonToRemote(payload); + }); +} + +#endif diff --git a/soh/soh/Enhancements/game-interactor/GameInteractor_Sail.h b/soh/soh/Enhancements/game-interactor/GameInteractor_Sail.h new file mode 100644 index 000000000..cb90c65c7 --- /dev/null +++ b/soh/soh/Enhancements/game-interactor/GameInteractor_Sail.h @@ -0,0 +1,29 @@ +#ifdef ENABLE_REMOTE_CONTROL + +#ifdef __cplusplus +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "./GameInteractor.h" + +class GameInteractorSail { + private: + bool isEnabled; + + void HandleRemoteJson(nlohmann::json payload); + GameInteractionEffectBase* EffectFromJson(nlohmann::json payload); + void RegisterHooks(); + public: + static GameInteractorSail* Instance; + void Enable(); + void Disable(); +}; +#endif +#endif diff --git a/soh/soh/Enhancements/gameplaystats.cpp b/soh/soh/Enhancements/gameplaystats.cpp index a6e5a47e8..efcf44efb 100644 --- a/soh/soh/Enhancements/gameplaystats.cpp +++ b/soh/soh/Enhancements/gameplaystats.cpp @@ -618,7 +618,7 @@ void DrawGameplayStatsOptionsTab() { } void GameplayStatsWindow::DrawElement() { - ImGui::SetNextWindowSize(ImVec2(480, 550), ImGuiCond_Appearing); + ImGui::SetNextWindowSize(ImVec2(480, 550), ImGuiCond_FirstUseEver); if (!ImGui::Begin("Gameplay Stats", &mIsVisible, ImGuiWindowFlags_NoFocusOnAppearing)) { ImGui::End(); return; 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/mods.cpp b/soh/soh/Enhancements/mods.cpp index 6d66ff055..329a8ee48 100644 --- a/soh/soh/Enhancements/mods.cpp +++ b/soh/soh/Enhancements/mods.cpp @@ -26,29 +26,42 @@ extern "C" { #include +#include "align_asset_macro.h" #include "macros.h" #include "functions.h" #include "variables.h" #include "functions.h" +void ResourceMgr_PatchGfxByName(const char* path, const char* patchName, int index, Gfx instruction); +void ResourceMgr_UnpatchGfxByName(const char* path, const char* patchName); + extern SaveContext gSaveContext; extern PlayState* gPlayState; extern void Overlay_DisplayText(float duration, const char* text); uint32_t ResourceMgr_IsSceneMasterQuest(s16 sceneNum); } -bool performDelayedSave = false; -bool performSave = false; + +// GreyScaleEndDlist +#define dgEndGrayscaleAndEndDlistDL "__OTR__helpers/cosmetics/gEndGrayscaleAndEndDlistDL" +static const ALIGN_ASSET(2) char gEndGrayscaleAndEndDlistDL[] = dgEndGrayscaleAndEndDlistDL; + +// This is used for the Temple of Time Medalions' color +#define dtokinoma_room_0DL_007A70 "__OTR__scenes/shared/tokinoma_scene/tokinoma_room_0DL_007A70" +static const ALIGN_ASSET(2) char tokinoma_room_0DL_007A70[] = dtokinoma_room_0DL_007A70; +#define dtokinoma_room_0DL_007FD0 "__OTR__scenes/shared/tokinoma_scene/tokinoma_room_0DL_007FD0" +static const ALIGN_ASSET(2) char tokinoma_room_0DL_007FD0[] = dtokinoma_room_0DL_007FD0; // 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 } void RegisterInfiniteMoney() { GameInteractor::Instance->RegisterGameHook([]() { + if (!GameInteractor::IsSaveLoaded()) return; if (CVarGetInteger("gInfiniteMoney", 0) != 0) { if (gSaveContext.rupees < CUR_CAPACITY(UPG_WALLET)) { gSaveContext.rupees = CUR_CAPACITY(UPG_WALLET); @@ -59,6 +72,7 @@ void RegisterInfiniteMoney() { void RegisterInfiniteHealth() { GameInteractor::Instance->RegisterGameHook([]() { + if (!GameInteractor::IsSaveLoaded()) return; if (CVarGetInteger("gInfiniteHealth", 0) != 0) { if (gSaveContext.health < gSaveContext.healthCapacity) { gSaveContext.health = gSaveContext.healthCapacity; @@ -69,6 +83,7 @@ void RegisterInfiniteHealth() { void RegisterInfiniteAmmo() { GameInteractor::Instance->RegisterGameHook([]() { + if (!GameInteractor::IsSaveLoaded()) return; if (CVarGetInteger("gInfiniteAmmo", 0) != 0) { // Deku Sticks if (AMMO(ITEM_STICK) < CUR_CAPACITY(UPG_STICKS)) { @@ -105,6 +120,7 @@ void RegisterInfiniteAmmo() { void RegisterInfiniteMagic() { GameInteractor::Instance->RegisterGameHook([]() { + if (!GameInteractor::IsSaveLoaded()) return; if (CVarGetInteger("gInfiniteMagic", 0) != 0) { if (gSaveContext.isMagicAcquired && gSaveContext.magic != (gSaveContext.isDoubleMagicAcquired + 1) * 0x30) { gSaveContext.magic = (gSaveContext.isDoubleMagicAcquired + 1) * 0x30; @@ -115,6 +131,7 @@ void RegisterInfiniteMagic() { void RegisterInfiniteNayrusLove() { GameInteractor::Instance->RegisterGameHook([]() { + if (!GameInteractor::IsSaveLoaded()) return; if (CVarGetInteger("gInfiniteNayru", 0) != 0) { gSaveContext.nayrusLoveTimer = 0x44B; } @@ -123,7 +140,7 @@ void RegisterInfiniteNayrusLove() { void RegisterMoonJumpOnL() { GameInteractor::Instance->RegisterGameHook([]() { - if (!gPlayState) return; + if (!GameInteractor::IsSaveLoaded()) return; if (CVarGetInteger("gMoonJumpOnL", 0) != 0) { Player* player = GET_PLAYER(gPlayState); @@ -138,7 +155,7 @@ void RegisterMoonJumpOnL() { void RegisterInfiniteISG() { GameInteractor::Instance->RegisterGameHook([]() { - if (!gPlayState) return; + if (!GameInteractor::IsSaveLoaded()) return; if (CVarGetInteger("gEzISG", 0) != 0) { Player* player = GET_PLAYER(gPlayState); @@ -150,7 +167,7 @@ void RegisterInfiniteISG() { //Permanent quick put away (QPA) glitched damage value void RegisterEzQPA() { GameInteractor::Instance->RegisterGameHook([]() { - if (!gPlayState) return; + if (!GameInteractor::IsSaveLoaded()) return; if (CVarGetInteger("gEzQPA", 0) != 0) { Player* player = GET_PLAYER(gPlayState); @@ -162,7 +179,7 @@ void RegisterEzQPA() { void RegisterUnrestrictedItems() { GameInteractor::Instance->RegisterGameHook([]() { - if (!gPlayState) return; + if (!GameInteractor::IsSaveLoaded()) return; if (CVarGetInteger("gNoRestrictItems", 0) != 0) { u8 sunsBackup = gPlayState->interfaceCtx.restrictions.sunsSong; @@ -190,14 +207,16 @@ void RegisterFreezeTime() { /// Switches Link's age and respawns him at the last entrance he entered. void RegisterSwitchAge() { GameInteractor::Instance->RegisterGameHook([]() { + if (!GameInteractor::IsSaveLoaded()) { + CVarClear("gSwitchAge"); + return; + } static bool warped = false; static Vec3f playerPos; static int16_t playerYaw; static RoomContext* roomCtx; static s32 roomNum; - if (!gPlayState) return; - if (CVarGetInteger("gSwitchAge", 0) && !warped) { playerPos = GET_PLAYER(gPlayState)->actor.world.pos; playerYaw = GET_PLAYER(gPlayState)->actor.shape.rot.y; @@ -207,8 +226,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) { @@ -217,7 +236,7 @@ void RegisterSwitchAge() { func_80097534(gPlayState, roomCtx); // load map for new room (unloading the previous room) } warped = false; - CVarSetInteger("gSwitchAge", 0); + CVarClear("gSwitchAge"); } }); } @@ -226,7 +245,8 @@ void RegisterSwitchAge() { void RegisterOcarinaTimeTravel() { GameInteractor::Instance->RegisterGameHook([]() { - if (!gPlayState) { + if (!GameInteractor::IsSaveLoaded()) { + CVarClear("gTimeTravel"); return; } @@ -258,14 +278,12 @@ void RegisterOcarinaTimeTravel() { void AutoSave(GetItemEntry itemEntry) { u8 item = itemEntry.itemId; + bool performSave = false; // Don't autosave immediately after buying items from shops to prevent getting them for free! // Don't autosave in the Chamber of Sages since resuming from that map breaks the game // Don't autosave during the Ganon fight when picking up the Master Sword - // Don't autosave in the fishing pond to prevent getting rod on B outside of the pond - // Don't autosave in the bombchu bowling alley to prevent having chus on B outside of the minigame - // Don't autosave in grottos since resuming from grottos breaks the game. if ((CVarGetInteger("gAutosave", AUTOSAVE_OFF) != AUTOSAVE_OFF) && (gPlayState != NULL) && (gSaveContext.pendingSale == ITEM_NONE) && - (gPlayState->gameplayFrames > 60 && gSaveContext.cutsceneIndex < 0xFFF0) && (gPlayState->sceneNum != SCENE_GANON_BOSS)) { + (gPlayState->gameplayFrames > 60 && gSaveContext.cutsceneIndex < 0xFFF0) && (gPlayState->sceneNum != SCENE_GANON_BOSS) && (gPlayState->sceneNum != SCENE_CHAMBER_OF_THE_SAGES)) { if (((CVarGetInteger("gAutosave", AUTOSAVE_OFF) == AUTOSAVE_LOCATION_AND_ALL_ITEMS) || (CVarGetInteger("gAutosave", AUTOSAVE_OFF) == AUTOSAVE_ALL_ITEMS)) && (item != ITEM_NONE)) { // Autosave for all items performSave = true; @@ -326,25 +344,9 @@ void AutoSave(GetItemEntry itemEntry) { CVarGetInteger("gAutosave", AUTOSAVE_OFF) == AUTOSAVE_LOCATION) { performSave = true; } - if (gPlayState->sceneNum == SCENE_FAIRYS_FOUNTAIN || gPlayState->sceneNum == SCENE_GROTTOS || - gPlayState->sceneNum == SCENE_CHAMBER_OF_THE_SAGES || gPlayState->sceneNum == SCENE_FISHING_POND || - gPlayState->sceneNum == SCENE_BOMBCHU_BOWLING_ALLEY) { - if (CVarGetInteger("gAutosave", AUTOSAVE_OFF) == AUTOSAVE_LOCATION_AND_MAJOR_ITEMS || - CVarGetInteger("gAutosave", AUTOSAVE_OFF) == AUTOSAVE_LOCATION_AND_ALL_ITEMS || - CVarGetInteger("gAutosave", AUTOSAVE_OFF) == AUTOSAVE_LOCATION) { - performSave = false; - return; - } - if (performSave) { - performSave = false; - performDelayedSave = true; - } - return; - } - if (performSave || performDelayedSave) { + if (performSave) { Play_PerformSave(gPlayState); performSave = false; - performDelayedSave = false; } } } @@ -412,6 +414,52 @@ void RegisterShadowTag() { }); } +static bool hasAffectedHealth = false; +void UpdatePermanentHeartLossState() { + if (!GameInteractor::IsSaveLoaded()) return; + + if (!CVarGetInteger("gPermanentHeartLoss", 0) && hasAffectedHealth) { + uint8_t heartContainers = gSaveContext.sohStats.heartContainers; // each worth 16 health + uint8_t heartPieces = gSaveContext.sohStats.heartPieces; // each worth 4 health, but only in groups of 4 + uint8_t startingHealth = 16 * 3; + + + uint8_t newCapacity = startingHealth + (heartContainers * 16) + ((heartPieces - (heartPieces % 4)) * 4); + gSaveContext.healthCapacity = MAX(newCapacity, gSaveContext.healthCapacity); + gSaveContext.health = MIN(gSaveContext.health, gSaveContext.healthCapacity); + hasAffectedHealth = false; + } +} + +void RegisterPermanentHeartLoss() { + GameInteractor::Instance->RegisterGameHook([](int16_t fileNum) { + hasAffectedHealth = false; + UpdatePermanentHeartLossState(); + }); + + GameInteractor::Instance->RegisterGameHook([]() { + if (!CVarGetInteger("gPermanentHeartLoss", 0) || !GameInteractor::IsSaveLoaded()) return; + + if (gSaveContext.healthCapacity > 16 && gSaveContext.healthCapacity - gSaveContext.health >= 16) { + gSaveContext.healthCapacity -= 16; + gSaveContext.health = MIN(gSaveContext.health, gSaveContext.healthCapacity); + hasAffectedHealth = true; + } + }); +}; + +void RegisterDeleteFileOnDeath() { + GameInteractor::Instance->RegisterGameHook([]() { + if (!CVarGetInteger("gDeleteFileOnDeath", 0) || !GameInteractor::IsSaveLoaded() || &gPlayState->gameOverCtx == NULL || &gPlayState->pauseCtx == NULL) return; + + if (gPlayState->gameOverCtx.state == GAMEOVER_DEATH_MENU && gPlayState->pauseCtx.state == 9) { + SaveManager::Instance->DeleteZeldaFile(gSaveContext.fileNum); + hasAffectedHealth = false; + std::reinterpret_pointer_cast(LUS::Context::GetInstance()->GetWindow()->GetGui()->GetGuiWindow("Console"))->Dispatch("reset"); + } + }); +} + struct DayTimeGoldSkulltulas { uint16_t scene; uint16_t room; @@ -648,10 +696,10 @@ void RegisterTriforceHunt() { // Warp to credits if (GameInteractor::State::TriforceHuntCreditsWarpActive) { - gPlayState->nextEntranceIndex = 0x6B; + gPlayState->nextEntranceIndex = ENTR_CHAMBER_OF_THE_SAGES_0; gSaveContext.nextCutsceneIndex = 0xFFF2; - gPlayState->sceneLoadFlag = 0x14; - gPlayState->fadeTransition = 3; + gPlayState->transitionTrigger = TRANS_TRIGGER_START; + gPlayState->transitionType = TRANS_TYPE_FADE_WHITE; GameInteractor::State::TriforceHuntCreditsWarpActive = 0; } @@ -664,16 +712,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->sceneLoadFlag != 0x14 && - (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() && 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 = + ItemTableManager::Instance->RetrieveItemEntry(MOD_RANDOMIZER, RG_GANONS_CASTLE_BOSS_KEY); GiveItemEntryWithoutActor(gPlayState, getItemEntry); - } } }); } @@ -1045,8 +1096,16 @@ void RegisterRandomizedEnemySizes() { Player* player = GET_PLAYER(gPlayState); Actor* actor = static_cast(refActor); - // Only apply to enemies and bosses. Exclude the wobbly platforms in Jabu because they need to act like platforms. - if (!CVarGetInteger("gRandomizedEnemySizes", 0) || (actor->category != ACTORCAT_ENEMY && actor->category != ACTORCAT_BOSS) || actor->id == ACTOR_EN_BROB) { + // Exclude wobbly platforms in Jabu because they need to act like platforms. + // Exclude Dead Hand hands and Bongo Bongo main body because they make the fights (near) impossible. + uint8_t excludedEnemy = actor->id == ACTOR_EN_BROB || actor->id == ACTOR_EN_DHA || (actor->id == ACTOR_BOSS_SST && actor->params == -1); + + // Dodongo, Volvagia and Dead Hand are always smaller because they're impossible when bigger. + uint8_t smallOnlyEnemy = actor->id == ACTOR_BOSS_DODONGO || actor->id == ACTOR_BOSS_FD || + actor->id == ACTOR_BOSS_FD2 || actor->id == ACTOR_EN_DH; + + // Only apply to enemies and bosses. + if (!CVarGetInteger("gRandomizedEnemySizes", 0) || (actor->category != ACTORCAT_ENEMY && actor->category != ACTORCAT_BOSS) || excludedEnemy) { return; } @@ -1055,9 +1114,8 @@ void RegisterRandomizedEnemySizes() { uint8_t bigActor = rand() % 2; - // Big actor. Dodongo and Volvagia are always smaller because they're impossible when bigger. - if (bigActor && actor->id != ACTOR_BOSS_DODONGO && actor->id != ACTOR_BOSS_FD && - actor->id != ACTOR_BOSS_FD2) { + // Big actor + if (bigActor && !smallOnlyEnemy) { randomNumber = rand() % 200; // Between 100% and 300% size. randomScale = 1.0f + (randomNumber / 100); @@ -1069,6 +1127,99 @@ void RegisterRandomizedEnemySizes() { } Actor_SetScale(actor, actor->scale.z * randomScale); + + if (CVarGetInteger("gEnemySizeScalesHealth", 0) && (actor->category == ACTORCAT_ENEMY)) { + // Scale the health based on a smaller factor than randomScale + float healthScalingFactor = 0.8f; // Adjust this factor as needed + float scaledHealth = actor->colChkInfo.health * (randomScale * healthScalingFactor); + + // Ensure the scaled health doesn't go below zero + actor->colChkInfo.health = fmax(scaledHealth, 1.0f); + } else { + return; + } + }); +} + +void PatchToTMedallions() { + // TODO: Refactor the DemoEffect_UpdateJewelAdult and DemoEffect_UpdateJewelChild from z_demo_effect + // effects to take effect in there + if (CVarGetInteger("gToTMedallionsColors", 0)) { + ResourceMgr_PatchGfxByName(tokinoma_room_0DL_007A70, "ToTMedallions_StartGrayscale", 7, gsSPGrayscale(true)); + ResourceMgr_PatchGfxByName(tokinoma_room_0DL_007FD0, "ToTMedallions_2_StartGrayscale", 7, gsSPGrayscale(true)); + + if (CHECK_QUEST_ITEM(QUEST_MEDALLION_WATER)) { + ResourceMgr_PatchGfxByName(tokinoma_room_0DL_007A70, "ToTMedallions_MakeBlue", 16, gsDPSetGrayscaleColor(0, 161, 255, 255)); + } else { + ResourceMgr_PatchGfxByName(tokinoma_room_0DL_007A70, "ToTMedallions_MakeBlue", 16, gsDPSetGrayscaleColor(255, 255, 255, 255)); + } + + if (CHECK_QUEST_ITEM(QUEST_MEDALLION_SPIRIT)) { + ResourceMgr_PatchGfxByName(tokinoma_room_0DL_007A70, "ToTMedallions_MakeOrange", 45, gsDPSetGrayscaleColor(255, 135, 0, 255)); + } else { + ResourceMgr_PatchGfxByName(tokinoma_room_0DL_007A70, "ToTMedallions_MakeOrange", 45, gsDPSetGrayscaleColor(255, 255, 255, 255)); + } + + if (CHECK_QUEST_ITEM(QUEST_MEDALLION_LIGHT)) { + ResourceMgr_PatchGfxByName(tokinoma_room_0DL_007A70, "ToTMedallions_MakeYellow", 69, gsDPSetGrayscaleColor(255, 255, 0, 255)); + ResourceMgr_PatchGfxByName(tokinoma_room_0DL_007FD0, "ToTMedallions_2_MakeYellow", 16, gsDPSetGrayscaleColor(255, 255, 0, 255)); + } else { + ResourceMgr_PatchGfxByName(tokinoma_room_0DL_007A70, "ToTMedallions_MakeYellow", 69, gsDPSetGrayscaleColor(255, 255, 255, 255)); + ResourceMgr_PatchGfxByName(tokinoma_room_0DL_007FD0, "ToTMedallions_2_MakeYellow", 16, gsDPSetGrayscaleColor(255, 255, 255, 255)); + } + + if (CHECK_QUEST_ITEM(QUEST_MEDALLION_FOREST)) { + ResourceMgr_PatchGfxByName(tokinoma_room_0DL_007A70, "ToTMedallions_MakeGreen", 94, gsDPSetGrayscaleColor(0, 255, 0, 255)); + } else { + ResourceMgr_PatchGfxByName(tokinoma_room_0DL_007A70, "ToTMedallions_MakeGreen", 94, gsDPSetGrayscaleColor(255, 255, 255, 255)); + } + + if (CHECK_QUEST_ITEM(QUEST_MEDALLION_FIRE)) { + ResourceMgr_PatchGfxByName(tokinoma_room_0DL_007A70, "ToTMedallions_MakeRed", 118, gsDPSetGrayscaleColor(255, 0, 0, 255)); + } else { + ResourceMgr_PatchGfxByName(tokinoma_room_0DL_007A70, "ToTMedallions_MakeRed", 118, gsDPSetGrayscaleColor(255, 255, 255, 255)); + } + + if (CHECK_QUEST_ITEM(QUEST_MEDALLION_SHADOW)) { + ResourceMgr_PatchGfxByName(tokinoma_room_0DL_007A70, "ToTMedallions_MakePurple", 142, gsDPSetGrayscaleColor(212, 0, 255, 255)); + ResourceMgr_PatchGfxByName(tokinoma_room_0DL_007FD0, "ToTMedallions_2_MakePurple", 27, gsDPSetGrayscaleColor(212, 0, 255, 255)); + } else { + ResourceMgr_PatchGfxByName(tokinoma_room_0DL_007A70, "ToTMedallions_MakePurple", 142, gsDPSetGrayscaleColor(255, 255, 255, 255)); + ResourceMgr_PatchGfxByName(tokinoma_room_0DL_007FD0, "ToTMedallions_2_MakePurple", 27, gsDPSetGrayscaleColor(255, 255, 255, 255)); + } + + ResourceMgr_PatchGfxByName(tokinoma_room_0DL_007A70, "ToTMedallions_EndGrayscaleAndEndDlist", 160, gsSPBranchListOTRFilePath(gEndGrayscaleAndEndDlistDL)); + ResourceMgr_PatchGfxByName(tokinoma_room_0DL_007FD0, "ToTMedallions_2_EndGrayscaleAndEndDlist", 51, gsSPBranchListOTRFilePath(gEndGrayscaleAndEndDlistDL)); + } else { + // Unpatch everything + ResourceMgr_UnpatchGfxByName(tokinoma_room_0DL_007A70, "ToTMedallions_StartGrayscale"); + ResourceMgr_UnpatchGfxByName(tokinoma_room_0DL_007FD0, "ToTMedallions_2_StartGrayscale"); + + ResourceMgr_UnpatchGfxByName(tokinoma_room_0DL_007A70, "ToTMedallions_MakeBlue"); + ResourceMgr_UnpatchGfxByName(tokinoma_room_0DL_007A70, "ToTMedallions_MakeOrange"); + ResourceMgr_UnpatchGfxByName(tokinoma_room_0DL_007A70, "ToTMedallions_MakeYellow"); + ResourceMgr_UnpatchGfxByName(tokinoma_room_0DL_007FD0, "ToTMedallions_2_MakeYellow"); + ResourceMgr_UnpatchGfxByName(tokinoma_room_0DL_007A70, "ToTMedallions_MakeRed"); + ResourceMgr_UnpatchGfxByName(tokinoma_room_0DL_007A70, "ToTMedallions_MakePurple"); + ResourceMgr_UnpatchGfxByName(tokinoma_room_0DL_007FD0, "ToTMedallions_2_MakePurple"); + + ResourceMgr_UnpatchGfxByName(tokinoma_room_0DL_007A70, "ToTMedallions_EndGrayscaleAndEndDlist"); + ResourceMgr_UnpatchGfxByName(tokinoma_room_0DL_007FD0, "ToTMedallions_2_EndGrayscaleAndEndDlist"); + } +} + +void RegisterToTMedallions() { + GameInteractor::Instance->RegisterGameHook([](GetItemEntry _unused) { + if (!CVarGetInteger("gToTMedallionsColors", 0) || !gPlayState || gPlayState->sceneNum != SCENE_TEMPLE_OF_TIME) { + return; + } + PatchToTMedallions(); + }); + GameInteractor::Instance->RegisterGameHook([](int16_t sceneNum) { + if (!CVarGetInteger("gToTMedallionsColors", 0) || sceneNum != SCENE_TEMPLE_OF_TIME) { + return; + } + PatchToTMedallions(); }); } @@ -1090,15 +1241,19 @@ void InitMods() { RegisterDaytimeGoldSkultullas(); RegisterRupeeDash(); RegisterShadowTag(); + RegisterPermanentHeartLoss(); + RegisterDeleteFileOnDeath(); RegisterHyperBosses(); RegisterHyperEnemies(); RegisterBonkDamage(); RegisterMenuPathFix(); RegisterMirrorModeHandler(); RegisterTriforceHunt(); + RegisterGrantGanonsBossKey(); RegisterEnemyDefeatCounts(); RegisterAltTrapTypes(); RegisterRandomizerSheikSpawn(); RegisterRandomizedEnemySizes(); + RegisterToTMedallions(); NameTag_RegisterHooks(); } diff --git a/soh/soh/Enhancements/mods.h b/soh/soh/Enhancements/mods.h index 2f0430475..46123f968 100644 --- a/soh/soh/Enhancements/mods.h +++ b/soh/soh/Enhancements/mods.h @@ -9,6 +9,8 @@ extern "C" { void UpdateDirtPathFixState(int32_t sceneNum); void UpdateMirrorModeState(int32_t sceneNum); +void PatchToTMedallions(); +void UpdatePermanentHeartLossState(); void InitMods(); #ifdef __cplusplus diff --git a/soh/soh/Enhancements/presets.h b/soh/soh/Enhancements/presets.h index f0f586e00..d7efeb4f3 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", @@ -217,6 +218,32 @@ const std::vector enhancementsCvars = { "gFixTexturesOOB", "gIvanCoopModeEnabled", "gEnemySpawnsOverWaterboxes", + "gTreeStickDrops", + "gShadowTag", + "gRandomizedEnemySizes", + "gRandomizedEnemies", + "gMirroredWorldMode", + "gMirroredWorld", + "gHyperEnemies", + "gHookshotableReticle", + "gHideBunnyHood", + "gFixVineFall", + "gFileSelectMoreInfo", + "gEnemyHealthBar", + "gBushDropFix", + "gAllDogsRichard", + "gAddTraps.enabled", + "gAddTraps.Ammo", + "gAddTraps.Bomb", + "gAddTraps.Burn", + "gAddTraps.Ice", + "gAddTraps.Kill", + "gAddTraps.Knock", + "gAddTraps.Shock", + "gAddTraps.Speed", + "gAddTraps.Tele", + "gAddTraps.Void", + "gToTMedallionsColors", }; const std::vector cheatCvars = { @@ -269,7 +296,23 @@ const std::vector cheatCvars = { "gNoRedeadFreeze", "gBombTimerMultiplier", "gNoFishDespawn", - "gNoBugsDespawn" + "gNoBugsDespawn", + "gWalkModifierDoesntChangeJump", + "gStatsEnabled", + "gSaveStatesEnabled", + "gSaveStatePromise", + "gRegEditEnabled", + "gPreset0", + "gPreset1", + "gDekuStickCheat", + "gDebugWarpScreenTranslation", + "gDebugSaveFileMode", + "gCosmetics.Link_BodyScale.Changed", + "gCosmetics.Link_BodyScale.Value", + "gCosmetics.Link_HeadScale.Changed", + "gCosmetics.Link_HeadScale.Value", + "gCosmetics.Link_SwordScale.Changed", + "gCosmetics.Link_SwordScale.Value", }; const std::vector randomizerCvars = { @@ -399,6 +442,15 @@ const std::vector randomizerCvars = { "gRandomizeGregHint", "gRandoManualSeedEntry", "gRandomizerSettingsEnabled", + "gRandomizeTriforceHuntTotalPieces", + "gRandomizeTriforceHuntRequiredPieces", + "gRandomizeTriforceHunt", + "gRandomizeShuffleMasterSword", + "gRandomizeSariaHint", + "gRandomizeRupeeNames", + "gRandomizeFrogsHint", + "gRandoRelevantNavi", + "gRandoQuestItemFanfares", }; const std::vector vanillaPlusPresetEntries = { @@ -740,6 +792,9 @@ const std::vector randomizerPresetEntries = { // Chest size & texture matches contents PRESET_ENTRY_S32("gChestSizeAndTextureMatchesContents", CSMC_BOTH), + // Color Temple of Time's Medallions + PRESET_ENTRY_S32("gToTMedallionsColors", 1), + // Pause link animation (0 to 16) PRESET_ENTRY_S32("gPauseLiveLink", 16), // Frames to wait 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 577de1c19..850157ad8 100644 --- a/soh/soh/Enhancements/randomizer/3drando/item_location.cpp +++ b/soh/soh/Enhancements/randomizer/3drando/item_location.cpp @@ -24,11 +24,11 @@ void LocationTable_Init() { //Lost Woods 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(30), 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(57), 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(31), 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(21), 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); locationTable[LW_DEKU_SCRUB_NEAR_DEKU_THEATER_LEFT] = ItemLocation::Base (RC_LW_DEKU_SCRUB_NEAR_DEKU_THEATER_LEFT, 0x5B, "LW Deku Scrub Near Deku Theater Left", LW_DEKU_SCRUB_NEAR_DEKU_THEATER_LEFT, BUY_DEKU_STICK_1, {Category::cDekuScrub}, SpoilerCollectionCheck::Scrub(), SpoilerCollectionCheckGroup::GROUP_LOST_WOODS); locationTable[LW_DEKU_SCRUB_NEAR_BRIDGE] = ItemLocation::Base (RC_LW_DEKU_SCRUB_NEAR_BRIDGE, 0x5B, "LW Deku Scrub Near Bridge", LW_DEKU_SCRUB_NEAR_BRIDGE, PROGRESSIVE_STICK_UPGRADE, {Category::cDekuScrub, Category::cDekuScrubUpgrades}, SpoilerCollectionCheck::Scrub(), SpoilerCollectionCheckGroup::GROUP_LOST_WOODS); @@ -53,7 +53,7 @@ void LocationTable_Init() { //Lake Hylia locationTable[LH_CHILD_FISHING] = ItemLocation::Base (RC_LH_CHILD_FISHING, 0x49, "LH Child Fishing", LH_CHILD_FISHING, PIECE_OF_HEART, {}, SpoilerCollectionCheck::RandomizerInf(), SpoilerCollectionCheckGroup::GROUP_LAKE_HYLIA); locationTable[LH_ADULT_FISHING] = ItemLocation::Base (RC_LH_ADULT_FISHING, 0x49, "LH Adult Fishing", LH_ADULT_FISHING, PROGRESSIVE_SCALE, {}, SpoilerCollectionCheck::RandomizerInf(), SpoilerCollectionCheckGroup::GROUP_LAKE_HYLIA); - locationTable[LH_LAB_DIVE] = ItemLocation::Base (RC_LH_LAB_DIVE, 0x38, "LH Lab Dive", LH_LAB_DIVE, PIECE_OF_HEART, {}, SpoilerCollectionCheck::ItemGetInf(24), SpoilerCollectionCheckGroup::GROUP_LAKE_HYLIA); + locationTable[LH_LAB_DIVE] = ItemLocation::Base (RC_LH_LAB_DIVE, 0x38, "LH Lab Dive", LH_LAB_DIVE, PIECE_OF_HEART, {}, SpoilerCollectionCheck::ItemGetInf(16), SpoilerCollectionCheckGroup::GROUP_LAKE_HYLIA); locationTable[LH_TRADE_FROG] = ItemLocation::Base (RC_LH_TRADE_FROG, 0x38, "LH Lab Trade Eyeball Frog", LH_TRADE_FROG, EYEDROPS, {Category::cAdultTrade}, SpoilerCollectionCheck::RandomizerInf(), SpoilerCollectionCheckGroup::GROUP_LAKE_HYLIA); locationTable[LH_UNDERWATER_ITEM] = ItemLocation::Base (RC_LH_UNDERWATER_ITEM, 0x57, "LH Underwater Item", LH_UNDERWATER_ITEM, RUTOS_LETTER, {}, SpoilerCollectionCheck::EventChkInf(0x31), SpoilerCollectionCheckGroup::GROUP_LAKE_HYLIA); locationTable[LH_SUN] = ItemLocation::Base (RC_LH_SUN, 0x57, "LH Sun", LH_SUN, FIRE_ARROWS, {}, SpoilerCollectionCheck::Chest(0x57, 0x1F), SpoilerCollectionCheckGroup::GROUP_LAKE_HYLIA); @@ -73,7 +73,7 @@ void LocationTable_Init() { //Gerudo Fortress locationTable[GF_CHEST] = ItemLocation::Chest (RC_GF_CHEST, 0x5D, 0x00, "GF Chest", GF_CHEST, PIECE_OF_HEART, {}, SpoilerCollectionCheckGroup::GROUP_GERUDO_VALLEY); locationTable[GF_HBA_1000_POINTS] = ItemLocation::Base (RC_GF_HBA_1000_POINTS, 0x5D, "GF HBA 1000 Points", GF_HBA_1000_POINTS, PIECE_OF_HEART, {}, SpoilerCollectionCheck::InfTable(0x19, 0x08), SpoilerCollectionCheckGroup::GROUP_GERUDO_VALLEY); - locationTable[GF_HBA_1500_POINTS] = ItemLocation::Base (RC_GF_HBA_1500_POINTS, 0x5D, "GF HBA 1500 Points", GF_HBA_1500_POINTS, PROGRESSIVE_BOW, {}, SpoilerCollectionCheck::ItemGetInf(7), SpoilerCollectionCheckGroup::GROUP_GERUDO_VALLEY); + locationTable[GF_HBA_1500_POINTS] = ItemLocation::Base (RC_GF_HBA_1500_POINTS, 0x5D, "GF HBA 1500 Points", GF_HBA_1500_POINTS, PROGRESSIVE_BOW, {}, SpoilerCollectionCheck::ItemGetInf(15), SpoilerCollectionCheckGroup::GROUP_GERUDO_VALLEY); locationTable[GF_GERUDO_MEMBERSHIP_CARD] = ItemLocation::Base (RC_GF_GERUDO_MEMBERSHIP_CARD, 0x0C, "GF Gerudo Membership Card", GF_GERUDO_MEMBERSHIP_CARD, GERUDO_MEMBERSHIP_CARD, {}, SpoilerCollectionCheck::GerudoToken(), SpoilerCollectionCheckGroup::GROUP_GERUDO_VALLEY); locationTable[GF_NORTH_F1_CARPENTER] = ItemLocation::Collectable(RC_GF_NORTH_F1_CARPENTER, 0x0C, 0x0C, "GF North F1 Carpenter", GF_NORTH_F1_CARPENTER, GERUDO_FORTRESS_SMALL_KEY, {Category::cVanillaGFSmallKey}, SpoilerCollectionCheckGroup::GROUP_GERUDO_VALLEY); locationTable[GF_NORTH_F2_CARPENTER] = ItemLocation::Collectable(RC_GF_NORTH_F2_CARPENTER, 0x0C, 0x0A, "GF North F2 Carpenter", GF_NORTH_F2_CARPENTER, GERUDO_FORTRESS_SMALL_KEY, {Category::cVanillaGFSmallKey}, SpoilerCollectionCheckGroup::GROUP_GERUDO_VALLEY); @@ -90,12 +90,12 @@ void LocationTable_Init() { locationTable[COLOSSUS_DEKU_SCRUB_GROTTO_FRONT] = ItemLocation::GrottoScrub(RC_COLOSSUS_DEKU_SCRUB_GROTTO_FRONT, 0xFD, "Colossus Deku Scrub Grotto Front", COLOSSUS_DEKU_SCRUB_GROTTO_FRONT, BUY_GREEN_POTION, {Category::cDekuScrub}, SpoilerCollectionCheck::Scrub(), SpoilerCollectionCheckGroup::GROUP_GERUDO_VALLEY); //Market - locationTable[MARKET_TREASURE_CHEST_GAME_REWARD] = ItemLocation::Chest (RC_MARKET_TREASURE_CHEST_GAME_REWARD, 0x10, "MK Treasure Chest Game Reward", MARKET_TREASURE_CHEST_GAME_REWARD, TREASURE_GAME_HEART, {}, SpoilerCollectionCheck::ItemGetInf(19), SpoilerCollectionCheckGroup::GROUP_HYRULE_CASTLE); - locationTable[MARKET_BOMBCHU_BOWLING_FIRST_PRIZE] = ItemLocation::Base (RC_MARKET_BOMBCHU_BOWLING_FIRST_PRIZE, 0x4B, "MK Bombchu Bowling First Prize", MARKET_BOMBCHU_BOWLING_FIRST_PRIZE, PROGRESSIVE_BOMB_BAG, {}, SpoilerCollectionCheck::ItemGetInf(25), SpoilerCollectionCheckGroup::GROUP_HYRULE_CASTLE); - locationTable[MARKET_BOMBCHU_BOWLING_SECOND_PRIZE] = ItemLocation::Base (RC_MARKET_BOMBCHU_BOWLING_SECOND_PRIZE, 0x4B, "MK Bombchu Bowling Second Prize", MARKET_BOMBCHU_BOWLING_SECOND_PRIZE, PIECE_OF_HEART, {}, SpoilerCollectionCheck::ItemGetInf(26), SpoilerCollectionCheckGroup::GROUP_HYRULE_CASTLE); + locationTable[MARKET_TREASURE_CHEST_GAME_REWARD] = ItemLocation::Chest (RC_MARKET_TREASURE_CHEST_GAME_REWARD, 0x10, "MK Treasure Chest Game Reward", MARKET_TREASURE_CHEST_GAME_REWARD, TREASURE_GAME_HEART, {}, SpoilerCollectionCheck::ItemGetInf(27), SpoilerCollectionCheckGroup::GROUP_HYRULE_CASTLE); + locationTable[MARKET_BOMBCHU_BOWLING_FIRST_PRIZE] = ItemLocation::Base (RC_MARKET_BOMBCHU_BOWLING_FIRST_PRIZE, 0x4B, "MK Bombchu Bowling First Prize", MARKET_BOMBCHU_BOWLING_FIRST_PRIZE, PROGRESSIVE_BOMB_BAG, {}, SpoilerCollectionCheck::ItemGetInf(17), SpoilerCollectionCheckGroup::GROUP_HYRULE_CASTLE); + locationTable[MARKET_BOMBCHU_BOWLING_SECOND_PRIZE] = ItemLocation::Base (RC_MARKET_BOMBCHU_BOWLING_SECOND_PRIZE, 0x4B, "MK Bombchu Bowling Second Prize", MARKET_BOMBCHU_BOWLING_SECOND_PRIZE, PIECE_OF_HEART, {}, SpoilerCollectionCheck::ItemGetInf(18), SpoilerCollectionCheckGroup::GROUP_HYRULE_CASTLE); locationTable[MARKET_BOMBCHU_BOWLING_BOMBCHUS] = ItemLocation::Base (RC_MARKET_BOMBCHU_BOWLING_BOMBCHUS, 0x4B, "MK Bombchu Bowling Bombchus", NONE, BOMBCHU_DROP, {}, SpoilerCollectionCheck::None(), SpoilerCollectionCheckGroup::GROUP_HYRULE_CASTLE); locationTable[MARKET_LOST_DOG] = ItemLocation::Base (RC_MARKET_LOST_DOG, 0x35, "MK Lost Dog", MARKET_LOST_DOG, PIECE_OF_HEART, {}, SpoilerCollectionCheck::InfTable(0x19, 0x09), SpoilerCollectionCheckGroup::GROUP_HYRULE_CASTLE); - locationTable[MARKET_SHOOTING_GALLERY_REWARD] = ItemLocation::Base (RC_MARKET_SHOOTING_GALLERY_REWARD, 0x42, "MK Shooting Gallery", MARKET_SHOOTING_GALLERY_REWARD, PROGRESSIVE_SLINGSHOT, {}, SpoilerCollectionCheck::ItemGetInf(5), SpoilerCollectionCheckGroup::GROUP_HYRULE_CASTLE); + locationTable[MARKET_SHOOTING_GALLERY_REWARD] = ItemLocation::Base (RC_MARKET_SHOOTING_GALLERY_REWARD, 0x42, "MK Shooting Gallery", MARKET_SHOOTING_GALLERY_REWARD, PROGRESSIVE_SLINGSHOT, {}, SpoilerCollectionCheck::ItemGetInf(13), SpoilerCollectionCheckGroup::GROUP_HYRULE_CASTLE); locationTable[MARKET_10_BIG_POES] = ItemLocation::Base (RC_MARKET_10_BIG_POES, 0x4D, "MK 10 Big Poes", MARKET_10_BIG_POES, EMPTY_BOTTLE, {}, SpoilerCollectionCheck::RandomizerInf(), SpoilerCollectionCheckGroup::GROUP_HYRULE_CASTLE); locationTable[MARKET_TREASURE_CHEST_GAME_ITEM_1] = ItemLocation::Chest (RC_MARKET_TREASURE_CHEST_GAME_ITEM_1, 0x10, 0x01, "MK Chest Game First Room Chest", MARKET_TREASURE_CHEST_GAME_ITEM_1, TREASURE_GAME_SMALL_KEY, {Category::cChestMinigame}, SpoilerCollectionCheckGroup::GROUP_HYRULE_CASTLE); locationTable[MARKET_TREASURE_CHEST_GAME_ITEM_2] = ItemLocation::Chest (RC_MARKET_TREASURE_CHEST_GAME_ITEM_2, 0x10, 0x03, "MK Chest Game Second Room Chest", MARKET_TREASURE_CHEST_GAME_ITEM_2, TREASURE_GAME_SMALL_KEY, {Category::cChestMinigame}, SpoilerCollectionCheckGroup::GROUP_HYRULE_CASTLE); @@ -115,14 +115,14 @@ void LocationTable_Init() { locationTable[KAK_30_GOLD_SKULLTULA_REWARD] = ItemLocation::Base (RC_KAK_30_GOLD_SKULLTULA_REWARD, 0x50, "Kak 30 Gold Skulltula Reward", KAK_30_GOLD_SKULLTULA_REWARD, PROGRESSIVE_WALLET, {}, SpoilerCollectionCheck::EventChkInf(0xDC), SpoilerCollectionCheckGroup::GROUP_KAKARIKO); locationTable[KAK_40_GOLD_SKULLTULA_REWARD] = ItemLocation::Base (RC_KAK_40_GOLD_SKULLTULA_REWARD, 0x50, "Kak 40 Gold Skulltula Reward", KAK_40_GOLD_SKULLTULA_REWARD, BOMBCHU_10, {}, SpoilerCollectionCheck::EventChkInf(0xDD), SpoilerCollectionCheckGroup::GROUP_KAKARIKO); locationTable[KAK_50_GOLD_SKULLTULA_REWARD] = ItemLocation::Base (RC_KAK_50_GOLD_SKULLTULA_REWARD, 0x50, "Kak 50 Gold Skulltula Reward", KAK_50_GOLD_SKULLTULA_REWARD, PIECE_OF_HEART, {}, SpoilerCollectionCheck::EventChkInf(0xDE), SpoilerCollectionCheckGroup::GROUP_KAKARIKO); - locationTable[KAK_100_GOLD_SKULLTULA_REWARD] = ItemLocation::Base (RC_KAK_100_GOLD_SKULLTULA_REWARD, 0x50, "Kak 100 Gold Skulltula Reward", KAK_100_GOLD_SKULLTULA_REWARD, HUGE_RUPEE, {}, SpoilerCollectionCheck::EventChkInf(0xDF), SpoilerCollectionCheckGroup::GROUP_KAKARIKO); - locationTable[KAK_MAN_ON_ROOF] = ItemLocation::Base (RC_KAK_MAN_ON_ROOF, 0x52, "Kak Man on Roof", KAK_MAN_ON_ROOF, PIECE_OF_HEART, {}, SpoilerCollectionCheck::ItemGetInf(29), SpoilerCollectionCheckGroup::GROUP_KAKARIKO); + locationTable[KAK_100_GOLD_SKULLTULA_REWARD] = ItemLocation::Base (RC_KAK_100_GOLD_SKULLTULA_REWARD, 0x50, "Kak 100 Gold Skulltula Reward", KAK_100_GOLD_SKULLTULA_REWARD, HUGE_RUPEE, {}, SpoilerCollectionCheck::RandomizerInf(), SpoilerCollectionCheckGroup::GROUP_KAKARIKO); + locationTable[KAK_MAN_ON_ROOF] = ItemLocation::Base (RC_KAK_MAN_ON_ROOF, 0x52, "Kak Man on Roof", KAK_MAN_ON_ROOF, PIECE_OF_HEART, {}, SpoilerCollectionCheck::ItemGetInf(21), SpoilerCollectionCheckGroup::GROUP_KAKARIKO); 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(56), 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(36), 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(4), 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(38), 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); locationTable[KAK_WINDMILL_FREESTANDING_POH] = ItemLocation::Collectable(RC_KAK_WINDMILL_FREESTANDING_POH, 0x48, 0x01, "Kak Windmill Freestanding PoH", KAK_WINDMILL_FREESTANDING_POH, PIECE_OF_HEART, {}, SpoilerCollectionCheckGroup::GROUP_KAKARIKO); @@ -133,7 +133,7 @@ void LocationTable_Init() { locationTable[GRAVEYARD_HOOKSHOT_CHEST] = ItemLocation::Chest (RC_GRAVEYARD_HOOKSHOT_CHEST, 0x48, 0x00, "GY Hookshot Chest", GRAVEYARD_HOOKSHOT_CHEST, PROGRESSIVE_HOOKSHOT, {}, SpoilerCollectionCheckGroup::GROUP_KAKARIKO); locationTable[GRAVEYARD_DAMPE_RACE_FREESTANDING_POH] = ItemLocation::Collectable(RC_GRAVEYARD_DAMPE_RACE_FREESTANDING_POH, 0x48, 0x07, "GY Dampe Race Freestanding PoH", GRAVEYARD_DAMPE_RACE_FREESTANDING_POH, PIECE_OF_HEART, {}, SpoilerCollectionCheckGroup::GROUP_KAKARIKO); locationTable[GRAVEYARD_FREESTANDING_POH] = ItemLocation::Collectable(RC_GRAVEYARD_FREESTANDING_POH, 0x53, 0x04, "GY Freestanding PoH", GRAVEYARD_FREESTANDING_POH, PIECE_OF_HEART, {}, SpoilerCollectionCheckGroup::GROUP_KAKARIKO); - locationTable[GRAVEYARD_DAMPE_GRAVEDIGGING_TOUR] = ItemLocation::Collectable(RC_GRAVEYARD_DAMPE_GRAVEDIGGING_TOUR, 0x53, "GY Dampe Gravedigging Tour", GRAVEYARD_DAMPE_GRAVEDIGGING_TOUR, PIECE_OF_HEART, {}, SpoilerCollectionCheck::Gravedigger(0x53, 0x1F), SpoilerCollectionCheckGroup::GROUP_KAKARIKO); + locationTable[GRAVEYARD_DAMPE_GRAVEDIGGING_TOUR] = ItemLocation::Collectable(RC_GRAVEYARD_DAMPE_GRAVEDIGGING_TOUR, 0x53, "GY Dampe Gravedigging Tour", GRAVEYARD_DAMPE_GRAVEDIGGING_TOUR, PIECE_OF_HEART, {}, SpoilerCollectionCheck::Gravedigger(0x53, 0x19), SpoilerCollectionCheckGroup::GROUP_KAKARIKO); //Death Mountain locationTable[DMT_CHEST] = ItemLocation::Chest (RC_DMT_CHEST, 0x60, 0x01, "DMT Chest", DMT_CHEST, PURPLE_RUPEE, {}, SpoilerCollectionCheckGroup::GROUP_DEATH_MOUNTAIN); @@ -191,7 +191,7 @@ void LocationTable_Init() { locationTable[ZF_BOTTOM_FREESTANDING_POH] = ItemLocation::Collectable(RC_ZF_BOTTOM_FREESTANDING_POH, 0x59, 0x14, "ZF Bottom Freestanding PoH", ZF_BOTTOM_FREESTANDING_POH, PIECE_OF_HEART, {}, SpoilerCollectionCheckGroup::GROUP_ZORAS_DOMAIN); //Lon Lon Ranch - locationTable[LLR_TALONS_CHICKENS] = ItemLocation::Base (RC_LLR_TALONS_CHICKENS, 0x4C, "LLR Talons Chickens", LLR_TALONS_CHICKENS, BOTTLE_WITH_MILK, {}, SpoilerCollectionCheck::ItemGetInf(10), SpoilerCollectionCheckGroup::GROUP_LON_LON_RANCH); + locationTable[LLR_TALONS_CHICKENS] = ItemLocation::Base (RC_LLR_TALONS_CHICKENS, 0x4C, "LLR Talons Chickens", LLR_TALONS_CHICKENS, BOTTLE_WITH_MILK, {}, SpoilerCollectionCheck::ItemGetInf(2), SpoilerCollectionCheckGroup::GROUP_LON_LON_RANCH); locationTable[LLR_FREESTANDING_POH] = ItemLocation::Collectable(RC_LLR_FREESTANDING_POH, 0x4C, 0x01, "LLR Freestanding PoH", LLR_FREESTANDING_POH, PIECE_OF_HEART, {}, SpoilerCollectionCheckGroup::GROUP_LON_LON_RANCH); locationTable[LLR_DEKU_SCRUB_GROTTO_LEFT] = ItemLocation::GrottoScrub(RC_LLR_DEKU_SCRUB_GROTTO_LEFT, 0xFC, "LLR Deku Scrub Grotto Left", LLR_DEKU_SCRUB_GROTTO_LEFT, BUY_DEKU_NUT_5, {Category::cDekuScrub}, SpoilerCollectionCheck::Scrub(), SpoilerCollectionCheckGroup::GROUP_LON_LON_RANCH); locationTable[LLR_DEKU_SCRUB_GROTTO_RIGHT] = ItemLocation::GrottoScrub(RC_LLR_DEKU_SCRUB_GROTTO_RIGHT, 0xFC, "LLR Deku Scrub Grotto Right", LLR_DEKU_SCRUB_GROTTO_RIGHT, BUY_BOMBS_535, {Category::cDekuScrub}, SpoilerCollectionCheck::Scrub(), SpoilerCollectionCheckGroup::GROUP_LON_LON_RANCH); @@ -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/location_access/locacc_death_mountain.cpp b/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_death_mountain.cpp index 8988b045b..19960f1be 100644 --- a/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_death_mountain.cpp +++ b/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_death_mountain.cpp @@ -104,7 +104,7 @@ void AreaTable_Init_DeathMountain() { Entrance(DEATH_MOUNTAIN_TRAIL, {[]{return true;}}), Entrance(GC_WOODS_WARP, {[]{return GCWoodsWarpOpen;}}), Entrance(GC_SHOP, {[]{return (IsAdult && StopGCRollingGoronAsAdult) || (IsChild && (CanBlastOrSmash || GoronBracelet || GoronCityChildFire || CanUse(BOW)));}}), - Entrance(GC_DARUNIAS_CHAMBER, {[]{return (IsAdult && StopGCRollingGoronAsAdult) || GCDaruniasDoorOpenChild;}}), + Entrance(GC_DARUNIAS_CHAMBER, {[]{return (IsAdult && StopGCRollingGoronAsAdult) || (IsChild && GCDaruniasDoorOpenChild);}}), Entrance(GC_GROTTO_PLATFORM, {[]{return IsAdult && ((CanPlay(SongOfTime) && ((EffectiveHealth > 2) || CanUse(GORON_TUNIC) || CanUse(LONGSHOT) || CanUse(NAYRUS_LOVE))) || (EffectiveHealth > 1 && CanUse(GORON_TUNIC) && CanUse(HOOKSHOT)) || (CanUse(NAYRUS_LOVE) && CanUse(HOOKSHOT)) || (EffectiveHealth > 2 && CanUse(HOOKSHOT) && LogicGoronCityGrotto));}}), }); 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/playthrough.cpp b/soh/soh/Enhancements/randomizer/3drando/playthrough.cpp index 088ba5067..62042246c 100644 --- a/soh/soh/Enhancements/randomizer/3drando/playthrough.cpp +++ b/soh/soh/Enhancements/randomizer/3drando/playthrough.cpp @@ -1,5 +1,6 @@ #include "playthrough.hpp" +#include #include #include "custom_messages.hpp" #include "fill.hpp" @@ -8,6 +9,7 @@ #include "random.hpp" #include "spoiler_log.hpp" #include "soh/Enhancements/randomizer/randomizerTypes.h" +#include "variables.h" namespace Playthrough { @@ -39,6 +41,10 @@ int Playthrough_Init(uint32_t seed, std::unordered_map{}(std::to_string(Settings::seed) + settingsStr); Random_Init(finalHash); Settings::hash = std::to_string(finalHash); 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