diff --git a/.gitignore b/.gitignore index 9c499abb0..ec5401c38 100644 --- a/.gitignore +++ b/.gitignore @@ -4,7 +4,9 @@ __pycache__/ .DS_Store # Text editor remnants -.vscode/ +.vscode/* +!.vscode/tasks.json + .vs/ .idea/ cmake-build-** @@ -400,7 +402,6 @@ ASALocalRun/ lib/libgfxd/libgfxd.a ExporterTest/ExporterTest.a ZAPDUtils/ZAPDUtils.a -.vscode/ build/ external/ ZAPDUtils/build/ diff --git a/.vscode/tasks.json b/.vscode/tasks.json new file mode 100644 index 000000000..be763065e --- /dev/null +++ b/.vscode/tasks.json @@ -0,0 +1,61 @@ +{ + "version": "2.0.0", + "tasks": [ + { + "label": "Setup CMake Project", + "type": "shell", + "command": "cmake", + "args": [ + "-S", + ".", + "-B", + "build/x64", + "-G", + "Visual Studio 17 2022", + "-T", + "v143", + "-A", + "x64" + ], + "group": "build", + "problemMatcher": [] + }, + { + "label": "Generate SOH OTR", + "type": "shell", + "command": "cmake", + "args": [ + "--build", + "./build/x64", + "--target", + "GenerateSohOtr" + ], + "group": "build", + "problemMatcher": [] + }, + { + "label": "Build Project", + "type": "shell", + "command": "cmake", + "args": [ + "--build", + "./build/x64" + ], + "group": { + "kind": "build", + "isDefault": true + }, + "dependsOn": ["Generate SOH OTR"], + "problemMatcher": [] + }, + { + "label": "Build All", + "dependsOrder": "sequence", + "dependsOn": [ + "Setup CMake Project", + "Generate SOH OTR", + "Build Project" + ] + } + ] +} \ No newline at end of file diff --git a/docs/BUILDING.md b/docs/BUILDING.md index 963037465..4e37a27e9 100644 --- a/docs/BUILDING.md +++ b/docs/BUILDING.md @@ -58,7 +58,7 @@ To develop using Visual Studio you only need to use cmake to generate the soluti To develop using Visual Studio Code or another editor you only need to open the repository in it. To build you'll need to follow the instructions from the building section. -_Note: If you're using Visual Studio Code, the [cpack plugin](https://marketplace.visualstudio.com/items?itemName=ms-vscode.cmake-tools) makes it very easy to just press run and debug._ +_Note: If you're using Visual Studio Code, the [CMake Tools plugin](https://marketplace.visualstudio.com/items?itemName=ms-vscode.cmake-tools) makes it very easy to just press run and debug._ _Experimental: You can also use another build system entirely rather than MSVC like [Ninja](https://ninja-build.org/) for possibly better performance._ @@ -177,7 +177,7 @@ Requires Xcode (or xcode-tools) && `sdl2, libpng, glew, ninja, cmake, tinyxml2, **Important: For maximum performance make sure you have ninja build tools installed!** -_Note: If you're using Visual Studio Code, the [cpack plugin](https://marketplace.visualstudio.com/items?itemName=ms-vscode.cmake-tools) makes it very easy to just press run and debug._ +_Note: If you're using Visual Studio Code, the [CMake Tools plugin](https://marketplace.visualstudio.com/items?itemName=ms-vscode.cmake-tools) makes it very easy to just press run and debug._ ```bash # Clone the repo diff --git a/libultraship b/libultraship index 9a974e002..5341b0172 160000 --- a/libultraship +++ b/libultraship @@ -1 +1 @@ -Subproject commit 9a974e002f84cd1fe834ee9d2fa4ccf16d899e0f +Subproject commit 5341b017254a186da3ffe6d681d4e293769f23f4 diff --git a/soh/assets/custom/objects/object_bombchubag/Hilite_new b/soh/assets/custom/objects/object_bombchubag/Hilite_new new file mode 100644 index 000000000..5438695fa Binary files /dev/null and b/soh/assets/custom/objects/object_bombchubag/Hilite_new differ diff --git a/soh/assets/custom/objects/object_bombchubag/gBombchuBagBodyDL b/soh/assets/custom/objects/object_bombchubag/gBombchuBagBodyDL new file mode 100644 index 000000000..86da33492 --- /dev/null +++ b/soh/assets/custom/objects/object_bombchubag/gBombchuBagBodyDL @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_bombchubag/gBombchuBagBodyDL_tri_0 b/soh/assets/custom/objects/object_bombchubag/gBombchuBagBodyDL_tri_0 new file mode 100644 index 000000000..add13c49f --- /dev/null +++ b/soh/assets/custom/objects/object_bombchubag/gBombchuBagBodyDL_tri_0 @@ -0,0 +1,31 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_bombchubag/gBombchuBagBodyDL_tri_1 b/soh/assets/custom/objects/object_bombchubag/gBombchuBagBodyDL_tri_1 new file mode 100644 index 000000000..7430c2a29 --- /dev/null +++ b/soh/assets/custom/objects/object_bombchubag/gBombchuBagBodyDL_tri_1 @@ -0,0 +1,99 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_bombchubag/gBombchuBagBodyDL_vtx_0 b/soh/assets/custom/objects/object_bombchubag/gBombchuBagBodyDL_vtx_0 new file mode 100644 index 000000000..cddcb70e4 --- /dev/null +++ b/soh/assets/custom/objects/object_bombchubag/gBombchuBagBodyDL_vtx_0 @@ -0,0 +1,45 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_bombchubag/gBombchuBagBodyDL_vtx_1 b/soh/assets/custom/objects/object_bombchubag/gBombchuBagBodyDL_vtx_1 new file mode 100644 index 000000000..6f8e0802d --- /dev/null +++ b/soh/assets/custom/objects/object_bombchubag/gBombchuBagBodyDL_vtx_1 @@ -0,0 +1,112 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_bombchubag/gBombchuBagMaskDL b/soh/assets/custom/objects/object_bombchubag/gBombchuBagMaskDL new file mode 100644 index 000000000..b68fbafff --- /dev/null +++ b/soh/assets/custom/objects/object_bombchubag/gBombchuBagMaskDL @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_bombchubag/gBombchuBagMaskDL_tri_0 b/soh/assets/custom/objects/object_bombchubag/gBombchuBagMaskDL_tri_0 new file mode 100644 index 000000000..c5ccc230f --- /dev/null +++ b/soh/assets/custom/objects/object_bombchubag/gBombchuBagMaskDL_tri_0 @@ -0,0 +1,54 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_bombchubag/gBombchuBagMaskDL_vtx_0 b/soh/assets/custom/objects/object_bombchubag/gBombchuBagMaskDL_vtx_0 new file mode 100644 index 000000000..cdc8798bc --- /dev/null +++ b/soh/assets/custom/objects/object_bombchubag/gBombchuBagMaskDL_vtx_0 @@ -0,0 +1,56 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_bombchubag/mat_gBombchuBagBodyDL_f3dlite_bag_body_matte b/soh/assets/custom/objects/object_bombchubag/mat_gBombchuBagBodyDL_f3dlite_bag_body_matte new file mode 100644 index 000000000..4fb4e2029 --- /dev/null +++ b/soh/assets/custom/objects/object_bombchubag/mat_gBombchuBagBodyDL_f3dlite_bag_body_matte @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_bombchubag/mat_gBombchuBagBodyDL_f3dlite_bag_body_shine b/soh/assets/custom/objects/object_bombchubag/mat_gBombchuBagBodyDL_f3dlite_bag_body_shine new file mode 100644 index 000000000..985d1ad9d --- /dev/null +++ b/soh/assets/custom/objects/object_bombchubag/mat_gBombchuBagBodyDL_f3dlite_bag_body_shine @@ -0,0 +1,20 @@ + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_bombchubag/mat_gBombchuBagMaskDL_f3dlite_bag_mask b/soh/assets/custom/objects/object_bombchubag/mat_gBombchuBagMaskDL_f3dlite_bag_mask new file mode 100644 index 000000000..4fb4e2029 --- /dev/null +++ b/soh/assets/custom/objects/object_bombchubag/mat_gBombchuBagMaskDL_f3dlite_bag_mask @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_boss_soul/BarkOrHorns b/soh/assets/custom/objects/object_boss_soul/BarkOrHorns new file mode 100644 index 000000000..d546ce9bd Binary files /dev/null and b/soh/assets/custom/objects/object_boss_soul/BarkOrHorns differ diff --git a/soh/assets/custom/objects/object_boss_soul/LightNoise b/soh/assets/custom/objects/object_boss_soul/LightNoise new file mode 100644 index 000000000..73bcf2a59 Binary files /dev/null and b/soh/assets/custom/objects/object_boss_soul/LightNoise differ diff --git a/soh/assets/custom/objects/object_boss_soul/gGIBossSoulSkullDL b/soh/assets/custom/objects/object_boss_soul/gGIBossSoulSkullDL index 6e3cbc204..191d058ec 100644 --- a/soh/assets/custom/objects/object_boss_soul/gGIBossSoulSkullDL +++ b/soh/assets/custom/objects/object_boss_soul/gGIBossSoulSkullDL @@ -1,19 +1,16 @@ - - - - - - - - - - - + + - - - + + + + + + + + + diff --git a/soh/assets/custom/objects/object_boss_soul/gGIBossSoulSkullDL_tri_0 b/soh/assets/custom/objects/object_boss_soul/gGIBossSoulSkullDL_tri_0 index 34ff33a71..643249842 100644 --- a/soh/assets/custom/objects/object_boss_soul/gGIBossSoulSkullDL_tri_0 +++ b/soh/assets/custom/objects/object_boss_soul/gGIBossSoulSkullDL_tri_0 @@ -1,163 +1,59 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_boss_soul/gGIBossSoulSkullDL_tri_1 b/soh/assets/custom/objects/object_boss_soul/gGIBossSoulSkullDL_tri_1 index e406505e8..2dd15cd06 100644 --- a/soh/assets/custom/objects/object_boss_soul/gGIBossSoulSkullDL_tri_1 +++ b/soh/assets/custom/objects/object_boss_soul/gGIBossSoulSkullDL_tri_1 @@ -1,26 +1,14 @@ - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_boss_soul/gGIBossSoulSkullDL_tri_2 b/soh/assets/custom/objects/object_boss_soul/gGIBossSoulSkullDL_tri_2 index d93755356..1ae88a89b 100644 --- a/soh/assets/custom/objects/object_boss_soul/gGIBossSoulSkullDL_tri_2 +++ b/soh/assets/custom/objects/object_boss_soul/gGIBossSoulSkullDL_tri_2 @@ -1,7 +1,38 @@ - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_boss_soul/gGIBossSoulSkullDL_tri_3 b/soh/assets/custom/objects/object_boss_soul/gGIBossSoulSkullDL_tri_3 index 87fb8da01..38c434f31 100644 --- a/soh/assets/custom/objects/object_boss_soul/gGIBossSoulSkullDL_tri_3 +++ b/soh/assets/custom/objects/object_boss_soul/gGIBossSoulSkullDL_tri_3 @@ -1,48 +1,42 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_boss_soul/gGIBossSoulSkullDL_tri_4 b/soh/assets/custom/objects/object_boss_soul/gGIBossSoulSkullDL_tri_4 index 6e436b142..bf4f6d363 100644 --- a/soh/assets/custom/objects/object_boss_soul/gGIBossSoulSkullDL_tri_4 +++ b/soh/assets/custom/objects/object_boss_soul/gGIBossSoulSkullDL_tri_4 @@ -1,245 +1,38 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_boss_soul/gGIBossSoulSkullDL_vtx_0 b/soh/assets/custom/objects/object_boss_soul/gGIBossSoulSkullDL_vtx_0 index ed4b6e1c0..c42b63538 100644 --- a/soh/assets/custom/objects/object_boss_soul/gGIBossSoulSkullDL_vtx_0 +++ b/soh/assets/custom/objects/object_boss_soul/gGIBossSoulSkullDL_vtx_0 @@ -1,173 +1,118 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_boss_soul/gGIBossSoulSkullDL_vtx_1 b/soh/assets/custom/objects/object_boss_soul/gGIBossSoulSkullDL_vtx_1 index d2728aae4..c6d656107 100644 --- a/soh/assets/custom/objects/object_boss_soul/gGIBossSoulSkullDL_vtx_1 +++ b/soh/assets/custom/objects/object_boss_soul/gGIBossSoulSkullDL_vtx_1 @@ -1,26 +1,38 @@ - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_boss_soul/gGIBossSoulSkullDL_vtx_2 b/soh/assets/custom/objects/object_boss_soul/gGIBossSoulSkullDL_vtx_2 index eb0050c03..83377b227 100644 --- a/soh/assets/custom/objects/object_boss_soul/gGIBossSoulSkullDL_vtx_2 +++ b/soh/assets/custom/objects/object_boss_soul/gGIBossSoulSkullDL_vtx_2 @@ -1,6 +1,46 @@ - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_boss_soul/gGIBossSoulSkullDL_vtx_3 b/soh/assets/custom/objects/object_boss_soul/gGIBossSoulSkullDL_vtx_3 index f124650c8..13644a811 100644 --- a/soh/assets/custom/objects/object_boss_soul/gGIBossSoulSkullDL_vtx_3 +++ b/soh/assets/custom/objects/object_boss_soul/gGIBossSoulSkullDL_vtx_3 @@ -1,58 +1,62 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_boss_soul/gGIBossSoulSkullDL_vtx_4 b/soh/assets/custom/objects/object_boss_soul/gGIBossSoulSkullDL_vtx_4 index 2bbe7895e..777a37058 100644 --- a/soh/assets/custom/objects/object_boss_soul/gGIBossSoulSkullDL_vtx_4 +++ b/soh/assets/custom/objects/object_boss_soul/gGIBossSoulSkullDL_vtx_4 @@ -1,267 +1,46 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_boss_soul/gGIBossSoulSkullDL_vtx_cull b/soh/assets/custom/objects/object_boss_soul/gGIBossSoulSkullDL_vtx_cull new file mode 100644 index 000000000..0e8c716c3 --- /dev/null +++ b/soh/assets/custom/objects/object_boss_soul/gGIBossSoulSkullDL_vtx_cull @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_boss_soul/heart1 b/soh/assets/custom/objects/object_boss_soul/heart1 new file mode 100644 index 000000000..1fdc62cbd Binary files /dev/null and b/soh/assets/custom/objects/object_boss_soul/heart1 differ diff --git a/soh/assets/custom/objects/object_boss_soul/mat_gGIBossSoulSkullDL_Black b/soh/assets/custom/objects/object_boss_soul/mat_gGIBossSoulSkullDL_Black new file mode 100644 index 000000000..03ecd61f5 --- /dev/null +++ b/soh/assets/custom/objects/object_boss_soul/mat_gGIBossSoulSkullDL_Black @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_boss_soul/mat_gGIBossSoulSkullDL_Gem_eyes b/soh/assets/custom/objects/object_boss_soul/mat_gGIBossSoulSkullDL_Gem_eyes deleted file mode 100644 index 07364ba3a..000000000 --- a/soh/assets/custom/objects/object_boss_soul/mat_gGIBossSoulSkullDL_Gem_eyes +++ /dev/null @@ -1,21 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - diff --git a/soh/assets/custom/objects/object_boss_soul/mat_gGIBossSoulSkullDL_Horns b/soh/assets/custom/objects/object_boss_soul/mat_gGIBossSoulSkullDL_Horns new file mode 100644 index 000000000..28fdc0d1b --- /dev/null +++ b/soh/assets/custom/objects/object_boss_soul/mat_gGIBossSoulSkullDL_Horns @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_boss_soul/mat_gGIBossSoulSkullDL_Jewel b/soh/assets/custom/objects/object_boss_soul/mat_gGIBossSoulSkullDL_Jewel new file mode 100644 index 000000000..dbe5cfd53 --- /dev/null +++ b/soh/assets/custom/objects/object_boss_soul/mat_gGIBossSoulSkullDL_Jewel @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_boss_soul/mat_gGIBossSoulSkullDL_Skull1 b/soh/assets/custom/objects/object_boss_soul/mat_gGIBossSoulSkullDL_Skull1 new file mode 100644 index 000000000..c32c4ee24 --- /dev/null +++ b/soh/assets/custom/objects/object_boss_soul/mat_gGIBossSoulSkullDL_Skull1 @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_boss_soul/mat_gGIBossSoulSkullDL_f3dlite_material b/soh/assets/custom/objects/object_boss_soul/mat_gGIBossSoulSkullDL_f3dlite_material new file mode 100644 index 000000000..a3dd769f6 --- /dev/null +++ b/soh/assets/custom/objects/object_boss_soul/mat_gGIBossSoulSkullDL_f3dlite_material @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_boss_soul/mat_gGIBossSoulSkullDL_skull_horns b/soh/assets/custom/objects/object_boss_soul/mat_gGIBossSoulSkullDL_skull_horns deleted file mode 100644 index 78d2a531c..000000000 --- a/soh/assets/custom/objects/object_boss_soul/mat_gGIBossSoulSkullDL_skull_horns +++ /dev/null @@ -1,21 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - diff --git a/soh/assets/custom/objects/object_boss_soul/mat_gGIBossSoulSkullDL_skull_surface b/soh/assets/custom/objects/object_boss_soul/mat_gGIBossSoulSkullDL_skull_surface deleted file mode 100644 index e15a4dce4..000000000 --- a/soh/assets/custom/objects/object_boss_soul/mat_gGIBossSoulSkullDL_skull_surface +++ /dev/null @@ -1,21 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - diff --git a/soh/assets/custom/objects/object_boss_soul/noise_tex b/soh/assets/custom/objects/object_boss_soul/noise_tex deleted file mode 100644 index aaf4e331f..000000000 Binary files a/soh/assets/custom/objects/object_boss_soul/noise_tex and /dev/null differ diff --git a/soh/assets/custom/objects/object_boss_soul/noise_tex_copy b/soh/assets/custom/objects/object_boss_soul/noise_tex_copy deleted file mode 100644 index a6d6cf945..000000000 Binary files a/soh/assets/custom/objects/object_boss_soul/noise_tex_copy and /dev/null differ diff --git a/soh/assets/custom/objects/object_bosskey/Hilite_Caustics2 b/soh/assets/custom/objects/object_bosskey/Hilite_Caustics2 new file mode 100644 index 000000000..3eae27564 Binary files /dev/null and b/soh/assets/custom/objects/object_bosskey/Hilite_Caustics2 differ diff --git a/soh/assets/custom/objects/object_bosskey/Hilite_new b/soh/assets/custom/objects/object_bosskey/Hilite_new new file mode 100644 index 000000000..5438695fa Binary files /dev/null and b/soh/assets/custom/objects/object_bosskey/Hilite_new differ diff --git a/soh/assets/custom/objects/object_bosskey/gBossKeyCustomDL b/soh/assets/custom/objects/object_bosskey/gBossKeyCustomDL new file mode 100644 index 000000000..606e5e5a8 --- /dev/null +++ b/soh/assets/custom/objects/object_bosskey/gBossKeyCustomDL @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_bosskey/gBossKeyCustomDL_tri_0 b/soh/assets/custom/objects/object_bosskey/gBossKeyCustomDL_tri_0 new file mode 100644 index 000000000..55782c315 --- /dev/null +++ b/soh/assets/custom/objects/object_bosskey/gBossKeyCustomDL_tri_0 @@ -0,0 +1,142 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_bosskey/gBossKeyCustomDL_vtx_0 b/soh/assets/custom/objects/object_bosskey/gBossKeyCustomDL_vtx_0 new file mode 100644 index 000000000..1e9285c25 --- /dev/null +++ b/soh/assets/custom/objects/object_bosskey/gBossKeyCustomDL_vtx_0 @@ -0,0 +1,151 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_bosskey/gBossKeyIconFireTempleDL b/soh/assets/custom/objects/object_bosskey/gBossKeyIconFireTempleDL new file mode 100644 index 000000000..5b07f23b0 --- /dev/null +++ b/soh/assets/custom/objects/object_bosskey/gBossKeyIconFireTempleDL @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_bosskey/gBossKeyIconFireTempleDL_tri_0 b/soh/assets/custom/objects/object_bosskey/gBossKeyIconFireTempleDL_tri_0 new file mode 100644 index 000000000..66729a5c3 --- /dev/null +++ b/soh/assets/custom/objects/object_bosskey/gBossKeyIconFireTempleDL_tri_0 @@ -0,0 +1,68 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_bosskey/gBossKeyIconFireTempleDL_vtx_0 b/soh/assets/custom/objects/object_bosskey/gBossKeyIconFireTempleDL_vtx_0 new file mode 100644 index 000000000..72d390049 --- /dev/null +++ b/soh/assets/custom/objects/object_bosskey/gBossKeyIconFireTempleDL_vtx_0 @@ -0,0 +1,54 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_bosskey/gBossKeyIconForestTempleDL b/soh/assets/custom/objects/object_bosskey/gBossKeyIconForestTempleDL new file mode 100644 index 000000000..ff11c42ce --- /dev/null +++ b/soh/assets/custom/objects/object_bosskey/gBossKeyIconForestTempleDL @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_bosskey/gBossKeyIconForestTempleDL_tri_0 b/soh/assets/custom/objects/object_bosskey/gBossKeyIconForestTempleDL_tri_0 new file mode 100644 index 000000000..7f516410e --- /dev/null +++ b/soh/assets/custom/objects/object_bosskey/gBossKeyIconForestTempleDL_tri_0 @@ -0,0 +1,104 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_bosskey/gBossKeyIconForestTempleDL_vtx_0 b/soh/assets/custom/objects/object_bosskey/gBossKeyIconForestTempleDL_vtx_0 new file mode 100644 index 000000000..e04ca5dc1 --- /dev/null +++ b/soh/assets/custom/objects/object_bosskey/gBossKeyIconForestTempleDL_vtx_0 @@ -0,0 +1,58 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_bosskey/gBossKeyIconGanonsCastleDL b/soh/assets/custom/objects/object_bosskey/gBossKeyIconGanonsCastleDL new file mode 100644 index 000000000..770739883 --- /dev/null +++ b/soh/assets/custom/objects/object_bosskey/gBossKeyIconGanonsCastleDL @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_bosskey/gBossKeyIconGanonsCastleDL_tri_0 b/soh/assets/custom/objects/object_bosskey/gBossKeyIconGanonsCastleDL_tri_0 new file mode 100644 index 000000000..4e7d534f9 --- /dev/null +++ b/soh/assets/custom/objects/object_bosskey/gBossKeyIconGanonsCastleDL_tri_0 @@ -0,0 +1,749 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_bosskey/gBossKeyIconGanonsCastleDL_vtx_0 b/soh/assets/custom/objects/object_bosskey/gBossKeyIconGanonsCastleDL_vtx_0 new file mode 100644 index 000000000..64d53ebb3 --- /dev/null +++ b/soh/assets/custom/objects/object_bosskey/gBossKeyIconGanonsCastleDL_vtx_0 @@ -0,0 +1,803 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_bosskey/gBossKeyIconShadowTempleDL b/soh/assets/custom/objects/object_bosskey/gBossKeyIconShadowTempleDL new file mode 100644 index 000000000..52ec0e5f9 --- /dev/null +++ b/soh/assets/custom/objects/object_bosskey/gBossKeyIconShadowTempleDL @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_bosskey/gBossKeyIconShadowTempleDL_tri_0 b/soh/assets/custom/objects/object_bosskey/gBossKeyIconShadowTempleDL_tri_0 new file mode 100644 index 000000000..43091fea3 --- /dev/null +++ b/soh/assets/custom/objects/object_bosskey/gBossKeyIconShadowTempleDL_tri_0 @@ -0,0 +1,74 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_bosskey/gBossKeyIconShadowTempleDL_vtx_0 b/soh/assets/custom/objects/object_bosskey/gBossKeyIconShadowTempleDL_vtx_0 new file mode 100644 index 000000000..1619bed17 --- /dev/null +++ b/soh/assets/custom/objects/object_bosskey/gBossKeyIconShadowTempleDL_vtx_0 @@ -0,0 +1,60 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_bosskey/gBossKeyIconSpiritTempleDL b/soh/assets/custom/objects/object_bosskey/gBossKeyIconSpiritTempleDL new file mode 100644 index 000000000..58acaff21 --- /dev/null +++ b/soh/assets/custom/objects/object_bosskey/gBossKeyIconSpiritTempleDL @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_bosskey/gBossKeyIconSpiritTempleDL_tri_0 b/soh/assets/custom/objects/object_bosskey/gBossKeyIconSpiritTempleDL_tri_0 new file mode 100644 index 000000000..7a94a5699 --- /dev/null +++ b/soh/assets/custom/objects/object_bosskey/gBossKeyIconSpiritTempleDL_tri_0 @@ -0,0 +1,100 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_bosskey/gBossKeyIconSpiritTempleDL_vtx_0 b/soh/assets/custom/objects/object_bosskey/gBossKeyIconSpiritTempleDL_vtx_0 new file mode 100644 index 000000000..ceebb97ee --- /dev/null +++ b/soh/assets/custom/objects/object_bosskey/gBossKeyIconSpiritTempleDL_vtx_0 @@ -0,0 +1,63 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_bosskey/gBossKeyIconWaterTempleDL b/soh/assets/custom/objects/object_bosskey/gBossKeyIconWaterTempleDL new file mode 100644 index 000000000..edd9984a4 --- /dev/null +++ b/soh/assets/custom/objects/object_bosskey/gBossKeyIconWaterTempleDL @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_bosskey/gBossKeyIconWaterTempleDL_tri_0 b/soh/assets/custom/objects/object_bosskey/gBossKeyIconWaterTempleDL_tri_0 new file mode 100644 index 000000000..198e881c2 --- /dev/null +++ b/soh/assets/custom/objects/object_bosskey/gBossKeyIconWaterTempleDL_tri_0 @@ -0,0 +1,106 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_bosskey/gBossKeyIconWaterTempleDL_vtx_0 b/soh/assets/custom/objects/object_bosskey/gBossKeyIconWaterTempleDL_vtx_0 new file mode 100644 index 000000000..e3d917797 --- /dev/null +++ b/soh/assets/custom/objects/object_bosskey/gBossKeyIconWaterTempleDL_vtx_0 @@ -0,0 +1,92 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_bosskey/mat_gBossKeyCustomDL_f3dlite_BossKeyMetal_Custom b/soh/assets/custom/objects/object_bosskey/mat_gBossKeyCustomDL_f3dlite_BossKeyMetal_Custom new file mode 100644 index 000000000..8c58c67c9 --- /dev/null +++ b/soh/assets/custom/objects/object_bosskey/mat_gBossKeyCustomDL_f3dlite_BossKeyMetal_Custom @@ -0,0 +1,20 @@ + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_bosskey/mat_gBossKeyIconFireTempleDL_f3dlite_BossKeyGem_FireTemple b/soh/assets/custom/objects/object_bosskey/mat_gBossKeyIconFireTempleDL_f3dlite_BossKeyGem_FireTemple new file mode 100644 index 000000000..c96909c80 --- /dev/null +++ b/soh/assets/custom/objects/object_bosskey/mat_gBossKeyIconFireTempleDL_f3dlite_BossKeyGem_FireTemple @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_bosskey/mat_gBossKeyIconForestTempleDL_f3dlite_BossKeyGem_ForestTemple b/soh/assets/custom/objects/object_bosskey/mat_gBossKeyIconForestTempleDL_f3dlite_BossKeyGem_ForestTemple new file mode 100644 index 000000000..ab328f65b --- /dev/null +++ b/soh/assets/custom/objects/object_bosskey/mat_gBossKeyIconForestTempleDL_f3dlite_BossKeyGem_ForestTemple @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_bosskey/mat_gBossKeyIconGanonsCastleDL_f3dlite_BossKeyGem_GanonsCastle b/soh/assets/custom/objects/object_bosskey/mat_gBossKeyIconGanonsCastleDL_f3dlite_BossKeyGem_GanonsCastle new file mode 100644 index 000000000..c4c60bef1 --- /dev/null +++ b/soh/assets/custom/objects/object_bosskey/mat_gBossKeyIconGanonsCastleDL_f3dlite_BossKeyGem_GanonsCastle @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_bosskey/mat_gBossKeyIconShadowTempleDL_f3dlite_BossKeyGem_ShadowTemple b/soh/assets/custom/objects/object_bosskey/mat_gBossKeyIconShadowTempleDL_f3dlite_BossKeyGem_ShadowTemple new file mode 100644 index 000000000..301b96815 --- /dev/null +++ b/soh/assets/custom/objects/object_bosskey/mat_gBossKeyIconShadowTempleDL_f3dlite_BossKeyGem_ShadowTemple @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_bosskey/mat_gBossKeyIconSpiritTempleDL_f3dlite_BossKeyGem_SpiritTemple b/soh/assets/custom/objects/object_bosskey/mat_gBossKeyIconSpiritTempleDL_f3dlite_BossKeyGem_SpiritTemple new file mode 100644 index 000000000..f838ce380 --- /dev/null +++ b/soh/assets/custom/objects/object_bosskey/mat_gBossKeyIconSpiritTempleDL_f3dlite_BossKeyGem_SpiritTemple @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_bosskey/mat_gBossKeyIconWaterTempleDL_f3dlite_BossKeyGem_WaterTemple b/soh/assets/custom/objects/object_bosskey/mat_gBossKeyIconWaterTempleDL_f3dlite_BossKeyGem_WaterTemple new file mode 100644 index 000000000..4e6dc67fc --- /dev/null +++ b/soh/assets/custom/objects/object_bosskey/mat_gBossKeyIconWaterTempleDL_f3dlite_BossKeyGem_WaterTemple @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_housekey/Hilite_new b/soh/assets/custom/objects/object_housekey/Hilite_new new file mode 100644 index 000000000..5438695fa Binary files /dev/null and b/soh/assets/custom/objects/object_housekey/Hilite_new differ diff --git a/soh/assets/custom/objects/object_housekey/HouseKey_Tag b/soh/assets/custom/objects/object_housekey/HouseKey_Tag new file mode 100644 index 000000000..4939ef966 Binary files /dev/null and b/soh/assets/custom/objects/object_housekey/HouseKey_Tag differ diff --git a/soh/assets/custom/objects/object_housekey/gHouseKeyDL b/soh/assets/custom/objects/object_housekey/gHouseKeyDL new file mode 100644 index 000000000..3d6787c3c --- /dev/null +++ b/soh/assets/custom/objects/object_housekey/gHouseKeyDL @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_housekey/gHouseKeyDL_tri_0 b/soh/assets/custom/objects/object_housekey/gHouseKeyDL_tri_0 new file mode 100644 index 000000000..4c8002a6a --- /dev/null +++ b/soh/assets/custom/objects/object_housekey/gHouseKeyDL_tri_0 @@ -0,0 +1,54 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_housekey/gHouseKeyDL_tri_1 b/soh/assets/custom/objects/object_housekey/gHouseKeyDL_tri_1 new file mode 100644 index 000000000..06fdafc2d --- /dev/null +++ b/soh/assets/custom/objects/object_housekey/gHouseKeyDL_tri_1 @@ -0,0 +1,43 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_housekey/gHouseKeyDL_tri_2 b/soh/assets/custom/objects/object_housekey/gHouseKeyDL_tri_2 new file mode 100644 index 000000000..a606298d1 --- /dev/null +++ b/soh/assets/custom/objects/object_housekey/gHouseKeyDL_tri_2 @@ -0,0 +1,82 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_housekey/gHouseKeyDL_vtx_0 b/soh/assets/custom/objects/object_housekey/gHouseKeyDL_vtx_0 new file mode 100644 index 000000000..cd0885c1c --- /dev/null +++ b/soh/assets/custom/objects/object_housekey/gHouseKeyDL_vtx_0 @@ -0,0 +1,61 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_housekey/gHouseKeyDL_vtx_1 b/soh/assets/custom/objects/object_housekey/gHouseKeyDL_vtx_1 new file mode 100644 index 000000000..c4f2d8850 --- /dev/null +++ b/soh/assets/custom/objects/object_housekey/gHouseKeyDL_vtx_1 @@ -0,0 +1,39 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_housekey/gHouseKeyDL_vtx_2 b/soh/assets/custom/objects/object_housekey/gHouseKeyDL_vtx_2 new file mode 100644 index 000000000..dc377511e --- /dev/null +++ b/soh/assets/custom/objects/object_housekey/gHouseKeyDL_vtx_2 @@ -0,0 +1,93 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_housekey/mat_gHouseKeyDL_f3dlite_housekeymetal b/soh/assets/custom/objects/object_housekey/mat_gHouseKeyDL_f3dlite_housekeymetal new file mode 100644 index 000000000..90c65bd06 --- /dev/null +++ b/soh/assets/custom/objects/object_housekey/mat_gHouseKeyDL_f3dlite_housekeymetal @@ -0,0 +1,20 @@ + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_housekey/mat_gHouseKeyDL_f3dlite_housekeyringmetal b/soh/assets/custom/objects/object_housekey/mat_gHouseKeyDL_f3dlite_housekeyringmetal new file mode 100644 index 000000000..d7d19e315 --- /dev/null +++ b/soh/assets/custom/objects/object_housekey/mat_gHouseKeyDL_f3dlite_housekeyringmetal @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_housekey/mat_gHouseKeyDL_f3dlite_housekeytag b/soh/assets/custom/objects/object_housekey/mat_gHouseKeyDL_f3dlite_housekeytag new file mode 100644 index 000000000..05f2afc64 --- /dev/null +++ b/soh/assets/custom/objects/object_housekey/mat_gHouseKeyDL_f3dlite_housekeytag @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_key/Hilite_new b/soh/assets/custom/objects/object_key/Hilite_new new file mode 100644 index 000000000..5438695fa Binary files /dev/null and b/soh/assets/custom/objects/object_key/Hilite_new differ diff --git a/soh/assets/custom/objects/object_key/gSkeletonKeyDL b/soh/assets/custom/objects/object_key/gSkeletonKeyDL new file mode 100644 index 000000000..0405a3c7c --- /dev/null +++ b/soh/assets/custom/objects/object_key/gSkeletonKeyDL @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_key/gSkeletonKeyDL_tri_0 b/soh/assets/custom/objects/object_key/gSkeletonKeyDL_tri_0 new file mode 100644 index 000000000..80e7f1bad --- /dev/null +++ b/soh/assets/custom/objects/object_key/gSkeletonKeyDL_tri_0 @@ -0,0 +1,121 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_key/gSkeletonKeyDL_tri_1 b/soh/assets/custom/objects/object_key/gSkeletonKeyDL_tri_1 new file mode 100644 index 000000000..46e6b22e5 --- /dev/null +++ b/soh/assets/custom/objects/object_key/gSkeletonKeyDL_tri_1 @@ -0,0 +1,316 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_key/gSkeletonKeyDL_vtx_0 b/soh/assets/custom/objects/object_key/gSkeletonKeyDL_vtx_0 new file mode 100644 index 000000000..f135e476d --- /dev/null +++ b/soh/assets/custom/objects/object_key/gSkeletonKeyDL_vtx_0 @@ -0,0 +1,130 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_key/gSkeletonKeyDL_vtx_1 b/soh/assets/custom/objects/object_key/gSkeletonKeyDL_vtx_1 new file mode 100644 index 000000000..0f5b2970e --- /dev/null +++ b/soh/assets/custom/objects/object_key/gSkeletonKeyDL_vtx_1 @@ -0,0 +1,335 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_key/gSmallKeyCustomDL b/soh/assets/custom/objects/object_key/gSmallKeyCustomDL new file mode 100644 index 000000000..0ac907844 --- /dev/null +++ b/soh/assets/custom/objects/object_key/gSmallKeyCustomDL @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_key/gSmallKeyCustomDL_tri_0 b/soh/assets/custom/objects/object_key/gSmallKeyCustomDL_tri_0 new file mode 100644 index 000000000..594962af6 --- /dev/null +++ b/soh/assets/custom/objects/object_key/gSmallKeyCustomDL_tri_0 @@ -0,0 +1,95 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_key/gSmallKeyCustomDL_vtx_0 b/soh/assets/custom/objects/object_key/gSmallKeyCustomDL_vtx_0 new file mode 100644 index 000000000..9ceebf190 --- /dev/null +++ b/soh/assets/custom/objects/object_key/gSmallKeyCustomDL_vtx_0 @@ -0,0 +1,100 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_key/gSmallKeyIconBottomoftheWellDL b/soh/assets/custom/objects/object_key/gSmallKeyIconBottomoftheWellDL new file mode 100644 index 000000000..c9da256e2 --- /dev/null +++ b/soh/assets/custom/objects/object_key/gSmallKeyIconBottomoftheWellDL @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_key/gSmallKeyIconBottomoftheWellDL_tri_0 b/soh/assets/custom/objects/object_key/gSmallKeyIconBottomoftheWellDL_tri_0 new file mode 100644 index 000000000..87c380d5c --- /dev/null +++ b/soh/assets/custom/objects/object_key/gSmallKeyIconBottomoftheWellDL_tri_0 @@ -0,0 +1,241 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_key/gSmallKeyIconBottomoftheWellDL_vtx_0 b/soh/assets/custom/objects/object_key/gSmallKeyIconBottomoftheWellDL_vtx_0 new file mode 100644 index 000000000..bd7962a42 --- /dev/null +++ b/soh/assets/custom/objects/object_key/gSmallKeyIconBottomoftheWellDL_vtx_0 @@ -0,0 +1,298 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_key/gSmallKeyIconFireTempleDL b/soh/assets/custom/objects/object_key/gSmallKeyIconFireTempleDL new file mode 100644 index 000000000..57f2ce5bf --- /dev/null +++ b/soh/assets/custom/objects/object_key/gSmallKeyIconFireTempleDL @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_key/gSmallKeyIconFireTempleDL_tri_0 b/soh/assets/custom/objects/object_key/gSmallKeyIconFireTempleDL_tri_0 new file mode 100644 index 000000000..aa905d45a --- /dev/null +++ b/soh/assets/custom/objects/object_key/gSmallKeyIconFireTempleDL_tri_0 @@ -0,0 +1,68 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_key/gSmallKeyIconFireTempleDL_vtx_0 b/soh/assets/custom/objects/object_key/gSmallKeyIconFireTempleDL_vtx_0 new file mode 100644 index 000000000..9e167011c --- /dev/null +++ b/soh/assets/custom/objects/object_key/gSmallKeyIconFireTempleDL_vtx_0 @@ -0,0 +1,54 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_key/gSmallKeyIconForestTempleDL b/soh/assets/custom/objects/object_key/gSmallKeyIconForestTempleDL new file mode 100644 index 000000000..4bf303073 --- /dev/null +++ b/soh/assets/custom/objects/object_key/gSmallKeyIconForestTempleDL @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_key/gSmallKeyIconForestTempleDL_tri_0 b/soh/assets/custom/objects/object_key/gSmallKeyIconForestTempleDL_tri_0 new file mode 100644 index 000000000..5414d43d9 --- /dev/null +++ b/soh/assets/custom/objects/object_key/gSmallKeyIconForestTempleDL_tri_0 @@ -0,0 +1,104 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_key/gSmallKeyIconForestTempleDL_vtx_0 b/soh/assets/custom/objects/object_key/gSmallKeyIconForestTempleDL_vtx_0 new file mode 100644 index 000000000..28f60fbae --- /dev/null +++ b/soh/assets/custom/objects/object_key/gSmallKeyIconForestTempleDL_vtx_0 @@ -0,0 +1,58 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_key/gSmallKeyIconGanonsCastleDL b/soh/assets/custom/objects/object_key/gSmallKeyIconGanonsCastleDL new file mode 100644 index 000000000..6c1d663d0 --- /dev/null +++ b/soh/assets/custom/objects/object_key/gSmallKeyIconGanonsCastleDL @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_key/gSmallKeyIconGanonsCastleDL_tri_0 b/soh/assets/custom/objects/object_key/gSmallKeyIconGanonsCastleDL_tri_0 new file mode 100644 index 000000000..c0eb2f9f7 --- /dev/null +++ b/soh/assets/custom/objects/object_key/gSmallKeyIconGanonsCastleDL_tri_0 @@ -0,0 +1,749 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_key/gSmallKeyIconGanonsCastleDL_vtx_0 b/soh/assets/custom/objects/object_key/gSmallKeyIconGanonsCastleDL_vtx_0 new file mode 100644 index 000000000..52fd01da3 --- /dev/null +++ b/soh/assets/custom/objects/object_key/gSmallKeyIconGanonsCastleDL_vtx_0 @@ -0,0 +1,803 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_key/gSmallKeyIconGerudoFortressDL b/soh/assets/custom/objects/object_key/gSmallKeyIconGerudoFortressDL new file mode 100644 index 000000000..f688a34de --- /dev/null +++ b/soh/assets/custom/objects/object_key/gSmallKeyIconGerudoFortressDL @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_key/gSmallKeyIconGerudoFortressDL_tri_0 b/soh/assets/custom/objects/object_key/gSmallKeyIconGerudoFortressDL_tri_0 new file mode 100644 index 000000000..e1d99f600 --- /dev/null +++ b/soh/assets/custom/objects/object_key/gSmallKeyIconGerudoFortressDL_tri_0 @@ -0,0 +1,156 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_key/gSmallKeyIconGerudoFortressDL_vtx_0 b/soh/assets/custom/objects/object_key/gSmallKeyIconGerudoFortressDL_vtx_0 new file mode 100644 index 000000000..3e17db842 --- /dev/null +++ b/soh/assets/custom/objects/object_key/gSmallKeyIconGerudoFortressDL_vtx_0 @@ -0,0 +1,179 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_key/gSmallKeyIconGerudoTrainingGroundDL b/soh/assets/custom/objects/object_key/gSmallKeyIconGerudoTrainingGroundDL new file mode 100644 index 000000000..493d63531 --- /dev/null +++ b/soh/assets/custom/objects/object_key/gSmallKeyIconGerudoTrainingGroundDL @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_key/gSmallKeyIconGerudoTrainingGroundDL_tri_0 b/soh/assets/custom/objects/object_key/gSmallKeyIconGerudoTrainingGroundDL_tri_0 new file mode 100644 index 000000000..7d8b684a3 --- /dev/null +++ b/soh/assets/custom/objects/object_key/gSmallKeyIconGerudoTrainingGroundDL_tri_0 @@ -0,0 +1,391 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_key/gSmallKeyIconGerudoTrainingGroundDL_vtx_0 b/soh/assets/custom/objects/object_key/gSmallKeyIconGerudoTrainingGroundDL_vtx_0 new file mode 100644 index 000000000..a4cd37820 --- /dev/null +++ b/soh/assets/custom/objects/object_key/gSmallKeyIconGerudoTrainingGroundDL_vtx_0 @@ -0,0 +1,430 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_key/gSmallKeyIconShadowTempleDL b/soh/assets/custom/objects/object_key/gSmallKeyIconShadowTempleDL new file mode 100644 index 000000000..71426049e --- /dev/null +++ b/soh/assets/custom/objects/object_key/gSmallKeyIconShadowTempleDL @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_key/gSmallKeyIconShadowTempleDL_tri_0 b/soh/assets/custom/objects/object_key/gSmallKeyIconShadowTempleDL_tri_0 new file mode 100644 index 000000000..25ecf0b48 --- /dev/null +++ b/soh/assets/custom/objects/object_key/gSmallKeyIconShadowTempleDL_tri_0 @@ -0,0 +1,74 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_key/gSmallKeyIconShadowTempleDL_vtx_0 b/soh/assets/custom/objects/object_key/gSmallKeyIconShadowTempleDL_vtx_0 new file mode 100644 index 000000000..42a1284ce --- /dev/null +++ b/soh/assets/custom/objects/object_key/gSmallKeyIconShadowTempleDL_vtx_0 @@ -0,0 +1,60 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_key/gSmallKeyIconSpiritTempleDL b/soh/assets/custom/objects/object_key/gSmallKeyIconSpiritTempleDL new file mode 100644 index 000000000..5c314fb5a --- /dev/null +++ b/soh/assets/custom/objects/object_key/gSmallKeyIconSpiritTempleDL @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_key/gSmallKeyIconSpiritTempleDL_tri_0 b/soh/assets/custom/objects/object_key/gSmallKeyIconSpiritTempleDL_tri_0 new file mode 100644 index 000000000..fbce62b66 --- /dev/null +++ b/soh/assets/custom/objects/object_key/gSmallKeyIconSpiritTempleDL_tri_0 @@ -0,0 +1,100 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_key/gSmallKeyIconSpiritTempleDL_vtx_0 b/soh/assets/custom/objects/object_key/gSmallKeyIconSpiritTempleDL_vtx_0 new file mode 100644 index 000000000..66a2c5f88 --- /dev/null +++ b/soh/assets/custom/objects/object_key/gSmallKeyIconSpiritTempleDL_vtx_0 @@ -0,0 +1,63 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_key/gSmallKeyIconTreasureChestGameDL b/soh/assets/custom/objects/object_key/gSmallKeyIconTreasureChestGameDL new file mode 100644 index 000000000..4e27a5d3e --- /dev/null +++ b/soh/assets/custom/objects/object_key/gSmallKeyIconTreasureChestGameDL @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_key/gSmallKeyIconTreasureChestGameDL_tri_0 b/soh/assets/custom/objects/object_key/gSmallKeyIconTreasureChestGameDL_tri_0 new file mode 100644 index 000000000..246bae6a9 --- /dev/null +++ b/soh/assets/custom/objects/object_key/gSmallKeyIconTreasureChestGameDL_tri_0 @@ -0,0 +1,376 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_key/gSmallKeyIconTreasureChestGameDL_vtx_0 b/soh/assets/custom/objects/object_key/gSmallKeyIconTreasureChestGameDL_vtx_0 new file mode 100644 index 000000000..fd7c81995 --- /dev/null +++ b/soh/assets/custom/objects/object_key/gSmallKeyIconTreasureChestGameDL_vtx_0 @@ -0,0 +1,406 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_key/gSmallKeyIconWaterTempleDL b/soh/assets/custom/objects/object_key/gSmallKeyIconWaterTempleDL new file mode 100644 index 000000000..b2b4f5bfc --- /dev/null +++ b/soh/assets/custom/objects/object_key/gSmallKeyIconWaterTempleDL @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_key/gSmallKeyIconWaterTempleDL_tri_0 b/soh/assets/custom/objects/object_key/gSmallKeyIconWaterTempleDL_tri_0 new file mode 100644 index 000000000..94037d2c9 --- /dev/null +++ b/soh/assets/custom/objects/object_key/gSmallKeyIconWaterTempleDL_tri_0 @@ -0,0 +1,106 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_key/gSmallKeyIconWaterTempleDL_vtx_0 b/soh/assets/custom/objects/object_key/gSmallKeyIconWaterTempleDL_vtx_0 new file mode 100644 index 000000000..2ff054194 --- /dev/null +++ b/soh/assets/custom/objects/object_key/gSmallKeyIconWaterTempleDL_vtx_0 @@ -0,0 +1,92 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_boss_soul/mat_gGIBossSoulSkullDL_skull_black b/soh/assets/custom/objects/object_key/mat_gSkeletonKeyDL_f3dlite_KeyMetal_Skeleton similarity index 66% rename from soh/assets/custom/objects/object_boss_soul/mat_gGIBossSoulSkullDL_skull_black rename to soh/assets/custom/objects/object_key/mat_gSkeletonKeyDL_f3dlite_KeyMetal_Skeleton index 6aee093d9..4062e86db 100644 --- a/soh/assets/custom/objects/object_boss_soul/mat_gGIBossSoulSkullDL_skull_black +++ b/soh/assets/custom/objects/object_key/mat_gSkeletonKeyDL_f3dlite_KeyMetal_Skeleton @@ -1,21 +1,20 @@ - + - + - + - + - + - diff --git a/soh/assets/custom/objects/object_boss_soul/mat_gGIBossSoulSkullDL_skull_eyes b/soh/assets/custom/objects/object_key/mat_gSkeletonKeyDL_f3dlite_KeyMetal_SkeletonShade similarity index 55% rename from soh/assets/custom/objects/object_boss_soul/mat_gGIBossSoulSkullDL_skull_eyes rename to soh/assets/custom/objects/object_key/mat_gSkeletonKeyDL_f3dlite_KeyMetal_SkeletonShade index c08beb94a..ac5b34610 100644 --- a/soh/assets/custom/objects/object_boss_soul/mat_gGIBossSoulSkullDL_skull_eyes +++ b/soh/assets/custom/objects/object_key/mat_gSkeletonKeyDL_f3dlite_KeyMetal_SkeletonShade @@ -1,21 +1,21 @@ - - - + + + - + - + - + - + - + diff --git a/soh/assets/custom/objects/object_key/mat_gSmallKeyCustomDL_f3dlite_KeyMetal_Small b/soh/assets/custom/objects/object_key/mat_gSmallKeyCustomDL_f3dlite_KeyMetal_Small new file mode 100644 index 000000000..57c9001dd --- /dev/null +++ b/soh/assets/custom/objects/object_key/mat_gSmallKeyCustomDL_f3dlite_KeyMetal_Small @@ -0,0 +1,20 @@ + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_key/mat_gSmallKeyIconBottomoftheWellDL_f3dlite_IconMetal_BottomoftheWell b/soh/assets/custom/objects/object_key/mat_gSmallKeyIconBottomoftheWellDL_f3dlite_IconMetal_BottomoftheWell new file mode 100644 index 000000000..57c9001dd --- /dev/null +++ b/soh/assets/custom/objects/object_key/mat_gSmallKeyIconBottomoftheWellDL_f3dlite_IconMetal_BottomoftheWell @@ -0,0 +1,20 @@ + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_key/mat_gSmallKeyIconFireTempleDL_f3dlite_IconMetal_FireTemple b/soh/assets/custom/objects/object_key/mat_gSmallKeyIconFireTempleDL_f3dlite_IconMetal_FireTemple new file mode 100644 index 000000000..57c9001dd --- /dev/null +++ b/soh/assets/custom/objects/object_key/mat_gSmallKeyIconFireTempleDL_f3dlite_IconMetal_FireTemple @@ -0,0 +1,20 @@ + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_key/mat_gSmallKeyIconForestTempleDL_f3dlite_IconMetal_ForestTemple b/soh/assets/custom/objects/object_key/mat_gSmallKeyIconForestTempleDL_f3dlite_IconMetal_ForestTemple new file mode 100644 index 000000000..57c9001dd --- /dev/null +++ b/soh/assets/custom/objects/object_key/mat_gSmallKeyIconForestTempleDL_f3dlite_IconMetal_ForestTemple @@ -0,0 +1,20 @@ + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_key/mat_gSmallKeyIconGanonsCastleDL_f3dlite_IconMetal_GanonsCastle b/soh/assets/custom/objects/object_key/mat_gSmallKeyIconGanonsCastleDL_f3dlite_IconMetal_GanonsCastle new file mode 100644 index 000000000..57c9001dd --- /dev/null +++ b/soh/assets/custom/objects/object_key/mat_gSmallKeyIconGanonsCastleDL_f3dlite_IconMetal_GanonsCastle @@ -0,0 +1,20 @@ + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_key/mat_gSmallKeyIconGerudoFortressDL_f3dlite_IconMetal_GerudoFortress b/soh/assets/custom/objects/object_key/mat_gSmallKeyIconGerudoFortressDL_f3dlite_IconMetal_GerudoFortress new file mode 100644 index 000000000..57c9001dd --- /dev/null +++ b/soh/assets/custom/objects/object_key/mat_gSmallKeyIconGerudoFortressDL_f3dlite_IconMetal_GerudoFortress @@ -0,0 +1,20 @@ + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_key/mat_gSmallKeyIconGerudoTrainingGroundDL_f3dlite_IconMetal_GerudoTrainingGround b/soh/assets/custom/objects/object_key/mat_gSmallKeyIconGerudoTrainingGroundDL_f3dlite_IconMetal_GerudoTrainingGround new file mode 100644 index 000000000..57c9001dd --- /dev/null +++ b/soh/assets/custom/objects/object_key/mat_gSmallKeyIconGerudoTrainingGroundDL_f3dlite_IconMetal_GerudoTrainingGround @@ -0,0 +1,20 @@ + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_key/mat_gSmallKeyIconShadowTempleDL_f3dlite_IconMetal_ShadowTemple b/soh/assets/custom/objects/object_key/mat_gSmallKeyIconShadowTempleDL_f3dlite_IconMetal_ShadowTemple new file mode 100644 index 000000000..57c9001dd --- /dev/null +++ b/soh/assets/custom/objects/object_key/mat_gSmallKeyIconShadowTempleDL_f3dlite_IconMetal_ShadowTemple @@ -0,0 +1,20 @@ + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_key/mat_gSmallKeyIconSpiritTempleDL_f3dlite_IconMetal_SpiritTemple b/soh/assets/custom/objects/object_key/mat_gSmallKeyIconSpiritTempleDL_f3dlite_IconMetal_SpiritTemple new file mode 100644 index 000000000..57c9001dd --- /dev/null +++ b/soh/assets/custom/objects/object_key/mat_gSmallKeyIconSpiritTempleDL_f3dlite_IconMetal_SpiritTemple @@ -0,0 +1,20 @@ + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_key/mat_gSmallKeyIconTreasureChestGameDL_f3dlite_IconMetal_TreasureChestGame b/soh/assets/custom/objects/object_key/mat_gSmallKeyIconTreasureChestGameDL_f3dlite_IconMetal_TreasureChestGame new file mode 100644 index 000000000..57c9001dd --- /dev/null +++ b/soh/assets/custom/objects/object_key/mat_gSmallKeyIconTreasureChestGameDL_f3dlite_IconMetal_TreasureChestGame @@ -0,0 +1,20 @@ + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_key/mat_gSmallKeyIconWaterTempleDL_f3dlite_IconMetal_WaterTemple b/soh/assets/custom/objects/object_key/mat_gSmallKeyIconWaterTempleDL_f3dlite_IconMetal_WaterTemple new file mode 100644 index 000000000..57c9001dd --- /dev/null +++ b/soh/assets/custom/objects/object_key/mat_gSmallKeyIconWaterTempleDL_f3dlite_IconMetal_WaterTemple @@ -0,0 +1,20 @@ + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_keyring/Hilite_new b/soh/assets/custom/objects/object_keyring/Hilite_new new file mode 100644 index 000000000..5438695fa Binary files /dev/null and b/soh/assets/custom/objects/object_keyring/Hilite_new differ diff --git a/soh/assets/custom/objects/object_keyring/gKeyringIconBottomoftheWellDL b/soh/assets/custom/objects/object_keyring/gKeyringIconBottomoftheWellDL new file mode 100644 index 000000000..d00c883c1 --- /dev/null +++ b/soh/assets/custom/objects/object_keyring/gKeyringIconBottomoftheWellDL @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_keyring/gKeyringIconBottomoftheWellDL_tri_0 b/soh/assets/custom/objects/object_keyring/gKeyringIconBottomoftheWellDL_tri_0 new file mode 100644 index 000000000..0afe832af --- /dev/null +++ b/soh/assets/custom/objects/object_keyring/gKeyringIconBottomoftheWellDL_tri_0 @@ -0,0 +1,299 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_keyring/gKeyringIconBottomoftheWellDL_vtx_0 b/soh/assets/custom/objects/object_keyring/gKeyringIconBottomoftheWellDL_vtx_0 new file mode 100644 index 000000000..58e9ef0ad --- /dev/null +++ b/soh/assets/custom/objects/object_keyring/gKeyringIconBottomoftheWellDL_vtx_0 @@ -0,0 +1,360 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_keyring/gKeyringIconFireTempleDL b/soh/assets/custom/objects/object_keyring/gKeyringIconFireTempleDL new file mode 100644 index 000000000..10a581f75 --- /dev/null +++ b/soh/assets/custom/objects/object_keyring/gKeyringIconFireTempleDL @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_keyring/gKeyringIconFireTempleDL_tri_0 b/soh/assets/custom/objects/object_keyring/gKeyringIconFireTempleDL_tri_0 new file mode 100644 index 000000000..3848bb958 --- /dev/null +++ b/soh/assets/custom/objects/object_keyring/gKeyringIconFireTempleDL_tri_0 @@ -0,0 +1,126 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_keyring/gKeyringIconFireTempleDL_vtx_0 b/soh/assets/custom/objects/object_keyring/gKeyringIconFireTempleDL_vtx_0 new file mode 100644 index 000000000..a48f4da09 --- /dev/null +++ b/soh/assets/custom/objects/object_keyring/gKeyringIconFireTempleDL_vtx_0 @@ -0,0 +1,116 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_keyring/gKeyringIconForestTempleDL b/soh/assets/custom/objects/object_keyring/gKeyringIconForestTempleDL new file mode 100644 index 000000000..3f5f8e2b3 --- /dev/null +++ b/soh/assets/custom/objects/object_keyring/gKeyringIconForestTempleDL @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_keyring/gKeyringIconForestTempleDL_tri_0 b/soh/assets/custom/objects/object_keyring/gKeyringIconForestTempleDL_tri_0 new file mode 100644 index 000000000..d76afc98f --- /dev/null +++ b/soh/assets/custom/objects/object_keyring/gKeyringIconForestTempleDL_tri_0 @@ -0,0 +1,162 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_keyring/gKeyringIconForestTempleDL_vtx_0 b/soh/assets/custom/objects/object_keyring/gKeyringIconForestTempleDL_vtx_0 new file mode 100644 index 000000000..3d03eb5af --- /dev/null +++ b/soh/assets/custom/objects/object_keyring/gKeyringIconForestTempleDL_vtx_0 @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_keyring/gKeyringIconGanonsCastleDL b/soh/assets/custom/objects/object_keyring/gKeyringIconGanonsCastleDL new file mode 100644 index 000000000..11c19c09a --- /dev/null +++ b/soh/assets/custom/objects/object_keyring/gKeyringIconGanonsCastleDL @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_keyring/gKeyringIconGanonsCastleDL_tri_0 b/soh/assets/custom/objects/object_keyring/gKeyringIconGanonsCastleDL_tri_0 new file mode 100644 index 000000000..fae636a2e --- /dev/null +++ b/soh/assets/custom/objects/object_keyring/gKeyringIconGanonsCastleDL_tri_0 @@ -0,0 +1,807 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_keyring/gKeyringIconGanonsCastleDL_vtx_0 b/soh/assets/custom/objects/object_keyring/gKeyringIconGanonsCastleDL_vtx_0 new file mode 100644 index 000000000..709729262 --- /dev/null +++ b/soh/assets/custom/objects/object_keyring/gKeyringIconGanonsCastleDL_vtx_0 @@ -0,0 +1,865 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_keyring/gKeyringIconGerudoFortressDL b/soh/assets/custom/objects/object_keyring/gKeyringIconGerudoFortressDL new file mode 100644 index 000000000..3552eef1b --- /dev/null +++ b/soh/assets/custom/objects/object_keyring/gKeyringIconGerudoFortressDL @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_keyring/gKeyringIconGerudoFortressDL_tri_0 b/soh/assets/custom/objects/object_keyring/gKeyringIconGerudoFortressDL_tri_0 new file mode 100644 index 000000000..791defa81 --- /dev/null +++ b/soh/assets/custom/objects/object_keyring/gKeyringIconGerudoFortressDL_tri_0 @@ -0,0 +1,213 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_keyring/gKeyringIconGerudoFortressDL_vtx_0 b/soh/assets/custom/objects/object_keyring/gKeyringIconGerudoFortressDL_vtx_0 new file mode 100644 index 000000000..1dd0cbb61 --- /dev/null +++ b/soh/assets/custom/objects/object_keyring/gKeyringIconGerudoFortressDL_vtx_0 @@ -0,0 +1,233 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_keyring/gKeyringIconGerudoTrainingGroundDL b/soh/assets/custom/objects/object_keyring/gKeyringIconGerudoTrainingGroundDL new file mode 100644 index 000000000..f7bf5e89b --- /dev/null +++ b/soh/assets/custom/objects/object_keyring/gKeyringIconGerudoTrainingGroundDL @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_keyring/gKeyringIconGerudoTrainingGroundDL_tri_0 b/soh/assets/custom/objects/object_keyring/gKeyringIconGerudoTrainingGroundDL_tri_0 new file mode 100644 index 000000000..70e7032ef --- /dev/null +++ b/soh/assets/custom/objects/object_keyring/gKeyringIconGerudoTrainingGroundDL_tri_0 @@ -0,0 +1,449 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_keyring/gKeyringIconGerudoTrainingGroundDL_vtx_0 b/soh/assets/custom/objects/object_keyring/gKeyringIconGerudoTrainingGroundDL_vtx_0 new file mode 100644 index 000000000..f255b1e85 --- /dev/null +++ b/soh/assets/custom/objects/object_keyring/gKeyringIconGerudoTrainingGroundDL_vtx_0 @@ -0,0 +1,495 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_keyring/gKeyringIconShadowTempleDL b/soh/assets/custom/objects/object_keyring/gKeyringIconShadowTempleDL new file mode 100644 index 000000000..78f6956b6 --- /dev/null +++ b/soh/assets/custom/objects/object_keyring/gKeyringIconShadowTempleDL @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_keyring/gKeyringIconShadowTempleDL_tri_0 b/soh/assets/custom/objects/object_keyring/gKeyringIconShadowTempleDL_tri_0 new file mode 100644 index 000000000..e76ad0a59 --- /dev/null +++ b/soh/assets/custom/objects/object_keyring/gKeyringIconShadowTempleDL_tri_0 @@ -0,0 +1,132 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_keyring/gKeyringIconShadowTempleDL_vtx_0 b/soh/assets/custom/objects/object_keyring/gKeyringIconShadowTempleDL_vtx_0 new file mode 100644 index 000000000..068971385 --- /dev/null +++ b/soh/assets/custom/objects/object_keyring/gKeyringIconShadowTempleDL_vtx_0 @@ -0,0 +1,124 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_keyring/gKeyringIconSpiritTempleDL b/soh/assets/custom/objects/object_keyring/gKeyringIconSpiritTempleDL new file mode 100644 index 000000000..ac3998c5e --- /dev/null +++ b/soh/assets/custom/objects/object_keyring/gKeyringIconSpiritTempleDL @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_keyring/gKeyringIconSpiritTempleDL_tri_0 b/soh/assets/custom/objects/object_keyring/gKeyringIconSpiritTempleDL_tri_0 new file mode 100644 index 000000000..ed0bbd563 --- /dev/null +++ b/soh/assets/custom/objects/object_keyring/gKeyringIconSpiritTempleDL_tri_0 @@ -0,0 +1,158 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_keyring/gKeyringIconSpiritTempleDL_vtx_0 b/soh/assets/custom/objects/object_keyring/gKeyringIconSpiritTempleDL_vtx_0 new file mode 100644 index 000000000..519fda91b --- /dev/null +++ b/soh/assets/custom/objects/object_keyring/gKeyringIconSpiritTempleDL_vtx_0 @@ -0,0 +1,125 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_keyring/gKeyringIconTreasureChestGameDL b/soh/assets/custom/objects/object_keyring/gKeyringIconTreasureChestGameDL new file mode 100644 index 000000000..5dfb7d894 --- /dev/null +++ b/soh/assets/custom/objects/object_keyring/gKeyringIconTreasureChestGameDL @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_keyring/gKeyringIconTreasureChestGameDL_tri_0 b/soh/assets/custom/objects/object_keyring/gKeyringIconTreasureChestGameDL_tri_0 new file mode 100644 index 000000000..cba2269e6 --- /dev/null +++ b/soh/assets/custom/objects/object_keyring/gKeyringIconTreasureChestGameDL_tri_0 @@ -0,0 +1,433 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_keyring/gKeyringIconTreasureChestGameDL_vtx_0 b/soh/assets/custom/objects/object_keyring/gKeyringIconTreasureChestGameDL_vtx_0 new file mode 100644 index 000000000..0bddb8b22 --- /dev/null +++ b/soh/assets/custom/objects/object_keyring/gKeyringIconTreasureChestGameDL_vtx_0 @@ -0,0 +1,461 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_keyring/gKeyringIconWaterTempleDL b/soh/assets/custom/objects/object_keyring/gKeyringIconWaterTempleDL new file mode 100644 index 000000000..bcbb38c84 --- /dev/null +++ b/soh/assets/custom/objects/object_keyring/gKeyringIconWaterTempleDL @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_keyring/gKeyringIconWaterTempleDL_tri_0 b/soh/assets/custom/objects/object_keyring/gKeyringIconWaterTempleDL_tri_0 new file mode 100644 index 000000000..9eb74a012 --- /dev/null +++ b/soh/assets/custom/objects/object_keyring/gKeyringIconWaterTempleDL_tri_0 @@ -0,0 +1,164 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_keyring/gKeyringIconWaterTempleDL_vtx_0 b/soh/assets/custom/objects/object_keyring/gKeyringIconWaterTempleDL_vtx_0 new file mode 100644 index 000000000..70d0655e2 --- /dev/null +++ b/soh/assets/custom/objects/object_keyring/gKeyringIconWaterTempleDL_vtx_0 @@ -0,0 +1,154 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_keyring/gKeyringKeysBottomoftheWellDL b/soh/assets/custom/objects/object_keyring/gKeyringKeysBottomoftheWellDL new file mode 100644 index 000000000..5db16596e --- /dev/null +++ b/soh/assets/custom/objects/object_keyring/gKeyringKeysBottomoftheWellDL @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_keyring/gKeyringKeysBottomoftheWellDL_tri_0 b/soh/assets/custom/objects/object_keyring/gKeyringKeysBottomoftheWellDL_tri_0 new file mode 100644 index 000000000..d8c702732 --- /dev/null +++ b/soh/assets/custom/objects/object_keyring/gKeyringKeysBottomoftheWellDL_tri_0 @@ -0,0 +1,276 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_keyring/gKeyringKeysBottomoftheWellDL_vtx_0 b/soh/assets/custom/objects/object_keyring/gKeyringKeysBottomoftheWellDL_vtx_0 new file mode 100644 index 000000000..47d6419fc --- /dev/null +++ b/soh/assets/custom/objects/object_keyring/gKeyringKeysBottomoftheWellDL_vtx_0 @@ -0,0 +1,301 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_keyring/gKeyringKeysBottomoftheWellMQDL b/soh/assets/custom/objects/object_keyring/gKeyringKeysBottomoftheWellMQDL new file mode 100644 index 000000000..defb5b283 --- /dev/null +++ b/soh/assets/custom/objects/object_keyring/gKeyringKeysBottomoftheWellMQDL @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_keyring/gKeyringKeysBottomoftheWellMQDL_tri_0 b/soh/assets/custom/objects/object_keyring/gKeyringKeysBottomoftheWellMQDL_tri_0 new file mode 100644 index 000000000..55f14d8e9 --- /dev/null +++ b/soh/assets/custom/objects/object_keyring/gKeyringKeysBottomoftheWellMQDL_tri_0 @@ -0,0 +1,185 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_keyring/gKeyringKeysBottomoftheWellMQDL_vtx_0 b/soh/assets/custom/objects/object_keyring/gKeyringKeysBottomoftheWellMQDL_vtx_0 new file mode 100644 index 000000000..81ca9693a --- /dev/null +++ b/soh/assets/custom/objects/object_keyring/gKeyringKeysBottomoftheWellMQDL_vtx_0 @@ -0,0 +1,203 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_keyring/gKeyringKeysFireTempleDL b/soh/assets/custom/objects/object_keyring/gKeyringKeysFireTempleDL new file mode 100644 index 000000000..98ea5b8f4 --- /dev/null +++ b/soh/assets/custom/objects/object_keyring/gKeyringKeysFireTempleDL @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_keyring/gKeyringKeysFireTempleDL_tri_0 b/soh/assets/custom/objects/object_keyring/gKeyringKeysFireTempleDL_tri_0 new file mode 100644 index 000000000..a04f98241 --- /dev/null +++ b/soh/assets/custom/objects/object_keyring/gKeyringKeysFireTempleDL_tri_0 @@ -0,0 +1,728 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_keyring/gKeyringKeysFireTempleDL_vtx_0 b/soh/assets/custom/objects/object_keyring/gKeyringKeysFireTempleDL_vtx_0 new file mode 100644 index 000000000..3b96611f0 --- /dev/null +++ b/soh/assets/custom/objects/object_keyring/gKeyringKeysFireTempleDL_vtx_0 @@ -0,0 +1,806 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_keyring/gKeyringKeysFireTempleMQDL b/soh/assets/custom/objects/object_keyring/gKeyringKeysFireTempleMQDL new file mode 100644 index 000000000..3d81cd28b --- /dev/null +++ b/soh/assets/custom/objects/object_keyring/gKeyringKeysFireTempleMQDL @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_keyring/gKeyringKeysFireTempleMQDL_tri_0 b/soh/assets/custom/objects/object_keyring/gKeyringKeysFireTempleMQDL_tri_0 new file mode 100644 index 000000000..ca8d79f15 --- /dev/null +++ b/soh/assets/custom/objects/object_keyring/gKeyringKeysFireTempleMQDL_tri_0 @@ -0,0 +1,457 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_keyring/gKeyringKeysFireTempleMQDL_vtx_0 b/soh/assets/custom/objects/object_keyring/gKeyringKeysFireTempleMQDL_vtx_0 new file mode 100644 index 000000000..114ad7219 --- /dev/null +++ b/soh/assets/custom/objects/object_keyring/gKeyringKeysFireTempleMQDL_vtx_0 @@ -0,0 +1,502 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_keyring/gKeyringKeysForestTempleDL b/soh/assets/custom/objects/object_keyring/gKeyringKeysForestTempleDL new file mode 100644 index 000000000..74831c220 --- /dev/null +++ b/soh/assets/custom/objects/object_keyring/gKeyringKeysForestTempleDL @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_keyring/gKeyringKeysForestTempleDL_tri_0 b/soh/assets/custom/objects/object_keyring/gKeyringKeysForestTempleDL_tri_0 new file mode 100644 index 000000000..009f5a41d --- /dev/null +++ b/soh/assets/custom/objects/object_keyring/gKeyringKeysForestTempleDL_tri_0 @@ -0,0 +1,457 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_keyring/gKeyringKeysForestTempleDL_vtx_0 b/soh/assets/custom/objects/object_keyring/gKeyringKeysForestTempleDL_vtx_0 new file mode 100644 index 000000000..114ad7219 --- /dev/null +++ b/soh/assets/custom/objects/object_keyring/gKeyringKeysForestTempleDL_vtx_0 @@ -0,0 +1,502 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_keyring/gKeyringKeysForestTempleMQDL b/soh/assets/custom/objects/object_keyring/gKeyringKeysForestTempleMQDL new file mode 100644 index 000000000..33b2eaa3e --- /dev/null +++ b/soh/assets/custom/objects/object_keyring/gKeyringKeysForestTempleMQDL @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_keyring/gKeyringKeysForestTempleMQDL_tri_0 b/soh/assets/custom/objects/object_keyring/gKeyringKeysForestTempleMQDL_tri_0 new file mode 100644 index 000000000..491d44044 --- /dev/null +++ b/soh/assets/custom/objects/object_keyring/gKeyringKeysForestTempleMQDL_tri_0 @@ -0,0 +1,547 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_keyring/gKeyringKeysForestTempleMQDL_vtx_0 b/soh/assets/custom/objects/object_keyring/gKeyringKeysForestTempleMQDL_vtx_0 new file mode 100644 index 000000000..5331ba549 --- /dev/null +++ b/soh/assets/custom/objects/object_keyring/gKeyringKeysForestTempleMQDL_vtx_0 @@ -0,0 +1,605 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_keyring/gKeyringKeysGanonsCastleDL b/soh/assets/custom/objects/object_keyring/gKeyringKeysGanonsCastleDL new file mode 100644 index 000000000..693b894b9 --- /dev/null +++ b/soh/assets/custom/objects/object_keyring/gKeyringKeysGanonsCastleDL @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_keyring/gKeyringKeysGanonsCastleDL_tri_0 b/soh/assets/custom/objects/object_keyring/gKeyringKeysGanonsCastleDL_tri_0 new file mode 100644 index 000000000..0c059294f --- /dev/null +++ b/soh/assets/custom/objects/object_keyring/gKeyringKeysGanonsCastleDL_tri_0 @@ -0,0 +1,276 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_keyring/gKeyringKeysGanonsCastleDL_vtx_0 b/soh/assets/custom/objects/object_keyring/gKeyringKeysGanonsCastleDL_vtx_0 new file mode 100644 index 000000000..47d6419fc --- /dev/null +++ b/soh/assets/custom/objects/object_keyring/gKeyringKeysGanonsCastleDL_vtx_0 @@ -0,0 +1,301 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_keyring/gKeyringKeysGanonsCastleMQDL b/soh/assets/custom/objects/object_keyring/gKeyringKeysGanonsCastleMQDL new file mode 100644 index 000000000..fe6e93dd6 --- /dev/null +++ b/soh/assets/custom/objects/object_keyring/gKeyringKeysGanonsCastleMQDL @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_keyring/gKeyringKeysGanonsCastleMQDL_tri_0 b/soh/assets/custom/objects/object_keyring/gKeyringKeysGanonsCastleMQDL_tri_0 new file mode 100644 index 000000000..eae1fe0fd --- /dev/null +++ b/soh/assets/custom/objects/object_keyring/gKeyringKeysGanonsCastleMQDL_tri_0 @@ -0,0 +1,185 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_keyring/gKeyringKeysGanonsCastleMQDL_vtx_0 b/soh/assets/custom/objects/object_keyring/gKeyringKeysGanonsCastleMQDL_vtx_0 new file mode 100644 index 000000000..81ca9693a --- /dev/null +++ b/soh/assets/custom/objects/object_keyring/gKeyringKeysGanonsCastleMQDL_vtx_0 @@ -0,0 +1,203 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_keyring/gKeyringKeysGerudoFortressDL b/soh/assets/custom/objects/object_keyring/gKeyringKeysGerudoFortressDL new file mode 100644 index 000000000..71b8e23e4 --- /dev/null +++ b/soh/assets/custom/objects/object_keyring/gKeyringKeysGerudoFortressDL @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_keyring/gKeyringKeysGerudoFortressDL_tri_0 b/soh/assets/custom/objects/object_keyring/gKeyringKeysGerudoFortressDL_tri_0 new file mode 100644 index 000000000..5aa84af33 --- /dev/null +++ b/soh/assets/custom/objects/object_keyring/gKeyringKeysGerudoFortressDL_tri_0 @@ -0,0 +1,366 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_keyring/gKeyringKeysGerudoFortressDL_vtx_0 b/soh/assets/custom/objects/object_keyring/gKeyringKeysGerudoFortressDL_vtx_0 new file mode 100644 index 000000000..1005037ee --- /dev/null +++ b/soh/assets/custom/objects/object_keyring/gKeyringKeysGerudoFortressDL_vtx_0 @@ -0,0 +1,404 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_keyring/gKeyringKeysGerudoTrainingGroundDL b/soh/assets/custom/objects/object_keyring/gKeyringKeysGerudoTrainingGroundDL new file mode 100644 index 000000000..d01877e7b --- /dev/null +++ b/soh/assets/custom/objects/object_keyring/gKeyringKeysGerudoTrainingGroundDL @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_keyring/gKeyringKeysGerudoTrainingGroundDL_tri_0 b/soh/assets/custom/objects/object_keyring/gKeyringKeysGerudoTrainingGroundDL_tri_0 new file mode 100644 index 000000000..fd249043c --- /dev/null +++ b/soh/assets/custom/objects/object_keyring/gKeyringKeysGerudoTrainingGroundDL_tri_0 @@ -0,0 +1,819 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_keyring/gKeyringKeysGerudoTrainingGroundDL_vtx_0 b/soh/assets/custom/objects/object_keyring/gKeyringKeysGerudoTrainingGroundDL_vtx_0 new file mode 100644 index 000000000..bc91491ad --- /dev/null +++ b/soh/assets/custom/objects/object_keyring/gKeyringKeysGerudoTrainingGroundDL_vtx_0 @@ -0,0 +1,904 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_keyring/gKeyringKeysGerudoTrainingGroundMQDL b/soh/assets/custom/objects/object_keyring/gKeyringKeysGerudoTrainingGroundMQDL new file mode 100644 index 000000000..cb914449c --- /dev/null +++ b/soh/assets/custom/objects/object_keyring/gKeyringKeysGerudoTrainingGroundMQDL @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_keyring/gKeyringKeysGerudoTrainingGroundMQDL_tri_0 b/soh/assets/custom/objects/object_keyring/gKeyringKeysGerudoTrainingGroundMQDL_tri_0 new file mode 100644 index 000000000..5fb4d5f7e --- /dev/null +++ b/soh/assets/custom/objects/object_keyring/gKeyringKeysGerudoTrainingGroundMQDL_tri_0 @@ -0,0 +1,276 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_keyring/gKeyringKeysGerudoTrainingGroundMQDL_vtx_0 b/soh/assets/custom/objects/object_keyring/gKeyringKeysGerudoTrainingGroundMQDL_vtx_0 new file mode 100644 index 000000000..47d6419fc --- /dev/null +++ b/soh/assets/custom/objects/object_keyring/gKeyringKeysGerudoTrainingGroundMQDL_vtx_0 @@ -0,0 +1,301 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_keyring/gKeyringKeysShadowTempleDL b/soh/assets/custom/objects/object_keyring/gKeyringKeysShadowTempleDL new file mode 100644 index 000000000..7738f6244 --- /dev/null +++ b/soh/assets/custom/objects/object_keyring/gKeyringKeysShadowTempleDL @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_keyring/gKeyringKeysShadowTempleDL_tri_0 b/soh/assets/custom/objects/object_keyring/gKeyringKeysShadowTempleDL_tri_0 new file mode 100644 index 000000000..612359c24 --- /dev/null +++ b/soh/assets/custom/objects/object_keyring/gKeyringKeysShadowTempleDL_tri_0 @@ -0,0 +1,457 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_keyring/gKeyringKeysShadowTempleDL_vtx_0 b/soh/assets/custom/objects/object_keyring/gKeyringKeysShadowTempleDL_vtx_0 new file mode 100644 index 000000000..114ad7219 --- /dev/null +++ b/soh/assets/custom/objects/object_keyring/gKeyringKeysShadowTempleDL_vtx_0 @@ -0,0 +1,502 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_keyring/gKeyringKeysShadowTempleMQDL b/soh/assets/custom/objects/object_keyring/gKeyringKeysShadowTempleMQDL new file mode 100644 index 000000000..d9b35ef41 --- /dev/null +++ b/soh/assets/custom/objects/object_keyring/gKeyringKeysShadowTempleMQDL @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_keyring/gKeyringKeysShadowTempleMQDL_tri_0 b/soh/assets/custom/objects/object_keyring/gKeyringKeysShadowTempleMQDL_tri_0 new file mode 100644 index 000000000..d5f911605 --- /dev/null +++ b/soh/assets/custom/objects/object_keyring/gKeyringKeysShadowTempleMQDL_tri_0 @@ -0,0 +1,547 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_keyring/gKeyringKeysShadowTempleMQDL_vtx_0 b/soh/assets/custom/objects/object_keyring/gKeyringKeysShadowTempleMQDL_vtx_0 new file mode 100644 index 000000000..5331ba549 --- /dev/null +++ b/soh/assets/custom/objects/object_keyring/gKeyringKeysShadowTempleMQDL_vtx_0 @@ -0,0 +1,605 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_keyring/gKeyringKeysSpiritTempleDL b/soh/assets/custom/objects/object_keyring/gKeyringKeysSpiritTempleDL new file mode 100644 index 000000000..f2f531e39 --- /dev/null +++ b/soh/assets/custom/objects/object_keyring/gKeyringKeysSpiritTempleDL @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_keyring/gKeyringKeysSpiritTempleDL_tri_0 b/soh/assets/custom/objects/object_keyring/gKeyringKeysSpiritTempleDL_tri_0 new file mode 100644 index 000000000..34e3d25b2 --- /dev/null +++ b/soh/assets/custom/objects/object_keyring/gKeyringKeysSpiritTempleDL_tri_0 @@ -0,0 +1,457 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_keyring/gKeyringKeysSpiritTempleDL_vtx_0 b/soh/assets/custom/objects/object_keyring/gKeyringKeysSpiritTempleDL_vtx_0 new file mode 100644 index 000000000..114ad7219 --- /dev/null +++ b/soh/assets/custom/objects/object_keyring/gKeyringKeysSpiritTempleDL_vtx_0 @@ -0,0 +1,502 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_keyring/gKeyringKeysSpiritTempleMQDL b/soh/assets/custom/objects/object_keyring/gKeyringKeysSpiritTempleMQDL new file mode 100644 index 000000000..1a6058c23 --- /dev/null +++ b/soh/assets/custom/objects/object_keyring/gKeyringKeysSpiritTempleMQDL @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_keyring/gKeyringKeysSpiritTempleMQDL_tri_0 b/soh/assets/custom/objects/object_keyring/gKeyringKeysSpiritTempleMQDL_tri_0 new file mode 100644 index 000000000..a4c7b6c8a --- /dev/null +++ b/soh/assets/custom/objects/object_keyring/gKeyringKeysSpiritTempleMQDL_tri_0 @@ -0,0 +1,638 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_keyring/gKeyringKeysSpiritTempleMQDL_vtx_0 b/soh/assets/custom/objects/object_keyring/gKeyringKeysSpiritTempleMQDL_vtx_0 new file mode 100644 index 000000000..b32d9fd51 --- /dev/null +++ b/soh/assets/custom/objects/object_keyring/gKeyringKeysSpiritTempleMQDL_vtx_0 @@ -0,0 +1,703 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_keyring/gKeyringKeysTreasureChestGameDL b/soh/assets/custom/objects/object_keyring/gKeyringKeysTreasureChestGameDL new file mode 100644 index 000000000..69c9d7a9f --- /dev/null +++ b/soh/assets/custom/objects/object_keyring/gKeyringKeysTreasureChestGameDL @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_keyring/gKeyringKeysTreasureChestGameDL_tri_0 b/soh/assets/custom/objects/object_keyring/gKeyringKeysTreasureChestGameDL_tri_0 new file mode 100644 index 000000000..548ac5731 --- /dev/null +++ b/soh/assets/custom/objects/object_keyring/gKeyringKeysTreasureChestGameDL_tri_0 @@ -0,0 +1,366 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_keyring/gKeyringKeysTreasureChestGameDL_vtx_0 b/soh/assets/custom/objects/object_keyring/gKeyringKeysTreasureChestGameDL_vtx_0 new file mode 100644 index 000000000..1005037ee --- /dev/null +++ b/soh/assets/custom/objects/object_keyring/gKeyringKeysTreasureChestGameDL_vtx_0 @@ -0,0 +1,404 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_keyring/gKeyringKeysWaterTempleDL b/soh/assets/custom/objects/object_keyring/gKeyringKeysWaterTempleDL new file mode 100644 index 000000000..72868b384 --- /dev/null +++ b/soh/assets/custom/objects/object_keyring/gKeyringKeysWaterTempleDL @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_keyring/gKeyringKeysWaterTempleDL_tri_0 b/soh/assets/custom/objects/object_keyring/gKeyringKeysWaterTempleDL_tri_0 new file mode 100644 index 000000000..5ef106903 --- /dev/null +++ b/soh/assets/custom/objects/object_keyring/gKeyringKeysWaterTempleDL_tri_0 @@ -0,0 +1,547 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_keyring/gKeyringKeysWaterTempleDL_vtx_0 b/soh/assets/custom/objects/object_keyring/gKeyringKeysWaterTempleDL_vtx_0 new file mode 100644 index 000000000..5331ba549 --- /dev/null +++ b/soh/assets/custom/objects/object_keyring/gKeyringKeysWaterTempleDL_vtx_0 @@ -0,0 +1,605 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_keyring/gKeyringKeysWaterTempleMQDL b/soh/assets/custom/objects/object_keyring/gKeyringKeysWaterTempleMQDL new file mode 100644 index 000000000..1394e1eb9 --- /dev/null +++ b/soh/assets/custom/objects/object_keyring/gKeyringKeysWaterTempleMQDL @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_keyring/gKeyringKeysWaterTempleMQDL_tri_0 b/soh/assets/custom/objects/object_keyring/gKeyringKeysWaterTempleMQDL_tri_0 new file mode 100644 index 000000000..e81ea815f --- /dev/null +++ b/soh/assets/custom/objects/object_keyring/gKeyringKeysWaterTempleMQDL_tri_0 @@ -0,0 +1,185 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_keyring/gKeyringKeysWaterTempleMQDL_vtx_0 b/soh/assets/custom/objects/object_keyring/gKeyringKeysWaterTempleMQDL_vtx_0 new file mode 100644 index 000000000..81ca9693a --- /dev/null +++ b/soh/assets/custom/objects/object_keyring/gKeyringKeysWaterTempleMQDL_vtx_0 @@ -0,0 +1,203 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_keyring/gKeyringRingDL b/soh/assets/custom/objects/object_keyring/gKeyringRingDL new file mode 100644 index 000000000..8939b439e --- /dev/null +++ b/soh/assets/custom/objects/object_keyring/gKeyringRingDL @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_keyring/gKeyringRingDL_tri_0 b/soh/assets/custom/objects/object_keyring/gKeyringRingDL_tri_0 new file mode 100644 index 000000000..1e143c948 --- /dev/null +++ b/soh/assets/custom/objects/object_keyring/gKeyringRingDL_tri_0 @@ -0,0 +1,184 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_keyring/gKeyringRingDL_vtx_0 b/soh/assets/custom/objects/object_keyring/gKeyringRingDL_vtx_0 new file mode 100644 index 000000000..4008f3806 --- /dev/null +++ b/soh/assets/custom/objects/object_keyring/gKeyringRingDL_vtx_0 @@ -0,0 +1,193 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_keyring/mat_gKeyringIconBottomoftheWellDL_f3dlite_IconMetal_BottomoftheWell b/soh/assets/custom/objects/object_keyring/mat_gKeyringIconBottomoftheWellDL_f3dlite_IconMetal_BottomoftheWell new file mode 100644 index 000000000..a76e9f9bd --- /dev/null +++ b/soh/assets/custom/objects/object_keyring/mat_gKeyringIconBottomoftheWellDL_f3dlite_IconMetal_BottomoftheWell @@ -0,0 +1,20 @@ + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_keyring/mat_gKeyringIconFireTempleDL_f3dlite_IconMetal_FireTemple b/soh/assets/custom/objects/object_keyring/mat_gKeyringIconFireTempleDL_f3dlite_IconMetal_FireTemple new file mode 100644 index 000000000..a76e9f9bd --- /dev/null +++ b/soh/assets/custom/objects/object_keyring/mat_gKeyringIconFireTempleDL_f3dlite_IconMetal_FireTemple @@ -0,0 +1,20 @@ + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_keyring/mat_gKeyringIconForestTempleDL_f3dlite_IconMetal_ForestTemple b/soh/assets/custom/objects/object_keyring/mat_gKeyringIconForestTempleDL_f3dlite_IconMetal_ForestTemple new file mode 100644 index 000000000..a76e9f9bd --- /dev/null +++ b/soh/assets/custom/objects/object_keyring/mat_gKeyringIconForestTempleDL_f3dlite_IconMetal_ForestTemple @@ -0,0 +1,20 @@ + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_keyring/mat_gKeyringIconGanonsCastleDL_f3dlite_IconMetal_GanonsCastle b/soh/assets/custom/objects/object_keyring/mat_gKeyringIconGanonsCastleDL_f3dlite_IconMetal_GanonsCastle new file mode 100644 index 000000000..a76e9f9bd --- /dev/null +++ b/soh/assets/custom/objects/object_keyring/mat_gKeyringIconGanonsCastleDL_f3dlite_IconMetal_GanonsCastle @@ -0,0 +1,20 @@ + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_keyring/mat_gKeyringIconGerudoFortressDL_f3dlite_IconMetal_GerudoFortress b/soh/assets/custom/objects/object_keyring/mat_gKeyringIconGerudoFortressDL_f3dlite_IconMetal_GerudoFortress new file mode 100644 index 000000000..b5755b4a8 --- /dev/null +++ b/soh/assets/custom/objects/object_keyring/mat_gKeyringIconGerudoFortressDL_f3dlite_IconMetal_GerudoFortress @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_keyring/mat_gKeyringIconGerudoTrainingGroundDL_f3dlite_IconMetal_GerudoTrainingGround b/soh/assets/custom/objects/object_keyring/mat_gKeyringIconGerudoTrainingGroundDL_f3dlite_IconMetal_GerudoTrainingGround new file mode 100644 index 000000000..a76e9f9bd --- /dev/null +++ b/soh/assets/custom/objects/object_keyring/mat_gKeyringIconGerudoTrainingGroundDL_f3dlite_IconMetal_GerudoTrainingGround @@ -0,0 +1,20 @@ + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_keyring/mat_gKeyringIconShadowTempleDL_f3dlite_IconMetal_ShadowTemple b/soh/assets/custom/objects/object_keyring/mat_gKeyringIconShadowTempleDL_f3dlite_IconMetal_ShadowTemple new file mode 100644 index 000000000..a76e9f9bd --- /dev/null +++ b/soh/assets/custom/objects/object_keyring/mat_gKeyringIconShadowTempleDL_f3dlite_IconMetal_ShadowTemple @@ -0,0 +1,20 @@ + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_keyring/mat_gKeyringIconSpiritTempleDL_f3dlite_IconMetal_SpiritTemple b/soh/assets/custom/objects/object_keyring/mat_gKeyringIconSpiritTempleDL_f3dlite_IconMetal_SpiritTemple new file mode 100644 index 000000000..a76e9f9bd --- /dev/null +++ b/soh/assets/custom/objects/object_keyring/mat_gKeyringIconSpiritTempleDL_f3dlite_IconMetal_SpiritTemple @@ -0,0 +1,20 @@ + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_keyring/mat_gKeyringIconTreasureChestGameDL_f3dlite_IconMetal_TreasureChestGame b/soh/assets/custom/objects/object_keyring/mat_gKeyringIconTreasureChestGameDL_f3dlite_IconMetal_TreasureChestGame new file mode 100644 index 000000000..a76e9f9bd --- /dev/null +++ b/soh/assets/custom/objects/object_keyring/mat_gKeyringIconTreasureChestGameDL_f3dlite_IconMetal_TreasureChestGame @@ -0,0 +1,20 @@ + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_keyring/mat_gKeyringIconWaterTempleDL_f3dlite_IconMetal_WaterTemple b/soh/assets/custom/objects/object_keyring/mat_gKeyringIconWaterTempleDL_f3dlite_IconMetal_WaterTemple new file mode 100644 index 000000000..a76e9f9bd --- /dev/null +++ b/soh/assets/custom/objects/object_keyring/mat_gKeyringIconWaterTempleDL_f3dlite_IconMetal_WaterTemple @@ -0,0 +1,20 @@ + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_keyring/mat_gKeyringKeysBottomoftheWellDL_f3dlite_KeyMetal_BottomoftheWell b/soh/assets/custom/objects/object_keyring/mat_gKeyringKeysBottomoftheWellDL_f3dlite_KeyMetal_BottomoftheWell new file mode 100644 index 000000000..fafddd268 --- /dev/null +++ b/soh/assets/custom/objects/object_keyring/mat_gKeyringKeysBottomoftheWellDL_f3dlite_KeyMetal_BottomoftheWell @@ -0,0 +1,20 @@ + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_keyring/mat_gKeyringKeysBottomoftheWellMQDL_f3dlite_KeyMetal_BottomoftheWell b/soh/assets/custom/objects/object_keyring/mat_gKeyringKeysBottomoftheWellMQDL_f3dlite_KeyMetal_BottomoftheWell new file mode 100644 index 000000000..fafddd268 --- /dev/null +++ b/soh/assets/custom/objects/object_keyring/mat_gKeyringKeysBottomoftheWellMQDL_f3dlite_KeyMetal_BottomoftheWell @@ -0,0 +1,20 @@ + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_keyring/mat_gKeyringKeysFireTempleDL_f3dlite_KeyMetal_FireTemple b/soh/assets/custom/objects/object_keyring/mat_gKeyringKeysFireTempleDL_f3dlite_KeyMetal_FireTemple new file mode 100644 index 000000000..fafddd268 --- /dev/null +++ b/soh/assets/custom/objects/object_keyring/mat_gKeyringKeysFireTempleDL_f3dlite_KeyMetal_FireTemple @@ -0,0 +1,20 @@ + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_keyring/mat_gKeyringKeysFireTempleMQDL_f3dlite_KeyMetal_FireTemple b/soh/assets/custom/objects/object_keyring/mat_gKeyringKeysFireTempleMQDL_f3dlite_KeyMetal_FireTemple new file mode 100644 index 000000000..fafddd268 --- /dev/null +++ b/soh/assets/custom/objects/object_keyring/mat_gKeyringKeysFireTempleMQDL_f3dlite_KeyMetal_FireTemple @@ -0,0 +1,20 @@ + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_keyring/mat_gKeyringKeysForestTempleDL_f3dlite_KeyMetal_ForestTemple b/soh/assets/custom/objects/object_keyring/mat_gKeyringKeysForestTempleDL_f3dlite_KeyMetal_ForestTemple new file mode 100644 index 000000000..fafddd268 --- /dev/null +++ b/soh/assets/custom/objects/object_keyring/mat_gKeyringKeysForestTempleDL_f3dlite_KeyMetal_ForestTemple @@ -0,0 +1,20 @@ + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_keyring/mat_gKeyringKeysForestTempleMQDL_f3dlite_KeyMetal_ForestTemple b/soh/assets/custom/objects/object_keyring/mat_gKeyringKeysForestTempleMQDL_f3dlite_KeyMetal_ForestTemple new file mode 100644 index 000000000..fafddd268 --- /dev/null +++ b/soh/assets/custom/objects/object_keyring/mat_gKeyringKeysForestTempleMQDL_f3dlite_KeyMetal_ForestTemple @@ -0,0 +1,20 @@ + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_keyring/mat_gKeyringKeysGanonsCastleDL_f3dlite_KeyMetal_GanonsCastle b/soh/assets/custom/objects/object_keyring/mat_gKeyringKeysGanonsCastleDL_f3dlite_KeyMetal_GanonsCastle new file mode 100644 index 000000000..fafddd268 --- /dev/null +++ b/soh/assets/custom/objects/object_keyring/mat_gKeyringKeysGanonsCastleDL_f3dlite_KeyMetal_GanonsCastle @@ -0,0 +1,20 @@ + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_keyring/mat_gKeyringKeysGanonsCastleMQDL_f3dlite_KeyMetal_GanonsCastle b/soh/assets/custom/objects/object_keyring/mat_gKeyringKeysGanonsCastleMQDL_f3dlite_KeyMetal_GanonsCastle new file mode 100644 index 000000000..fafddd268 --- /dev/null +++ b/soh/assets/custom/objects/object_keyring/mat_gKeyringKeysGanonsCastleMQDL_f3dlite_KeyMetal_GanonsCastle @@ -0,0 +1,20 @@ + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_keyring/mat_gKeyringKeysGerudoFortressDL_f3dlite_KeyMetal_GerudoFortress b/soh/assets/custom/objects/object_keyring/mat_gKeyringKeysGerudoFortressDL_f3dlite_KeyMetal_GerudoFortress new file mode 100644 index 000000000..fafddd268 --- /dev/null +++ b/soh/assets/custom/objects/object_keyring/mat_gKeyringKeysGerudoFortressDL_f3dlite_KeyMetal_GerudoFortress @@ -0,0 +1,20 @@ + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_keyring/mat_gKeyringKeysGerudoTrainingGroundDL_f3dlite_KeyMetal_GerudoTrainingGround b/soh/assets/custom/objects/object_keyring/mat_gKeyringKeysGerudoTrainingGroundDL_f3dlite_KeyMetal_GerudoTrainingGround new file mode 100644 index 000000000..fafddd268 --- /dev/null +++ b/soh/assets/custom/objects/object_keyring/mat_gKeyringKeysGerudoTrainingGroundDL_f3dlite_KeyMetal_GerudoTrainingGround @@ -0,0 +1,20 @@ + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_keyring/mat_gKeyringKeysGerudoTrainingGroundMQDL_f3dlite_KeyMetal_GerudoTrainingGround b/soh/assets/custom/objects/object_keyring/mat_gKeyringKeysGerudoTrainingGroundMQDL_f3dlite_KeyMetal_GerudoTrainingGround new file mode 100644 index 000000000..fafddd268 --- /dev/null +++ b/soh/assets/custom/objects/object_keyring/mat_gKeyringKeysGerudoTrainingGroundMQDL_f3dlite_KeyMetal_GerudoTrainingGround @@ -0,0 +1,20 @@ + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_keyring/mat_gKeyringKeysShadowTempleDL_f3dlite_KeyMetal_ShadowTemple b/soh/assets/custom/objects/object_keyring/mat_gKeyringKeysShadowTempleDL_f3dlite_KeyMetal_ShadowTemple new file mode 100644 index 000000000..fafddd268 --- /dev/null +++ b/soh/assets/custom/objects/object_keyring/mat_gKeyringKeysShadowTempleDL_f3dlite_KeyMetal_ShadowTemple @@ -0,0 +1,20 @@ + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_keyring/mat_gKeyringKeysShadowTempleMQDL_f3dlite_KeyMetal_ShadowTemple b/soh/assets/custom/objects/object_keyring/mat_gKeyringKeysShadowTempleMQDL_f3dlite_KeyMetal_ShadowTemple new file mode 100644 index 000000000..fafddd268 --- /dev/null +++ b/soh/assets/custom/objects/object_keyring/mat_gKeyringKeysShadowTempleMQDL_f3dlite_KeyMetal_ShadowTemple @@ -0,0 +1,20 @@ + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_keyring/mat_gKeyringKeysSpiritTempleDL_f3dlite_KeyMetal_SpiritTemple b/soh/assets/custom/objects/object_keyring/mat_gKeyringKeysSpiritTempleDL_f3dlite_KeyMetal_SpiritTemple new file mode 100644 index 000000000..fafddd268 --- /dev/null +++ b/soh/assets/custom/objects/object_keyring/mat_gKeyringKeysSpiritTempleDL_f3dlite_KeyMetal_SpiritTemple @@ -0,0 +1,20 @@ + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_keyring/mat_gKeyringKeysSpiritTempleMQDL_f3dlite_KeyMetal_SpiritTemple b/soh/assets/custom/objects/object_keyring/mat_gKeyringKeysSpiritTempleMQDL_f3dlite_KeyMetal_SpiritTemple new file mode 100644 index 000000000..fafddd268 --- /dev/null +++ b/soh/assets/custom/objects/object_keyring/mat_gKeyringKeysSpiritTempleMQDL_f3dlite_KeyMetal_SpiritTemple @@ -0,0 +1,20 @@ + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_keyring/mat_gKeyringKeysTreasureChestGameDL_f3dlite_KeyMetal_TreasureChestGame b/soh/assets/custom/objects/object_keyring/mat_gKeyringKeysTreasureChestGameDL_f3dlite_KeyMetal_TreasureChestGame new file mode 100644 index 000000000..fafddd268 --- /dev/null +++ b/soh/assets/custom/objects/object_keyring/mat_gKeyringKeysTreasureChestGameDL_f3dlite_KeyMetal_TreasureChestGame @@ -0,0 +1,20 @@ + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_keyring/mat_gKeyringKeysWaterTempleDL_f3dlite_KeyMetal_WaterTemple b/soh/assets/custom/objects/object_keyring/mat_gKeyringKeysWaterTempleDL_f3dlite_KeyMetal_WaterTemple new file mode 100644 index 000000000..fafddd268 --- /dev/null +++ b/soh/assets/custom/objects/object_keyring/mat_gKeyringKeysWaterTempleDL_f3dlite_KeyMetal_WaterTemple @@ -0,0 +1,20 @@ + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_keyring/mat_gKeyringKeysWaterTempleMQDL_f3dlite_KeyMetal_WaterTemple b/soh/assets/custom/objects/object_keyring/mat_gKeyringKeysWaterTempleMQDL_f3dlite_KeyMetal_WaterTemple new file mode 100644 index 000000000..fafddd268 --- /dev/null +++ b/soh/assets/custom/objects/object_keyring/mat_gKeyringKeysWaterTempleMQDL_f3dlite_KeyMetal_WaterTemple @@ -0,0 +1,20 @@ + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_keyring/mat_gKeyringRingDL_f3dlite_KeyRingMetal b/soh/assets/custom/objects/object_keyring/mat_gKeyringRingDL_f3dlite_KeyRingMetal new file mode 100644 index 000000000..fafddd268 --- /dev/null +++ b/soh/assets/custom/objects/object_keyring/mat_gKeyringRingDL_f3dlite_KeyRingMetal @@ -0,0 +1,20 @@ + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/textures/parameter_static/gBossSoul.rgba32.png b/soh/assets/custom/textures/parameter_static/gBossSoul.rgba32.png old mode 100755 new mode 100644 index 9fe2ac404..4e60a4995 Binary files a/soh/assets/custom/textures/parameter_static/gBossSoul.rgba32.png and b/soh/assets/custom/textures/parameter_static/gBossSoul.rgba32.png differ diff --git a/soh/assets/objects/object_shopnuts/object_shopnuts.h b/soh/assets/objects/object_shopnuts/object_shopnuts.h index f7408c648..a5879943b 100644 --- a/soh/assets/objects/object_shopnuts/object_shopnuts.h +++ b/soh/assets/objects/object_shopnuts/object_shopnuts.h @@ -102,8 +102,8 @@ static const ALIGN_ASSET(2) char gBusinessScrubNervousIdleAnim[] = dgBusinessScr #define dgBusinessScrubAnim_139C "__OTR__objects/object_shopnuts/gBusinessScrubAnim_139C" static const ALIGN_ASSET(2) char gBusinessScrubAnim_139C[] = dgBusinessScrubAnim_139C; -#define dgBusinessScrubAnim_4404 "__OTR__objects/object_shopnuts/gBusinessScrubAnim_4404" -static const ALIGN_ASSET(2) char gBusinessScrubAnim_4404[] = dgBusinessScrubAnim_4404; +#define dgBusinessScrubLeaveBurrowAnim "__OTR__objects/object_shopnuts/gBusinessScrubLeaveBurrowAnim" +static const ALIGN_ASSET(2) char gBusinessScrubLeaveBurrowAnim[] = dgBusinessScrubLeaveBurrowAnim; #define dgBusinessScrubAnim_4574 "__OTR__objects/object_shopnuts/gBusinessScrubAnim_4574" static const ALIGN_ASSET(2) char gBusinessScrubAnim_4574[] = dgBusinessScrubAnim_4574; diff --git a/soh/assets/soh_assets.h b/soh/assets/soh_assets.h index 894be4106..ace158854 100644 --- a/soh/assets/soh_assets.h +++ b/soh/assets/soh_assets.h @@ -83,6 +83,163 @@ static const ALIGN_ASSET(2) char gFishingPoleGiDL[] = dgFishingPoleGiDL; #define dgMysteryItemDL "__OTR__objects/object_mystery_item/gMysteryItemDL" static const ALIGN_ASSET(2) char gMysteryItemDL[] = dgMysteryItemDL; +#define dgBombchuBagBodyDL "__OTR__objects/object_bombchubag/gBombchuBagBodyDL" +static const ALIGN_ASSET(2) char gBombchuBagBodyDL[] = dgBombchuBagBodyDL; + +#define dgBombchuBagMaskDL "__OTR__objects/object_bombchubag/gBombchuBagMaskDL" +static const ALIGN_ASSET(2) char gBombchuBagMaskDL[] = dgBombchuBagMaskDL; + +//boss keys +#define dgBossKeyCustomDL "__OTR__objects/object_bosskey/gBossKeyCustomDL" +static const ALIGN_ASSET(2) char gBossKeyCustomDL[] = dgBossKeyCustomDL; + +#define dgBossKeyIconForestTempleDL "__OTR__objects/object_bosskey/gBossKeyIconForestTempleDL" +static const ALIGN_ASSET(2) char gBossKeyIconForestTempleDL[] = dgBossKeyIconForestTempleDL; + +#define dgBossKeyIconFireTempleDL "__OTR__objects/object_bosskey/gBossKeyIconFireTempleDL" +static const ALIGN_ASSET(2) char gBossKeyIconFireTempleDL[] = dgBossKeyIconFireTempleDL; + +#define dgBossKeyIconWaterTempleDL "__OTR__objects/object_bosskey/gBossKeyIconWaterTempleDL" +static const ALIGN_ASSET(2) char gBossKeyIconWaterTempleDL[] = dgBossKeyIconWaterTempleDL; + +#define dgBossKeyIconSpiritTempleDL "__OTR__objects/object_bosskey/gBossKeyIconSpiritTempleDL" +static const ALIGN_ASSET(2) char gBossKeyIconSpiritTempleDL[] = dgBossKeyIconSpiritTempleDL; + +#define dgBossKeyIconShadowTempleDL "__OTR__objects/object_bosskey/gBossKeyIconShadowTempleDL" +static const ALIGN_ASSET(2) char gBossKeyIconShadowTempleDL[] = dgBossKeyIconShadowTempleDL; + +#define dgBossKeyIconGanonsCastleDL "__OTR__objects/object_bosskey/gBossKeyIconGanonsCastleDL" +static const ALIGN_ASSET(2) char gBossKeyIconGanonsCastleDL[] = dgBossKeyIconGanonsCastleDL; + +//skeleton key +#define dgSkeletonKeyDL "__OTR__objects/object_key/gSkeletonKeyDL" +static const ALIGN_ASSET(2) char gSkeletonKeyDL[] = dgSkeletonKeyDL; + +//small keys +#define dgSmallKeyCustomDL "__OTR__objects/object_key/gSmallKeyCustomDL" +static const ALIGN_ASSET(2) char gSmallKeyCustomDL[] = dgSmallKeyCustomDL; + +#define dgSmallKeyIconForestTempleDL "__OTR__objects/object_key/gSmallKeyIconForestTempleDL" +static const ALIGN_ASSET(2) char gSmallKeyIconForestTempleDL[] = dgSmallKeyIconForestTempleDL; + +#define dgSmallKeyIconFireTempleDL "__OTR__objects/object_key/gSmallKeyIconFireTempleDL" +static const ALIGN_ASSET(2) char gSmallKeyIconFireTempleDL[] = dgSmallKeyIconFireTempleDL; + +#define dgSmallKeyIconWaterTempleDL "__OTR__objects/object_key/gSmallKeyIconWaterTempleDL" +static const ALIGN_ASSET(2) char gSmallKeyIconWaterTempleDL[] = dgSmallKeyIconWaterTempleDL; + +#define dgSmallKeyIconGerudoFortressDL "__OTR__objects/object_key/gSmallKeyIconGerudoFortressDL" +static const ALIGN_ASSET(2) char gSmallKeyIconGerudoFortressDL[] = dgSmallKeyIconGerudoFortressDL; + +#define dgSmallKeyIconGerudoTrainingGroundDL "__OTR__objects/object_key/gSmallKeyIconGerudoTrainingGroundDL" +static const ALIGN_ASSET(2) char gSmallKeyIconGerudoTrainingGroundDL[] = dgSmallKeyIconGerudoTrainingGroundDL; + +#define dgSmallKeyIconSpiritTempleDL "__OTR__objects/object_key/gSmallKeyIconSpiritTempleDL" +static const ALIGN_ASSET(2) char gSmallKeyIconSpiritTempleDL[] = dgSmallKeyIconSpiritTempleDL; + +#define dgSmallKeyIconBottomoftheWellDL "__OTR__objects/object_key/gSmallKeyIconBottomoftheWellDL" +static const ALIGN_ASSET(2) char gSmallKeyIconBottomoftheWellDL[] = dgSmallKeyIconBottomoftheWellDL; + +#define dgSmallKeyIconShadowTempleDL "__OTR__objects/object_key/gSmallKeyIconShadowTempleDL" +static const ALIGN_ASSET(2) char gSmallKeyIconShadowTempleDL[] = dgSmallKeyIconShadowTempleDL; + +#define dgSmallKeyIconGanonsCastleDL "__OTR__objects/object_key/gSmallKeyIconGanonsCastleDL" +static const ALIGN_ASSET(2) char gSmallKeyIconGanonsCastleDL[] = dgSmallKeyIconGanonsCastleDL; + +#define dgSmallKeyIconTreasureChestGameDL "__OTR__objects/object_key/gSmallKeyIconTreasureChestGameDL" +static const ALIGN_ASSET(2) char gSmallKeyIconTreasureChestGameDL[] = dgSmallKeyIconTreasureChestGameDL; + +//keyrings +#define dgKeyringRingDL "__OTR__objects/object_keyring/gKeyringRingDL" +static const ALIGN_ASSET(2) char gKeyringRingDL[] = dgKeyringRingDL; + +#define dgKeyringIconForestTempleDL "__OTR__objects/object_keyring/gKeyringIconForestTempleDL" +static const ALIGN_ASSET(2) char gKeyringIconForestTempleDL[] = dgKeyringIconForestTempleDL; + +#define dgKeyringIconFireTempleDL "__OTR__objects/object_keyring/gKeyringIconFireTempleDL" +static const ALIGN_ASSET(2) char gKeyringIconFireTempleDL[] = dgKeyringIconFireTempleDL; + +#define dgKeyringIconWaterTempleDL "__OTR__objects/object_keyring/gKeyringIconWaterTempleDL" +static const ALIGN_ASSET(2) char gKeyringIconWaterTempleDL[] = dgKeyringIconWaterTempleDL; + +#define dgKeyringIconGerudoFortressDL "__OTR__objects/object_keyring/gKeyringIconGerudoFortressDL" +static const ALIGN_ASSET(2) char gKeyringIconGerudoFortressDL[] = dgKeyringIconGerudoFortressDL; + +#define dgKeyringIconGerudoTrainingGroundDL "__OTR__objects/object_keyring/gKeyringIconGerudoTrainingGroundDL" +static const ALIGN_ASSET(2) char gKeyringIconGerudoTrainingGroundDL[] = dgKeyringIconGerudoTrainingGroundDL; + +#define dgKeyringIconSpiritTempleDL "__OTR__objects/object_keyring/gKeyringIconSpiritTempleDL" +static const ALIGN_ASSET(2) char gKeyringIconSpiritTempleDL[] = dgKeyringIconSpiritTempleDL; + +#define dgKeyringIconBottomoftheWellDL "__OTR__objects/object_keyring/gKeyringIconBottomoftheWellDL" +static const ALIGN_ASSET(2) char gKeyringIconBottomoftheWellDL[] = dgKeyringIconBottomoftheWellDL; + +#define dgKeyringIconShadowTempleDL "__OTR__objects/object_keyring/gKeyringIconShadowTempleDL" +static const ALIGN_ASSET(2) char gKeyringIconShadowTempleDL[] = dgKeyringIconShadowTempleDL; + +#define dgKeyringIconGanonsCastleDL "__OTR__objects/object_keyring/gKeyringIconGanonsCastleDL" +static const ALIGN_ASSET(2) char gKeyringIconGanonsCastleDL[] = dgKeyringIconGanonsCastleDL; + +#define dgKeyringIconTreasureChestGameDL "__OTR__objects/object_keyring/gKeyringIconTreasureChestGameDL" +static const ALIGN_ASSET(2) char gKeyringIconTreasureChestGameDL[] = dgKeyringIconTreasureChestGameDL; + +#define dgKeyringKeysForestTempleDL "__OTR__objects/object_keyring/gKeyringKeysForestTempleDL" +static const ALIGN_ASSET(2) char gKeyringKeysForestTempleDL[] = dgKeyringKeysForestTempleDL; + +#define dgKeyringKeysFireTempleDL "__OTR__objects/object_keyring/gKeyringKeysFireTempleDL" +static const ALIGN_ASSET(2) char gKeyringKeysFireTempleDL[] = dgKeyringKeysFireTempleDL; + +#define dgKeyringKeysWaterTempleDL "__OTR__objects/object_keyring/gKeyringKeysWaterTempleDL" +static const ALIGN_ASSET(2) char gKeyringKeysWaterTempleDL[] = dgKeyringKeysWaterTempleDL; + +#define dgKeyringKeysGerudoFortressDL "__OTR__objects/object_keyring/gKeyringKeysGerudoFortressDL" +static const ALIGN_ASSET(2) char gKeyringKeysGerudoFortressDL[] = dgKeyringKeysGerudoFortressDL; + +#define dgKeyringKeysGerudoTrainingGroundDL "__OTR__objects/object_keyring/gKeyringKeysGerudoTrainingGroundDL" +static const ALIGN_ASSET(2) char gKeyringKeysGerudoTrainingGroundDL[] = dgKeyringKeysGerudoTrainingGroundDL; + +#define dgKeyringKeysSpiritTempleDL "__OTR__objects/object_keyring/gKeyringKeysSpiritTempleDL" +static const ALIGN_ASSET(2) char gKeyringKeysSpiritTempleDL[] = dgKeyringKeysSpiritTempleDL; + +#define dgKeyringKeysBottomoftheWellDL "__OTR__objects/object_keyring/gKeyringKeysBottomoftheWellDL" +static const ALIGN_ASSET(2) char gKeyringKeysBottomoftheWellDL[] = dgKeyringKeysBottomoftheWellDL; + +#define dgKeyringKeysShadowTempleDL "__OTR__objects/object_keyring/gKeyringKeysShadowTempleDL" +static const ALIGN_ASSET(2) char gKeyringKeysShadowTempleDL[] = dgKeyringKeysShadowTempleDL; + +#define dgKeyringKeysGanonsCastleDL "__OTR__objects/object_keyring/gKeyringKeysGanonsCastleDL" +static const ALIGN_ASSET(2) char gKeyringKeysGanonsCastleDL[] = dgKeyringKeysGanonsCastleDL; + +#define dgKeyringKeysTreasureChestGameDL "__OTR__objects/object_keyring/gKeyringKeysTreasureChestGameDL" +static const ALIGN_ASSET(2) char gKeyringKeysTreasureChestGameDL[] = dgKeyringKeysTreasureChestGameDL; + +#define dgKeyringKeysForestTempleMQDL "__OTR__objects/object_keyring/gKeyringKeysForestTempleMQDL" +static const ALIGN_ASSET(2) char gKeyringKeysForestTempleMQDL[] = dgKeyringKeysForestTempleMQDL; + +#define dgKeyringKeysFireTempleMQDL "__OTR__objects/object_keyring/gKeyringKeysFireTempleMQDL" +static const ALIGN_ASSET(2) char gKeyringKeysFireTempleMQDL[] = dgKeyringKeysFireTempleMQDL; + +#define dgKeyringKeysWaterTempleMQDL "__OTR__objects/object_keyring/gKeyringKeysWaterTempleMQDL" +static const ALIGN_ASSET(2) char gKeyringKeysWaterTempleMQDL[] = dgKeyringKeysWaterTempleMQDL; + +#define dgKeyringKeysGerudoTrainingGroundMQDL "__OTR__objects/object_keyring/gKeyringKeysGerudoTrainingGroundMQDL" +static const ALIGN_ASSET(2) char gKeyringKeysGerudoTrainingGroundMQDL[] = dgKeyringKeysGerudoTrainingGroundMQDL; + +#define dgKeyringKeysSpiritTempleMQDL "__OTR__objects/object_keyring/gKeyringKeysSpiritTempleMQDL" +static const ALIGN_ASSET(2) char gKeyringKeysSpiritTempleMQDL[] = dgKeyringKeysSpiritTempleMQDL; + +#define dgKeyringKeysBottomoftheWellMQDL "__OTR__objects/object_keyring/gKeyringKeysBottomoftheWellMQDL" +static const ALIGN_ASSET(2) char gKeyringKeysBottomoftheWellMQDL[] = dgKeyringKeysBottomoftheWellMQDL; + +#define dgKeyringKeysShadowTempleMQDL "__OTR__objects/object_keyring/gKeyringKeysShadowTempleMQDL" +static const ALIGN_ASSET(2) char gKeyringKeysShadowTempleMQDL[] = dgKeyringKeysShadowTempleMQDL; + +#define dgKeyringKeysGanonsCastleMQDL "__OTR__objects/object_keyring/gKeyringKeysGanonsCastleMQDL" +static const ALIGN_ASSET(2) char gKeyringKeysGanonsCastleMQDL[] = dgKeyringKeysGanonsCastleMQDL; + +#define dgHouseKeyDL "__OTR__objects/object_housekey/gHouseKeyDL" +static const ALIGN_ASSET(2) char gHouseKeyDL[] = dgHouseKeyDL; + // overlays #define dgOptionsDividerChangeLangVtx "__OTR__overlays/ovl_file_choose/gOptionsDividerChangeLangVtx" static const ALIGN_ASSET(2) char gOptionsDividerChangeLangVtx[] = dgOptionsDividerChangeLangVtx; @@ -181,3 +338,10 @@ static const ALIGN_ASSET(2) char gLinkAdultGoronTunicSkel[] = dgLinkAdultGoronTu #define dgLinkAdultZoraTunicSkel "__OTR__objects/object_link_boy_zora/gLinkAdultZoraTunicSkel" static const ALIGN_ASSET(2) char gLinkAdultZoraTunicSkel[] = dgLinkAdultZoraTunicSkel; + +// LUS Logo +#define dgShipLogoDL "__OTR__textures/nintendo_rogo_static/gShipLogoDL" +static const ALIGN_ASSET(2) char gShipLogoDL[] = dgShipLogoDL; + +#define dnintendo_rogo_static_Tex_LUS_000000 "__OTR__textures/nintendo_rogo_static/nintendo_rogo_static_Tex_LUS_000000" +static const ALIGN_ASSET(2) char nintendo_rogo_static_Tex_LUS_000000[] = dnintendo_rogo_static_Tex_LUS_000000; diff --git a/soh/assets/xml/GC_MQ_D/objects/object_shopnuts.xml b/soh/assets/xml/GC_MQ_D/objects/object_shopnuts.xml index a4e12e38a..7065f8941 100644 --- a/soh/assets/xml/GC_MQ_D/objects/object_shopnuts.xml +++ b/soh/assets/xml/GC_MQ_D/objects/object_shopnuts.xml @@ -61,7 +61,7 @@ - + diff --git a/soh/assets/xml/GC_MQ_PAL_F/objects/object_shopnuts.xml b/soh/assets/xml/GC_MQ_PAL_F/objects/object_shopnuts.xml index a4e12e38a..7065f8941 100644 --- a/soh/assets/xml/GC_MQ_PAL_F/objects/object_shopnuts.xml +++ b/soh/assets/xml/GC_MQ_PAL_F/objects/object_shopnuts.xml @@ -61,7 +61,7 @@ - + diff --git a/soh/assets/xml/GC_NMQ_D/objects/object_shopnuts.xml b/soh/assets/xml/GC_NMQ_D/objects/object_shopnuts.xml index a4e12e38a..7065f8941 100644 --- a/soh/assets/xml/GC_NMQ_D/objects/object_shopnuts.xml +++ b/soh/assets/xml/GC_NMQ_D/objects/object_shopnuts.xml @@ -61,7 +61,7 @@ - + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_shopnuts.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_shopnuts.xml index a4e12e38a..7065f8941 100644 --- a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_shopnuts.xml +++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_shopnuts.xml @@ -61,7 +61,7 @@ - + diff --git a/soh/assets/xml/N64_PAL_10/objects/object_shopnuts.xml b/soh/assets/xml/N64_PAL_10/objects/object_shopnuts.xml index a4e12e38a..7065f8941 100644 --- a/soh/assets/xml/N64_PAL_10/objects/object_shopnuts.xml +++ b/soh/assets/xml/N64_PAL_10/objects/object_shopnuts.xml @@ -61,7 +61,7 @@ - + diff --git a/soh/assets/xml/N64_PAL_11/objects/object_shopnuts.xml b/soh/assets/xml/N64_PAL_11/objects/object_shopnuts.xml index a4e12e38a..7065f8941 100644 --- a/soh/assets/xml/N64_PAL_11/objects/object_shopnuts.xml +++ b/soh/assets/xml/N64_PAL_11/objects/object_shopnuts.xml @@ -61,7 +61,7 @@ - + diff --git a/soh/include/macros.h b/soh/include/macros.h index 5db738735..acff90f19 100644 --- a/soh/include/macros.h +++ b/soh/include/macros.h @@ -275,7 +275,12 @@ extern GraphicsContext* __gfxCtx; : (((a2) >= (a3)) ? (a2) : (((a3) >= (a1)) ? (a1) : (a3)))) #define MATRIX_TOMTX(dest) Matrix_ToMtx(dest, __FILE__, __LINE__) +#ifdef __cplusplus +#define MATRIX_NEWMTX(gfxCtx) Matrix_NewMtx(gfxCtx, const_cast(__FILE__), __LINE__) +#else #define MATRIX_NEWMTX(gfxCtx) Matrix_NewMtx(gfxCtx, __FILE__, __LINE__) +#endif + #define MATRIX_CHECKFLOATS(mf) Matrix_CheckFloats(mf, __FILE__, __LINE__) #define ZELDA_ARENA_MALLOC_DEBUG(size) ZeldaArena_MallocDebug(size, __FILE__, __LINE__) diff --git a/soh/include/z64actor.h b/soh/include/z64actor.h index 272237d21..6d8fd3ca0 100644 --- a/soh/include/z64actor.h +++ b/soh/include/z64actor.h @@ -94,34 +94,120 @@ typedef struct { /* 0x18 */ Vec3f feetPos[2]; // Update by using `Actor_SetFeetPos` in PostLimbDraw } ActorShape; // size = 0x30 -#define ACTOR_FLAG_TARGETABLE (1 << 0) +// Actor is discoverable by the Attention System. This enables Navi to hover over the actor when it is in range. +// The actor can also be locked onto (as long as `ACTOR_FLAG_LOCK_ON_DISABLED` is not set). +#define ACTOR_FLAG_ATTENTION_ENABLED (1 << 0) + +// Actor is hostile toward the Player. Player has specific "battle" behavior when locked onto hostile actors. +// Enemy background music will also be played when the player is close enough to a hostile actor. +// Note: This must be paired with `ACTOR_FLAG_ATTENTION_ENABLED` to have any effect #define ACTOR_FLAG_HOSTILE (1 << 2) + +// Actor is considered "friendly"; Opposite flag of `ACTOR_FLAG_HOSTILE`. +// Note that this flag doesn't have any effect on either the actor, or Player's behavior. +// What actually matters is the presence or lack of `ACTOR_FLAG_HOSTILE`. #define ACTOR_FLAG_FRIENDLY (1 << 3) -#define ACTOR_FLAG_UPDATE_WHILE_CULLED (1 << 4) -#define ACTOR_FLAG_DRAW_WHILE_CULLED (1 << 5) -#define ACTOR_FLAG_ACTIVE (1 << 6) -#define ACTOR_FLAG_LENS (1 << 7) -#define ACTOR_FLAG_PLAYER_TALKED_TO (1 << 8) -#define ACTOR_FLAG_HOOKSHOT_DRAGS (1 << 9) -#define ACTOR_FLAG_DRAGGED_BY_HOOKSHOT (1 << 10) -#define ACTOR_FLAG_ENKUSA_CUT (1 << 11) + +// Culling of the actor's update process is disabled. +// In other words, the actor will keep updating even if the actor is outside its own culling volume. +// See `Actor_CullingCheck` for more information about culling. +// See `Actor_CullingVolumeTest` for more information on the test used to determine if an actor should be culled. +#define ACTOR_FLAG_UPDATE_CULLING_DISABLED (1 << 4) + +// Culling of the actor's draw process is disabled. +// In other words, the actor will keep drawing even if the actor is outside its own culling volume. +// See `Actor_CullingCheck` for more information about culling. +// See `Actor_CullingVolumeTest` for more information on the test used to determine if an actor should be culled. +// (The original name for this flag is `NO_CULL_DRAW`, known from the Majora's Mask Debug ROM) +#define ACTOR_FLAG_DRAW_CULLING_DISABLED (1 << 5) + +// Set if the actor is currently within the bounds of its culling volume. +// In most cases, this flag can be used to determine whether or not an actor is currently culled. +// However this flag still updates even if `ACTOR_FLAG_UPDATE_CULLING_DISABLED` or `ACTOR_FLAG_DRAW_CULLING_DISABLED` +// are set. Meaning, the flag can still have a value of "false" even if it is not actually culled. +// (The original name for this flag is `NO_CULL_FLAG`, known from the Majora's Mask Debug ROM) +#define ACTOR_FLAG_INSIDE_CULLING_VOLUME (1 << 6) + +// hidden or revealed by Lens of Truth (depending on room lensMode) +#define ACTOR_FLAG_REACT_TO_LENS (1 << 7) + +// Signals that player has accepted an offer to talk to an actor +// Player will retain this flag until the player is finished talking +// Actor will retain this flag until `Actor_TalkOfferAccepted` is called or manually turned off by the actor +#define ACTOR_FLAG_TALK (1 << 8) + +// When the hookshot attaches to this actor, the actor will be pulled back as the hookshot retracts. +#define ACTOR_FLAG_HOOKSHOT_PULLS_ACTOR (1 << 9) + +// When the hookshot attaches to this actor, Player will be pulled by the hookshot and fly to the actor. +#define ACTOR_FLAG_HOOKSHOT_PULLS_PLAYER (1 << 10) + +// A clump of grass (EN_KUSA) has been destroyed. +// This flag is used to communicate with the spawner actor (OBJ_MURE). +#define ACTOR_FLAG_GRASS_DESTROYED (1 << 11) + +// Actor will not shake when a quake occurs #define ACTOR_FLAG_IGNORE_QUAKE (1 << 12) + +// The hookshot is currently attached to this actor. +// The behavior that occurs after attachment is determined by `ACTOR_FLAG_HOOKSHOT_PULLS_ACTOR` and `ACTOR_FLAG_HOOKSHOT_PULLS_PLAYER`. +// If neither of those flags are set attachment cannot occur, and the hookshot will simply act as a damage source. +// +// This flag is also reused to indicate that an actor is attached to the boomerang. +// This only has an effect for Gold Skulltula Tokens (EN_SI) which has overlapping behavior for hookshot and boomerang. #define ACTOR_FLAG_HOOKSHOT_ATTACHED (1 << 13) -#define ACTOR_FLAG_ARROW_DRAGGABLE (1 << 14) -#define ACTOR_FLAG_DRAGGED_BY_ARROW (1 << 15) -#define ACTOR_FLAG_WILL_TALK (1 << 16) -#define ACTOR_FLAG_PILLAR_PICKUP (1 << 17) -#define ACTOR_FLAG_NAVI_HAS_INFO (1 << 18) -#define ACTOR_FLAG_SFX_AT_POS (1 << 19) -#define ACTOR_FLAG_SFX_AT_CENTER (1 << 20) -#define ACTOR_FLAG_SFX_AT_CENTER2 (1 << 21) + +// When hit by an arrow, the actor will be able to attach to the arrow and fly with it in the air +#define ACTOR_FLAG_CAN_ATTACH_TO_ARROW (1 << 14) + +// Actor is currently attached to an arrow and flying with it in the air +#define ACTOR_FLAG_ATTACHED_TO_ARROW (1 << 15) + +// Player automatically accepts a Talk Offer without needing to press the A button. +// Player still has to meet all conditions to be able to receive a talk offer (for example, being in range). +#define ACTOR_FLAG_TALK_OFFER_AUTO_ACCEPTED (1 << 16) + +// Actor will be influenced by the pitch (x rot) of Player's left hand when being carried, +// instead of Player's yaw which is the default actor carry behavior. +// This flag is helpful for something like the `BG_HEAVY_BLOCK` actor which Player carries underhanded. +#define ACTOR_FLAG_CARRY_X_ROT_INFLUENCE (1 << 17) + +// When locked onto an actor with this flag set, the C-Up button can be used to talk to this actor. +// A C-Up button labeled "Navi" will appear on the HUD when locked on which indicates the actor can be checked with Navi. +// With this flag Player talks directly to the actor with C-Up. It is expected that the resulting dialog should appear +// to be coming from Navi, even though she is not involved at all with this interaction. +#define ACTOR_FLAG_TALK_WITH_C_UP (1 << 18) + +// Flags controlling the use of `Actor.sfx`. Do not use directly. +#define ACTOR_FLAG_SFX_ACTOR_POS_2 (1 << 19) +#define ACTOR_AUDIO_FLAG_SFX_CENTERED_1 (1 << 20) +#define ACTOR_AUDIO_FLAG_SFX_CENTERED_2 (1 << 21) + +// ignores point lights but not directional lights (such as environment lights) #define ACTOR_FLAG_IGNORE_POINTLIGHTS (1 << 22) -#define ACTOR_FLAG_ALWAYS_THROWN (1 << 23) -#define ACTOR_FLAG_PLAY_HIT_SFX (1 << 24) -#define ACTOR_FLAG_NO_FREEZE_OCARINA (1 << 25) -#define ACTOR_FLAG_CAN_PRESS_SWITCH (1 << 26) -#define ACTOR_FLAG_NO_LOCKON (1 << 27) -#define ACTOR_FLAG_SFX_AS_TIMER (1 << 28) + +// When Player is carrying this actor, it can only be thrown, not dropped/placed. +// Typically an actor can only be thrown when moving, but this allows an actor to be thrown when standing still. +#define ACTOR_FLAG_THROW_ONLY (1 << 23) + +// When colliding with Player's body AC collider, a "thump" sound will play indicating his body has been hit +#define ACTOR_FLAG_SFX_FOR_PLAYER_BODY_HIT (1 << 24) + +// Actor can update even if Player is currently using the ocarina. +// Typically an actor will halt while the ocarina is active (depending on category). +// This flag allows a given actor to be an exception. +#define ACTOR_FLAG_UPDATE_DURING_OCARINA (1 << 25) + +// Actor can press and hold down switches. +// See usages of `DynaPolyActor_SetSwitchPressed` and `DynaPolyActor_IsSwitchPressed` for more context on how switches work. +#define ACTOR_FLAG_CAN_PRESS_SWITCHES (1 << 26) + +// Player is not able to lock onto the actor. +// Navi will still be able to hover over the actor, assuming `ACTOR_FLAG_ATTENTION_ENABLED` is set. +#define ACTOR_FLAG_LOCK_ON_DISABLED (1 << 27) + +// Flag controlling the use of `Actor.sfx`. Do not use directly. See Actor_PlaySfx_FlaggedTimer +#define ACTOR_FLAG_SFX_TIMER (1 << 28) typedef struct Actor { /* 0x000 */ s16 id; // Actor ID diff --git a/soh/include/z64save.h b/soh/include/z64save.h index 47a2d18c4..f59271212 100644 --- a/soh/include/z64save.h +++ b/soh/include/z64save.h @@ -157,6 +157,42 @@ typedef struct { char hintText[200]; } HintLocationRando; +#pragma region SoH + +typedef struct ShipRandomizerSaveContextData { + u16 adultTradeItems; + u8 triforcePiecesCollected; +} ShipRandomizerSaveContextData; + +typedef struct ShipBossRushSaveContextData { + u32 isPaused; + u8 options[BR_OPTIONS_MAX]; +} ShipBossRushSaveContextData; + +typedef union ShipQuestSpecificSaveContextData { + ShipRandomizerSaveContextData randomizer; + ShipBossRushSaveContextData bossRush; +} ShipQuestSpecificSaveContextData; + +typedef struct ShipQuestSaveContextData { + u8 id; + ShipQuestSpecificSaveContextData data; +} ShipQuestSaveContextData; + +typedef struct ShipSaveContextData { + u16 pendingSale; + u16 pendingSaleMod; + u8 pendingIceTrapCount; + SohStats stats; + FaroresWindData backupFW; + ShipQuestSaveContextData quest; + u8 maskMemory; + //TODO: Move non-rando specific flags to a new sohInf and move the remaining randomizerInf to ShipRandomizerSaveContextData + u16 randomizerInf[(RAND_INF_MAX + 15) / 16]; +} ShipSaveContextData; + +#pragma endregion + typedef struct { /* 0x0000 */ s32 entranceIndex; // start of `save` substruct, originally called "memory" /* 0x0004 */ s32 linkAge; // 0: Adult; 1: Child (see enum `LinkAge`) @@ -270,25 +306,7 @@ typedef struct { /* 0x1420 */ s16 worldMapArea; /* 0x1422 */ s16 sunsSongState; // controls the effects of suns song /* 0x1424 */ s16 healthAccumulator; - // #region SOH [General] - // Upstream TODO: Move these to their own struct or name to more obviously specific to SoH - /* */ u16 pendingSale; - /* */ u16 pendingSaleMod; - /* */ uint8_t questId; - /* */ uint32_t isBossRushPaused; - /* */ uint8_t bossRushOptions[BR_OPTIONS_MAX]; - /* */ u8 pendingIceTrapCount; - /* */ SohStats sohStats; - /* */ FaroresWindData backupFW; - /* */ u8 maskMemory; - // #endregion - // #region SOH [Randomizer] - // Upstream TODO: Move these to their own struct or name to more obviously specific to Randomizer - /* */ u16 randomizerInf[(RAND_INF_MAX + 15) / 16]; - /* */ u8 mqDungeonCount; - /* */ u16 adultTradeItems; - /* */ u8 triforcePiecesCollected; - // #endregion + /* */ ShipSaveContextData ship; } SaveContext; // size = 0x1428 typedef enum { @@ -298,10 +316,10 @@ typedef enum { /* 03 */ QUEST_BOSSRUSH, } Quest; -#define IS_VANILLA (gSaveContext.questId == QUEST_NORMAL) -#define IS_MASTER_QUEST (gSaveContext.questId == QUEST_MASTER) -#define IS_RANDO (gSaveContext.questId == QUEST_RANDOMIZER) -#define IS_BOSS_RUSH (gSaveContext.questId == QUEST_BOSSRUSH) +#define IS_VANILLA (gSaveContext.ship.quest.id == QUEST_NORMAL) +#define IS_MASTER_QUEST (gSaveContext.ship.quest.id == QUEST_MASTER) +#define IS_RANDO (gSaveContext.ship.quest.id == QUEST_RANDOMIZER) +#define IS_BOSS_RUSH (gSaveContext.ship.quest.id == QUEST_BOSSRUSH) typedef enum { /* 0x00 */ BTN_ENABLED, @@ -590,7 +608,7 @@ typedef enum { #define ITEMGETINF_08 0x08 #define ITEMGETINF_09 0x09 #define ITEMGETINF_0A 0x0A -#define ITEMGETINF_0B 0x0B +#define ITEMGETINF_DEKU_SCRUB_HEART_PIECE 0x0B #define ITEMGETINF_0C 0x0C #define ITEMGETINF_0D 0x0D #define ITEMGETINF_0E 0x0E @@ -760,8 +778,8 @@ typedef enum { #define INFTABLE_17F 0x17F #define INFTABLE_190 0x190 #define INFTABLE_191 0x191 -#define INFTABLE_192 0x192 -#define INFTABLE_193 0x193 +#define INFTABLE_BOUGHT_STICK_UPGRADE 0x192 +#define INFTABLE_BOUGHT_NUT_UPGRADE 0x193 #define INFTABLE_SPOKE_TO_KAEPORA_IN_LAKE_HYLIA 0x195 #define INFTABLE_196 0x196 #define INFTABLE_197 0x197 diff --git a/soh/soh/AboutWindow.cpp b/soh/soh/AboutWindow.cpp new file mode 100644 index 000000000..e5d51300c --- /dev/null +++ b/soh/soh/AboutWindow.cpp @@ -0,0 +1,103 @@ +#include "AboutWindow.h" +#include +#include +#include "soh/ResourceManagerHelpers.h" + +extern "C" { +#include "variables.h" +} + +AboutWindow::~AboutWindow() { + SPDLOG_TRACE("destruct about window"); +} + +void AboutWindow::InitElement() { + mIsTaggedVersion = gGitCommitTag[0] != 0; + + strncpy(mGitCommitHashTruncated, (char*)gGitCommitHash, 7); + mGitCommitHashTruncated[7] = 0; +} + +void AboutWindow::Draw() { + if (!IsVisible()) { + return; + } + + ImGuiWindowFlags windowFlags = ImGuiWindowFlags_AlwaysAutoResize | + ImGuiWindowFlags_NoResize | + ImGuiWindowFlags_NoDocking | + ImGuiWindowFlags_NoScrollWithMouse | + ImGuiWindowFlags_NoScrollbar; + + ImGui::PushStyleVar(ImGuiStyleVar_WindowPadding, ImVec2(16 * ImGui::GetIO().FontGlobalScale, 8 * ImGui::GetIO().FontGlobalScale)); + + if (!ImGui::Begin(GetName().c_str(), &mIsVisible, windowFlags)) { + ImGui::End(); + } else { + DrawElement(); + ImGui::End(); + } + + ImGui::PopStyleVar(); + + // Sync up the IsVisible flag if it was changed by ImGui + SyncVisibilityConsoleVariable(); +} + +const char* AboutWindow::GetGameVersionString(uint32_t index) { + uint32_t gameVersion = ResourceMgr_GetGameVersion(index); + switch (gameVersion) { + case OOT_NTSC_US_10: + return "NTSC-U 1.0"; + case OOT_NTSC_US_11: + return "NTSC-U 1.1"; + case OOT_NTSC_US_12: + return "NTSC-U 1.2"; + case OOT_PAL_10: + return "PAL 1.0"; + case OOT_PAL_11: + return "PAL 1.1"; + case OOT_PAL_GC: + return "PAL GC"; + case OOT_PAL_MQ: + return "PAL MQ"; + case OOT_PAL_GC_DBG1: + case OOT_PAL_GC_DBG2: + return "PAL GC-D"; + case OOT_PAL_GC_MQ_DBG: + return "PAL MQ-D"; + case OOT_IQUE_CN: + return "IQUE CN"; + case OOT_IQUE_TW: + return "IQUE TW"; + default: + return "UNKNOWN"; + } +} + +void AboutWindow::DrawElement() { + // The icon is already padded - adjust for that + ImVec2 cursorPos = ImGui::GetCursorScreenPos(); + cursorPos.x -= 16 * ImGui::GetIO().FontGlobalScale; + ImGui::SetCursorScreenPos(cursorPos); + + ImGui::Image(Ship::Context::GetInstance()->GetWindow()->GetGui()->GetTextureByName("Game_Icon"), ImVec2(64.0f * ImGui::GetIO().FontGlobalScale, 64.0f * ImGui::GetIO().FontGlobalScale)); + + ImGui::SameLine(); + + ImGui::BeginGroup(); + ImGui::Text("Ship of Harkinian"); + if (mIsTaggedVersion) { + ImGui::Text("%s", gBuildVersion); + } else { + ImGui::Text("%s", gGitBranch); + ImGui::Text("%s", mGitCommitHashTruncated); + } + ImGui::EndGroup(); + + ImGui::Dummy(ImVec2(0, 2 * ImGui::GetIO().FontGlobalScale)); + ImGui::Text("Game Archives:"); + for (uint32_t i = 0; i < ResourceMgr_GetNumGameVersions(); i++) { + ImGui::BulletText(GetGameVersionString(i)); + } +} diff --git a/soh/soh/AboutWindow.h b/soh/soh/AboutWindow.h new file mode 100644 index 000000000..5a731fdc1 --- /dev/null +++ b/soh/soh/AboutWindow.h @@ -0,0 +1,20 @@ +#pragma once + +#include + +class AboutWindow : public Ship::GuiWindow { + public: + using GuiWindow::GuiWindow; + ~AboutWindow(); + + private: + void InitElement() override; + void Draw() override; + void DrawElement() override; + void UpdateElement() override {}; + + const char* GetGameVersionString(uint32_t index); + + bool mIsTaggedVersion; + char mGitCommitHashTruncated[8]; +}; diff --git a/soh/soh/ActorDB.cpp b/soh/soh/ActorDB.cpp index 604d48804..880b2dab9 100644 --- a/soh/soh/ActorDB.cpp +++ b/soh/soh/ActorDB.cpp @@ -598,7 +598,7 @@ static ActorDBInit EnPartnerInit = { "En_Partner", "Ivan", ACTORCAT_ITEMACTION, - (ACTOR_FLAG_UPDATE_WHILE_CULLED | ACTOR_FLAG_DRAW_WHILE_CULLED | ACTOR_FLAG_DRAGGED_BY_HOOKSHOT | ACTOR_FLAG_CAN_PRESS_SWITCH), + (ACTOR_FLAG_UPDATE_CULLING_DISABLED | ACTOR_FLAG_DRAW_CULLING_DISABLED | ACTOR_FLAG_HOOKSHOT_PULLS_PLAYER | ACTOR_FLAG_CAN_PRESS_SWITCHES), OBJECT_GAMEPLAY_KEEP, sizeof(EnPartner), (ActorFunc)EnPartner_Init, diff --git a/soh/soh/Enhancements/Cheats/DekuStick.cpp b/soh/soh/Enhancements/Cheats/DekuStick.cpp new file mode 100644 index 000000000..8afa0e330 --- /dev/null +++ b/soh/soh/Enhancements/Cheats/DekuStick.cpp @@ -0,0 +1,27 @@ +#include +#include "soh/Enhancements/enhancementTypes.h" +#include "soh/Enhancements/game-interactor/GameInteractor_Hooks.h" +#include "soh/ShipInit.hpp" + +extern "C" { +extern PlayState* gPlayState; +#include "macros.h" +} + +#define CVAR_DEKU_STICK_NAME CVAR_CHEAT("DekuStick") +#define CVAR_DEKU_STICK_DEFAULT DEKU_STICK_NORMAL +#define CVAR_DEKU_STICK_VALUE CVarGetInteger(CVAR_DEKU_STICK_NAME, CVAR_DEKU_STICK_DEFAULT) + +void RegisterDekuStickCheats() { + COND_VB_SHOULD(VB_DEKU_STICK_BREAK, CVAR_DEKU_STICK_VALUE != DEKU_STICK_NORMAL, { *should = false; }); + COND_VB_SHOULD(VB_DEKU_STICK_BURN_OUT, CVAR_DEKU_STICK_VALUE != DEKU_STICK_NORMAL, { *should = false; }); + COND_VB_SHOULD(VB_DEKU_STICK_BURN_DOWN, CVAR_DEKU_STICK_VALUE != DEKU_STICK_NORMAL, { *should = false; }); + COND_VB_SHOULD(VB_DEKU_STICK_BE_ON_FIRE, CVAR_DEKU_STICK_VALUE == DEKU_STICK_UNBREAKABLE_AND_ALWAYS_ON_FIRE, { + Player* player = GET_PLAYER(gPlayState); + player->unk_860 = 200; // Keeps the stick's flame lit + player->unk_85C = 1.0f; // Ensures the stick is the proper length + *should = true; + }); +} + +static RegisterShipInitFunc initFunc(RegisterDekuStickCheats, { CVAR_DEKU_STICK_NAME }); diff --git a/soh/soh/Enhancements/Cheats/EasyFrameAdvance.cpp b/soh/soh/Enhancements/Cheats/EasyFrameAdvance.cpp new file mode 100644 index 000000000..ab7bba377 --- /dev/null +++ b/soh/soh/Enhancements/Cheats/EasyFrameAdvance.cpp @@ -0,0 +1,40 @@ +#include +#include "soh/Enhancements/game-interactor/GameInteractor_Hooks.h" +#include "soh/ShipInit.hpp" + +extern "C" { +#include "variables.h" +#include "overlays/misc/ovl_kaleido_scope/z_kaleido_scope.h" +} + +#define CVAR_FRAME_ADVANCE_NAME CVAR_CHEAT("EasyFrameAdvance") +#define CVAR_FRAME_ADVANCE_DEFAULT 0 +#define CVAR_FRAME_ADVANCE_VALUE CVarGetInteger(CVAR_FRAME_ADVANCE_NAME, CVAR_FRAME_ADVANCE_DEFAULT) + +static int frameAdvanceTimer = 0; +#define PAUSE_STATE_OFF 0 +#define PAUSE_STATE_UNPAUSE_CLOSE 19 + +void RegisterEasyFrameAdvance() { + COND_HOOK(OnGameStateMainStart, CVAR_FRAME_ADVANCE_VALUE, []() { + if (gPlayState == NULL) { + return; + } + + Input* input = &gPlayState->state.input[0]; + PauseContext* pauseCtx = &gPlayState->pauseCtx; + + if (frameAdvanceTimer > 0 && pauseCtx->state == PAUSE_STATE_OFF) { + frameAdvanceTimer--; + if (frameAdvanceTimer == 0 && CHECK_BTN_ALL(input->cur.button, BTN_START)) { + input->press.button |= BTN_START; + } + } + + if (pauseCtx->state == PAUSE_STATE_UNPAUSE_CLOSE) { + frameAdvanceTimer = 2; + } + }); +} + +static RegisterShipInitFunc initFunc(RegisterEasyFrameAdvance, { CVAR_FRAME_ADVANCE_NAME }); diff --git a/soh/soh/Enhancements/Cheats/EasyISG.cpp b/soh/soh/Enhancements/Cheats/EasyISG.cpp new file mode 100644 index 000000000..f48788a9d --- /dev/null +++ b/soh/soh/Enhancements/Cheats/EasyISG.cpp @@ -0,0 +1,27 @@ +#include +#include "soh/Enhancements/game-interactor/GameInteractor_Hooks.h" +#include "soh/ShipInit.hpp" + +extern "C" { +extern PlayState* gPlayState; +#include "macros.h" +} + +#define CVAR_EASY_ISG_NAME CVAR_CHEAT("EasyISG") +#define CVAR_EASY_ISG_DEFAULT 0 +#define CVAR_EASY_ISG_VALUE CVarGetInteger(CVAR_EASY_ISG_NAME, CVAR_EASY_ISG_DEFAULT) + +void OnGameFrameUpdateEasyISG() { + if (!GameInteractor::IsSaveLoaded(true)) { + return; + } + + Player* player = GET_PLAYER(gPlayState); + player->meleeWeaponState = 1; +} + +void RegisterEasyISG() { + COND_HOOK(OnGameFrameUpdate, CVAR_EASY_ISG_VALUE, OnGameFrameUpdateEasyISG); +} + +static RegisterShipInitFunc initFunc(RegisterEasyISG, { CVAR_EASY_ISG_NAME }); diff --git a/soh/soh/Enhancements/Cheats/EasyQPA.cpp b/soh/soh/Enhancements/Cheats/EasyQPA.cpp new file mode 100644 index 000000000..096123cdd --- /dev/null +++ b/soh/soh/Enhancements/Cheats/EasyQPA.cpp @@ -0,0 +1,28 @@ +#include +#include "soh/Enhancements/game-interactor/GameInteractor_Hooks.h" +#include "soh/ShipInit.hpp" + +extern "C" { +extern PlayState* gPlayState; +#include "macros.h" +} + +#define CVAR_EASY_QPA_NAME CVAR_CHEAT("EasyQPA") +#define CVAR_EASY_QPA_DEFAULT 0 +#define CVAR_EASY_QPA_VALUE CVarGetInteger(CVAR_EASY_QPA_NAME, CVAR_EASY_QPA_DEFAULT) + +void OnGameFrameUpdateEasyQPA() { + if (!GameInteractor::IsSaveLoaded(true)) { + return; + } + + Player* player = GET_PLAYER(gPlayState); + player->meleeWeaponQuads[0].info.toucher.dmgFlags = 0x16171617; + player->meleeWeaponQuads[1].info.toucher.dmgFlags = 0x16171617; +} + +void RegisterEasyQPA() { + COND_HOOK(OnGameFrameUpdate, CVAR_EASY_QPA_VALUE, OnGameFrameUpdateEasyQPA); +} + +static RegisterShipInitFunc initFunc(RegisterEasyQPA, { CVAR_EASY_QPA_NAME }); diff --git a/soh/soh/Enhancements/Cheats/FreezeTime.cpp b/soh/soh/Enhancements/Cheats/FreezeTime.cpp new file mode 100644 index 000000000..2296c4fc9 --- /dev/null +++ b/soh/soh/Enhancements/Cheats/FreezeTime.cpp @@ -0,0 +1,39 @@ +#include +#include "soh/Enhancements/game-interactor/GameInteractor_Hooks.h" +#include "soh/ShipInit.hpp" +#include "z64save.h" + +extern "C" SaveContext gSaveContext; + +#define CVAR_FREEZE_TIME_NAME CVAR_CHEAT("FreezeTime") +#define CVAR_FREEZE_TIME_DEFAULT 0 +#define CVAR_FREEZE_TIME_VALUE CVarGetInteger(CVAR_FREEZE_TIME_NAME, CVAR_FREEZE_TIME_DEFAULT) + +#define CVAR_PREV_TIME_NAME CVAR_GENERAL("PrevTime") +#define CVAR_PREV_TIME_DEFAULT -1 +#define CVAR_PREV_TIME_VALUE CVarGetInteger(CVAR_PREV_TIME_NAME, CVAR_PREV_TIME_DEFAULT) + +void OnGameFrameUpdateFreezeTime() { + if (!GameInteractor::IsSaveLoaded(true)) { + return; + } + + if (CVAR_PREV_TIME_VALUE == CVAR_PREV_TIME_DEFAULT) { + CVarSetInteger(CVAR_PREV_TIME_NAME, gSaveContext.dayTime); + } + + gSaveContext.dayTime = CVAR_PREV_TIME_VALUE; +} + +void RegisterFreezeTime() { + static HOOK_ID hookId = 0; + GameInteractor::Instance->UnregisterGameHook(hookId); + hookId = 0; + if (CVAR_FREEZE_TIME_VALUE) { + hookId = GameInteractor::Instance->RegisterGameHook(OnGameFrameUpdateFreezeTime); + } else { + CVarClear(CVAR_PREV_TIME_NAME); + } +} + +static RegisterShipInitFunc initFunc(RegisterFreezeTime, { CVAR_FREEZE_TIME_NAME }); diff --git a/soh/soh/Enhancements/Cheats/Infinite/Ammo.cpp b/soh/soh/Enhancements/Cheats/Infinite/Ammo.cpp new file mode 100644 index 000000000..b54b330bf --- /dev/null +++ b/soh/soh/Enhancements/Cheats/Infinite/Ammo.cpp @@ -0,0 +1,35 @@ +#include +#include "soh/Enhancements/game-interactor/GameInteractor_Hooks.h" +#include "soh/ShipInit.hpp" +#include "z64save.h" + +extern "C" { +extern SaveContext gSaveContext; +#include "variables.h" +#include "macros.h" +} + +#define CVAR_INFINITE_AMMO_NAME CVAR_CHEAT("InfiniteAmmo") +#define CVAR_INFINITE_AMMO_DEFAULT 0 +#define CVAR_INFINITE_AMMO_VALUE CVarGetInteger(CVAR_INFINITE_AMMO_NAME, CVAR_INFINITE_AMMO_DEFAULT) + +void OnGameFrameUpdateInfiniteAmmo() { + if (!GameInteractor::IsSaveLoaded(true)) { + return; + } + + AMMO(ITEM_STICK) = CUR_CAPACITY(UPG_STICKS); + AMMO(ITEM_NUT) = CUR_CAPACITY(UPG_NUTS); + AMMO(ITEM_BOMB) = CUR_CAPACITY(UPG_BOMB_BAG); + AMMO(ITEM_BOW) = CUR_CAPACITY(UPG_QUIVER); + AMMO(ITEM_SLINGSHOT) = CUR_CAPACITY(UPG_BULLET_BAG); + if (INV_CONTENT(ITEM_BOMBCHU) != ITEM_NONE) { + AMMO(ITEM_BOMBCHU) = 50; + } +} + +void RegisterInfiniteAmmo() { + COND_HOOK(OnGameFrameUpdate, CVAR_INFINITE_AMMO_VALUE, OnGameFrameUpdateInfiniteAmmo); +} + +static RegisterShipInitFunc initFunc(RegisterInfiniteAmmo, { CVAR_INFINITE_AMMO_NAME }); diff --git a/soh/soh/Enhancements/Cheats/Infinite/Health.cpp b/soh/soh/Enhancements/Cheats/Infinite/Health.cpp new file mode 100644 index 000000000..d731059e5 --- /dev/null +++ b/soh/soh/Enhancements/Cheats/Infinite/Health.cpp @@ -0,0 +1,24 @@ +#include +#include "soh/Enhancements/game-interactor/GameInteractor_Hooks.h" +#include "soh/ShipInit.hpp" +#include "z64save.h" + +extern "C" SaveContext gSaveContext; + +#define CVAR_INFINITE_HEALTH_NAME CVAR_CHEAT("InfiniteHealth") +#define CVAR_INFINITE_HEALTH_DEFAULT 0 +#define CVAR_INFINITE_HEALTH_VALUE CVarGetInteger(CVAR_INFINITE_HEALTH_NAME, CVAR_INFINITE_HEALTH_DEFAULT) + +void OnGameFrameUpdateInfiniteHealth() { + if (!GameInteractor::IsSaveLoaded(true)) { + return; + } + + gSaveContext.health = gSaveContext.healthCapacity; +} + +void RegisterInfiniteHealth() { + COND_HOOK(OnGameFrameUpdate, CVAR_INFINITE_HEALTH_VALUE, OnGameFrameUpdateInfiniteHealth); +} + +static RegisterShipInitFunc initFunc(RegisterInfiniteHealth, { CVAR_INFINITE_HEALTH_NAME }); diff --git a/soh/soh/Enhancements/Cheats/Infinite/Magic.cpp b/soh/soh/Enhancements/Cheats/Infinite/Magic.cpp new file mode 100644 index 000000000..d078316c9 --- /dev/null +++ b/soh/soh/Enhancements/Cheats/Infinite/Magic.cpp @@ -0,0 +1,24 @@ +#include +#include "soh/Enhancements/game-interactor/GameInteractor_Hooks.h" +#include "soh/ShipInit.hpp" +#include "z64save.h" + +extern "C" SaveContext gSaveContext; + +#define CVAR_INFINITE_MAGIC_NAME CVAR_CHEAT("InfiniteMagic") +#define CVAR_INFINITE_MAGIC_DEFAULT 0 +#define CVAR_INFINITE_MAGIC_VALUE CVarGetInteger(CVAR_INFINITE_MAGIC_NAME, CVAR_INFINITE_MAGIC_DEFAULT) + +void OnGameFrameUpdateInfiniteMagic() { + if (!GameInteractor::IsSaveLoaded(true)) { + return; + } + + gSaveContext.magic = gSaveContext.magicLevel * MAGIC_NORMAL_METER; +} + +void RegisterInfiniteMagic() { + COND_HOOK(OnGameFrameUpdate, CVAR_INFINITE_MAGIC_VALUE, OnGameFrameUpdateInfiniteMagic); +} + +static RegisterShipInitFunc initFunc(RegisterInfiniteMagic, { CVAR_INFINITE_MAGIC_NAME }); diff --git a/soh/soh/Enhancements/Cheats/Infinite/Money.cpp b/soh/soh/Enhancements/Cheats/Infinite/Money.cpp new file mode 100644 index 000000000..292f65065 --- /dev/null +++ b/soh/soh/Enhancements/Cheats/Infinite/Money.cpp @@ -0,0 +1,32 @@ +#include +#include "soh/Enhancements/game-interactor/GameInteractor_Hooks.h" +#include "soh/ShipInit.hpp" +#include "z64save.h" +#include "variables.h" + +extern "C" { +extern SaveContext gSaveContext; +extern s32 Flags_GetRandomizerInf(RandomizerInf flag); +#include "macros.h" +} + +#define CVAR_INFINITE_MONEY_NAME CVAR_CHEAT("InfiniteMoney") +#define CVAR_INFINITE_MONEY_DEFAULT 0 +#define CVAR_INFINITE_MONEY_VALUE CVarGetInteger(CVAR_INFINITE_MONEY_NAME, CVAR_INFINITE_MONEY_DEFAULT) + +void OnGameFrameUpdateInfiniteMoney() { + if ( + !GameInteractor::IsSaveLoaded(true) || + (IS_RANDO && !Flags_GetRandomizerInf(RAND_INF_HAS_WALLET)) + ) { + return; + } + + gSaveContext.rupees = CUR_CAPACITY(UPG_WALLET); +} + +void RegisterInfiniteMoney() { + COND_HOOK(OnGameFrameUpdate, CVAR_INFINITE_MONEY_VALUE, OnGameFrameUpdateInfiniteMoney); +} + +static RegisterShipInitFunc initFunc(RegisterInfiniteMoney, { CVAR_INFINITE_MONEY_NAME }); diff --git a/soh/soh/Enhancements/Cheats/Infinite/NayrusLove.cpp b/soh/soh/Enhancements/Cheats/Infinite/NayrusLove.cpp new file mode 100644 index 000000000..0bea9afc9 --- /dev/null +++ b/soh/soh/Enhancements/Cheats/Infinite/NayrusLove.cpp @@ -0,0 +1,24 @@ +#include +#include "soh/Enhancements/game-interactor/GameInteractor_Hooks.h" +#include "soh/ShipInit.hpp" +#include "z64save.h" + +extern "C" SaveContext gSaveContext; + +#define CVAR_INFINITE_NAYRUS_LOVE_NAME CVAR_CHEAT("InfiniteNayru") +#define CVAR_INFINITE_NAYRUS_LOVE_DEFAULT 0 +#define CVAR_INFINITE_NAYRUS_LOVE_VALUE CVarGetInteger(CVAR_INFINITE_NAYRUS_LOVE_NAME, CVAR_INFINITE_NAYRUS_LOVE_DEFAULT) + +void OnGameFrameUpdateInfiniteNayrusLove() { + if (!GameInteractor::IsSaveLoaded(true)) { + return; + } + + gSaveContext.nayrusLoveTimer = 0x44B; +} + +void RegisterInfiniteNayrusLove() { + COND_HOOK(OnGameFrameUpdate, CVAR_INFINITE_NAYRUS_LOVE_VALUE, OnGameFrameUpdateInfiniteNayrusLove); +} + +static RegisterShipInitFunc initFunc(RegisterInfiniteNayrusLove, { CVAR_INFINITE_NAYRUS_LOVE_NAME }); diff --git a/soh/soh/Enhancements/Cheats/MoonJump.cpp b/soh/soh/Enhancements/Cheats/MoonJump.cpp index e741fbb82..fb13c1c7b 100644 --- a/soh/soh/Enhancements/Cheats/MoonJump.cpp +++ b/soh/soh/Enhancements/Cheats/MoonJump.cpp @@ -3,11 +3,11 @@ #include "soh/ShipInit.hpp" extern "C" { -#include "macros.h" extern PlayState* gPlayState; +#include "macros.h" } -#define CVAR_MOON_JUMP_NAME "gCheats.MoonJumpOnL" +#define CVAR_MOON_JUMP_NAME CVAR_CHEAT("MoonJumpOnL") #define CVAR_MOON_JUMP_DEFAULT 0 #define CVAR_MOON_JUMP_VALUE CVarGetInteger(CVAR_MOON_JUMP_NAME, CVAR_MOON_JUMP_DEFAULT) diff --git a/soh/soh/Enhancements/Cheats/UnrestrictedItems.cpp b/soh/soh/Enhancements/Cheats/UnrestrictedItems.cpp new file mode 100644 index 000000000..0b5aaebbc --- /dev/null +++ b/soh/soh/Enhancements/Cheats/UnrestrictedItems.cpp @@ -0,0 +1,26 @@ +#include +#include "soh/Enhancements/game-interactor/GameInteractor_Hooks.h" +#include "soh/ShipInit.hpp" + +extern "C" PlayState* gPlayState; + +#define CVAR_UNRESTRICTED_ITEMS_NAME CVAR_CHEAT("NoRestrictItems") +#define CVAR_UNRESTRICTED_ITEMS_DEFAULT 0 +#define CVAR_UNRESTRICTED_ITEMS_VALUE CVarGetInteger(CVAR_UNRESTRICTED_ITEMS_NAME, CVAR_UNRESTRICTED_ITEMS_DEFAULT) + +void OnGameFrameUpdateUnrestrictedItems() { + if (!GameInteractor::IsSaveLoaded(true)) { + return; + } + + // do not allow the use of sun's song even with the cheat + u8 sunsBackup = gPlayState->interfaceCtx.restrictions.sunsSong; + memset(&gPlayState->interfaceCtx.restrictions, 0, sizeof(gPlayState->interfaceCtx.restrictions)); + gPlayState->interfaceCtx.restrictions.sunsSong = sunsBackup; +} + +void RegisterUnrestrictedItems() { + COND_HOOK(OnGameFrameUpdate, CVAR_UNRESTRICTED_ITEMS_VALUE, OnGameFrameUpdateUnrestrictedItems); +} + +static RegisterShipInitFunc initFunc(RegisterUnrestrictedItems, { CVAR_UNRESTRICTED_ITEMS_NAME }); diff --git a/soh/soh/Enhancements/ExtraTraps.cpp b/soh/soh/Enhancements/ExtraTraps.cpp new file mode 100644 index 000000000..196fc63f4 --- /dev/null +++ b/soh/soh/Enhancements/ExtraTraps.cpp @@ -0,0 +1,203 @@ +#include "libultraship/bridge.h" +#include "soh/Enhancements/game-interactor/GameInteractor_Hooks.h" +#include "soh/ShipInit.hpp" +#include "soh/Enhancements/randomizer/3drando/random.hpp" +#include "soh/Notification/Notification.h" +#include "soh/OTRGlobals.h" + +extern "C" { +#include "variables.h" +#include "functions.h" +#include "macros.h" +extern PlayState* gPlayState; +GetItemEntry ItemTable_RetrieveEntry(s16 modIndex, s16 getItemID); +} + +#define CVAR_EXTRA_TRAPS_NAME CVAR_ENHANCEMENT("ExtraTraps.Enabled") +#define CVAR_EXTRA_TRAPS_DEFAULT 0 +#define CVAR_EXTRA_TRAPS_VALUE CVarGetInteger(CVAR_EXTRA_TRAPS_NAME, CVAR_EXTRA_TRAPS_DEFAULT) + +typedef enum { + ADD_ICE_TRAP, + ADD_BURN_TRAP, + ADD_SHOCK_TRAP, + ADD_KNOCK_TRAP, + ADD_SPEED_TRAP, + ADD_BOMB_TRAP, + ADD_VOID_TRAP, + ADD_AMMO_TRAP, + ADD_KILL_TRAP, + ADD_TELEPORT_TRAP, + ADD_TRAP_MAX +} AltTrapType; + +static AltTrapType roll = ADD_TRAP_MAX; +static int statusTimer = -1; +static int eventTimer = -1; + +const char* altTrapTypeCvars[] = { + CVAR_ENHANCEMENT("ExtraTraps.Ice"), + CVAR_ENHANCEMENT("ExtraTraps.Burn"), + CVAR_ENHANCEMENT("ExtraTraps.Shock"), + CVAR_ENHANCEMENT("ExtraTraps.Knockback"), + CVAR_ENHANCEMENT("ExtraTraps.Speed"), + CVAR_ENHANCEMENT("ExtraTraps.Bomb"), + CVAR_ENHANCEMENT("ExtraTraps.Void"), + CVAR_ENHANCEMENT("ExtraTraps.Ammo"), + CVAR_ENHANCEMENT("ExtraTraps.Kill"), + CVAR_ENHANCEMENT("ExtraTraps.Teleport") +}; + +std::vector getEnabledAddTraps () { + std::vector enabledAddTraps; + for (int i = 0; i < ADD_TRAP_MAX; i++) { + if (CVarGetInteger(altTrapTypeCvars[i], 0)) { + if (gSaveContext.equips.buttonItems[0] == ITEM_FISHING_POLE && (i == ADD_VOID_TRAP || i == ADD_TELEPORT_TRAP)) { + continue; // don't add void or teleport if you're holding the fishing pole, as this causes issues + } + enabledAddTraps.push_back(static_cast(i)); + } + } + if (enabledAddTraps.size() == 0) { + enabledAddTraps.push_back(ADD_ICE_TRAP); + } + return enabledAddTraps; +}; + +static void RollRandomTrap(uint32_t seed) { + uint32_t finalSeed = seed + (IS_RANDO ? Rando::Context::GetInstance()->GetSeed() : gSaveContext.ship.stats.fileCreatedAt); + Random_Init(finalSeed); + + roll = RandomElement(getEnabledAddTraps()); + switch (roll) { + case ADD_ICE_TRAP: + GameInteractor::RawAction::FreezePlayer(); + break; + case ADD_BURN_TRAP: + GameInteractor::RawAction::BurnPlayer(); + break; + case ADD_SHOCK_TRAP: + GameInteractor::RawAction::ElectrocutePlayer(); + break; + case ADD_KNOCK_TRAP: + eventTimer = 3; + break; + case ADD_SPEED_TRAP: + Audio_PlaySoundGeneral(NA_SE_VO_KZ_MOVE, &gSfxDefaultPos, 4, &gSfxDefaultFreqAndVolScale, &gSfxDefaultFreqAndVolScale, &gSfxDefaultReverb); + GameInteractor::State::RunSpeedModifier = -2; + statusTimer = 200; + Notification::Emit({ .message = "Speed Decreased!" }); + break; + case ADD_BOMB_TRAP: + eventTimer = 3; + break; + case ADD_VOID_TRAP: + Audio_PlaySoundGeneral(NA_SE_EN_GANON_LAUGH, &gSfxDefaultPos, 4, &gSfxDefaultFreqAndVolScale, &gSfxDefaultFreqAndVolScale, &gSfxDefaultReverb); + eventTimer = 3; + break; + case ADD_AMMO_TRAP: + eventTimer = 3; + Notification::Emit({ .message = "Ammo Halved!" }); + break; + case ADD_KILL_TRAP: + GameInteractor::RawAction::SetPlayerHealth(0); + break; + case ADD_TELEPORT_TRAP: + eventTimer = 3; + break; + default: + break; + } +} + +static void OnPlayerUpdate() { + Player* player = GET_PLAYER(gPlayState); + if (statusTimer == 0) { + GameInteractor::State::RunSpeedModifier = 0; + } + if (eventTimer == 0) { + switch (roll) { + case ADD_KNOCK_TRAP: + GameInteractor::RawAction::KnockbackPlayer(1); + break; + case ADD_BOMB_TRAP: + GameInteractor::RawAction::SpawnActor(ACTOR_EN_BOM, 1); + break; + case ADD_VOID_TRAP: + Play_TriggerRespawn(gPlayState); + break; + case ADD_AMMO_TRAP: + AMMO(ITEM_STICK) = AMMO(ITEM_STICK) * 0.5; + AMMO(ITEM_NUT) = AMMO(ITEM_NUT) * 0.5; + AMMO(ITEM_SLINGSHOT) = AMMO(ITEM_SLINGSHOT) * 0.5; + AMMO(ITEM_BOW) = AMMO(ITEM_BOW) * 0.5; + AMMO(ITEM_BOMB) = AMMO(ITEM_BOMB) * 0.5; + AMMO(ITEM_BOMBCHU) = AMMO(ITEM_BOMBCHU) * 0.5; + Audio_PlaySoundGeneral(NA_SE_VO_FR_SMILE_0, &gSfxDefaultPos, 4, &gSfxDefaultFreqAndVolScale, &gSfxDefaultFreqAndVolScale, &gSfxDefaultReverb); + break; + case ADD_TELEPORT_TRAP: { + int entrance; + int index = Random(0, 7); + switch (index) { + case 0: + entrance = GI_TP_DEST_SERENADE; + break; + case 1: + entrance = GI_TP_DEST_REQUIEM; + break; + case 2: + entrance = GI_TP_DEST_BOLERO; + break; + case 3: + entrance = GI_TP_DEST_MINUET; + break; + case 4: + entrance = GI_TP_DEST_NOCTURNE; + break; + case 5: + entrance = GI_TP_DEST_PRELUDE; + break; + default: + entrance = GI_TP_DEST_LINKSHOUSE; + break; + } + GameInteractor::RawAction::TeleportPlayer(entrance); + break; + } + default: + break; + } + } + if (statusTimer >= 0) { + statusTimer--; + } + if (eventTimer >= 0) { + eventTimer--; + } +} + +void RegisterExtraTraps() { + COND_HOOK(OnPlayerUpdate, CVAR_EXTRA_TRAPS_VALUE, OnPlayerUpdate); + + COND_VB_SHOULD(VB_SHORT_CIRCUIT_GIVE_ITEM_PROCESS, true, { + if (!gSaveContext.ship.pendingIceTrapCount) { + return; + } + + Player* player = GET_PLAYER(gPlayState); + + *should = true; + gSaveContext.ship.pendingIceTrapCount--; + gSaveContext.ship.stats.count[COUNT_ICE_TRAPS]++; + GameInteractor_ExecuteOnItemReceiveHooks(ItemTable_RetrieveEntry(MOD_RANDOMIZER, RG_ICE_TRAP)); + if (CVAR_EXTRA_TRAPS_VALUE) { + RollRandomTrap(gPlayState->sceneNum + player->getItemEntry.drawItemId); + } else { + GameInteractor::RawAction::FreezePlayer(); + } + }); +} + +static RegisterShipInitFunc initFunc(RegisterExtraTraps, { CVAR_EXTRA_TRAPS_NAME }); + + diff --git a/soh/soh/Enhancements/FileSelectEnhancements.cpp b/soh/soh/Enhancements/FileSelectEnhancements.cpp index 43b2f1966..84cff9d12 100644 --- a/soh/soh/Enhancements/FileSelectEnhancements.cpp +++ b/soh/soh/Enhancements/FileSelectEnhancements.cpp @@ -13,7 +13,7 @@ std::array RandomizerSettingsMenuText[RSM_MAX] = { // German "Start Randomizer", // French - "Start Randomizer", + "Commencer le Randomizer", }, { // English @@ -21,7 +21,7 @@ std::array RandomizerSettingsMenuText[RSM_MAX] = { // German "Generate New Randomizer Seed", // French - "Generate New Randomizer Seed", + "Générer une nouvelle seed pour le Randomizer", }, { // English @@ -29,7 +29,7 @@ std::array RandomizerSettingsMenuText[RSM_MAX] = { // German "Open Randomizer Settings", // French - "Open Randomizer Settings", + "Ouvrir les paramètres du Randomizer", }, { // English @@ -37,7 +37,7 @@ std::array RandomizerSettingsMenuText[RSM_MAX] = { // German "Generating...", // French - "Generating...", + "Génération en cours...", }, { // English diff --git a/soh/soh/Enhancements/Restorations/PauseBufferInputs.cpp b/soh/soh/Enhancements/Restorations/PauseBufferInputs.cpp new file mode 100644 index 000000000..4604c00ca --- /dev/null +++ b/soh/soh/Enhancements/Restorations/PauseBufferInputs.cpp @@ -0,0 +1,83 @@ +#include +#include "soh/Enhancements/game-interactor/GameInteractor_Hooks.h" +#include "soh/ShipInit.hpp" + +extern "C" { +#include "variables.h" +#include "overlays/misc/ovl_kaleido_scope/z_kaleido_scope.h" +} + +#define CVAR_BUFFER_NAME CVAR_ENHANCEMENT("PauseBufferWindow") +#define CVAR_BUFFER_DEFAULT 0 +#define CVAR_BUFFER_VALUE CVarGetInteger(CVAR_BUFFER_NAME, CVAR_BUFFER_DEFAULT) + +#define CVAR_INCLUDE_NAME CVAR_ENHANCEMENT("IncludeHeldInputsBufferWindow") +#define CVAR_INCLUDE_DEFAULT 0 +#define CVAR_INCLUDE_VALUE CVarGetInteger(CVAR_INCLUDE_NAME, CVAR_INCLUDE_DEFAULT) + +#define CVAR_FRAME_ADVANCE_NAME CVAR_CHEAT("EasyFrameAdvance") +#define CVAR_FRAME_ADVANCE_DEFAULT 0 +#define CVAR_FRAME_ADVANCE_VALUE CVarGetInteger(CVAR_FRAME_ADVANCE_NAME, CVAR_FRAME_ADVANCE_DEFAULT) + +static u16 inputBufferTimer = 0; +static u16 prePauseInputs = 0; +static u16 pauseInputs = 0; +#define PAUSE_STATE_OFF 0 +#define PAUSE_STATE_OPENING_1 2 +#define PAUSE_STATE_UNPAUSE_SETUP 18 + +void RegisterPauseBufferInputs() { + COND_VB_SHOULD(VB_KALEIDO_UNPAUSE_CLOSE, CVAR_BUFFER_VALUE || CVAR_INCLUDE_VALUE, { + Input* input = &gPlayState->state.input[0]; + + // Store all inputs that were pressed during the buffer window + pauseInputs |= input->press.button; + + // If the user opts to include held inputs in the buffer window, store the held inputs, minus the held inputs when the pause menu was opened + if (CVAR_INCLUDE_VALUE && inputBufferTimer == 0) { + pauseInputs |= input->cur.button & ~prePauseInputs; + prePauseInputs = 0; + } + + // Wait a specified number of frames before continuing the unpause + inputBufferTimer++; + if (inputBufferTimer < CVAR_BUFFER_VALUE) { + *should = false; + } + }); + + COND_HOOK(OnGameStateMainStart, CVAR_BUFFER_VALUE || CVAR_INCLUDE_VALUE, []() { + if (gPlayState == NULL) { + return; + } + + Input* input = &gPlayState->state.input[0]; + PauseContext* pauseCtx = &gPlayState->pauseCtx; + + // if the input buffer timer is not 0 and the pause state is off, then the player just unpaused + if (inputBufferTimer != 0 && pauseCtx->state == PAUSE_STATE_OFF) { + inputBufferTimer = 0; + + // If the user opts into easy frame advance, remove START input + if (CVAR_FRAME_ADVANCE_VALUE) { + pauseInputs &= ~BTN_START; + } + + // So we need to re-apply the inputs that were pressed during the buffer window + input->press.button |= pauseInputs; + } + + // Reset the timer and stored inputs at the beginning of the unpause process + if (pauseCtx->state == PAUSE_STATE_UNPAUSE_SETUP && pauseCtx->unk_1F4 != 160.0f) { + inputBufferTimer = 0; + pauseInputs = 0; + } + + // If the user opts to include held inputs in the buffer window, store the held inputs at the beginning of the pause process, minus the START input + if (pauseCtx->state == PAUSE_STATE_OPENING_1 && CVAR_INCLUDE_VALUE) { + prePauseInputs = input->cur.button & ~BTN_START; + } + }); +} + +static RegisterShipInitFunc initFunc(RegisterPauseBufferInputs, { CVAR_BUFFER_NAME, CVAR_INCLUDE_NAME }); diff --git a/soh/soh/Enhancements/TimeDisplay/TimeDisplay.cpp b/soh/soh/Enhancements/TimeDisplay/TimeDisplay.cpp index cb9dfbb46..05e03dae1 100644 --- a/soh/soh/Enhancements/TimeDisplay/TimeDisplay.cpp +++ b/soh/soh/Enhancements/TimeDisplay/TimeDisplay.cpp @@ -4,7 +4,7 @@ #include "assets/textures/parameter_static/parameter_static.h" #include "assets/soh_assets.h" -#include "soh/ImGuiUtils.h" +#include "soh/SohGui/ImGuiUtils.h" extern "C" { #include "macros.h" @@ -196,7 +196,6 @@ void TimeDisplayWindow::Draw() { uint16_t textureIndex = 0; for (size_t i = 0; i < textLength; i++) { - ImVec2 originalCursorPos = ImGui::GetCursorPos(); if (textToDecode[i] == ':' || textToDecode[i] == '.') { textureIndex = 10; } else { diff --git a/soh/soh/Enhancements/TimeSavers/SkipCutscene/Story/SkipBlueWarp.cpp b/soh/soh/Enhancements/TimeSavers/SkipCutscene/Story/SkipBlueWarp.cpp index 9f9b67fec..c9a999cb1 100644 --- a/soh/soh/Enhancements/TimeSavers/SkipCutscene/Story/SkipBlueWarp.cpp +++ b/soh/soh/Enhancements/TimeSavers/SkipCutscene/Story/SkipBlueWarp.cpp @@ -10,7 +10,7 @@ extern "C" { #include "variables.h" } -#define RAND_GET_OPTION(option) Rando::Context::GetInstance()->GetOption(option).GetContextOptionIndex() +#define RAND_GET_OPTION(option) Rando::Context::GetInstance()->GetOption(option).Get() static bool sEnteredBlueWarp = false; diff --git a/soh/soh/Enhancements/TimeSavers/SkipMiscInteractions/SkipChildRutoInteractions.cpp b/soh/soh/Enhancements/TimeSavers/SkipMiscInteractions/SkipChildRutoInteractions.cpp index aaaf1b39f..7d676e6f8 100644 --- a/soh/soh/Enhancements/TimeSavers/SkipMiscInteractions/SkipChildRutoInteractions.cpp +++ b/soh/soh/Enhancements/TimeSavers/SkipMiscInteractions/SkipChildRutoInteractions.cpp @@ -85,7 +85,7 @@ void SkipChildRutoInteractions_Register() { if (enRu1->action == 22) { enRu1->action = 27; enRu1->drawConfig = 1; - enRu1->actor.flags |= ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_FRIENDLY; + enRu1->actor.flags |= ACTOR_FLAG_ATTENTION_ENABLED | ACTOR_FLAG_FRIENDLY; Animation_Change(&enRu1->skelAnime, (AnimationHeader*)&gRutoChildSittingAnim, 1.0f, 0.0f, Animation_GetLastFrame((void*)&gRutoChildSittingAnim), ANIMMODE_LOOP, 0.0f); } diff --git a/soh/soh/Enhancements/audio/AudioEditor.cpp b/soh/soh/Enhancements/audio/AudioEditor.cpp index d56c8269c..d15bc5f25 100644 --- a/soh/soh/Enhancements/audio/AudioEditor.cpp +++ b/soh/soh/Enhancements/audio/AudioEditor.cpp @@ -11,7 +11,7 @@ #include "soh/OTRGlobals.h" #include "soh/cvar_prefixes.h" #include -#include "soh/UIWidgets.hpp" +#include "soh/SohGui/UIWidgets.hpp" #include "AudioCollection.h" #include "soh/Enhancements/game-interactor/GameInteractor.h" diff --git a/soh/soh/Enhancements/bootcommands.c b/soh/soh/Enhancements/bootcommands.c index c010067da..ac2ae2bc5 100644 --- a/soh/soh/Enhancements/bootcommands.c +++ b/soh/soh/Enhancements/bootcommands.c @@ -12,14 +12,6 @@ #include "soh/OTRGlobals.h" #include "soh/cvar_prefixes.h" -uint8_t gLoadFileSelect = 0, gSkipLogoTest = 0; - -extern BootCommandFunc BootCommands_Command_SkipLogo(char** argv, s32 argc); -extern BootCommandFunc BootCommands_Command_LoadFileSelect(char** argv, s32 argc); - -static BootCommand sCommands[] = { { "--skiplogo", BootCommands_Command_SkipLogo }, - { "--loadfileselect", BootCommands_Command_LoadFileSelect } }; - void BootCommands_Init() { // Clears vars to prevent randomizer menu from being disabled @@ -28,48 +20,7 @@ void BootCommands_Init() CVarClear(CVAR_GENERAL("OnFileSelectNameEntry")); // Clear when soh is killed on the file name entry page CVarClear(CVAR_GENERAL("BetterDebugWarpScreenMQMode")); CVarClear(CVAR_GENERAL("BetterDebugWarpScreenMQModeScene")); - CVarClear(CVAR_GENERAL("CheatEasyPauseBufferLastInputs")); - CVarClear(CVAR_GENERAL("CheatEasyPauseBufferTimer")); #if defined(__SWITCH__) || defined(__WIIU__) CVarRegisterInteger(CVAR_IMGUI_CONTROLLER_NAV, 1); // always enable controller nav on switch/wii u #endif } - -//void BootCommands_ParseBootArgs(char* str) -void BootCommands_ParseBootArgs(s32 argc, char** argv) -{ - s32 i; - - // Parse the commands - for (i = 0; i < argc; i++) { - s32 j; - - for (j = 0; j < ARRAY_COUNT(sCommands); j++) { - if (!strcmp(argv[i], sCommands[j].name)) { - s32 numArgsProcessed = sCommands[j].func(&argv[i], argc - i); - i += numArgsProcessed; - break; - } - } - } -} - -/* - * Command Name: --skiplogo - * Description: Skips the N64 Logo Screen - * Arguments: None - */ -BootCommandFunc BootCommands_Command_SkipLogo(char** argv, s32 argc) { - gSkipLogoTest = 1; - return 0; -} - -/* - * Command Name: --loadfileselect - * Description: Loads the file select screen on bootup. - * Arguments: None - */ -BootCommandFunc BootCommands_Command_LoadFileSelect(char** argv, s32 argc) { - gLoadFileSelect = 1; - return 0; -} diff --git a/soh/soh/Enhancements/bootcommands.h b/soh/soh/Enhancements/bootcommands.h index fdf362e97..5c6cb8c8c 100644 --- a/soh/soh/Enhancements/bootcommands.h +++ b/soh/soh/Enhancements/bootcommands.h @@ -3,19 +3,6 @@ #include #include -typedef s32 (*BootCommandFunc)(char** argv, s32 argc); // Returns the number of arguments it read - -typedef struct BootCommand -{ - char* name; - BootCommandFunc func; -} BootCommand; - -extern uint8_t gLoadFileSelect; -extern uint8_t gSkipLogoTest; - void BootCommands_Init(); -//void BootCommands_ParseBootArgs(char* str); -void BootCommands_ParseBootArgs(s32 argc, char** argv); #endif \ No newline at end of file diff --git a/soh/soh/Enhancements/boss-rush/BossRush.cpp b/soh/soh/Enhancements/boss-rush/BossRush.cpp index d4997cca9..96220f057 100644 --- a/soh/soh/Enhancements/boss-rush/BossRush.cpp +++ b/soh/soh/Enhancements/boss-rush/BossRush.cpp @@ -265,10 +265,10 @@ void BossRush_HandleBlueWarp(PlayState* play, f32 warpPosX, f32 warpPosZ) { gSaveContext.linkAge = LINK_AGE_ADULT; // Change to Adult Link. - if (gSaveContext.bossRushOptions[BR_OPTIONS_BOSSES] == BR_CHOICE_BOSSES_ALL) { + if (gSaveContext.ship.quest.data.bossRush.options[BR_OPTIONS_BOSSES] == BR_CHOICE_BOSSES_ALL) { BossRush_SetEquipment(LINK_AGE_ADULT); // Warp to credits. - } else if (gSaveContext.bossRushOptions[BR_OPTIONS_BOSSES] == BR_CHOICE_BOSSES_CHILD) { + } else if (gSaveContext.ship.quest.data.bossRush.options[BR_OPTIONS_BOSSES] == BR_CHOICE_BOSSES_CHILD) { play->nextEntranceIndex = ENTR_CHAMBER_OF_THE_SAGES_0; gSaveContext.nextCutsceneIndex = 0xFFF2; play->transitionTrigger = TRANS_TRIGGER_START; @@ -285,14 +285,14 @@ void BossRush_HandleBlueWarp(PlayState* play, f32 warpPosX, f32 warpPosZ) { void BossRush_HandleBlueWarpHeal(PlayState* play) { // This function gets called multiple times per blue warp, so only heal when player isn't at max HP. - if (gSaveContext.bossRushOptions[BR_OPTIONS_HEAL] == BR_CHOICE_HEAL_EVERYBOSS && + if (gSaveContext.ship.quest.data.bossRush.options[BR_OPTIONS_HEAL] == BR_CHOICE_HEAL_EVERYBOSS && gSaveContext.health != gSaveContext.healthCapacity) { Health_ChangeBy(play, 320); } } void BossRush_HandleCompleteBoss(PlayState* play) { - gSaveContext.isBossRushPaused = 1; + gSaveContext.ship.quest.data.bossRush.isPaused = true; switch (play->sceneNum) { case SCENE_DEKU_TREE_BOSS: Flags_SetEventChkInf(EVENTCHKINF_USED_DEKU_TREE_BLUE_WARP); @@ -323,16 +323,16 @@ void BossRush_HandleCompleteBoss(PlayState* play) { } // Fully heal the player after Ganondorf - if (gSaveContext.bossRushOptions[BR_OPTIONS_HEAL] == BR_CHOICE_HEAL_EVERYBOSS && + if (gSaveContext.ship.quest.data.bossRush.options[BR_OPTIONS_HEAL] == BR_CHOICE_HEAL_EVERYBOSS && play->sceneNum == SCENE_GANONDORF_BOSS) { Health_ChangeBy(play, 320); } - if ((CheckDungeonCount() == 3 && gSaveContext.bossRushOptions[BR_OPTIONS_BOSSES] == BR_CHOICE_BOSSES_CHILD) || + if ((CheckDungeonCount() == 3 && gSaveContext.ship.quest.data.bossRush.options[BR_OPTIONS_BOSSES] == BR_CHOICE_BOSSES_CHILD) || play->sceneNum == SCENE_GANON_BOSS) { - gSaveContext.sohStats.playTimer += 2; - gSaveContext.sohStats.gameComplete = 1; - gSaveContext.sohStats.itemTimestamp[TIMESTAMP_BOSSRUSH_FINISH] = GAMEPLAYSTAT_TOTAL_TIME; + gSaveContext.ship.stats.playTimer += 2; + gSaveContext.ship.stats.gameComplete = 1; + gSaveContext.ship.stats.itemTimestamp[TIMESTAMP_BOSSRUSH_FINISH] = GAMEPLAYSTAT_TOTAL_TIME; } } @@ -344,14 +344,14 @@ void BossRush_InitSave() { gSaveContext.playerName[i] = brPlayerName[i]; } - gSaveContext.questId = QUEST_BOSSRUSH; - gSaveContext.isBossRushPaused = 1; + gSaveContext.ship.quest.id = QUEST_BOSSRUSH; + gSaveContext.ship.quest.data.bossRush.isPaused = true; gSaveContext.entranceIndex = ENTR_CHAMBER_OF_THE_SAGES_0; gSaveContext.cutsceneIndex = 0x8000; gSaveContext.isMagicAcquired = 1; // Set magic - if (gSaveContext.bossRushOptions[BR_OPTIONS_MAGIC] == BR_CHOICE_MAGIC_SINGLE) { + if (gSaveContext.ship.quest.data.bossRush.options[BR_OPTIONS_MAGIC] == BR_CHOICE_MAGIC_SINGLE) { gSaveContext.magicLevel = 1; gSaveContext.magic = 48; } else { @@ -362,7 +362,7 @@ void BossRush_InitSave() { // Set health u16 health = 16; - switch (gSaveContext.bossRushOptions[BR_OPTIONS_HEARTS]) { + switch (gSaveContext.ship.quest.data.bossRush.options[BR_OPTIONS_HEARTS]) { case BR_CHOICE_HEARTS_7: health *= 7; break; @@ -399,8 +399,9 @@ void BossRush_InitSave() { gSaveContext.eventChkInf[7] |= 0x80; // bongo bongo // Sets all rando flags to false - for (s32 i = 0; i < ARRAY_COUNT(gSaveContext.randomizerInf); i++) { - gSaveContext.randomizerInf[i] = 0; + // Boss Rush currently uses 2 randomizer flags (RAND_INF_DUNGEONS_DONE_SPIRIT_TEMPLE & RAND_INF_DUNGEONS_DONE_SHADOW_TEMPLE) + for (s32 i = 0; i < ARRAY_COUNT(gSaveContext.ship.randomizerInf); i++) { + gSaveContext.ship.randomizerInf[i] = 0; } // Set items @@ -411,11 +412,11 @@ void BossRush_InitSave() { ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE, }; - if (gSaveContext.bossRushOptions[BR_OPTIONS_LONGSHOT] == BR_CHOICE_LONGSHOT_YES) { + if (gSaveContext.ship.quest.data.bossRush.options[BR_OPTIONS_LONGSHOT] == BR_CHOICE_LONGSHOT_YES) { brItems[9] = ITEM_LONGSHOT; } - switch (gSaveContext.bossRushOptions[BR_OPTIONS_BOTTLE]) { + switch (gSaveContext.ship.quest.data.bossRush.options[BR_OPTIONS_BOTTLE]) { case BR_CHOICE_BOTTLE_EMPTY: brItems[18] = ITEM_BOTTLE; break; @@ -435,7 +436,7 @@ void BossRush_InitSave() { break; } - if (gSaveContext.bossRushOptions[BR_OPTIONS_BUNNYHOOD] == BR_CHOICE_BUNNYHOOD_YES) { + if (gSaveContext.ship.quest.data.bossRush.options[BR_OPTIONS_BUNNYHOOD] == BR_CHOICE_BUNNYHOOD_YES) { brItems[23] = ITEM_MASK_BUNNY; } @@ -446,9 +447,9 @@ void BossRush_InitSave() { // Set consumable counts std::array brAmmo = { 5, 5, 10, 10, 0, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; - if (gSaveContext.bossRushOptions[BR_OPTIONS_AMMO] == BR_CHOICE_AMMO_FULL) { + if (gSaveContext.ship.quest.data.bossRush.options[BR_OPTIONS_AMMO] == BR_CHOICE_AMMO_FULL) { brAmmo = { 10, 20, 20, 30, 0, 0, 30, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; - } else if (gSaveContext.bossRushOptions[BR_OPTIONS_AMMO] == BR_CHOICE_AMMO_MAXED) { + } else if (gSaveContext.ship.quest.data.bossRush.options[BR_OPTIONS_AMMO] == BR_CHOICE_AMMO_MAXED) { brAmmo = { 30, 40, 40, 50, 0, 0, 50, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; } @@ -462,17 +463,17 @@ void BossRush_InitSave() { gSaveContext.inventory.equipment |= 1 << 4; // Deku Shield gSaveContext.inventory.equipment |= 1 << 6; // Mirror Shield gSaveContext.inventory.equipment |= 1 << 9; // Goron Tunic - if (gSaveContext.bossRushOptions[BR_OPTIONS_BGS] == BR_CHOICE_BGS_YES) { + if (gSaveContext.ship.quest.data.bossRush.options[BR_OPTIONS_BGS] == BR_CHOICE_BGS_YES) { gSaveContext.inventory.equipment |= 1 << 2; // Biggoron Sword gSaveContext.bgsFlag = 1; } - if (gSaveContext.bossRushOptions[BR_OPTIONS_HOVERBOOTS] == BR_CHOICE_HOVERBOOTS_YES) { + if (gSaveContext.ship.quest.data.bossRush.options[BR_OPTIONS_HOVERBOOTS] == BR_CHOICE_HOVERBOOTS_YES) { gSaveContext.inventory.equipment |= 1 << 14; // Hover Boots } // Upgrades u8 upgradeLevel = 1; - if (gSaveContext.bossRushOptions[BR_OPTIONS_AMMO] == BR_CHOICE_AMMO_MAXED) { + if (gSaveContext.ship.quest.data.bossRush.options[BR_OPTIONS_AMMO] == BR_CHOICE_AMMO_MAXED) { upgradeLevel = 3; } Inventory_ChangeUpgrade(UPG_QUIVER, upgradeLevel); @@ -483,12 +484,12 @@ void BossRush_InitSave() { Inventory_ChangeUpgrade(UPG_STRENGTH, 1); // Set flags and Link's age based on chosen settings. - if (gSaveContext.bossRushOptions[BR_OPTIONS_BOSSES] == BR_CHOICE_BOSSES_ADULT || - gSaveContext.bossRushOptions[BR_OPTIONS_BOSSES] == BR_CHOICE_BOSSES_GANONDORF_GANON) { + if (gSaveContext.ship.quest.data.bossRush.options[BR_OPTIONS_BOSSES] == BR_CHOICE_BOSSES_ADULT || + gSaveContext.ship.quest.data.bossRush.options[BR_OPTIONS_BOSSES] == BR_CHOICE_BOSSES_GANONDORF_GANON) { Flags_SetEventChkInf(EVENTCHKINF_USED_DEKU_TREE_BLUE_WARP); Flags_SetEventChkInf(EVENTCHKINF_USED_DODONGOS_CAVERN_BLUE_WARP); Flags_SetEventChkInf(EVENTCHKINF_USED_JABU_JABUS_BELLY_BLUE_WARP); - if (gSaveContext.bossRushOptions[BR_OPTIONS_BOSSES] == BR_CHOICE_BOSSES_GANONDORF_GANON) { + if (gSaveContext.ship.quest.data.bossRush.options[BR_OPTIONS_BOSSES] == BR_CHOICE_BOSSES_GANONDORF_GANON) { Flags_SetEventChkInf(EVENTCHKINF_USED_FOREST_TEMPLE_BLUE_WARP); Flags_SetEventChkInf(EVENTCHKINF_USED_FIRE_TEMPLE_BLUE_WARP); Flags_SetEventChkInf(EVENTCHKINF_USED_WATER_TEMPLE_BLUE_WARP); @@ -516,7 +517,7 @@ void BossRush_OnVanillaBehaviorHandler(GIVanillaBehavior id, bool* should, va_li switch (id) { // Allow not healing before ganon case VB_GANON_HEAL_BEFORE_FIGHT: { - if (gSaveContext.bossRushOptions[BR_OPTIONS_HEAL] == BR_CHOICE_HEAL_NEVER) { + if (gSaveContext.ship.quest.data.bossRush.options[BR_OPTIONS_HEAL] == BR_CHOICE_HEAL_NEVER) { *should = false; } break; @@ -669,7 +670,7 @@ void BossRush_OnActorInitHandler(void* actorRef) { void BossRush_OnSceneInitHandler(s16 sceneNum) { // Unpause the timer when the scene loaded isn't the Chamber of Sages. if (sceneNum != SCENE_CHAMBER_OF_THE_SAGES) { - gSaveContext.isBossRushPaused = 0; + gSaveContext.ship.quest.data.bossRush.isPaused = false; } } diff --git a/soh/soh/Enhancements/cheat_hook_handlers.cpp b/soh/soh/Enhancements/cheat_hook_handlers.cpp deleted file mode 100644 index 20c85d4d4..000000000 --- a/soh/soh/Enhancements/cheat_hook_handlers.cpp +++ /dev/null @@ -1,58 +0,0 @@ -#include -#include "soh/OTRGlobals.h" -#include "soh/Enhancements/game-interactor/GameInteractor.h" -#include "soh/Enhancements/game-interactor/GameInteractor_Hooks.h" -#include "soh/Enhancements/enhancementTypes.h" - -extern "C" { -#include "macros.h" -#include "variables.h" - -extern SaveContext gSaveContext; -extern PlayState* gPlayState; -} - -void CheatsOnVanillaBehaviorHandler(GIVanillaBehavior id, bool* should, va_list originalArgs) { - switch (id) { - case VB_DEKU_STICK_BREAK: { - if (CVarGetInteger(CVAR_CHEAT("DekuStick"), DEKU_STICK_NORMAL) != DEKU_STICK_NORMAL) { - *should = false; - } - break; - } - case VB_DEKU_STICK_BE_ON_FIRE: { - if (CVarGetInteger(CVAR_CHEAT("DekuStick"), DEKU_STICK_NORMAL) == DEKU_STICK_UNBREAKABLE_AND_ALWAYS_ON_FIRE) { - Player* player = GET_PLAYER(gPlayState); - player->unk_860 = 200; // Keeps the stick's flame lit - player->unk_85C = 1.0f; // Ensures the stick is the proper length - *should = true; - } - break; - } - case VB_DEKU_STICK_BURN_OUT: { - if (CVarGetInteger(CVAR_CHEAT("DekuStick"), DEKU_STICK_NORMAL) != DEKU_STICK_NORMAL) { - *should = false; - } - break; - } - case VB_DEKU_STICK_BURN_DOWN: { - if (CVarGetInteger(CVAR_CHEAT("DekuStick"), DEKU_STICK_NORMAL) != DEKU_STICK_NORMAL) { - *should = false; - } - break; - } - default: - break; - } -} - -static uint32_t onVanillaBehaviorHook = 0; -void CheatsRegisterHooks() { - GameInteractor::Instance->RegisterGameHook([](int32_t fileNum) mutable { - - GameInteractor::Instance->UnregisterGameHook(onVanillaBehaviorHook); - onVanillaBehaviorHook = 0; - onVanillaBehaviorHook = GameInteractor::Instance->RegisterGameHook(CheatsOnVanillaBehaviorHandler); - - }); -} diff --git a/soh/soh/Enhancements/cheat_hook_handlers.h b/soh/soh/Enhancements/cheat_hook_handlers.h deleted file mode 100644 index 88a79f285..000000000 --- a/soh/soh/Enhancements/cheat_hook_handlers.h +++ /dev/null @@ -1,6 +0,0 @@ -#ifndef CHEAT_HOOK_HANDLERS_H -#define CHEAT_HOOK_HANDLERS_H - -void CheatsRegisterHooks(); - -#endif // CHEAT_HOOK_HANDLERS_H diff --git a/soh/soh/Enhancements/controls/InputViewer.cpp b/soh/soh/Enhancements/controls/InputViewer.cpp index 7d6b37179..5f650a25f 100644 --- a/soh/soh/Enhancements/controls/InputViewer.cpp +++ b/soh/soh/Enhancements/controls/InputViewer.cpp @@ -9,7 +9,7 @@ #include #include -#include "../../UIWidgets.hpp" +#include "soh/SohGui/UIWidgets.hpp" // Text colors static ImVec4 textColor = ImVec4(1.0f, 1.0f, 1.0f, 1.0f); diff --git a/soh/soh/Enhancements/controls/SohInputEditorWindow.cpp b/soh/soh/Enhancements/controls/SohInputEditorWindow.cpp index 492517738..7e4918799 100644 --- a/soh/soh/Enhancements/controls/SohInputEditorWindow.cpp +++ b/soh/soh/Enhancements/controls/SohInputEditorWindow.cpp @@ -1,7 +1,7 @@ #include "SohInputEditorWindow.h" #include #include "soh/OTRGlobals.h" -#include "../../UIWidgets.hpp" +#include "soh/SohGui/UIWidgets.hpp" #include "z64.h" #include "soh/cvar_prefixes.h" #ifndef __WIIU__ @@ -46,13 +46,6 @@ void SohInputEditorWindow::InitElement() { addButtonName(BTN_DLEFT, "D-pad left"); addButtonName(BTN_DRIGHT, "D-pad right"); addButtonName(0, "None"); - - mDeviceIndexVisiblity.clear(); - mDeviceIndexVisiblity[Ship::ShipDeviceIndex::Keyboard] = true; - mDeviceIndexVisiblity[Ship::ShipDeviceIndex::Blue] = true; - for (auto index = 1; index < Ship::ShipDeviceIndex::Max; index++) { - mDeviceIndexVisiblity[static_cast(index)] = false; - } } #define INPUT_EDITOR_WINDOW_GAME_INPUT_BLOCK_ID 95237929 @@ -176,6 +169,9 @@ void SohInputEditorWindow::DrawAnalogPreview(const char* label, ImVec2 stick, fl #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_MOUSE_BEIGE ImVec4(0.5f, 0.5f, 0.5f, 0.5f) +#define BUTTON_COLOR_MOUSE_BEIGE_HOVERED ImVec4(0.5f, 0.5f, 0.5f, 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) @@ -191,29 +187,21 @@ void SohInputEditorWindow::DrawAnalogPreview(const char* label, ImVec2 stick, fl #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(Ship::ShipDeviceIndex lusIndex, ImVec4& buttonColor, +void SohInputEditorWindow::GetButtonColorsForDeviceType(Ship::PhysicalDeviceType lusIndex, ImVec4& buttonColor, ImVec4& buttonHoveredColor) { switch (lusIndex) { - case Ship::ShipDeviceIndex::Keyboard: + case Ship::PhysicalDeviceType::Keyboard: buttonColor = BUTTON_COLOR_KEYBOARD_BEIGE; buttonHoveredColor = BUTTON_COLOR_KEYBOARD_BEIGE_HOVERED; break; - case Ship::ShipDeviceIndex::Blue: + case Ship::PhysicalDeviceType::Mouse: + buttonColor = BUTTON_COLOR_MOUSE_BEIGE; + buttonHoveredColor = BUTTON_COLOR_MOUSE_BEIGE_HOVERED; + break; + case Ship::PhysicalDeviceType::SDLGamepad: buttonColor = BUTTON_COLOR_GAMEPAD_BLUE; buttonHoveredColor = BUTTON_COLOR_GAMEPAD_BLUE_HOVERED; break; - case Ship::ShipDeviceIndex::Red: - buttonColor = BUTTON_COLOR_GAMEPAD_RED; - buttonHoveredColor = BUTTON_COLOR_GAMEPAD_RED_HOVERED; - break; - case Ship::ShipDeviceIndex::Orange: - buttonColor = BUTTON_COLOR_GAMEPAD_ORANGE; - buttonHoveredColor = BUTTON_COLOR_GAMEPAD_ORANGE_HOVERED; - break; - case Ship::ShipDeviceIndex::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; @@ -266,9 +254,6 @@ void SohInputEditorWindow::DrawButtonLineEditMappingButton(uint8_t port, N64Butt if (mapping == nullptr) { return; } - if (!mDeviceIndexVisiblity[mapping->GetShipDeviceIndex()]) { - return; - } ImGui::PushStyleVar(ImGuiStyleVar_ButtonTextAlign, ImVec2(0.0f, 0.5f)); std::string icon = ""; @@ -287,7 +272,7 @@ void SohInputEditorWindow::DrawButtonLineEditMappingButton(uint8_t port, N64Butt auto buttonHoveredColor = ImGui::GetStyleColorVec4(ImGuiCol_ButtonHovered); auto physicalInputDisplayName = StringHelper::Sprintf("%s %s", icon.c_str(), mapping->GetPhysicalInputName().c_str()); - GetButtonColorsForLUSDeviceIndex(mapping->GetShipDeviceIndex(), buttonColor, buttonHoveredColor); + GetButtonColorsForDeviceType(mapping->GetPhysicalDeviceType(), buttonColor, buttonHoveredColor); ImGui::PushStyleColor(ImGuiCol_Button, buttonColor); ImGui::PushStyleColor(ImGuiCol_ButtonHovered, buttonHoveredColor); auto popupId = StringHelper::Sprintf("editButtonMappingPopup##%s", id.c_str()); @@ -324,19 +309,12 @@ void SohInputEditorWindow::DrawButtonLineEditMappingButton(uint8_t port, N64Butt ImGui::PopStyleVar(); ImGui::SameLine(0, 0); -#ifndef __WIIU__ auto sdlAxisDirectionToButtonMapping = std::dynamic_pointer_cast(mapping); - auto indexMapping = Ship::Context::GetInstance() - ->GetControlDeck() - ->GetDeviceIndexMappingManager() - ->GetDeviceIndexMappingFromShipDeviceIndex(mapping->GetShipDeviceIndex()); - auto sdlIndexMapping = std::dynamic_pointer_cast(indexMapping); - - if (sdlIndexMapping != nullptr && sdlAxisDirectionToButtonMapping != nullptr) { + if (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->GetShipDeviceIndex(), buttonColor, buttonHoveredColor); + GetButtonColorsForDeviceType(mapping->GetPhysicalDeviceType(), buttonColor, buttonHoveredColor); ImGui::PushStyleColor(ImGuiCol_Button, buttonColor); ImGui::PushStyleColor(ImGuiCol_ButtonHovered, buttonHoveredColor); ImGui::PushStyleVar(ImGuiStyleVar_ButtonTextAlign, ImVec2(1.0f, 0.5f)); @@ -357,17 +335,19 @@ void SohInputEditorWindow::DrawButtonLineEditMappingButton(uint8_t port, N64Butt 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"); + auto globalSettings = Ship::Context::GetInstance()->GetControlDeck()->GetGlobalSDLDeviceSettings(); + if (sdlAxisDirectionToButtonMapping->AxisIsStick()) { ImGui::Text("Stick axis threshold:"); - int32_t stickAxisThreshold = sdlIndexMapping->GetStickAxisThresholdPercentage(); + int32_t stickAxisThreshold = globalSettings->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(); + globalSettings->SetStickAxisThresholdPercentage(stickAxisThreshold - 1); + globalSettings->SaveToConfig(); } ImGui::PopButtonRepeat(); if (stickAxisThreshold == 0) { @@ -377,8 +357,8 @@ void SohInputEditorWindow::DrawButtonLineEditMappingButton(uint8_t port, N64Butt 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(); + globalSettings->SetStickAxisThresholdPercentage(stickAxisThreshold); + globalSettings->SaveToConfig(); } ImGui::SameLine(0.0f, 0.0f); if (stickAxisThreshold == 100) { @@ -386,8 +366,8 @@ void SohInputEditorWindow::DrawButtonLineEditMappingButton(uint8_t port, N64Butt } ImGui::PushButtonRepeat(true); if (ImGui::Button(StringHelper::Sprintf("+##Stick Axis Threshold%s", id.c_str()).c_str())) { - sdlIndexMapping->SetStickAxisThresholdPercentage(stickAxisThreshold + 1); - sdlIndexMapping->SaveToConfig(); + globalSettings->SetStickAxisThresholdPercentage(stickAxisThreshold + 1); + globalSettings->SaveToConfig(); } ImGui::PopButtonRepeat(); if (stickAxisThreshold == 100) { @@ -398,14 +378,14 @@ void SohInputEditorWindow::DrawButtonLineEditMappingButton(uint8_t port, N64Butt if (sdlAxisDirectionToButtonMapping->AxisIsTrigger()) { ImGui::Text("Trigger axis threshold:"); - int32_t triggerAxisThreshold = sdlIndexMapping->GetTriggerAxisThresholdPercentage(); + int32_t triggerAxisThreshold = globalSettings->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(); + globalSettings->SetTriggerAxisThresholdPercentage(triggerAxisThreshold - 1); + globalSettings->SaveToConfig(); } ImGui::PopButtonRepeat(); if (triggerAxisThreshold == 0) { @@ -415,8 +395,8 @@ void SohInputEditorWindow::DrawButtonLineEditMappingButton(uint8_t port, N64Butt 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(); + globalSettings->SetTriggerAxisThresholdPercentage(triggerAxisThreshold); + globalSettings->SaveToConfig(); } ImGui::SameLine(0.0f, 0.0f); if (triggerAxisThreshold == 100) { @@ -424,8 +404,8 @@ void SohInputEditorWindow::DrawButtonLineEditMappingButton(uint8_t port, N64Butt } ImGui::PushButtonRepeat(true); if (ImGui::Button(StringHelper::Sprintf("+##Trigger Axis Threshold%s", id.c_str()).c_str())) { - sdlIndexMapping->SetTriggerAxisThresholdPercentage(triggerAxisThreshold + 1); - sdlIndexMapping->SaveToConfig(); + globalSettings->SetTriggerAxisThresholdPercentage(triggerAxisThreshold + 1); + globalSettings->SaveToConfig(); } ImGui::PopButtonRepeat(); if (triggerAxisThreshold == 100) { @@ -444,7 +424,6 @@ void SohInputEditorWindow::DrawButtonLineEditMappingButton(uint8_t port, N64Butt ImGui::PopStyleVar(); ImGui::SameLine(0, 0); } -#endif ImGui::PushStyleColor(ImGuiCol_Button, buttonColor); ImGui::PushStyleColor(ImGuiCol_ButtonHovered, buttonHoveredColor); @@ -539,9 +518,6 @@ void SohInputEditorWindow::DrawStickDirectionLineEditMappingButton(uint8_t port, if (mapping == nullptr) { return; } - if (!mDeviceIndexVisiblity[mapping->GetShipDeviceIndex()]) { - return; - } ImGui::PushStyleVar(ImGuiStyleVar_ButtonTextAlign, ImVec2(0.0f, 0.5f)); std::string icon = ""; @@ -560,7 +536,7 @@ void SohInputEditorWindow::DrawStickDirectionLineEditMappingButton(uint8_t port, auto buttonHoveredColor = ImGui::GetStyleColorVec4(ImGuiCol_ButtonHovered); auto physicalInputDisplayName = StringHelper::Sprintf("%s %s", icon.c_str(), mapping->GetPhysicalInputName().c_str()); - GetButtonColorsForLUSDeviceIndex(mapping->GetShipDeviceIndex(), buttonColor, buttonHoveredColor); + GetButtonColorsForDeviceType(mapping->GetPhysicalDeviceType(), buttonColor, buttonHoveredColor); ImGui::PushStyleColor(ImGuiCol_Button, buttonColor); ImGui::PushStyleColor(ImGuiCol_ButtonHovered, buttonHoveredColor); auto popupId = StringHelper::Sprintf("editStickDirectionMappingPopup##%s", id.c_str()); @@ -885,7 +861,7 @@ void SohInputEditorWindow::DrawRumbleSection(uint8_t port) { ImGui::SetNextItemOpen(true, ImGuiCond_Once); auto buttonColor = ImGui::GetStyleColorVec4(ImGuiCol_Button); auto buttonHoveredColor = ImGui::GetStyleColorVec4(ImGuiCol_ButtonHovered); - GetButtonColorsForLUSDeviceIndex(mapping->GetShipDeviceIndex(), buttonColor, buttonHoveredColor); + GetButtonColorsForDeviceType(mapping->GetPhysicalDeviceType(), 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 = ""; @@ -1256,209 +1232,6 @@ void SohInputEditorWindow::DrawGyroSection(uint8_t port) { } } -void SohInputEditorWindow::DrawButtonDeviceIcons(uint8_t portIndex, std::set bitmasks) { - std::set allLusDeviceIndices; - allLusDeviceIndices.insert(Ship::ShipDeviceIndex::Keyboard); - for (auto [lusIndex, mapping] : Ship::Context::GetInstance() - ->GetControlDeck() - ->GetDeviceIndexMappingManager() - ->GetAllDeviceIndexMappingsFromConfig()) { - allLusDeviceIndices.insert(lusIndex); - } - - std::vector> lusDeviceIndiciesWithMappings; - for (auto lusIndex : allLusDeviceIndices) { - for (auto [bitmask, button] : - Ship::Context::GetInstance()->GetControlDeck()->GetControllerByPort(portIndex)->GetAllButtons()) { - if (!bitmasks.contains(bitmask)) { - continue; - } - - if (button->HasMappingsForShipDeviceIndex(lusIndex)) { - for (auto [id, mapping] : button->GetAllButtonMappings()) { - if (mapping->GetShipDeviceIndex() == 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 == Ship::ShipDeviceIndex::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, Ship::StickIndex stickIndex) { - std::set allLusDeviceIndices; - allLusDeviceIndices.insert(Ship::ShipDeviceIndex::Keyboard); - for (auto [lusIndex, mapping] : Ship::Context::GetInstance() - ->GetControlDeck() - ->GetDeviceIndexMappingManager() - ->GetAllDeviceIndexMappingsFromConfig()) { - allLusDeviceIndices.insert(lusIndex); - } - - std::vector> lusDeviceIndiciesWithMappings; - for (auto lusIndex : allLusDeviceIndices) { - auto controllerStick = - stickIndex == Ship::StickIndex::LEFT_STICK - ? Ship::Context::GetInstance()->GetControlDeck()->GetControllerByPort(portIndex)->GetLeftStick() - : Ship::Context::GetInstance()->GetControlDeck()->GetControllerByPort(portIndex)->GetRightStick(); - if (controllerStick->HasMappingsForShipDeviceIndex(lusIndex)) { - for (auto [direction, mappings] : controllerStick->GetAllAxisDirectionMappings()) { - bool foundMapping = false; - for (auto [id, mapping] : mappings) { - if (mapping->GetShipDeviceIndex() == 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 == Ship::ShipDeviceIndex::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] : Ship::Context::GetInstance() - ->GetControlDeck() - ->GetDeviceIndexMappingManager() - ->GetAllDeviceIndexMappingsFromConfig()) { - allLusDeviceIndices.insert(lusIndex); - } - - std::vector> lusDeviceIndiciesWithMappings; - for (auto lusIndex : allLusDeviceIndices) { - if (Ship::Context::GetInstance() - ->GetControlDeck() - ->GetControllerByPort(portIndex) - ->GetRumble() - ->HasMappingsForShipDeviceIndex(lusIndex)) { - for (auto [id, mapping] : Ship::Context::GetInstance() - ->GetControlDeck() - ->GetControllerByPort(portIndex) - ->GetRumble() - ->GetAllRumbleMappings()) { - if (mapping->GetShipDeviceIndex() == 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 = - Ship::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->GetShipDeviceIndex(), 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] : Ship::Context::GetInstance() - ->GetControlDeck() - ->GetDeviceIndexMappingManager() - ->GetAllDeviceIndexMappingsFromConfig()) { - allLusDeviceIndices.insert(lusIndex); - } - - std::vector> lusDeviceIndiciesWithMappings; - for (auto lusIndex : allLusDeviceIndices) { - if (Ship::Context::GetInstance() - ->GetControlDeck() - ->GetControllerByPort(portIndex) - ->GetRumble() - ->HasMappingsForShipDeviceIndex(lusIndex)) { - for (auto [id, mapping] : Ship::Context::GetInstance() - ->GetControlDeck() - ->GetControllerByPort(portIndex) - ->GetLED() - ->GetAllLEDMappings()) { - if (mapping->GetShipDeviceIndex() == 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(); - } -} - const ImGuiTableFlags PANEL_TABLE_FLAGS = ImGuiTableFlags_BordersH | ImGuiTableFlags_BordersV; @@ -1651,66 +1424,52 @@ void SohInputEditorWindow::DrawDpadControlPanel() { Ship::GuiWindow::EndGroupPanel(0); } -void SohInputEditorWindow::DrawDeviceVisibilityButtons() { - std::map> indexMappings; - for (auto [lusIndex, mapping] : Ship::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] : Ship::Context::GetInstance() - ->GetControlDeck() - ->GetDeviceIndexMappingManager() - ->GetAllDeviceIndexMappings()) { - auto sdlIndexMapping = std::static_pointer_cast(mapping); - if (sdlIndexMapping == nullptr) { - continue; - } - - indexMappings[lusIndex] = { sdlIndexMapping->GetSDLControllerName(), sdlIndexMapping->GetSDLDeviceIndex() }; - } +void SohInputEditorWindow::DrawDeviceToggles(uint8_t portIndex) { + ImGui::PushItemFlag(ImGuiItemFlags_Disabled, true); auto keyboardButtonColor = ImGui::GetStyleColorVec4(ImGuiCol_Button); auto keyboardButtonHoveredColor = ImGui::GetStyleColorVec4(ImGuiCol_ButtonHovered); - GetButtonColorsForLUSDeviceIndex(Ship::ShipDeviceIndex::Keyboard, keyboardButtonColor, keyboardButtonHoveredColor); + GetButtonColorsForDeviceType(Ship::PhysicalDeviceType::Keyboard, keyboardButtonColor, keyboardButtonHoveredColor); ImGui::PushStyleColor(ImGuiCol_Button, keyboardButtonColor); ImGui::PushStyleColor(ImGuiCol_ButtonHovered, keyboardButtonHoveredColor); - bool keyboardVisible = mDeviceIndexVisiblity[Ship::ShipDeviceIndex::Keyboard]; - if(ImGui::Button( - StringHelper::Sprintf("%s %s Keyboard", keyboardVisible ? ICON_FA_EYE : ICON_FA_EYE_SLASH, ICON_FA_KEYBOARD_O) - .c_str())) { - mDeviceIndexVisiblity[Ship::ShipDeviceIndex::Keyboard] = !keyboardVisible; - } + ImGui::Button(StringHelper::Sprintf("%s Keyboard", ICON_FA_KEYBOARD_O).c_str()); ImGui::PopStyleColor(); ImGui::PopStyleColor(); + auto mouseButtonColor = ImGui::GetStyleColorVec4(ImGuiCol_Button); + auto mouseButtonHoveredColor = ImGui::GetStyleColorVec4(ImGuiCol_ButtonHovered); + GetButtonColorsForDeviceType(Ship::PhysicalDeviceType::Mouse, mouseButtonColor, mouseButtonHoveredColor); + ImGui::PushStyleColor(ImGuiCol_Button, mouseButtonColor); + ImGui::PushStyleColor(ImGuiCol_ButtonHovered, mouseButtonHoveredColor); + ImGui::Button(StringHelper::Sprintf("%s Mouse", ICON_FA_KEYBOARD_O).c_str()); + ImGui::PopStyleColor(); + ImGui::PopStyleColor(); - for (auto [lusIndex, info] : indexMappings) { - auto [name, sdlIndex] = info; - bool connected = sdlIndex != -1; + ImGui::PopItemFlag(); + auto connectedDeviceManager = Ship::Context::GetInstance()->GetControlDeck()->GetConnectedPhysicalDeviceManager(); + for (const auto& [instanceId, name] : connectedDeviceManager->GetConnectedSDLGamepadNames()) { + ImGui::PushItemFlag(ImGuiItemFlags_Disabled, true); auto buttonColor = ImGui::GetStyleColorVec4(ImGuiCol_Button); auto buttonHoveredColor = ImGui::GetStyleColorVec4(ImGuiCol_ButtonHovered); - GetButtonColorsForLUSDeviceIndex(lusIndex, buttonColor, buttonHoveredColor); - + GetButtonColorsForDeviceType(Ship::PhysicalDeviceType::SDLGamepad, buttonColor, buttonHoveredColor); ImGui::PushStyleColor(ImGuiCol_Button, buttonColor); ImGui::PushStyleColor(ImGuiCol_ButtonHovered, buttonHoveredColor); - bool visible = mDeviceIndexVisiblity[lusIndex]; - if(ImGui::Button( - StringHelper::Sprintf("%s %s %s (%s)", visible ? ICON_FA_EYE : ICON_FA_EYE_SLASH, connected ? ICON_FA_GAMEPAD : ICON_FA_CHAIN_BROKEN, name.c_str(), - connected ? StringHelper::Sprintf("SDL %d", sdlIndex).c_str() : "Disconnected") - .c_str())) { - mDeviceIndexVisiblity[lusIndex] = !visible; - } + auto notIgnored = !connectedDeviceManager->PortIsIgnoringInstanceId(portIndex, instanceId); + ImGui::PopItemFlag(); + if(ImGui::Checkbox(StringHelper::Sprintf("###instanceId_%d", instanceId).c_str(), ¬Ignored)) { + if (notIgnored) { + connectedDeviceManager->UnignoreInstanceIdForPort(portIndex, instanceId); + } else { + connectedDeviceManager->IgnoreInstanceIdForPort(portIndex, instanceId); + } + }; + ImGui::PushItemFlag(ImGuiItemFlags_Disabled, true); + ImGui::SameLine(); + ImGui::Button(StringHelper::Sprintf("%s %s (SDL)", ICON_FA_GAMEPAD, name.c_str()).c_str()); ImGui::PopStyleColor(); ImGui::PopStyleColor(); + ImGui::PopItemFlag(); } } @@ -1719,7 +1478,7 @@ void SohInputEditorWindow::DrawLinkTab() { if (ImGui::BeginTabItem(StringHelper::Sprintf("Link (P1)###port%d", portIndex).c_str())) { DrawClearAllButton(portIndex); DrawSetDefaultsButton(portIndex); - DrawDeviceVisibilityButtons(); + DrawDeviceToggles(portIndex); UpdateBitmaskToMappingIds(portIndex); UpdateStickDirectionToMappingIds(portIndex); @@ -1729,7 +1488,6 @@ void SohInputEditorWindow::DrawLinkTab() { 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); @@ -1744,57 +1502,36 @@ void SohInputEditorWindow::DrawLinkTab() { 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, Ship::LEFT_STICK); DrawStickSection(portIndex, Ship::LEFT, 0); - } else { - DrawAnalogStickDeviceIcons(portIndex, Ship::LEFT_STICK); } if (ImGui::CollapsingHeader("Additional (\"Right\") Stick")) { - DrawAnalogStickDeviceIcons(portIndex, Ship::RIGHT_STICK); DrawStickSection(portIndex, Ship::RIGHT, 1, CHIP_COLOR_N64_YELLOW); - } else { - DrawAnalogStickDeviceIcons(portIndex, Ship::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_CUSTOM_MODIFIER1); DrawButtonLine("M2", portIndex, BTN_CUSTOM_MODIFIER2); @@ -1827,15 +1564,10 @@ void SohInputEditorWindow::DrawLinkTab() { Ship::GuiWindow::EndGroupPanel(0); } ImGui::EndDisabled(); - } else { - DrawButtonDeviceIcons(portIndex, mModifierButtonsBitmasks); } if (ImGui::CollapsingHeader("Ocarina Controls")) { - DrawButtonDeviceIcons(portIndex, mCustomOcarinaButtonsBitmasks); DrawOcarinaControlPanel(); - } else { - DrawButtonDeviceIcons(portIndex, mCustomOcarinaButtonsBitmasks); } if (ImGui::CollapsingHeader("Camera Controls")) { @@ -1875,7 +1607,7 @@ void SohInputEditorWindow::DrawIvanTab() { if (ImGui::BeginTabItem(StringHelper::Sprintf("Ivan (P2)###port%d", portIndex).c_str())) { DrawClearAllButton(portIndex); DrawSetDefaultsButton(portIndex); - DrawDeviceVisibilityButtons(); + DrawDeviceToggles(portIndex); UpdateBitmaskToMappingIds(portIndex); UpdateStickDirectionToMappingIds(portIndex); @@ -1885,7 +1617,6 @@ void SohInputEditorWindow::DrawIvanTab() { 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); @@ -1897,25 +1628,17 @@ void SohInputEditorWindow::DrawIvanTab() { 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, Ship::LEFT_STICK); DrawStickSection(portIndex, Ship::LEFT, 0); - } else { - DrawAnalogStickDeviceIcons(portIndex, Ship::LEFT_STICK); } ImGui::PopStyleColor(); @@ -1931,7 +1654,7 @@ void SohInputEditorWindow::DrawDebugPortTab(uint8_t portIndex, std::string custo : customName.c_str())) { DrawClearAllButton(portIndex); DrawSetDefaultsButton(portIndex); - DrawDeviceVisibilityButtons(); + DrawDeviceToggles(portIndex); UpdateBitmaskToMappingIds(portIndex); UpdateStickDirectionToMappingIds(portIndex); @@ -1941,7 +1664,6 @@ void SohInputEditorWindow::DrawDebugPortTab(uint8_t portIndex, std::string custo 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); @@ -1956,25 +1678,16 @@ void SohInputEditorWindow::DrawDebugPortTab(uint8_t portIndex, std::string custo 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, Ship::LEFT_STICK); DrawStickSection(portIndex, Ship::LEFT, 0); - } else { - DrawAnalogStickDeviceIcons(portIndex, Ship::LEFT_STICK); } ImGui::PopStyleColor(); @@ -2010,19 +1723,6 @@ void SohInputEditorWindow::DrawSetDefaultsButton(uint8_t portIndex) { } if (ImGui::BeginPopup(popupId.c_str())) { - std::map> indexMappings; - for (auto [lusIndex, mapping] : Ship::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); @@ -2041,49 +1741,42 @@ void SohInputEditorWindow::DrawSetDefaultsButton(uint8_t portIndex) { Ship::Context::GetInstance() ->GetControlDeck() ->GetControllerByPort(portIndex) - ->ClearAllMappingsForDevice(Ship::ShipDeviceIndex::Keyboard); + ->ClearAllMappingsForDeviceType(Ship::PhysicalDeviceType::Keyboard); Ship::Context::GetInstance()->GetControlDeck()->GetControllerByPort(portIndex)->AddDefaultMappings( - Ship::ShipDeviceIndex::Keyboard); + Ship::PhysicalDeviceType::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()); + auto buttonColor = ImGui::GetStyleColorVec4(ImGuiCol_Button); + auto buttonHoveredColor = ImGui::GetStyleColorVec4(ImGuiCol_ButtonHovered); + GetButtonColorsForDeviceType(Ship::PhysicalDeviceType::SDLGamepad, buttonColor, buttonHoveredColor); + ImGui::PushStyleColor(ImGuiCol_Button, buttonColor); + ImGui::PushStyleColor(ImGuiCol_ButtonHovered, buttonHoveredColor); + if (ImGui::Button(StringHelper::Sprintf("%s %s", ICON_FA_GAMEPAD, "Gamepad (SDL)").c_str())) { + ImGui::OpenPopup("Set Defaults for Gamepad (SDL)"); + } + ImGui::PopStyleColor(); + ImGui::PopStyleColor(); + if (ImGui::BeginPopupModal("Set Defaults for Gamepad (SDL)", NULL, ImGuiWindowFlags_AlwaysAutoResize)) { + ImGui::Text("This will clear all existing mappings for\nGamepad (SDL) on port %d.\n\nContinue?", portIndex + 1); + if (ImGui::Button("Cancel")) { + shouldClose = true; + ImGui::CloseCurrentPopup(); } - 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")) { - Ship::Context::GetInstance() - ->GetControlDeck() - ->GetControllerByPort(portIndex) - ->ClearAllMappingsForDevice(lusIndex); - Ship::Context::GetInstance()->GetControlDeck()->GetControllerByPort(portIndex)->AddDefaultMappings( - lusIndex); - shouldClose = true; - ImGui::CloseCurrentPopup(); - } - ImGui::EndPopup(); + if (ImGui::Button("Set defaults")) { + Ship::Context::GetInstance() + ->GetControlDeck() + ->GetControllerByPort(portIndex) + ->ClearAllMappingsForDeviceType(Ship::PhysicalDeviceType::SDLGamepad); + Ship::Context::GetInstance()->GetControlDeck()->GetControllerByPort(portIndex)->AddDefaultMappings( + Ship::PhysicalDeviceType::SDLGamepad); + shouldClose = true; + ImGui::CloseCurrentPopup(); } + ImGui::EndPopup(); } if (ImGui::Button("Cancel") || shouldClose) { diff --git a/soh/soh/Enhancements/controls/SohInputEditorWindow.h b/soh/soh/Enhancements/controls/SohInputEditorWindow.h index fdb3c77b0..4545f771d 100644 --- a/soh/soh/Enhancements/controls/SohInputEditorWindow.h +++ b/soh/soh/Enhancements/controls/SohInputEditorWindow.h @@ -83,7 +83,7 @@ class SohInputEditorWindow : public Ship::GuiWindow { void UpdateBitmaskToMappingIds(uint8_t port); void UpdateStickDirectionToMappingIds(uint8_t port); - void GetButtonColorsForLUSDeviceIndex(Ship::ShipDeviceIndex lusIndex, ImVec4& buttonColor, + void GetButtonColorsForDeviceType(Ship::PhysicalDeviceType lusIndex, ImVec4& buttonColor, ImVec4& buttonHoveredColor); void DrawLinkTab(); void DrawIvanTab(); @@ -92,15 +92,9 @@ class SohInputEditorWindow : public Ship::GuiWindow { std::set mDpadBitmasks; std::set mModifierButtonsBitmasks; std::set mCustomOcarinaButtonsBitmasks; - void DrawButtonDeviceIcons(uint8_t portIndex, std::set bitmasks); - void DrawAnalogStickDeviceIcons(uint8_t portIndex, Ship::StickIndex stickIndex); - 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); - std::map mDeviceIndexVisiblity; - void DrawDeviceVisibilityButtons(); + void DrawDeviceToggles(uint8_t portIndex); }; diff --git a/soh/soh/Enhancements/cosmetics/CosmeticsEditor.cpp b/soh/soh/Enhancements/cosmetics/CosmeticsEditor.cpp index 6274de469..0bdd3d10d 100644 --- a/soh/soh/Enhancements/cosmetics/CosmeticsEditor.cpp +++ b/soh/soh/Enhancements/cosmetics/CosmeticsEditor.cpp @@ -10,7 +10,7 @@ #include #include -#include "soh/UIWidgets.hpp" +#include "soh/SohGui/UIWidgets.hpp" #include "soh/OTRGlobals.h" #include "soh/ResourceManagerHelpers.h" @@ -32,7 +32,6 @@ extern "C" { #include "objects/object_st/object_st.h" #include "objects/object_gi_boomerang/object_gi_boomerang.h" #include "objects/object_gi_liquid/object_gi_liquid.h" -#include "objects/object_gi_bow/object_gi_bow.h" #include "objects/object_gi_hearts/object_gi_hearts.h" #include "objects/gameplay_keep/gameplay_keep.h" #include "objects/object_gi_sword_1/object_gi_sword_1.h" @@ -47,9 +46,8 @@ extern "C" { #include "objects/object_gjyo_objects/object_gjyo_objects.h" #include "textures/nintendo_rogo_static/nintendo_rogo_static.h" #include "objects/object_gi_rabit_mask/object_gi_rabit_mask.h" -#include "overlays/ovl_Boss_Ganon2/ovl_Boss_Ganon2.h" #include "overlays/ovl_Magic_Wind/ovl_Magic_Wind.h" -#include "textures/nintendo_rogo_static/nintendo_rogo_static.h" + extern PlayState* gPlayState; void ResourceMgr_PatchGfxByName(const char* path, const char* patchName, int index, Gfx instruction); void ResourceMgr_PatchGfxCopyCommandByName(const char* path, const char* patchName, int destinationIndex, int sourceIndex); @@ -74,6 +72,9 @@ std::map groupLabels = { { COSMETICS_GROUP_SWORDS, "Swords" }, { COSMETICS_GROUP_GLOVES, "Gloves" }, { COSMETICS_GROUP_EQUIPMENT, "Equipment" }, + { COSMETICS_GROUP_KEYRING, "Keyring" }, + { COSMETICS_GROUP_SMALL_KEYS, "Small Keys" }, + { COSMETICS_GROUP_BOSS_KEYS, "Boss Keys" }, { COSMETICS_GROUP_CONSUMABLE, "Consumables" }, { COSMETICS_GROUP_HUD, "HUD" }, { COSMETICS_GROUP_KALEIDO, "Pause Menu" }, @@ -118,7 +119,7 @@ Color_RGBA8 ColorRGBA8(uint8_t r, uint8_t g, uint8_t b, uint8_t a) { /* So, you would like to add a new cosmetic option? BUCKLE UP - To preface this, if you have any questions or concerns ping @ProxySaw on discord, if I'm no longer available ask around in the #development-chat + To preface this, if you have any questions or concerns ping @ProxySaw on discord, if I'm no longer available ask around in the #soh-development # Silly Options Lets get this one out of the way, probably the only thing that will be consistent between silly options is how they are rendered @@ -252,6 +253,42 @@ static std::map cosmeticOptions = { COSMETIC_OPTION("Consumable.GoldRupee", "Gold Rupee", COSMETICS_GROUP_CONSUMABLE, ColorRGBA8(255, 190, 55, 255), false, true, true), COSMETIC_OPTION("Consumable.SilverRupee", "Silver Rupee", COSMETICS_GROUP_CONSUMABLE, ColorRGBA8(255, 255, 255, 255), false, true, true), + COSMETIC_OPTION("Key.KeyringRing", "Key Ring Ring", COSMETICS_GROUP_KEYRING, ColorRGBA8(255, 255, 255, 255), false, true, false), + COSMETIC_OPTION("Key.ForestSmallBody", "Forest Small Key Body", COSMETICS_GROUP_SMALL_KEYS, ColorRGBA8(255, 255, 255, 255), false, true, false), + COSMETIC_OPTION("Key.ForestSmallEmblem", "Forest Small Key Emblem", COSMETICS_GROUP_SMALL_KEYS, ColorRGBA8(4, 195, 46, 255), false, true, false), + COSMETIC_OPTION("Key.ForestBossBody", "Forest Boss Key Body", COSMETICS_GROUP_BOSS_KEYS, ColorRGBA8(255, 255, 0, 255), false, true, false), + COSMETIC_OPTION("Key.ForestBossGem", "Forest Boss Key Gem", COSMETICS_GROUP_BOSS_KEYS, ColorRGBA8(255, 0, 0, 255), false, true, false), + COSMETIC_OPTION("Key.FireSmallBody", "Fire Small Key Body", COSMETICS_GROUP_SMALL_KEYS, ColorRGBA8(255, 255, 255, 255), false, true, false), + COSMETIC_OPTION("Key.FireSmallEmblem", "Fire Small Key Emblem", COSMETICS_GROUP_SMALL_KEYS, ColorRGBA8(237, 95, 95, 255), false, true, false), + COSMETIC_OPTION("Key.FireBossBody", "Fire Boss Key Body", COSMETICS_GROUP_BOSS_KEYS, ColorRGBA8(255, 255, 0, 255), false, true, false), + COSMETIC_OPTION("Key.FireBossGem", "Fire Boss Key Gem", COSMETICS_GROUP_BOSS_KEYS, ColorRGBA8(255, 0, 0, 255), false, true, false), + COSMETIC_OPTION("Key.WaterSmallBody", "Water Small Key Body", COSMETICS_GROUP_SMALL_KEYS, ColorRGBA8(255, 255, 255, 255), false, true, false), + COSMETIC_OPTION("Key.WaterSmallEmblem", "Water Small Key Emblem", COSMETICS_GROUP_SMALL_KEYS, ColorRGBA8(85, 180, 223, 255), false, true, false), + COSMETIC_OPTION("Key.WaterBossBody", "Water Boss Key Body", COSMETICS_GROUP_BOSS_KEYS, ColorRGBA8(255, 255, 0, 255), false, true, false), + COSMETIC_OPTION("Key.WaterBossGem", "Water Boss Key Gem", COSMETICS_GROUP_BOSS_KEYS, ColorRGBA8(255, 0, 0, 255), false, true, false), + COSMETIC_OPTION("Key.SpiritSmallBody", "Spirit Small Key Body", COSMETICS_GROUP_SMALL_KEYS, ColorRGBA8(255, 255, 255, 255), false, true, false), + COSMETIC_OPTION("Key.SpiritSmallEmblem", "Spirit Small Key Emblem", COSMETICS_GROUP_SMALL_KEYS, ColorRGBA8(222, 158, 47, 255), false, true, false), + COSMETIC_OPTION("Key.SpiritBossBody", "Spirit Boss Key Body", COSMETICS_GROUP_BOSS_KEYS, ColorRGBA8(255, 255, 0, 255), false, true, false), + COSMETIC_OPTION("Key.SpiritBossGem", "Spirit Boss Key Gem", COSMETICS_GROUP_BOSS_KEYS, ColorRGBA8(255, 0, 0, 255), false, true, false), + COSMETIC_OPTION("Key.ShadowSmallBody", "Shadow Small Key Body", COSMETICS_GROUP_SMALL_KEYS, ColorRGBA8(255, 255, 255, 255), false, true, false), + COSMETIC_OPTION("Key.ShadowSmallEmblem", "Shadow Small Key Emblem", COSMETICS_GROUP_SMALL_KEYS, ColorRGBA8(126, 16, 177, 255), false, true, false), + COSMETIC_OPTION("Key.ShadowBossBody", "Shadow Boss Key Body", COSMETICS_GROUP_BOSS_KEYS, ColorRGBA8(255, 255, 0, 255), false, true, false), + COSMETIC_OPTION("Key.ShadowBossGem", "Shadow Boss Key Gem", COSMETICS_GROUP_BOSS_KEYS, ColorRGBA8(255, 0, 0, 255), false, true, false), + COSMETIC_OPTION("Key.GanonsSmallBody", "Ganons Small Key Body", COSMETICS_GROUP_SMALL_KEYS, ColorRGBA8(255, 255, 255, 255), false, true, false), + COSMETIC_OPTION("Key.GanonsSmallEmblem", "Ganons Small Key Emblem", COSMETICS_GROUP_SMALL_KEYS, ColorRGBA8(80, 80, 80, 255), false, true, false), + COSMETIC_OPTION("Key.GanonsBossBody", "Ganons Boss Key Body", COSMETICS_GROUP_BOSS_KEYS, ColorRGBA8(255, 255, 0, 255), false, true, false), + COSMETIC_OPTION("Key.GanonsBossGem", "Ganons Boss Key Gem", COSMETICS_GROUP_BOSS_KEYS, ColorRGBA8(255, 0, 0, 255), false, true, false), + + COSMETIC_OPTION("Key.WellSmallBody", "Well Small Key", COSMETICS_GROUP_SMALL_KEYS, ColorRGBA8(255, 255, 255, 255), false, true, false), + COSMETIC_OPTION("Key.WellSmallEmblem", "Well Small Key Emblem", COSMETICS_GROUP_SMALL_KEYS, ColorRGBA8(227, 110, 255, 255), false, true, true), + COSMETIC_OPTION("Key.FortSmallBody", "Fortress Small Key", COSMETICS_GROUP_SMALL_KEYS, ColorRGBA8(255, 255, 255, 255), false, true, false), + COSMETIC_OPTION("Key.FortSmallEmblem", "Fortress Small Key Emblem",COSMETICS_GROUP_SMALL_KEYS, ColorRGBA8(255, 255, 255, 255), false, true, true), + COSMETIC_OPTION("Key.GTGSmallBody", "GTG Small Key", COSMETICS_GROUP_SMALL_KEYS, ColorRGBA8(255, 255, 255, 255), false, true, false), + COSMETIC_OPTION("Key.GTGSmallEmblem", "GTG Small Key Emblem", COSMETICS_GROUP_SMALL_KEYS, ColorRGBA8(221, 212, 60, 255), false, true, true), + //COSMETIC_OPTION("Key.ChestGameSmallBody", "Chest Game Key", COSMETICS_GROUP_SMALL_KEYS, ColorRGBA8(255, 255, 255, 255), false, true, false), + //COSMETIC_OPTION("Key.ChestGameEmblem", "Chest Game Key Emblem", COSMETICS_GROUP_SMALL_KEYS, ColorRGBA8(255, 0, 0, 255), false, true, true), + COSMETIC_OPTION("Key.Skeleton", "Skeleton Key", COSMETICS_GROUP_SMALL_KEYS, ColorRGBA8(255, 255, 170, 255), false, true, false), + COSMETIC_OPTION("HUD.AButton", "A Button", COSMETICS_GROUP_HUD, ColorRGBA8( 90, 90, 255, 255), false, true, false), COSMETIC_OPTION("HUD.BButton", "B Button", COSMETICS_GROUP_HUD, ColorRGBA8( 0, 150, 0, 255), false, true, false), COSMETIC_OPTION("HUD.CButtons", "C Buttons", COSMETICS_GROUP_HUD, ColorRGBA8(255, 160, 0, 255), false, true, false), @@ -294,12 +331,12 @@ static std::map cosmeticOptions = { #undef MESSAGE_COSMETIC_OPTION - COSMETIC_OPTION("Kaleido.ItemSelA", "Item Select Color", COSMETICS_GROUP_KALEIDO, ColorRGBA8( 10, 50, 80, 255), false, true, false), + COSMETIC_OPTION("Kaleido.ItemSelA", "Item Select Color", COSMETICS_GROUP_KALEIDO, ColorRGBA8( 10, 50, 80, 255), false, true, true), COSMETIC_OPTION("Kaleido.ItemSelB", "Item Select Color B", COSMETICS_GROUP_KALEIDO, ColorRGBA8( 70, 100, 130, 255), false, true, true), COSMETIC_OPTION("Kaleido.ItemSelC", "Item Select Color C", COSMETICS_GROUP_KALEIDO, ColorRGBA8( 70, 100, 130, 255), false, true, true), COSMETIC_OPTION("Kaleido.ItemSelD", "Item Select Color D", COSMETICS_GROUP_KALEIDO, ColorRGBA8( 10, 50, 80, 255), false, true, true), - COSMETIC_OPTION("Kaleido.EquipSelA", "Equip Select Color", COSMETICS_GROUP_KALEIDO, ColorRGBA8( 10, 50, 40, 255), false, true, false), + COSMETIC_OPTION("Kaleido.EquipSelA", "Equip Select Color", COSMETICS_GROUP_KALEIDO, ColorRGBA8( 10, 50, 40, 255), false, true, true), COSMETIC_OPTION("Kaleido.EquipSelB", "Equip Select Color B", COSMETICS_GROUP_KALEIDO, ColorRGBA8( 90, 100, 60, 255), false, true, true), COSMETIC_OPTION("Kaleido.EquipSelC", "Equip Select Color C", COSMETICS_GROUP_KALEIDO, ColorRGBA8( 90, 100, 60, 255), false, true, true), COSMETIC_OPTION("Kaleido.EquipSelD", "Equip Select Color D", COSMETICS_GROUP_KALEIDO, ColorRGBA8( 10, 50, 80, 255), false, true, true), @@ -309,22 +346,22 @@ static std::map cosmeticOptions = { COSMETIC_OPTION("Kaleido.MapSelDunC", "Map Dungeon Color C", COSMETICS_GROUP_KALEIDO, ColorRGBA8(140, 60, 60, 255), false, true, true), COSMETIC_OPTION("Kaleido.MapSelDunD", "Map Dungeon Color D", COSMETICS_GROUP_KALEIDO, ColorRGBA8( 80, 40, 30, 255), false, true, true), - COSMETIC_OPTION("Kaleido.QuestStatusA", "Quest Status Color", COSMETICS_GROUP_KALEIDO, ColorRGBA8( 80, 80, 50, 255), false, true, false), + COSMETIC_OPTION("Kaleido.QuestStatusA", "Quest Status Color", COSMETICS_GROUP_KALEIDO, ColorRGBA8( 80, 80, 50, 255), false, true, true), COSMETIC_OPTION("Kaleido.QuestStatusB", "Quest Status Color B", COSMETICS_GROUP_KALEIDO, ColorRGBA8(120, 120, 70, 255), false, true, true), COSMETIC_OPTION("Kaleido.QuestStatusC", "Quest Status Color C", COSMETICS_GROUP_KALEIDO, ColorRGBA8(120, 120, 70, 255), false, true, true), COSMETIC_OPTION("Kaleido.QuestStatusD", "Quest Status Color D", COSMETICS_GROUP_KALEIDO, ColorRGBA8( 80, 80, 50, 255), false, true, true), - COSMETIC_OPTION("Kaleido.MapSelectA", "Map Color", COSMETICS_GROUP_KALEIDO, ColorRGBA8( 80, 40, 30, 255), false, true, false), + COSMETIC_OPTION("Kaleido.MapSelectA", "Map Color", COSMETICS_GROUP_KALEIDO, ColorRGBA8( 80, 40, 30, 255), false, true, true), COSMETIC_OPTION("Kaleido.MapSelectB", "Map Color B", COSMETICS_GROUP_KALEIDO, ColorRGBA8(140, 60, 60, 255), false, true, true), COSMETIC_OPTION("Kaleido.MapSelectC", "Map Color C", COSMETICS_GROUP_KALEIDO, ColorRGBA8(140, 60, 60, 255), false, true, true), COSMETIC_OPTION("Kaleido.MapSelectD", "Map Color D", COSMETICS_GROUP_KALEIDO, ColorRGBA8( 80, 40, 30, 255), false, true, true), - COSMETIC_OPTION("Kaleido.SaveA", "Save Color", COSMETICS_GROUP_KALEIDO, ColorRGBA8( 50, 50, 50, 255), false, true, false), + COSMETIC_OPTION("Kaleido.SaveA", "Save Color", COSMETICS_GROUP_KALEIDO, ColorRGBA8( 50, 50, 50, 255), false, true, true), COSMETIC_OPTION("Kaleido.SaveB", "Save Color B", COSMETICS_GROUP_KALEIDO, ColorRGBA8(110, 110, 110, 255), false, true, true), COSMETIC_OPTION("Kaleido.SaveC", "Save Color C", COSMETICS_GROUP_KALEIDO, ColorRGBA8(110, 110, 110, 255), false, true, true), COSMETIC_OPTION("Kaleido.SaveD", "Save Color D", COSMETICS_GROUP_KALEIDO, ColorRGBA8( 50, 50, 50, 255), false, true, true), - COSMETIC_OPTION("Kaleido.NamePanel", "Name Panel", COSMETICS_GROUP_KALEIDO, ColorRGBA8( 90, 100, 130, 255), true, true, false), + COSMETIC_OPTION("Kaleido.NamePanel", "Name Panel", COSMETICS_GROUP_KALEIDO, ColorRGBA8( 90, 100, 130, 255), true, true, true), COSMETIC_OPTION("Title.FileChoose", "File Choose", COSMETICS_GROUP_TITLE, ColorRGBA8(100, 150, 255, 255), false, true, false), COSMETIC_OPTION("Title.NintendoLogo", "Nintendo Logo", COSMETICS_GROUP_TITLE, ColorRGBA8( 0, 0, 255, 255), false, true, true), @@ -1445,10 +1482,16 @@ void Reset_Option_Double(const char* Button_Title, const char* name) { void DrawSillyTab() { ImGui::BeginDisabled(CVarGetInteger(CVAR_SETTING("DisableChanges"), 0)); + + UIWidgets::PaddedSeparator(true, true, 2.0f, 2.0f); + if (UIWidgets::EnhancementCheckbox("Let It Snow", CVAR_GENERAL("LetItSnow"))) { Ship::Context::GetInstance()->GetWindow()->GetGui()->SaveConsoleVariablesNextFrame(); } UIWidgets::Tooltip("Makes snow fall, changes chest texture colors to red and green, etc, for December holidays.\nWill reset on restart outside of December 23-25."); + + UIWidgets::PaddedSeparator(true, true, 2.0f, 2.0f); + if (UIWidgets::EnhancementSliderFloat("Link Body Scale: %.3fx", "##Link_BodyScale", CVAR_COSMETIC("Link.BodyScale.Value"), 0.001f, 0.025f, "", 0.01f, true)) { CVarSetInteger(CVAR_COSMETIC("Link.BodyScale.Changed"), 1); } @@ -1464,31 +1507,64 @@ void DrawSillyTab() { player->actor.scale.z = 0.01f; } } + + UIWidgets::PaddedSeparator(true, true, 2.0f, 2.0f); + if (UIWidgets::EnhancementSliderFloat("Link Head Scale: %.2fx", "##Link_HeadScale", CVAR_COSMETIC("Link.HeadScale.Value"), 0.4f, 4.0f, "", 1.0f, false)) { CVarSetInteger(CVAR_COSMETIC("Link.HeadScale.Changed"), 1); } Reset_Option_Double("Reset##Link_HeadScale", CVAR_COSMETIC("Link.HeadScale")); + + UIWidgets::PaddedSeparator(true, true, 2.0f, 2.0f); + if (UIWidgets::EnhancementSliderFloat("Link Sword Scale: %f", "##Link_SwordScale", CVAR_COSMETIC("Link.SwordScale.Value"), 1.0f, 2.5f, "", 1.0f, false)) { CVarSetInteger(CVAR_COSMETIC("Link.SwordScale.Changed"), 1); } Reset_Option_Double("Reset##Link_SwordScale", CVAR_COSMETIC("Link.SwordScale")); + + UIWidgets::PaddedSeparator(true, true, 2.0f, 2.0f); + UIWidgets::EnhancementSliderFloat("Bunny Hood Length: %f", "##BunnyHood_EarLength", CVAR_COSMETIC("BunnyHood.EarLength"), -300.0f, 1000.0f, "", 0.0f, false); Reset_Option_Single("Reset##BunnyHood_EarLength", CVAR_COSMETIC("BunnyHood.EarLength")); + + UIWidgets::PaddedSeparator(true, true, 2.0f, 2.0f); + UIWidgets::EnhancementSliderFloat("Bunny Hood Spread: %f", "##BunnyHood_EarSpread", CVAR_COSMETIC("BunnyHood.EarSpread"), -300.0f, 500.0f, "", 0.0f, false); Reset_Option_Single("Reset##BunnyHood_EarSpread", CVAR_COSMETIC("BunnyHood.EarSpread")); + + UIWidgets::PaddedSeparator(true, true, 2.0f, 2.0f); + UIWidgets::EnhancementSliderFloat("Goron Neck Length: %f", "##Goron_NeckLength", CVAR_COSMETIC("Goron.NeckLength"), 0.0f, 5000.0f, "", 0.0f, false); Reset_Option_Single("Reset##Goron_NeckLength", CVAR_COSMETIC("Goron.NeckLength")); + + UIWidgets::PaddedSeparator(true, true, 2.0f, 2.0f); + UIWidgets::EnhancementCheckbox("Unfix Goron Spin", CVAR_COSMETIC("UnfixGoronSpin")); + + UIWidgets::PaddedSeparator(true, true, 2.0f, 2.0f); + UIWidgets::EnhancementSliderFloat("Fairies Size: %f", "##Fairies_Size", CVAR_COSMETIC("Fairies.Size"), 0.25f, 5.0f, "", 1.0f, false); Reset_Option_Single("Reset##Fairies_Size", CVAR_COSMETIC("Fairies.Size")); + + UIWidgets::PaddedSeparator(true, true, 2.0f, 2.0f); + UIWidgets::EnhancementSliderFloat("N64 Logo Spin Speed: %f", "##N64Logo_SpinSpeed", CVAR_COSMETIC("N64Logo.SpinSpeed"), 0.25f, 5.0f, "", 1.0f, false); Reset_Option_Single("Reset##N64Logo_SpinSpeed", CVAR_COSMETIC("N64Logo.SpinSpeed")); + + UIWidgets::PaddedSeparator(true, true, 2.0f, 2.0f); + UIWidgets::EnhancementSliderFloat("Moon Size: %f", "##Moon_Size", CVAR_COSMETIC("Moon.Size"), 0.5f, 2.0f, "", 1.0f, false); Reset_Option_Single("Reset##Moon_Size", CVAR_COSMETIC("Moon.Size")); + + UIWidgets::PaddedSeparator(true, true, 2.0f, 2.0f); + if (UIWidgets::EnhancementSliderFloat("Kak Windmill Speed: %f", "##Kak_Windmill_Speed", CVAR_COSMETIC("Kak.Windmill_Speed.Value"), 100.0f, 6000.0f, "", 100.0f, false)) { CVarSetInteger(CVAR_COSMETIC("Kak.Windmill_Speed.Changed"), 1); } Reset_Option_Double("Reset##Kak_Windmill_Speed", CVAR_COSMETIC("Kak.Windmill_Speed")); + + UIWidgets::PaddedSeparator(true, true, 2.0f, 2.0f); + ImGui::EndDisabled(); } @@ -1546,66 +1622,6 @@ void ApplySideEffects(CosmeticOption& cosmeticOption) { CopyMultipliedColor(cosmeticOption, cosmeticOptions.at("SpinAttack.Level1Primary"), 2.0f); } else if (cosmeticOption.label == "Level 2 Secondary") { CopyMultipliedColor(cosmeticOption, cosmeticOptions.at("SpinAttack.Level2Primary"), 2.0f); - } else if (cosmeticOption.label == "Item Select Color") { - if (CVarGetInteger(cosmeticOption.rainbowCvar, 0)) { - ToggleRainbow(cosmeticOptions.at("Kaleido.ItemSelB"), true); - ToggleRainbow(cosmeticOptions.at("Kaleido.ItemSelC"), true); - ToggleRainbow(cosmeticOptions.at("Kaleido.ItemSelD"), true); - } else { - CopyMultipliedColor(cosmeticOption, cosmeticOptions.at("Kaleido.ItemSelB"), 2.0f); - CopyMultipliedColor(cosmeticOption, cosmeticOptions.at("Kaleido.ItemSelC"), 2.0f); - CopyMultipliedColor(cosmeticOption, cosmeticOptions.at("Kaleido.ItemSelD"), 1.0f); - } - } else if (cosmeticOption.label == "Equip Select Color") { - if (CVarGetInteger(cosmeticOption.rainbowCvar, 0)) { - ToggleRainbow(cosmeticOptions.at("Kaleido.EquipSelB"), true); - ToggleRainbow(cosmeticOptions.at("Kaleido.EquipSelC"), true); - ToggleRainbow(cosmeticOptions.at("Kaleido.EquipSelD"), true); - } else { - CopyMultipliedColor(cosmeticOption, cosmeticOptions.at("Kaleido.EquipSelB"), 2.0f); - CopyMultipliedColor(cosmeticOption, cosmeticOptions.at("Kaleido.EquipSelC"), 2.0f); - CopyMultipliedColor(cosmeticOption, cosmeticOptions.at("Kaleido.EquipSelD"), 1.0f); - } - } else if (cosmeticOption.label == "Map Dungeon Color") { - if (CVarGetInteger(cosmeticOption.rainbowCvar, 0)) { - ToggleRainbow(cosmeticOptions.at("Kaleido.MapSelDunB"), true); - ToggleRainbow(cosmeticOptions.at("Kaleido.MapSelDunC"), true); - ToggleRainbow(cosmeticOptions.at("Kaleido.MapSelDunD"), true); - } else { - CopyMultipliedColor(cosmeticOption, cosmeticOptions.at("Kaleido.MapSelDunB"), 2.0f); - CopyMultipliedColor(cosmeticOption, cosmeticOptions.at("Kaleido.MapSelDunC"), 2.0f); - CopyMultipliedColor(cosmeticOption, cosmeticOptions.at("Kaleido.MapSelDunD"), 1.0f); - } - } else if (cosmeticOption.label == "Quest Status Color") { - if (CVarGetInteger(cosmeticOption.rainbowCvar, 0)) { - ToggleRainbow(cosmeticOptions.at("Kaleido.QuestStatusB"), true); - ToggleRainbow(cosmeticOptions.at("Kaleido.QuestStatusC"), true); - ToggleRainbow(cosmeticOptions.at("Kaleido.QuestStatusD"), true); - } else { - CopyMultipliedColor(cosmeticOption, cosmeticOptions.at("Kaleido.QuestStatusB"), 2.0f); - CopyMultipliedColor(cosmeticOption, cosmeticOptions.at("Kaleido.QuestStatusC"), 2.0f); - CopyMultipliedColor(cosmeticOption, cosmeticOptions.at("Kaleido.QuestStatusD"), 1.0f); - } - } else if (cosmeticOption.label == "Map Color") { - if (CVarGetInteger(cosmeticOption.rainbowCvar, 0)) { - ToggleRainbow(cosmeticOptions.at("Kaleido.MapSelectB"), true); - ToggleRainbow(cosmeticOptions.at("Kaleido.MapSelectC"), true); - ToggleRainbow(cosmeticOptions.at("Kaleido.MapSelectD"), true); - } else { - CopyMultipliedColor(cosmeticOption, cosmeticOptions.at("Kaleido.MapSelectB"), 2.0f); - CopyMultipliedColor(cosmeticOption, cosmeticOptions.at("Kaleido.MapSelectC"), 2.0f); - CopyMultipliedColor(cosmeticOption, cosmeticOptions.at("Kaleido.MapSelectD"), 1.0f); - } - } else if (cosmeticOption.label == "Save Color") { - if (CVarGetInteger(cosmeticOption.rainbowCvar, 0)) { - ToggleRainbow(cosmeticOptions.at("Kaleido.SaveB"), true); - ToggleRainbow(cosmeticOptions.at("Kaleido.SaveC"), true); - ToggleRainbow(cosmeticOptions.at("Kaleido.SaveD"), true); - } else { - CopyMultipliedColor(cosmeticOption, cosmeticOptions.at("Kaleido.SaveB"), 2.0f); - CopyMultipliedColor(cosmeticOption, cosmeticOptions.at("Kaleido.SaveC"), 2.0f); - CopyMultipliedColor(cosmeticOption, cosmeticOptions.at("Kaleido.SaveD"), 1.0f); - } } } @@ -1778,6 +1794,7 @@ void DrawCosmeticGroup(CosmeticGroup cosmeticGroup) { DrawCosmeticRow(cosmeticOption); } } + UIWidgets::PaddedSeparator(true, true, 2.0f, 2.0f); } static const char* colorSchemes[2] = { @@ -1785,6 +1802,97 @@ static const char* colorSchemes[2] = { "Gamecube", }; +void CosmeticsEditorWindow::ApplyDungeonKeyColors() { + // Keyring + ResetColor(cosmeticOptions.at("Key.KeyringRing")); + + // Forest Temple + CVarSetColor(cosmeticOptions["Key.ForestSmallBody"].cvar, { 4, 195, 46, 255 }); + CVarSetInteger(cosmeticOptions["Key.ForestSmallBody"].changedCvar, 1); + cosmeticOptions["Key.ForestSmallBody"].currentColor = { 4 / 255.0f, 195 / 255.0f, 46 / 255.0f, 255 / 255.0f }; + ResetColor(cosmeticOptions.at("Key.ForestSmallEmblem")); + + ResetColor(cosmeticOptions.at("Key.ForestBossBody")); + CVarSetColor(cosmeticOptions["Key.ForestBossGem"].cvar, { 0, 255, 0, 255 }); + CVarSetInteger(cosmeticOptions["Key.ForestBossGem"].changedCvar, 1); + cosmeticOptions["Key.ForestBossGem"].currentColor = { 0, 255 / 255.0f, 0, 255 / 255.0f }; + + // Fire Temple + CVarSetColor(cosmeticOptions["Key.FireSmallBody"].cvar, { 237, 95, 95, 255 }); + CVarSetInteger(cosmeticOptions["Key.FireSmallBody"].changedCvar, 1); + cosmeticOptions["Key.FireSmallBody"].currentColor = { 237 / 255.0f, 95 / 255.0f, 95 / 255.0f, 255 / 255.0f }; + ResetColor(cosmeticOptions.at("Key.FireSmallEmblem")); + + ResetColor(cosmeticOptions.at("Key.FireBossBody")); + CVarSetColor(cosmeticOptions["Key.FireBossGem"].cvar, { 255, 30, 0, 255 }); + CVarSetInteger(cosmeticOptions["Key.FireBossGem"].changedCvar, 1); + cosmeticOptions["Key.FireBossGem"].currentColor = { 255 / 255.0f, 30 / 255.0f, 0, 255 / 255.0f }; + + // Water Temple + CVarSetColor(cosmeticOptions["Key.WaterSmallBody"].cvar, { 85, 180, 223, 255 }); + CVarSetInteger(cosmeticOptions["Key.WaterSmallBody"].changedCvar, 1); + cosmeticOptions["Key.WaterSmallBody"].currentColor = { 85 / 255.0f, 180 / 255.0f, 223 / 255.0f, 255 / 255.0f }; + ResetColor(cosmeticOptions.at("Key.WaterSmallEmblem")); + + ResetColor(cosmeticOptions.at("Key.WaterBossBody")); + CVarSetColor(cosmeticOptions["Key.WaterBossGem"].cvar, { 0, 137, 255, 255 }); + CVarSetInteger(cosmeticOptions["Key.WaterBossGem"].changedCvar, 1); + cosmeticOptions["Key.WaterBossGem"].currentColor = { 0, 137 / 255.0f, 255 / 255.0f, 255 / 255.0f }; + + // Spirit Temple + CVarSetColor(cosmeticOptions["Key.SpiritSmallBody"].cvar, { 222, 158, 47, 255 }); + CVarSetInteger(cosmeticOptions["Key.SpiritSmallBody"].changedCvar, 1); + cosmeticOptions["Key.SpiritSmallBody"].currentColor = { 222 / 255.0f, 158 / 255.0f, 47 / 255.0f, 255 / 255.0f }; + ResetColor(cosmeticOptions.at("Key.SpiritSmallEmblem")); + + ResetColor(cosmeticOptions.at("Key.SpiritBossBody")); + CVarSetColor(cosmeticOptions["Key.SpiritBossGem"].cvar, { 255, 85, 0, 255 }); + CVarSetInteger(cosmeticOptions["Key.SpiritBossGem"].changedCvar, 1); + cosmeticOptions["Key.SpiritBossGem"].currentColor = { 255 / 255.0f, 85 / 255.0f, 0, 255 / 255.0f }; + + // Shadow Temple + CVarSetColor(cosmeticOptions["Key.ShadowSmallBody"].cvar, { 126, 16, 177, 255 }); + CVarSetInteger(cosmeticOptions["Key.ShadowSmallBody"].changedCvar, 1); + cosmeticOptions["Key.ShadowSmallBody"].currentColor = { 126 / 255.0f, 16 / 255.0f, 177 / 255.0f, 255 / 255.0f }; + ResetColor(cosmeticOptions.at("Key.ShadowSmallEmblem")); + + ResetColor(cosmeticOptions.at("Key.ShadowBossBody")); + CVarSetColor(cosmeticOptions["Key.ShadowBossGem"].cvar, { 153, 0, 255, 255 }); + CVarSetInteger(cosmeticOptions["Key.ShadowBossGem"].changedCvar, 1); + cosmeticOptions["Key.ShadowBossGem"].currentColor = { 153 / 255.0f, 0, 255 / 255.0f, 255 / 255.0f }; + + // Ganon's Tower + CVarSetColor(cosmeticOptions["Key.GanonsSmallBody"].cvar, { 80, 80, 80, 255 }); + CVarSetInteger(cosmeticOptions["Key.GanonsSmallBody"].changedCvar, 1); + cosmeticOptions["Key.GanonsSmallBody"].currentColor = { 80 / 255.0f, 80 / 255.0f, 80 / 255.0f, 255 / 255.0f }; + ResetColor(cosmeticOptions.at("Key.GanonsSmallEmblem")); + + CVarSetColor(cosmeticOptions["Key.GanonsBossBody"].cvar, { 80, 80, 80, 255 }); + CVarSetInteger(cosmeticOptions["Key.GanonsBossBody"].changedCvar, 1); + cosmeticOptions["Key.GanonsBossBody"].currentColor = { 80 / 255.0f, 80 / 255.0f, 80 / 255.0f, 255 / 255.0f }; + CVarSetColor(cosmeticOptions["Key.GanonsBossGem"].cvar, { 255, 0, 0, 255 }); + CVarSetInteger(cosmeticOptions["Key.GanonsBossGem"].changedCvar, 1); + cosmeticOptions["Key.GanonsBossGem"].currentColor = { 255 / 255.0f, 0, 0, 255 / 255.0f }; + + // Bottom of the Well + CVarSetColor(cosmeticOptions["Key.WellSmallBody"].cvar, { 227, 110, 255, 255 }); + CVarSetInteger(cosmeticOptions["Key.WellSmallBody"].changedCvar, 1); + cosmeticOptions["Key.WellSmallBody"].currentColor = { 227 / 255.0f, 110 / 255.0f, 255 / 255.0f, 255 / 255.0f }; + ResetColor(cosmeticOptions.at("Key.WellSmallEmblem")); + + // Gerudo Training Ground + CVarSetColor(cosmeticOptions["Key.GTGSmallBody"].cvar, { 221, 212, 60, 255 }); + CVarSetInteger(cosmeticOptions["Key.GTGSmallBody"].changedCvar, 1); + cosmeticOptions["Key.GTGSmallBody"].currentColor = { 221 / 255.0f, 212 / 255.0f, 60 / 255.0f, 255 / 255.0f }; + ResetColor(cosmeticOptions.at("Key.GTGSmallEmblem")); + + // Gerudo Fortress + CVarSetColor(cosmeticOptions["Key.FortSmallBody"].cvar, { 255, 255, 255, 255 }); + CVarSetInteger(cosmeticOptions["Key.FortSmallBody"].changedCvar, 1); + cosmeticOptions["Key.FortSmallBody"].currentColor = { 255 / 255.0f, 255 / 255.0f, 255 / 255.0f, 255 / 255.0f }; + ResetColor(cosmeticOptions.at("Key.FortSmallEmblem")); +} + void CosmeticsEditorWindow::DrawElement() { ImGui::Text("Color Scheme"); ImGui::SameLine(); @@ -1794,6 +1902,7 @@ void CosmeticsEditorWindow::DrawElement() { "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(CVAR_COSMETIC("AdvancedMode"), 0)) { if (ImGui::Button("Lock All Advanced", ImVec2(ImGui::GetContentRegionAvail().x / 2, 30.0f))) { for (auto& [id, cosmeticOption] : cosmeticOptions) { @@ -1882,6 +1991,9 @@ void CosmeticsEditorWindow::DrawElement() { if (ImGui::BeginTabBar("CosmeticsContextTabBar", ImGuiTabBarFlags_NoCloseWithMiddleMouseButton)) { if (ImGui::BeginTabItem("Link & Items")) { + + UIWidgets::PaddedSeparator(true, true, 2.0f, 2.0f); + DrawCosmeticGroup(COSMETICS_GROUP_LINK); DrawCosmeticGroup(COSMETICS_GROUP_GLOVES); DrawCosmeticGroup(COSMETICS_GROUP_MIRRORSHIELD); @@ -1890,7 +2002,29 @@ void CosmeticsEditorWindow::DrawElement() { DrawCosmeticGroup(COSMETICS_GROUP_CONSUMABLE); ImGui::EndTabItem(); } + + if (ImGui::BeginTabItem("Keys")) { + + UIWidgets::PaddedSeparator(true, true, 2.0f, 2.0f); + + if (ImGui::Button("Give all keys dungeon-specific colors", ImVec2(300.0f, 30.0f))) { + ApplyDungeonKeyColors(); + Ship::Context::GetInstance()->GetWindow()->GetGui()->SaveConsoleVariablesNextFrame(); + } + + UIWidgets::PaddedSeparator(true, true, 2.0f, 2.0f); + + DrawCosmeticGroup(COSMETICS_GROUP_KEYRING); + DrawCosmeticGroup(COSMETICS_GROUP_SMALL_KEYS); + DrawCosmeticGroup(COSMETICS_GROUP_BOSS_KEYS); + + ImGui::EndTabItem(); + } + if (ImGui::BeginTabItem("Effects")) { + + UIWidgets::PaddedSeparator(true, true, 2.0f, 2.0f); + DrawCosmeticGroup(COSMETICS_GROUP_MAGIC); DrawCosmeticGroup(COSMETICS_GROUP_ARROWS); DrawCosmeticGroup(COSMETICS_GROUP_SPIN_ATTACK); @@ -1904,9 +2038,15 @@ void CosmeticsEditorWindow::DrawElement() { CVarClear(CVAR_COSMETIC("Trails.Duration.Changed")); Ship::Context::GetInstance()->GetWindow()->GetGui()->SaveConsoleVariablesNextFrame(); } + + UIWidgets::PaddedSeparator(true, true, 2.0f, 2.0f); + ImGui::EndTabItem(); } if (ImGui::BeginTabItem("World & NPCs")) { + + UIWidgets::PaddedSeparator(true, true, 2.0f, 2.0f); + DrawCosmeticGroup(COSMETICS_GROUP_WORLD); DrawCosmeticGroup(COSMETICS_GROUP_NAVI); DrawCosmeticGroup(COSMETICS_GROUP_IVAN); @@ -1918,6 +2058,9 @@ void CosmeticsEditorWindow::DrawElement() { ImGui::EndTabItem(); } if (ImGui::BeginTabItem("HUD")) { + + UIWidgets::PaddedSeparator(true, true, 2.0f, 2.0f); + DrawCosmeticGroup(COSMETICS_GROUP_HUD); DrawCosmeticGroup(COSMETICS_GROUP_TITLE); ImGui::EndTabItem(); @@ -1928,9 +2071,11 @@ void CosmeticsEditorWindow::DrawElement() { ImGui::EndTabItem(); } - if (ImGui::BeginTabItem("Pause Menu")) { - DrawCosmeticGroup(COSMETICS_GROUP_KALEIDO); - ImGui::EndTabItem(); + if (CVarGetInteger(CVAR_COSMETIC("AdvancedMode"), 0)) { + if (ImGui::BeginTabItem("Pause Menu")) { + DrawCosmeticGroup(COSMETICS_GROUP_KALEIDO); + ImGui::EndTabItem(); + } } if (CVarGetInteger(CVAR_COSMETIC("AdvancedMode"), 0)) { diff --git a/soh/soh/Enhancements/cosmetics/CosmeticsEditor.h b/soh/soh/Enhancements/cosmetics/CosmeticsEditor.h index 55dba5780..c9a28ef29 100644 --- a/soh/soh/Enhancements/cosmetics/CosmeticsEditor.h +++ b/soh/soh/Enhancements/cosmetics/CosmeticsEditor.h @@ -9,6 +9,9 @@ typedef enum { COSMETICS_GROUP_SWORDS, COSMETICS_GROUP_GLOVES, COSMETICS_GROUP_EQUIPMENT, + COSMETICS_GROUP_KEYRING, + COSMETICS_GROUP_SMALL_KEYS, + COSMETICS_GROUP_BOSS_KEYS, COSMETICS_GROUP_CONSUMABLE, COSMETICS_GROUP_HUD, COSMETICS_GROUP_KALEIDO, @@ -62,6 +65,7 @@ class CosmeticsEditorWindow : public Ship::GuiWindow { void InitElement() override; void DrawElement() override; + void ApplyDungeonKeyColors(); void UpdateElement() override {}; }; #endif //__cplusplus \ No newline at end of file diff --git a/soh/soh/Enhancements/cosmetics/CustomLogoTitle.cpp b/soh/soh/Enhancements/cosmetics/CustomLogoTitle.cpp new file mode 100644 index 000000000..d478f8fc3 --- /dev/null +++ b/soh/soh/Enhancements/cosmetics/CustomLogoTitle.cpp @@ -0,0 +1,232 @@ +#include "soh/Enhancements/game-interactor/GameInteractor_Hooks.h" +#include "soh/ShipInit.hpp" + +#include "textures/nintendo_rogo_static/nintendo_rogo_static.h" +#include "assets/objects/gameplay_keep/gameplay_keep.h" +#include "soh_assets.h" + +extern "C" { +#include "macros.h" +#include "z64.h" +#include "functions.h" +#include "variables.h" +#include "soh/Enhancements/enhancementTypes.h" +} + +extern "C" { +extern void Title_Calc(TitleContext*); +extern void Title_SetupView(TitleContext*, f32, f32, f32); +} + +#define LOGO_TO_DRAW_LUS 0 +#define LOGO_TO_DRAW_N64 1 + +static bool shouldDrawIceOnSpinningLogo = false; + +extern "C" void CustomLogoTitle_Draw(TitleContext* titleContext, uint8_t logoToDraw) { + static s16 sTitleRotY = 0; + static Lights1 sTitleLights = gdSPDefLights1(0x64, 0x64, 0x64, 0xFF, 0xFF, 0xFF, 0x45, 0x45, 0x45); + + u16 y; + u16 idx; + s32 pad1; + Vec3f v3; + Vec3f v1; + Vec3f v2; + s32 pad2[2]; + + OPEN_DISPS(titleContext->state.gfxCtx); + + v3.x = 69; + v3.y = 69; + v3.z = 69; + v2.x = -4949.148; + v2.y = 4002.5417; + v1.x = 0; + v1.y = 0; + v1.z = 0; + v2.z = 1119.0837; + + func_8002EABC(&v1, &v2, &v3, titleContext->state.gfxCtx); + gSPSetLights1(POLY_OPA_DISP++, sTitleLights); + Title_SetupView(titleContext, 0, 150.0, 300.0); + Gfx_SetupDL_25Opa(titleContext->state.gfxCtx); + Matrix_Translate(-53.0, -5.0, 0, MTXMODE_NEW); + Matrix_Scale(1.0, 1.0, 1.0, MTXMODE_APPLY); + Matrix_RotateZYX(0, sTitleRotY, 0, MTXMODE_APPLY); + + gSPMatrix(POLY_OPA_DISP++, MATRIX_NEWMTX(titleContext->state.gfxCtx), G_MTX_LOAD); + + if (logoToDraw == LOGO_TO_DRAW_LUS) { + gSPDisplayList(POLY_OPA_DISP++, (Gfx*)gShipLogoDL); + } else { + gSPDisplayList(POLY_OPA_DISP++, (Gfx*)gNintendo64LogoDL); + } + + Gfx_SetupDL_39Opa(titleContext->state.gfxCtx); + gDPPipeSync(POLY_OPA_DISP++); + gDPSetCycleType(POLY_OPA_DISP++, G_CYC_2CYCLE); + gDPSetRenderMode(POLY_OPA_DISP++, G_RM_XLU_SURF2, G_RM_OPA_CI | CVG_DST_WRAP); + gDPSetCombineLERP(POLY_OPA_DISP++, TEXEL1, PRIMITIVE, ENV_ALPHA, TEXEL0, 0, 0, 0, TEXEL0, PRIMITIVE, ENVIRONMENT, + COMBINED, ENVIRONMENT, COMBINED, 0, PRIMITIVE, 0); + if (CVarGetInteger(CVAR_COSMETIC("Title.NintendoLogo.Changed"), 0)) { + Color_RGB8 nintendoLogoColor = CVarGetColor24(CVAR_COSMETIC("Title.NintendoLogo.Value"), Color_RGB8{0, 0, 255}); + gDPSetPrimColor(POLY_OPA_DISP++, 0, 0, 255, 255, 255, 255); + gDPSetEnvColor(POLY_OPA_DISP++, nintendoLogoColor.r, nintendoLogoColor.g, nintendoLogoColor.b, 128); + } else { + gDPSetPrimColor(POLY_OPA_DISP++, 0, 0, 170, 255, 255, 255); + gDPSetEnvColor(POLY_OPA_DISP++, 0, 0, 255, 128); + } + + gDPLoadMultiBlock(POLY_OPA_DISP++, nintendo_rogo_static_Tex_001800, 0x100, 1, G_IM_FMT_I, G_IM_SIZ_8b, 32, 32, 0, + G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMIRROR | G_TX_WRAP, 5, 5, 2, 11); + + for (idx = 0, y = 94; idx < 16; idx++, y += 2) + { + gDPLoadMultiTile(POLY_OPA_DISP++, (logoToDraw == LOGO_TO_DRAW_N64) ? nintendo_rogo_static_Tex_000000 : nintendo_rogo_static_Tex_LUS_000000, 0, G_TX_RENDERTILE, G_IM_FMT_I, G_IM_SIZ_8b, 192, 32, + 0, idx * 2, 192 - 1, (idx + 1) * 2 - 1, 0, G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMASK, + G_TX_NOMASK, G_TX_NOLOD, G_TX_NOLOD); + + gDPSetTileSize(POLY_OPA_DISP++, 0, 0, 0, (192 - 1) << G_TEXTURE_IMAGE_FRAC, + (2 - 1) << G_TEXTURE_IMAGE_FRAC); + + gDPSetTileSize(POLY_OPA_DISP++, 1, titleContext->uls, (titleContext->ult & 0x7F) - idx * 4, 0, 0); + gSPTextureRectangle(POLY_OPA_DISP++, 388, y << 2, 1156, (y + 2) << 2, G_TX_RENDERTILE, 0, 0, 1 << 10, 1 << 10); + } + + // Draw ice block around spinning N or ship. + if (shouldDrawIceOnSpinningLogo) { + f32 scale = 0.4f; + + gSPSegment(POLY_OPA_DISP++, 0x08, + (uintptr_t)Gfx_TwoTexScroll(titleContext->state.gfxCtx, 0, 0, (0 - 1) % 128, 32, 32, 1, + 0, (1 * -2) % 128, 32, 32)); + + Matrix_Translate(0.0f, -10.0f, 0.0f, MTXMODE_APPLY); + Matrix_Scale(scale, scale, scale, MTXMODE_APPLY); + gSPMatrix(POLY_OPA_DISP++, MATRIX_NEWMTX(titleContext->state.gfxCtx), + G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW); + gDPSetEnvColor(POLY_OPA_DISP++, 0, 50, 100, 255); + gSPDisplayList(POLY_OPA_DISP++, (Gfx*)gEffIceFragment3DL); + } + + Environment_FillScreen(titleContext->state.gfxCtx, 0, 0, 0, (s16)titleContext->coverAlpha, FILL_SCREEN_XLU); + + sTitleRotY += (300 * CVarGetFloat(CVAR_COSMETIC("N64Logo.SpinSpeed"), 1.0f)); + + CLOSE_DISPS(titleContext->state.gfxCtx); +} + +#define CVAR_BOOTSEQUENCE_NAME CVAR_ENHANCEMENT("BootSequence") +#define CVAR_BOOTSEQUENCE_DEFAULT BOOTSEQUENCE_DEFAULT +#define CVAR_BOOTSEQUENCE_VALUE CVarGetInteger(CVAR_BOOTSEQUENCE_NAME, CVAR_BOOTSEQUENCE_DEFAULT) + +extern "C" void CustomLogoTitle_Main(TitleContext* titleContext) { + static uint8_t logosSeen = 0; + uint8_t logoToDraw; + + if (CVAR_BOOTSEQUENCE_VALUE == BOOTSEQUENCE_DEFAULT) { + if (logosSeen == 0) { + logoToDraw = LOGO_TO_DRAW_LUS; + } else { + logoToDraw = LOGO_TO_DRAW_N64; + } + } + + if (CVAR_BOOTSEQUENCE_VALUE == BOOTSEQUENCE_AUTHENTIC) { + logoToDraw = LOGO_TO_DRAW_N64; + } + + OPEN_DISPS(titleContext->state.gfxCtx); + + gSPSegment(POLY_OPA_DISP++, 0, (uintptr_t)NULL); + gSPSegment(POLY_OPA_DISP++, 1, (uintptr_t)titleContext->staticSegment); + Gfx_SetupFrame(titleContext->state.gfxCtx, 0, 0, 0); + Title_Calc(titleContext); + CustomLogoTitle_Draw(titleContext, logoToDraw); + + if (titleContext->exit) { + gSaveContext.seqId = (u8)NA_BGM_DISABLED; + gSaveContext.natureAmbienceId = 0xFF; + gSaveContext.gameMode = GAMEMODE_TITLE_SCREEN; + titleContext->state.running = false; + + logosSeen++; + + if (CVAR_BOOTSEQUENCE_VALUE == BOOTSEQUENCE_DEFAULT && logosSeen == 1) { + SET_NEXT_GAMESTATE(&titleContext->state, Title_Init, TitleContext); + } + + if ((CVAR_BOOTSEQUENCE_VALUE == BOOTSEQUENCE_DEFAULT && logosSeen == 2) || + (CVAR_BOOTSEQUENCE_VALUE == BOOTSEQUENCE_AUTHENTIC)) { + SET_NEXT_GAMESTATE(&titleContext->state, Opening_Init, OpeningContext); + logosSeen = 0; + } + } + + GameInteractor_ExecuteOnZTitleUpdate(titleContext); + + CLOSE_DISPS(titleContext->state.gfxCtx); +} + +// // // // +// Always +// + +void OnZTitleInitReplaceTitleMainWithCustom(void* gameState) { + TitleContext* titleContext = (TitleContext*)gameState; + titleContext->state.main = (GameStateFunc)CustomLogoTitle_Main; +} + +// Allows pressing A to skip the boot logo and go to the next state (opening or file select) +void OnZTitleUpdatePressButtonToSkip(void* gameState) { + TitleContext* titleContext = (TitleContext*)gameState; + + if (CHECK_BTN_ANY(titleContext->state.input->press.button, BTN_A | BTN_B | BTN_START)) { + // Force the title state to start fading to black and to last roughly 5 frames based on current fade in/out + titleContext->visibleDuration = 0; + titleContext->addAlpha = std::max((255 - titleContext->coverAlpha) / 5, 1); + } +} + +void RegisterCustomLogoTitle() { + COND_HOOK(OnZTitleInit, true, OnZTitleInitReplaceTitleMainWithCustom); + COND_HOOK(OnZTitleUpdate, true, OnZTitleUpdatePressButtonToSkip); +} + +static RegisterShipInitFunc initFuncAlways(RegisterCustomLogoTitle); + +// // // // // // +// Bootsequence +// + +void OnZTitleUpdateSkipToFileSelect(void* gameState) { + TitleContext* titleContext = (TitleContext*)gameState; + + gSaveContext.seqId = (u8)NA_BGM_DISABLED; + gSaveContext.natureAmbienceId = 0xFF; + gSaveContext.gameMode = GAMEMODE_TITLE_SCREEN; + titleContext->state.running = false; + + SET_NEXT_GAMESTATE(&titleContext->state, FileChoose_Init, FileChooseContext); +} + +void RegisterCustomLogoTitleBootsequence() { + COND_HOOK(OnZTitleUpdate, CVAR_BOOTSEQUENCE_VALUE == BOOTSEQUENCE_FILESELECT, OnZTitleUpdateSkipToFileSelect); +} + +static RegisterShipInitFunc initFuncBootsequence(RegisterCustomLogoTitleBootsequence, { CVAR_BOOTSEQUENCE_NAME }); + +// // // // // // +// Let it Snow +// + +#define CVAR_LETITSNOW_NAME CVAR_GENERAL("LetItSnow") +#define CVAR_LETITSNOW_DEFAULT 0 +#define CVAR_LETITSNOW_VALUE CVarGetInteger(CVAR_LETITSNOW_NAME, CVAR_LETITSNOW_DEFAULT) + +void RegisterCustomLogoTitleLetItSnow() { + shouldDrawIceOnSpinningLogo = CVAR_LETITSNOW_VALUE != CVAR_LETITSNOW_DEFAULT; +} + +static RegisterShipInitFunc initFuncLetItSnow(RegisterCustomLogoTitleLetItSnow, { CVAR_LETITSNOW_NAME }); diff --git a/soh/soh/Enhancements/debugconsole.cpp b/soh/soh/Enhancements/debugconsole.cpp index 76f903eb1..9ef0fe2ab 100644 --- a/soh/soh/Enhancements/debugconsole.cpp +++ b/soh/soh/Enhancements/debugconsole.cpp @@ -402,6 +402,7 @@ static bool EntranceHandler(std::shared_ptr Console, const std::v gPlayState->transitionTrigger = TRANS_TRIGGER_START; gPlayState->transitionType = TRANS_TYPE_INSTANT; gSaveContext.nextTransitionType = TRANS_TYPE_INSTANT; + return 0; } static bool VoidHandler(std::shared_ptr Console, const std::vector& args, std::string* output) { @@ -470,7 +471,7 @@ static bool FWHandler(std::shared_ptr Console, const std::vector< break; case 2: //backup if (CVarGetInteger(CVAR_ENHANCEMENT("BetterFarore"), 0)) { - gSaveContext.fw = gSaveContext.backupFW; + gSaveContext.fw = gSaveContext.ship.backupFW; gSaveContext.fw.set = 1; INFO_MESSAGE("[SOH] Backup FW data copied! Reload scene to take effect."); return 0; @@ -1297,6 +1298,9 @@ static constexpr std::array, COSMETICS_GRO {"swords", COSMETICS_GROUP_SWORDS}, {"gloves", COSMETICS_GROUP_GLOVES}, {"equipment", COSMETICS_GROUP_EQUIPMENT}, + {"keyring", COSMETICS_GROUP_KEYRING}, + {"small_keys", COSMETICS_GROUP_SMALL_KEYS }, + {"boss_keys", COSMETICS_GROUP_BOSS_KEYS }, {"consumable", COSMETICS_GROUP_CONSUMABLE}, {"hud", COSMETICS_GROUP_HUD}, {"kaleido", COSMETICS_GROUP_KALEIDO}, diff --git a/soh/soh/Enhancements/debugger/MessageViewer.cpp b/soh/soh/Enhancements/debugger/MessageViewer.cpp index 7ae34b4a8..589dbaf4a 100644 --- a/soh/soh/Enhancements/debugger/MessageViewer.cpp +++ b/soh/soh/Enhancements/debugger/MessageViewer.cpp @@ -1,6 +1,6 @@ #include "MessageViewer.h" -#include +#include #include #include "../custom-message/CustomMessageManager.h" @@ -174,15 +174,13 @@ void MessageDebug_StartTextBox(const char* tableId, uint16_t textId, uint8_t lan PlayState* play = gPlayState; static int16_t messageStaticIndices[] = { 0, 1, 3, 2 }; const auto player = GET_PLAYER(gPlayState); - player->actor.flags |= ACTOR_FLAG_PLAYER_TALKED_TO; + player->actor.flags |= ACTOR_FLAG_TALK; MessageContext* msgCtx = &play->msgCtx; msgCtx->ocarinaAction = 0xFFFF; Font* font = &msgCtx->font; sMessageHasSetSfx = 0; for (u32 i = 0; i < FONT_CHAR_TEX_SIZE * 120; i += FONT_CHAR_TEX_SIZE) { - if (&font->charTexBuf[i] != nullptr) { - gSPInvalidateTexCache(play->state.gfxCtx->polyOpa.p++, reinterpret_cast(&font->charTexBuf[i])); - } + gSPInvalidateTexCache(play->state.gfxCtx->polyOpa.p++, reinterpret_cast(&font->charTexBuf[i])); } R_TEXT_CHAR_SCALE = 75; R_TEXT_LINE_SPACING = 12; diff --git a/soh/soh/Enhancements/debugger/actorViewer.cpp b/soh/soh/Enhancements/debugger/actorViewer.cpp index c6ac49a74..8aac60954 100644 --- a/soh/soh/Enhancements/debugger/actorViewer.cpp +++ b/soh/soh/Enhancements/debugger/actorViewer.cpp @@ -1,6 +1,6 @@ #include "actorViewer.h" #include "../../util.h" -#include "../../UIWidgets.hpp" +#include "soh/SohGui/UIWidgets.hpp" #include "soh/ActorDB.h" #include "soh/Enhancements/game-interactor/GameInteractor.h" #include "soh/Enhancements/nametag.h" diff --git a/soh/soh/Enhancements/debugger/colViewer.cpp b/soh/soh/Enhancements/debugger/colViewer.cpp index 2cba03f5b..493ffdfdc 100644 --- a/soh/soh/Enhancements/debugger/colViewer.cpp +++ b/soh/soh/Enhancements/debugger/colViewer.cpp @@ -1,6 +1,6 @@ #include "colViewer.h" #include "../../frame_interpolation.h" -#include "../../UIWidgets.hpp" +#include "soh/SohGui/UIWidgets.hpp" #include #include diff --git a/soh/soh/Enhancements/debugger/debugSaveEditor.cpp b/soh/soh/Enhancements/debugger/debugSaveEditor.cpp index 83fe7f676..962f50bd6 100644 --- a/soh/soh/Enhancements/debugger/debugSaveEditor.cpp +++ b/soh/soh/Enhancements/debugger/debugSaveEditor.cpp @@ -1,8 +1,8 @@ #include "debugSaveEditor.h" -#include "../../util.h" -#include "../../ImGuiUtils.h" -#include "../../OTRGlobals.h" -#include "../../UIWidgets.hpp" +#include "soh/util.h" +#include "soh/SohGui/ImGuiUtils.h" +#include "soh/OTRGlobals.h" +#include "soh/SohGui/UIWidgets.hpp" #include #include @@ -314,7 +314,7 @@ void DrawInfoTab() { UIWidgets::InsertHelpHoverText("Z-Targeting behavior"); if (IS_RANDO && OTRGlobals::Instance->gRandomizer->GetRandoSettingValue(RSK_TRIFORCE_HUNT)) { - ImGui::InputScalar("Triforce Pieces", ImGuiDataType_U8, &gSaveContext.triforcePiecesCollected); + ImGui::InputScalar("Triforce Pieces", ImGuiDataType_U8, &gSaveContext.ship.quest.data.randomizer.triforcePiecesCollected); UIWidgets::InsertHelpHoverText("Currently obtained Triforce Pieces. For Triforce Hunt."); } @@ -416,17 +416,17 @@ void DrawBGSItemFlag(uint8_t itemID) { ImGui::Image(Ship::Context::GetInstance()->GetWindow()->GetGui()->GetTextureByName(slotEntry.name), ImVec2(32.0f, 32.0f), ImVec2(0, 0), ImVec2(1, 1)); ImGui::SameLine(); int tradeIndex = itemID - ITEM_POCKET_EGG; - bool hasItem = (gSaveContext.adultTradeItems & (1 << tradeIndex)) != 0; + bool hasItem = (gSaveContext.ship.quest.data.randomizer.adultTradeItems & (1 << tradeIndex)) != 0; bool shouldHaveItem = hasItem; ImGui::Checkbox(("##adultTradeFlag" + std::to_string(itemID)).c_str(), &shouldHaveItem); if (hasItem != shouldHaveItem) { if (shouldHaveItem) { - gSaveContext.adultTradeItems |= (1 << tradeIndex); + gSaveContext.ship.quest.data.randomizer.adultTradeItems |= (1 << tradeIndex); if (INV_CONTENT(ITEM_TRADE_ADULT) == ITEM_NONE) { INV_CONTENT(ITEM_TRADE_ADULT) = ITEM_POCKET_EGG + tradeIndex; } } else { - gSaveContext.adultTradeItems &= ~(1 << tradeIndex); + gSaveContext.ship.quest.data.randomizer.adultTradeItems &= ~(1 << tradeIndex); Inventory_ReplaceItem(gPlayState, itemID, Randomizer_GetNextAdultTradeItem()); } } @@ -477,7 +477,7 @@ void DrawInventoryTab() { if (ImGui::Button("##itemNonePicker", ImVec2(32.0f, 32.0f))) { gSaveContext.inventory.items[selectedIndex] = ITEM_NONE; if (selectedIndex == SLOT_TRADE_ADULT) { - gSaveContext.adultTradeItems = 0; + gSaveContext.ship.quest.data.randomizer.adultTradeItems = 0; } ImGui::CloseCurrentPopup(); } @@ -517,7 +517,7 @@ void DrawInventoryTab() { OTRGlobals::Instance->gRandomizer->GetRandoSettingValue(RSK_SHUFFLE_ADULT_TRADE) && selectedIndex == SLOT_TRADE_ADULT && slotEntry.id >= ITEM_POCKET_EGG && slotEntry.id <= ITEM_CLAIM_CHECK) { - gSaveContext.adultTradeItems |= ADULT_TRADE_FLAG(slotEntry.id); + gSaveContext.ship.quest.data.randomizer.adultTradeItems |= ADULT_TRADE_FLAG(slotEntry.id); } ImGui::CloseCurrentPopup(); } @@ -923,7 +923,7 @@ void DrawFlagsTab() { DrawFlagTableArray16(flagTable, j, gSaveContext.eventInf[j]); break; case RANDOMIZER_INF: - DrawFlagTableArray16(flagTable, j, gSaveContext.randomizerInf[j]); + DrawFlagTableArray16(flagTable, j, gSaveContext.ship.randomizerInf[j]); break; } }); @@ -1305,7 +1305,7 @@ void DrawQuestStatusTab() { ImGui::Image(Ship::Context::GetInstance()->GetWindow()->GetGui()->GetTextureByName(itemMapping[ITEM_KEY_SMALL].name), ImVec2(lineHeight, lineHeight)); ImGui::SameLine(); if (ImGui::InputScalar("##Keys", ImGuiDataType_S8, gSaveContext.inventory.dungeonKeys + dungeonItemsScene)) { - gSaveContext.sohStats.dungeonKeys[dungeonItemsScene] = gSaveContext.inventory.dungeonKeys[dungeonItemsScene]; + gSaveContext.ship.stats.dungeonKeys[dungeonItemsScene] = gSaveContext.inventory.dungeonKeys[dungeonItemsScene]; }; } else { // dungeonItems is size 20 but dungeonKeys is size 19, so there are no keys for the last scene (Barinade's Lair) diff --git a/soh/soh/Enhancements/debugger/debugSaveEditor.h b/soh/soh/Enhancements/debugger/debugSaveEditor.h index 8eb939ec8..2a77b9b0a 100644 --- a/soh/soh/Enhancements/debugger/debugSaveEditor.h +++ b/soh/soh/Enhancements/debugger/debugSaveEditor.h @@ -1551,6 +1551,55 @@ const std::vector flagTables = { { RAND_INF_SHADOW_TEMPLE_MQ_WIND_HINT_SUN_FAIRY, "RAND_INF_SHADOW_TEMPLE_MQ_WIND_HINT_SUN_FAIRY" }, { RAND_INF_BOTTOM_OF_THE_WELL_MQ_CELL_SUN_FAIRY, "RAND_INF_BOTTOM_OF_THE_WELL_MQ_CELL_SUN_FAIRY" }, { RAND_INF_BOTTOM_OF_THE_WELL_MQ_BASEMENT_SUN_FAIRY, "RAND_INF_BOTTOM_OF_THE_WELL_MQ_BASEMENT_SUN_FAIRY" }, + + { RAND_INF_GUARD_HOUSE_UNLOCKED, "RAND_INF_GUARD_HOUSE_UNLOCKED" }, + { RAND_INF_GUARD_HOUSE_KEY_OBTAINED, "RAND_INF_GUARD_HOUSE_KEY_OBTAINED" }, + { RAND_INF_MARKET_BAZAAR_UNLOCKED, "RAND_INF_MARKET_BAZAAR_UNLOCKED" }, + { RAND_INF_MARKET_BAZAAR_KEY_OBTAINED, "RAND_INF_MARKET_BAZAAR_KEY_OBTAINED" }, + { RAND_INF_MARKET_POTION_SHOP_UNLOCKED, "RAND_INF_MARKET_POTION_SHOP_UNLOCKED" }, + { RAND_INF_MARKET_POTION_SHOP_KEY_OBTAINED, "RAND_INF_MARKET_POTION_SHOP_KEY_OBTAINED" }, + { RAND_INF_MASK_SHOP_UNLOCKED, "RAND_INF_MASK_SHOP_UNLOCKED" }, + { RAND_INF_MASK_SHOP_KEY_OBTAINED, "RAND_INF_MASK_SHOP_KEY_OBTAINED" }, + { RAND_INF_MARKET_SHOOTING_GALLERY_UNLOCKED, "RAND_INF_MARKET_SHOOTING_GALLERY_UNLOCKED" }, + { RAND_INF_MARKET_SHOOTING_GALLERY_KEY_OBTAINED, "RAND_INF_MARKET_SHOOTING_GALLERY_KEY_OBTAINED" }, + { RAND_INF_BOMBCHU_BOWLING_UNLOCKED, "RAND_INF_BOMBCHU_BOWLING_UNLOCKED" }, + { RAND_INF_BOMBCHU_BOWLING_KEY_OBTAINED, "RAND_INF_BOMBCHU_BOWLING_KEY_OBTAINED" }, + { RAND_INF_TREASURE_CHEST_GAME_BUILDING_UNLOCKED, "RAND_INF_TREASURE_CHEST_GAME_BUILDING_UNLOCKED" }, + { RAND_INF_TREASURE_CHEST_GAME_BUILDING_KEY_OBTAINED, "RAND_INF_TREASURE_CHEST_GAME_BUILDING_KEY_OBTAINED" }, + { RAND_INF_BOMBCHU_SHOP_UNLOCKED, "RAND_INF_BOMBCHU_SHOP_UNLOCKED" }, + { RAND_INF_BOMBCHU_SHOP_KEY_OBTAINED, "RAND_INF_BOMBCHU_SHOP_KEY_OBTAINED" }, + { RAND_INF_RICHARDS_HOUSE_UNLOCKED, "RAND_INF_RICHARDS_HOUSE_UNLOCKED" }, + { RAND_INF_RICHARDS_HOUSE_KEY_OBTAINED, "RAND_INF_RICHARDS_HOUSE_KEY_OBTAINED" }, + { RAND_INF_ALLEY_HOUSE_UNLOCKED, "RAND_INF_ALLEY_HOUSE_UNLOCKED" }, + { RAND_INF_ALLEY_HOUSE_KEY_OBTAINED, "RAND_INF_ALLEY_HOUSE_KEY_OBTAINED" }, + { RAND_INF_KAK_BAZAAR_UNLOCKED, "RAND_INF_KAK_BAZAAR_UNLOCKED" }, + { RAND_INF_KAK_BAZAAR_KEY_OBTAINED, "RAND_INF_KAK_BAZAAR_KEY_OBTAINED" }, + { RAND_INF_KAK_POTION_SHOP_UNLOCKED, "RAND_INF_KAK_POTION_SHOP_UNLOCKED" }, + { RAND_INF_KAK_POTION_SHOP_KEY_OBTAINED, "RAND_INF_KAK_POTION_SHOP_KEY_OBTAINED" }, + { RAND_INF_BOSS_HOUSE_UNLOCKED, "RAND_INF_BOSS_HOUSE_UNLOCKED" }, + { RAND_INF_BOSS_HOUSE_KEY_OBTAINED, "RAND_INF_BOSS_HOUSE_KEY_OBTAINED" }, + { RAND_INF_GRANNYS_POTION_SHOP_UNLOCKED, "RAND_INF_GRANNYS_POTION_SHOP_UNLOCKED" }, + { RAND_INF_GRANNYS_POTION_SHOP_KEY_OBTAINED, "RAND_INF_GRANNYS_POTION_SHOP_KEY_OBTAINED" }, + { RAND_INF_SKULLTULA_HOUSE_UNLOCKED, "RAND_INF_SKULLTULA_HOUSE_UNLOCKED" }, + { RAND_INF_SKULLTULA_HOUSE_KEY_OBTAINED, "RAND_INF_SKULLTULA_HOUSE_KEY_OBTAINED" }, + { RAND_INF_IMPAS_HOUSE_UNLOCKED, "RAND_INF_IMPAS_HOUSE_UNLOCKED" }, + { RAND_INF_IMPAS_HOUSE_KEY_OBTAINED, "RAND_INF_IMPAS_HOUSE_KEY_OBTAINED" }, + { RAND_INF_WINDMILL_UNLOCKED, "RAND_INF_WINDMILL_UNLOCKED" }, + { RAND_INF_WINDMILL_KEY_OBTAINED, "RAND_INF_WINDMILL_KEY_OBTAINED" }, + { RAND_INF_KAK_SHOOTING_GALLERY_UNLOCKED, "RAND_INF_KAK_SHOOTING_GALLERY_UNLOCKED" }, + { RAND_INF_KAK_SHOOTING_GALLERY_KEY_OBTAINED, "RAND_INF_KAK_SHOOTING_GALLERY_KEY_OBTAINED" }, + { RAND_INF_DAMPES_HUT_UNLOCKED, "RAND_INF_DAMPES_HUT_UNLOCKED" }, + { RAND_INF_DAMPES_HUT_KEY_OBTAINED, "RAND_INF_DAMPES_HUT_KEY_OBTAINED" }, + { RAND_INF_TALONS_HOUSE_UNLOCKED, "RAND_INF_TALONS_HOUSE_UNLOCKED" }, + { RAND_INF_TALONS_HOUSE_KEY_OBTAINED, "RAND_INF_TALONS_HOUSE_KEY_OBTAINED" }, + { RAND_INF_STABLES_UNLOCKED, "RAND_INF_STABLES_UNLOCKED" }, + { RAND_INF_STABLES_KEY_OBTAINED, "RAND_INF_STABLES_KEY_OBTAINED" }, + { RAND_INF_BACK_TOWER_UNLOCKED, "RAND_INF_BACK_TOWER_UNLOCKED" }, + { RAND_INF_BACK_TOWER_KEY_OBTAINED, "RAND_INF_BACK_TOWER_KEY_OBTAINED" }, + { RAND_INF_HYLIA_LAB_UNLOCKED, "RAND_INF_HYLIA_LAB_UNLOCKED" }, + { RAND_INF_HYLIA_LAB_KEY_OBTAINED, "RAND_INF_HYLIA_LAB_KEY_OBTAINED" }, + { RAND_INF_FISHING_HOLE_UNLOCKED, "RAND_INF_FISHING_HOLE_UNLOCKED" }, + { RAND_INF_FISHING_HOLE_KEY_OBTAINED, "RAND_INF_FISHING_HOLE_KEY_OBTAINED" }, } }, }; diff --git a/soh/soh/Enhancements/debugger/dlViewer.cpp b/soh/soh/Enhancements/debugger/dlViewer.cpp index fdfc8be1c..4f4d13bff 100644 --- a/soh/soh/Enhancements/debugger/dlViewer.cpp +++ b/soh/soh/Enhancements/debugger/dlViewer.cpp @@ -1,9 +1,9 @@ #include "actorViewer.h" -#include "../../util.h" -#include "../../UIWidgets.hpp" +#include "soh/util.h" +#include "soh/SohGui/UIWidgets.hpp" #include "ResourceManager.h" #include "DisplayList.h" -#include "../../OTRGlobals.h" +#include "soh/OTRGlobals.h" #include #include diff --git a/soh/soh/Enhancements/debugger/hookDebugger.cpp b/soh/soh/Enhancements/debugger/hookDebugger.cpp index 8ee9b3391..782cf4f7a 100644 --- a/soh/soh/Enhancements/debugger/hookDebugger.cpp +++ b/soh/soh/Enhancements/debugger/hookDebugger.cpp @@ -1,6 +1,6 @@ #include "hookDebugger.h" -#include "../game-interactor/GameInteractor.h" -#include "../../UIWidgets.hpp" +#include "soh/Enhancements/game-interactor/GameInteractor.h" +#include "soh/SohGui/UIWidgets.hpp" #include #include diff --git a/soh/soh/Enhancements/debugger/performanceTimer.cpp b/soh/soh/Enhancements/debugger/performanceTimer.cpp index f52a8efac..69ffc6925 100644 --- a/soh/soh/Enhancements/debugger/performanceTimer.cpp +++ b/soh/soh/Enhancements/debugger/performanceTimer.cpp @@ -1,5 +1,3 @@ -#pragma once - #include "performanceTimer.h" void StartPerformanceTimer(TimerID timer){ diff --git a/soh/soh/Enhancements/debugger/valueViewer.cpp b/soh/soh/Enhancements/debugger/valueViewer.cpp index a58512ea3..088e69713 100644 --- a/soh/soh/Enhancements/debugger/valueViewer.cpp +++ b/soh/soh/Enhancements/debugger/valueViewer.cpp @@ -1,5 +1,5 @@ #include "valueViewer.h" -#include "../../UIWidgets.hpp" +#include "soh/SohGui/UIWidgets.hpp" #include "soh/OTRGlobals.h" extern "C" { diff --git a/soh/soh/Enhancements/enemyrandomizer.cpp b/soh/soh/Enhancements/enemyrandomizer.cpp index 89aab7e00..a2b72ca07 100644 --- a/soh/soh/Enhancements/enemyrandomizer.cpp +++ b/soh/soh/Enhancements/enemyrandomizer.cpp @@ -305,7 +305,7 @@ EnemyEntry GetRandomizedEnemyEntry(uint32_t seed) { GetSelectedEnemies(); } if (CVarGetInteger(CVAR_ENHANCEMENT("RandomizedEnemies"), ENEMY_RANDOMIZER_OFF) == ENEMY_RANDOMIZER_RANDOM_SEEDED) { - uint32_t finalSeed = seed + (IS_RANDO ? Rando::Context::GetInstance()->GetSettings()->GetSeed() : gSaveContext.sohStats.fileCreatedAt); + uint32_t finalSeed = seed + (IS_RANDO ? Rando::Context::GetInstance()->GetSeed() : gSaveContext.ship.stats.fileCreatedAt); Random_Init(finalSeed); uint32_t randomNumber = Random(0, RANDOMIZED_ENEMY_SPAWN_TABLE_SIZE); return selectedEnemyList[randomNumber]; diff --git a/soh/soh/Enhancements/enhancementTypes.h b/soh/soh/Enhancements/enhancementTypes.h index d57a94991..4b2f825f5 100644 --- a/soh/soh/Enhancements/enhancementTypes.h +++ b/soh/soh/Enhancements/enhancementTypes.h @@ -52,14 +52,6 @@ typedef enum { ENEMY_RANDOMIZER_RANDOM_SEEDED, } EnemyRandomizerMode; -typedef enum { - FASTFILE_1, - FASTFILE_2, - FASTFILE_3, - FASTFILE_MAP_SELECT, - FASTFILE_FILE_SELECT -} FastFileSelectTarget; - typedef enum { AUTOSAVE_OFF, AUTOSAVE_LOCATION_AND_MAJOR_ITEMS, @@ -69,6 +61,12 @@ typedef enum { AUTOSAVE_ALL_ITEMS } AutosaveType; +typedef enum { + BOOTSEQUENCE_DEFAULT, + BOOTSEQUENCE_AUTHENTIC, + BOOTSEQUENCE_FILESELECT +} BootSequenceType; + typedef enum { ZFIGHT_FIX_DISABLED, ZFIGHT_FIX_CONSISTENT_VANISH, diff --git a/soh/soh/Enhancements/game-interactor/GameInteractor.h b/soh/soh/Enhancements/game-interactor/GameInteractor.h index a6aa85a61..936a4be99 100644 --- a/soh/soh/Enhancements/game-interactor/GameInteractor.h +++ b/soh/soh/Enhancements/game-interactor/GameInteractor.h @@ -156,9 +156,9 @@ typedef enum { // Opt: *EnShopnuts /* Vanilla Condition: ``` - ((this->actor.params == 0x0002) && (Flags_GetItemGetInf(ITEMGETINF_0B))) || - ((this->actor.params == 0x0009) && (Flags_GetInfTable(INFTABLE_192))) || - ((this->actor.params == 0x000A) && (Flags_GetInfTable(INFTABLE_193))) + ((this->actor.params == 0x0002) && (Flags_GetItemGetInf(ITEMGETINF_DEKU_SCRUB_HEART_PIECE))) || + ((this->actor.params == 0x0009) && (Flags_GetInfTable(INFTABLE_BOUGHT_STICK_UPGRADE))) || + ((this->actor.params == 0x000A) && (Flags_GetInfTable(INFTABLE_BOUGHT_NUT_UPGRADE))) ``` */ VB_BUSINESS_SCRUB_DESPAWN, @@ -286,6 +286,7 @@ typedef enum { VB_RENDER_YES_ON_CONTINUE_PROMPT, // Vanilla condition: CHECK_BTN_ALL(input->press.button, BTN_START) VB_CLOSE_PAUSE_MENU, + VB_KALEIDO_UNPAUSE_CLOSE, // Vanilla condition: true VB_SPAWN_BLUE_WARP, // Vanilla condition: this->warpTimer > sWarpTimerTarget && gSaveContext.nextCutsceneIndex == 0xFFEF @@ -302,6 +303,15 @@ typedef enum { // Opt: *EnFr // Vanilla condition: this->reward == GI_NONE VB_FROGS_GO_TO_IDLE, + // Vanilla condition: var >= gSaveContext.health) && (gSaveContext.health > 0 + VB_HEALTH_METER_BE_CRITICAL, + VB_CONSUME_SMALL_KEY, + // Vanilla condition: gSaveContext.inventory.dungeonKeys[gSaveContext.mapIndex] <= 0 + VB_NOT_HAVE_SMALL_KEY, + // Vanilla condition: !Flags_GetSwitch(play, this->actor.params & 0x3F) + VB_DOOR_BE_LOCKED, + // Vanilla condition: ((doorActor->params >> 7) & 7) == 3 + VB_DOOR_PLAY_SCENE_TRANSITION, /*** Play Cutscenes ***/ @@ -379,6 +389,7 @@ typedef enum { /*** Give Items ***/ + VB_SHORT_CIRCUIT_GIVE_ITEM_PROCESS, VB_FREEZE_ON_SKULL_TOKEN, // Opt: *EnBox VB_GIVE_ITEM_FROM_CHEST, @@ -633,7 +644,7 @@ struct HookInfo { #define COND_VB_SHOULD(id, condition, body) \ { \ static HOOK_ID hookId = 0; \ - GameInteractor::Instance->UnregisterGameHookForID(hookId); \ + GameInteractor::Instance->UnregisterGameHookForID(hookId); \ hookId = 0; \ if (condition) { \ hookId = REGISTER_VB_SHOULD(id, body); \ diff --git a/soh/soh/Enhancements/game-interactor/GameInteractor_HookTable.h b/soh/soh/Enhancements/game-interactor/GameInteractor_HookTable.h index a2d5c56ec..3f2f80265 100644 --- a/soh/soh/Enhancements/game-interactor/GameInteractor_HookTable.h +++ b/soh/soh/Enhancements/game-interactor/GameInteractor_HookTable.h @@ -5,8 +5,11 @@ * - Argument 1: Name of the hook * - Argument 2: Function type that the hook uses */ +DEFINE_HOOK(OnZTitleInit, (void* gameState)); +DEFINE_HOOK(OnZTitleUpdate, (void* gameState)); DEFINE_HOOK(OnLoadGame, (int32_t fileNum)); DEFINE_HOOK(OnExitGame, (int32_t fileNum)); +DEFINE_HOOK(OnGameStateMainStart, ()); DEFINE_HOOK(OnGameFrameUpdate, ()); DEFINE_HOOK(OnItemReceive, (GetItemEntry itemEntry)); DEFINE_HOOK(OnSaleEnd, (GetItemEntry itemEntry)); diff --git a/soh/soh/Enhancements/game-interactor/GameInteractor_Hooks.cpp b/soh/soh/Enhancements/game-interactor/GameInteractor_Hooks.cpp index 39fc298a8..ab69b543f 100644 --- a/soh/soh/Enhancements/game-interactor/GameInteractor_Hooks.cpp +++ b/soh/soh/Enhancements/game-interactor/GameInteractor_Hooks.cpp @@ -2,6 +2,14 @@ // MARK: - Gameplay +void GameInteractor_ExecuteOnZTitleInit(void* gameState) { + GameInteractor::Instance->ExecuteHooks(gameState); +} + +void GameInteractor_ExecuteOnZTitleUpdate(void* gameState) { + GameInteractor::Instance->ExecuteHooks(gameState); +} + void GameInteractor_ExecuteOnLoadGame(int32_t fileNum) { GameInteractor::Instance->ExecuteHooks(fileNum); } @@ -10,6 +18,10 @@ void GameInteractor_ExecuteOnExitGame(int32_t fileNum) { GameInteractor::Instance->ExecuteHooks(fileNum); } +void GameInteractor_ExecuteOnGameStateMainStart() { + GameInteractor::Instance->ExecuteHooks(); +} + void GameInteractor_ExecuteOnGameFrameUpdate() { GameInteractor::Instance->ExecuteHooks(); } diff --git a/soh/soh/Enhancements/game-interactor/GameInteractor_Hooks.h b/soh/soh/Enhancements/game-interactor/GameInteractor_Hooks.h index cb238539f..b73f9fe70 100644 --- a/soh/soh/Enhancements/game-interactor/GameInteractor_Hooks.h +++ b/soh/soh/Enhancements/game-interactor/GameInteractor_Hooks.h @@ -7,8 +7,11 @@ extern "C" { #endif // MARK: - Gameplay +void GameInteractor_ExecuteOnZTitleInit(void* gameState); +void GameInteractor_ExecuteOnZTitleUpdate(void* gameState); void GameInteractor_ExecuteOnLoadGame(int32_t fileNum); void GameInteractor_ExecuteOnExitGame(int32_t fileNum); +void GameInteractor_ExecuteOnGameStateMainStart(); void GameInteractor_ExecuteOnGameFrameUpdate(); void GameInteractor_ExecuteOnItemReceiveHooks(GetItemEntry itemEntry); void GameInteractor_ExecuteOnSaleEndHooks(GetItemEntry itemEntry); diff --git a/soh/soh/Enhancements/game-interactor/GameInteractor_RawAction.cpp b/soh/soh/Enhancements/game-interactor/GameInteractor_RawAction.cpp index bb04e72b8..aa8c72d00 100644 --- a/soh/soh/Enhancements/game-interactor/GameInteractor_RawAction.cpp +++ b/soh/soh/Enhancements/game-interactor/GameInteractor_RawAction.cpp @@ -238,7 +238,12 @@ void GameInteractor::RawAction::SetFlag(int16_t flagType, int16_t flag) { gSaveContext.eventInf[flag >> 4] |= (1 << (flag & 0xF)); break; case FlagType::FLAG_RANDOMIZER_INF: - gSaveContext.randomizerInf[flag >> 4] |= (1 << (flag & 0xF)); + if (!IS_RANDO) { + LUSLOG_ERROR("Tried to set randomizerInf flag outside of rando (%d)", flag); + assert(false); + break; + } + gSaveContext.ship.randomizerInf[flag >> 4] |= (1 << (flag & 0xF)); break; case FlagType::FLAG_GS_TOKEN: SET_GS_FLAGS((flag & 0x1F00) >> 8, flag & 0xFF); @@ -261,7 +266,12 @@ void GameInteractor::RawAction::UnsetFlag(int16_t flagType, int16_t flag) { gSaveContext.eventInf[flag >> 4] &= ~(1 << (flag & 0xF)); break; case FlagType::FLAG_RANDOMIZER_INF: - gSaveContext.randomizerInf[flag >> 4] &= ~(1 << (flag & 0xF)); + if (!IS_RANDO) { + LUSLOG_ERROR("Tried to unset randomizerInf flag outside of rando (%d)", flag); + assert(false); + break; + } + gSaveContext.ship.randomizerInf[flag >> 4] &= ~(1 << (flag & 0xF)); break; } }; diff --git a/soh/soh/Enhancements/gameplaystats.cpp b/soh/soh/Enhancements/gameplaystats.cpp index 3f7691741..aff0d0726 100644 --- a/soh/soh/Enhancements/gameplaystats.cpp +++ b/soh/soh/Enhancements/gameplaystats.cpp @@ -5,7 +5,7 @@ #include "functions.h" #include "macros.h" #include "soh/cvar_prefixes.h" -#include "../UIWidgets.hpp" +#include "soh/SohGui/UIWidgets.hpp" #include "soh/util.h" #include @@ -252,7 +252,7 @@ typedef struct { // Timestamps are an array of structs, each with a name, time, and color // Names and colors are set up at the bottom of this file -// Times are stored in gSaveContext.sohStats.itemTimestamp +// Times are stored in gSaveContext.ship.stats.itemTimestamp TimestampInfo itemTimestampDisplay[TIMESTAMP_MAX]; TimestampInfo sceneTimestampDisplay[8191]; //std::vector sceneTimestampDisplay; @@ -287,25 +287,25 @@ extern "C" char* GameplayStats_GetCurrentTime() { } void LoadStatsVersion1() { - SaveManager::Instance->LoadCharArray("buildVersion", gSaveContext.sohStats.buildVersion, - ARRAY_COUNT(gSaveContext.sohStats.buildVersion)); - SaveManager::Instance->LoadData("buildVersionMajor", gSaveContext.sohStats.buildVersionMajor); - SaveManager::Instance->LoadData("buildVersionMinor", gSaveContext.sohStats.buildVersionMinor); - SaveManager::Instance->LoadData("buildVersionPatch", gSaveContext.sohStats.buildVersionPatch); + SaveManager::Instance->LoadCharArray("buildVersion", gSaveContext.ship.stats.buildVersion, + ARRAY_COUNT(gSaveContext.ship.stats.buildVersion)); + SaveManager::Instance->LoadData("buildVersionMajor", gSaveContext.ship.stats.buildVersionMajor); + SaveManager::Instance->LoadData("buildVersionMinor", gSaveContext.ship.stats.buildVersionMinor); + SaveManager::Instance->LoadData("buildVersionPatch", gSaveContext.ship.stats.buildVersionPatch); - SaveManager::Instance->LoadData("heartPieces", gSaveContext.sohStats.heartPieces); - SaveManager::Instance->LoadData("heartContainers", gSaveContext.sohStats.heartContainers); - SaveManager::Instance->LoadArray("dungeonKeys", ARRAY_COUNT(gSaveContext.sohStats.dungeonKeys), [](size_t i) { - SaveManager::Instance->LoadData("", gSaveContext.sohStats.dungeonKeys[i]); + SaveManager::Instance->LoadData("heartPieces", gSaveContext.ship.stats.heartPieces); + SaveManager::Instance->LoadData("heartContainers", gSaveContext.ship.stats.heartContainers); + SaveManager::Instance->LoadArray("dungeonKeys", ARRAY_COUNT(gSaveContext.ship.stats.dungeonKeys), [](size_t i) { + SaveManager::Instance->LoadData("", gSaveContext.ship.stats.dungeonKeys[i]); }); - SaveManager::Instance->LoadData("rtaTiming", gSaveContext.sohStats.rtaTiming); - SaveManager::Instance->LoadData("fileCreatedAt", gSaveContext.sohStats.fileCreatedAt); - SaveManager::Instance->LoadData("playTimer", gSaveContext.sohStats.playTimer); - SaveManager::Instance->LoadData("pauseTimer", gSaveContext.sohStats.pauseTimer); - SaveManager::Instance->LoadArray("itemTimestamps", ARRAY_COUNT(gSaveContext.sohStats.itemTimestamp), [](size_t i) { - SaveManager::Instance->LoadData("", gSaveContext.sohStats.itemTimestamp[i]); + SaveManager::Instance->LoadData("rtaTiming", gSaveContext.ship.stats.rtaTiming); + SaveManager::Instance->LoadData("fileCreatedAt", gSaveContext.ship.stats.fileCreatedAt); + SaveManager::Instance->LoadData("playTimer", gSaveContext.ship.stats.playTimer); + SaveManager::Instance->LoadData("pauseTimer", gSaveContext.ship.stats.pauseTimer); + SaveManager::Instance->LoadArray("itemTimestamps", ARRAY_COUNT(gSaveContext.ship.stats.itemTimestamp), [](size_t i) { + SaveManager::Instance->LoadData("", gSaveContext.ship.stats.itemTimestamp[i]); }); - SaveManager::Instance->LoadArray("sceneTimestamps", ARRAY_COUNT(gSaveContext.sohStats.sceneTimestamps), [&](size_t i) { + SaveManager::Instance->LoadArray("sceneTimestamps", ARRAY_COUNT(gSaveContext.ship.stats.sceneTimestamps), [&](size_t i) { SaveManager::Instance->LoadStruct("", [&]() { int scene, room, sceneTime, roomTime, isRoom; SaveManager::Instance->LoadData("scene", scene); @@ -316,63 +316,63 @@ void LoadStatsVersion1() { if (scene == 0 && room == 0 && sceneTime == 0 && roomTime == 0 && isRoom == 0) { return; } - gSaveContext.sohStats.sceneTimestamps[i].scene = scene; - gSaveContext.sohStats.sceneTimestamps[i].room = room; - gSaveContext.sohStats.sceneTimestamps[i].sceneTime = sceneTime; - gSaveContext.sohStats.sceneTimestamps[i].roomTime = roomTime; - gSaveContext.sohStats.sceneTimestamps[i].isRoom = isRoom; + gSaveContext.ship.stats.sceneTimestamps[i].scene = scene; + gSaveContext.ship.stats.sceneTimestamps[i].room = room; + gSaveContext.ship.stats.sceneTimestamps[i].sceneTime = sceneTime; + gSaveContext.ship.stats.sceneTimestamps[i].roomTime = roomTime; + gSaveContext.ship.stats.sceneTimestamps[i].isRoom = isRoom; }); }); - SaveManager::Instance->LoadData("tsIdx", gSaveContext.sohStats.tsIdx); - SaveManager::Instance->LoadArray("counts", ARRAY_COUNT(gSaveContext.sohStats.count), [](size_t i) { - SaveManager::Instance->LoadData("", gSaveContext.sohStats.count[i]); + SaveManager::Instance->LoadData("tsIdx", gSaveContext.ship.stats.tsIdx); + SaveManager::Instance->LoadArray("counts", ARRAY_COUNT(gSaveContext.ship.stats.count), [](size_t i) { + SaveManager::Instance->LoadData("", gSaveContext.ship.stats.count[i]); }); - SaveManager::Instance->LoadArray("scenesDiscovered", ARRAY_COUNT(gSaveContext.sohStats.scenesDiscovered), [](size_t i) { - SaveManager::Instance->LoadData("", gSaveContext.sohStats.scenesDiscovered[i]); + SaveManager::Instance->LoadArray("scenesDiscovered", ARRAY_COUNT(gSaveContext.ship.stats.scenesDiscovered), [](size_t i) { + SaveManager::Instance->LoadData("", gSaveContext.ship.stats.scenesDiscovered[i]); }); - SaveManager::Instance->LoadArray("entrancesDiscovered", ARRAY_COUNT(gSaveContext.sohStats.entrancesDiscovered), [](size_t i) { - SaveManager::Instance->LoadData("", gSaveContext.sohStats.entrancesDiscovered[i]); + SaveManager::Instance->LoadArray("entrancesDiscovered", ARRAY_COUNT(gSaveContext.ship.stats.entrancesDiscovered), [](size_t i) { + SaveManager::Instance->LoadData("", gSaveContext.ship.stats.entrancesDiscovered[i]); }); } void SaveStats(SaveContext* saveContext, int sectionID, bool fullSave) { - SaveManager::Instance->SaveData("buildVersion", saveContext->sohStats.buildVersion); - SaveManager::Instance->SaveData("buildVersionMajor", saveContext->sohStats.buildVersionMajor); - SaveManager::Instance->SaveData("buildVersionMinor", saveContext->sohStats.buildVersionMinor); - SaveManager::Instance->SaveData("buildVersionPatch", saveContext->sohStats.buildVersionPatch); + SaveManager::Instance->SaveData("buildVersion", saveContext->ship.stats.buildVersion); + SaveManager::Instance->SaveData("buildVersionMajor", saveContext->ship.stats.buildVersionMajor); + SaveManager::Instance->SaveData("buildVersionMinor", saveContext->ship.stats.buildVersionMinor); + SaveManager::Instance->SaveData("buildVersionPatch", saveContext->ship.stats.buildVersionPatch); - SaveManager::Instance->SaveData("heartPieces", saveContext->sohStats.heartPieces); - SaveManager::Instance->SaveData("heartContainers", saveContext->sohStats.heartContainers); - SaveManager::Instance->SaveArray("dungeonKeys", ARRAY_COUNT(saveContext->sohStats.dungeonKeys), [&](size_t i) { - SaveManager::Instance->SaveData("", saveContext->sohStats.dungeonKeys[i]); + SaveManager::Instance->SaveData("heartPieces", saveContext->ship.stats.heartPieces); + SaveManager::Instance->SaveData("heartContainers", saveContext->ship.stats.heartContainers); + SaveManager::Instance->SaveArray("dungeonKeys", ARRAY_COUNT(saveContext->ship.stats.dungeonKeys), [&](size_t i) { + SaveManager::Instance->SaveData("", saveContext->ship.stats.dungeonKeys[i]); }); - SaveManager::Instance->SaveData("rtaTiming", saveContext->sohStats.rtaTiming); - SaveManager::Instance->SaveData("fileCreatedAt", saveContext->sohStats.fileCreatedAt); - SaveManager::Instance->SaveData("playTimer", saveContext->sohStats.playTimer); - SaveManager::Instance->SaveData("pauseTimer", saveContext->sohStats.pauseTimer); - SaveManager::Instance->SaveArray("itemTimestamps", ARRAY_COUNT(saveContext->sohStats.itemTimestamp), [&](size_t i) { - SaveManager::Instance->SaveData("", saveContext->sohStats.itemTimestamp[i]); + SaveManager::Instance->SaveData("rtaTiming", saveContext->ship.stats.rtaTiming); + SaveManager::Instance->SaveData("fileCreatedAt", saveContext->ship.stats.fileCreatedAt); + SaveManager::Instance->SaveData("playTimer", saveContext->ship.stats.playTimer); + SaveManager::Instance->SaveData("pauseTimer", saveContext->ship.stats.pauseTimer); + SaveManager::Instance->SaveArray("itemTimestamps", ARRAY_COUNT(saveContext->ship.stats.itemTimestamp), [&](size_t i) { + SaveManager::Instance->SaveData("", saveContext->ship.stats.itemTimestamp[i]); }); - SaveManager::Instance->SaveArray("sceneTimestamps", ARRAY_COUNT(saveContext->sohStats.sceneTimestamps), [&](size_t i) { - if (saveContext->sohStats.sceneTimestamps[i].scene != 254 && saveContext->sohStats.sceneTimestamps[i].room != 254) { + SaveManager::Instance->SaveArray("sceneTimestamps", ARRAY_COUNT(saveContext->ship.stats.sceneTimestamps), [&](size_t i) { + if (saveContext->ship.stats.sceneTimestamps[i].scene != 254 && saveContext->ship.stats.sceneTimestamps[i].room != 254) { SaveManager::Instance->SaveStruct("", [&]() { - SaveManager::Instance->SaveData("scene", saveContext->sohStats.sceneTimestamps[i].scene); - SaveManager::Instance->SaveData("room", saveContext->sohStats.sceneTimestamps[i].room); - SaveManager::Instance->SaveData("sceneTime", saveContext->sohStats.sceneTimestamps[i].sceneTime); - SaveManager::Instance->SaveData("roomTime", saveContext->sohStats.sceneTimestamps[i].roomTime); - SaveManager::Instance->SaveData("isRoom", saveContext->sohStats.sceneTimestamps[i].isRoom); + SaveManager::Instance->SaveData("scene", saveContext->ship.stats.sceneTimestamps[i].scene); + SaveManager::Instance->SaveData("room", saveContext->ship.stats.sceneTimestamps[i].room); + SaveManager::Instance->SaveData("sceneTime", saveContext->ship.stats.sceneTimestamps[i].sceneTime); + SaveManager::Instance->SaveData("roomTime", saveContext->ship.stats.sceneTimestamps[i].roomTime); + SaveManager::Instance->SaveData("isRoom", saveContext->ship.stats.sceneTimestamps[i].isRoom); }); } }); - SaveManager::Instance->SaveData("tsIdx", saveContext->sohStats.tsIdx); - SaveManager::Instance->SaveArray("counts", ARRAY_COUNT(saveContext->sohStats.count), [&](size_t i) { - SaveManager::Instance->SaveData("", saveContext->sohStats.count[i]); + SaveManager::Instance->SaveData("tsIdx", saveContext->ship.stats.tsIdx); + SaveManager::Instance->SaveArray("counts", ARRAY_COUNT(saveContext->ship.stats.count), [&](size_t i) { + SaveManager::Instance->SaveData("", saveContext->ship.stats.count[i]); }); - SaveManager::Instance->SaveArray("scenesDiscovered", ARRAY_COUNT(saveContext->sohStats.scenesDiscovered), [&](size_t i) { - SaveManager::Instance->SaveData("", saveContext->sohStats.scenesDiscovered[i]); + SaveManager::Instance->SaveArray("scenesDiscovered", ARRAY_COUNT(saveContext->ship.stats.scenesDiscovered), [&](size_t i) { + SaveManager::Instance->SaveData("", saveContext->ship.stats.scenesDiscovered[i]); }); - SaveManager::Instance->SaveArray("entrancesDiscovered", ARRAY_COUNT(saveContext->sohStats.entrancesDiscovered), [&](size_t i) { - SaveManager::Instance->SaveData("", saveContext->sohStats.entrancesDiscovered[i]); + SaveManager::Instance->SaveArray("entrancesDiscovered", ARRAY_COUNT(saveContext->ship.stats.entrancesDiscovered), [&](size_t i) { + SaveManager::Instance->SaveData("", saveContext->ship.stats.entrancesDiscovered[i]); }); } @@ -443,16 +443,16 @@ void DrawGameplayStatsHeader() { } else { GameplayStatsRow("Build Version:", (char*)gBuildVersion); } - if (gSaveContext.sohStats.rtaTiming) { - GameplayStatsRow("Total Time (RTA):", formatTimestampGameplayStat(GAMEPLAYSTAT_TOTAL_TIME), gSaveContext.sohStats.gameComplete ? COLOR_GREEN : COLOR_WHITE); + if (gSaveContext.ship.stats.rtaTiming) { + GameplayStatsRow("Total Time (RTA):", formatTimestampGameplayStat(GAMEPLAYSTAT_TOTAL_TIME), gSaveContext.ship.stats.gameComplete ? COLOR_GREEN : COLOR_WHITE); } else { - GameplayStatsRow("Total Game Time:", formatTimestampGameplayStat(GAMEPLAYSTAT_TOTAL_TIME), gSaveContext.sohStats.gameComplete ? COLOR_GREEN : COLOR_WHITE); + GameplayStatsRow("Total Game Time:", formatTimestampGameplayStat(GAMEPLAYSTAT_TOTAL_TIME), gSaveContext.ship.stats.gameComplete ? COLOR_GREEN : COLOR_WHITE); } if (CVarGetInteger(CVAR_ENHANCEMENT("GameplayStats.ShowAdditionalTimers"), 0)) { // !Only display total game time - GameplayStatsRow("Gameplay Time:", formatTimestampGameplayStat(gSaveContext.sohStats.playTimer / 2), COLOR_GREY); - GameplayStatsRow("Pause Menu Time:", formatTimestampGameplayStat(gSaveContext.sohStats.pauseTimer / 3), COLOR_GREY); - GameplayStatsRow("Time in scene:", formatTimestampGameplayStat(gSaveContext.sohStats.sceneTimer / 2), COLOR_LIGHT_BLUE); - GameplayStatsRow("Time in room:", formatTimestampGameplayStat(gSaveContext.sohStats.roomTimer / 2), COLOR_LIGHT_BLUE); + GameplayStatsRow("Gameplay Time:", formatTimestampGameplayStat(gSaveContext.ship.stats.playTimer / 2), COLOR_GREY); + GameplayStatsRow("Pause Menu Time:", formatTimestampGameplayStat(gSaveContext.ship.stats.pauseTimer / 3), COLOR_GREY); + GameplayStatsRow("Time in scene:", formatTimestampGameplayStat(gSaveContext.ship.stats.sceneTimer / 2), COLOR_LIGHT_BLUE); + GameplayStatsRow("Time in room:", formatTimestampGameplayStat(gSaveContext.ship.stats.roomTimer / 2), COLOR_LIGHT_BLUE); } if (gPlayState != NULL && CVarGetInteger(CVAR_ENHANCEMENT("GameplayStats.ShowDebugInfo"), 0)) { // && display debug info GameplayStatsRow("play->sceneNum:", formatHexGameplayStat(gPlayState->sceneNum), COLOR_YELLOW); @@ -468,7 +468,7 @@ void DrawGameplayStatsTimestampsTab() { // Set up the array of item timestamps and then sort it chronologically for (int i = 0; i < TIMESTAMP_MAX; i++) { strcpy(itemTimestampDisplay[i].name, itemTimestampDisplayName[i]); - itemTimestampDisplay[i].time = gSaveContext.sohStats.itemTimestamp[i]; + itemTimestampDisplay[i].time = gSaveContext.ship.stats.itemTimestamp[i]; itemTimestampDisplay[i].color = itemTimestampDisplayColor[i]; } @@ -497,18 +497,18 @@ void DrawGameplayStatsCountsTab() { for (int i = COUNT_ENEMIES_DEFEATED_ANUBIS; i <= COUNT_ENEMIES_DEFEATED_WOLFOS; i++) { if (i == COUNT_ENEMIES_DEFEATED_FLOORMASTER) { // Special case: You must kill 3 mini Floormasters for it count as one defeated Floormaster - enemiesDefeated += gSaveContext.sohStats.count[i] / 3; + enemiesDefeated += gSaveContext.ship.stats.count[i] / 3; } else { - enemiesDefeated += gSaveContext.sohStats.count[i]; + enemiesDefeated += gSaveContext.ship.stats.count[i]; } } // Sum of all ammo used for (int i = COUNT_AMMO_USED_STICK; i <= COUNT_AMMO_USED_BEAN; i++) { - ammoUsed += gSaveContext.sohStats.count[i]; + ammoUsed += gSaveContext.ship.stats.count[i]; } // Sum of all button presses for (int i = COUNT_BUTTON_PRESSES_A; i <= COUNT_BUTTON_PRESSES_START; i++) { - buttonPresses += gSaveContext.sohStats.count[i]; + buttonPresses += gSaveContext.ship.stats.count[i]; } ImGui::PushStyleVar(ImGuiStyleVar_CellPadding, { 4.0f, 4.0f }); @@ -520,47 +520,47 @@ void DrawGameplayStatsCountsTab() { if (ImGui::TreeNodeEx("Enemy Details...", ImGuiTreeNodeFlags_NoTreePushOnOpen)) { for (int i = COUNT_ENEMIES_DEFEATED_ANUBIS; i <= COUNT_ENEMIES_DEFEATED_WOLFOS; i++) { if (i == COUNT_ENEMIES_DEFEATED_FLOORMASTER) { - GameplayStatsRow(countMappings[i], formatIntGameplayStat(gSaveContext.sohStats.count[i] / 3)); + GameplayStatsRow(countMappings[i], formatIntGameplayStat(gSaveContext.ship.stats.count[i] / 3)); } else { - GameplayStatsRow(countMappings[i], formatIntGameplayStat(gSaveContext.sohStats.count[i])); + GameplayStatsRow(countMappings[i], formatIntGameplayStat(gSaveContext.ship.stats.count[i])); } } } } - GameplayStatsRow("Rupees Collected:", formatIntGameplayStat(gSaveContext.sohStats.count[COUNT_RUPEES_COLLECTED])); + GameplayStatsRow("Rupees Collected:", formatIntGameplayStat(gSaveContext.ship.stats.count[COUNT_RUPEES_COLLECTED])); UIWidgets::Tooltip("Includes rupees collected with a full wallet."); - GameplayStatsRow("Rupees Spent:", formatIntGameplayStat(gSaveContext.sohStats.count[COUNT_RUPEES_SPENT])); - GameplayStatsRow("Chests Opened:", formatIntGameplayStat(gSaveContext.sohStats.count[COUNT_CHESTS_OPENED])); + GameplayStatsRow("Rupees Spent:", formatIntGameplayStat(gSaveContext.ship.stats.count[COUNT_RUPEES_SPENT])); + GameplayStatsRow("Chests Opened:", formatIntGameplayStat(gSaveContext.ship.stats.count[COUNT_CHESTS_OPENED])); GameplayStatsRow("Ammo Used:", formatIntGameplayStat(ammoUsed)); if (ammoUsed > 0) { ImGui::TableNextRow(); ImGui::TableNextColumn(); if (ImGui::TreeNodeEx("Ammo Details...", ImGuiTreeNodeFlags_NoTreePushOnOpen)) { for (int i = COUNT_AMMO_USED_STICK; i <= COUNT_AMMO_USED_BEAN; i++) { - GameplayStatsRow(countMappings[i], formatIntGameplayStat(gSaveContext.sohStats.count[i])); + GameplayStatsRow(countMappings[i], formatIntGameplayStat(gSaveContext.ship.stats.count[i])); } } } - GameplayStatsRow("Damage Taken:", formatIntGameplayStat(gSaveContext.sohStats.count[COUNT_DAMAGE_TAKEN])); - GameplayStatsRow("Sword Swings:", formatIntGameplayStat(gSaveContext.sohStats.count[COUNT_SWORD_SWINGS])); - GameplayStatsRow("Steps Taken:", formatIntGameplayStat(gSaveContext.sohStats.count[COUNT_STEPS])); + GameplayStatsRow("Damage Taken:", formatIntGameplayStat(gSaveContext.ship.stats.count[COUNT_DAMAGE_TAKEN])); + GameplayStatsRow("Sword Swings:", formatIntGameplayStat(gSaveContext.ship.stats.count[COUNT_SWORD_SWINGS])); + GameplayStatsRow("Steps Taken:", formatIntGameplayStat(gSaveContext.ship.stats.count[COUNT_STEPS])); // If using MM Bunny Hood enhancement, show how long it's been equipped (not counting pause time) - if (CVarGetInteger(CVAR_ENHANCEMENT("MMBunnyHood"), BUNNY_HOOD_VANILLA) != BUNNY_HOOD_VANILLA || gSaveContext.sohStats.count[COUNT_TIME_BUNNY_HOOD] > 0) { - GameplayStatsRow("Bunny Hood Time:", formatTimestampGameplayStat(gSaveContext.sohStats.count[COUNT_TIME_BUNNY_HOOD] / 2)); + if (CVarGetInteger(CVAR_ENHANCEMENT("MMBunnyHood"), BUNNY_HOOD_VANILLA) != BUNNY_HOOD_VANILLA || gSaveContext.ship.stats.count[COUNT_TIME_BUNNY_HOOD] > 0) { + GameplayStatsRow("Bunny Hood Time:", formatTimestampGameplayStat(gSaveContext.ship.stats.count[COUNT_TIME_BUNNY_HOOD] / 2)); } - GameplayStatsRow("Rolls:", formatIntGameplayStat(gSaveContext.sohStats.count[COUNT_ROLLS])); - GameplayStatsRow("Bonks:", formatIntGameplayStat(gSaveContext.sohStats.count[COUNT_BONKS])); - GameplayStatsRow("Sidehops:", formatIntGameplayStat(gSaveContext.sohStats.count[COUNT_SIDEHOPS])); - GameplayStatsRow("Backflips:", formatIntGameplayStat(gSaveContext.sohStats.count[COUNT_BACKFLIPS])); - GameplayStatsRow("Ice Traps:", formatIntGameplayStat(gSaveContext.sohStats.count[COUNT_ICE_TRAPS])); - GameplayStatsRow("Pauses:", formatIntGameplayStat(gSaveContext.sohStats.count[COUNT_PAUSES])); - GameplayStatsRow("Pots Smashed:", formatIntGameplayStat(gSaveContext.sohStats.count[COUNT_POTS_BROKEN])); - GameplayStatsRow("Bushes Cut:", formatIntGameplayStat(gSaveContext.sohStats.count[COUNT_BUSHES_CUT])); + GameplayStatsRow("Rolls:", formatIntGameplayStat(gSaveContext.ship.stats.count[COUNT_ROLLS])); + GameplayStatsRow("Bonks:", formatIntGameplayStat(gSaveContext.ship.stats.count[COUNT_BONKS])); + GameplayStatsRow("Sidehops:", formatIntGameplayStat(gSaveContext.ship.stats.count[COUNT_SIDEHOPS])); + GameplayStatsRow("Backflips:", formatIntGameplayStat(gSaveContext.ship.stats.count[COUNT_BACKFLIPS])); + GameplayStatsRow("Ice Traps:", formatIntGameplayStat(gSaveContext.ship.stats.count[COUNT_ICE_TRAPS])); + GameplayStatsRow("Pauses:", formatIntGameplayStat(gSaveContext.ship.stats.count[COUNT_PAUSES])); + GameplayStatsRow("Pots Smashed:", formatIntGameplayStat(gSaveContext.ship.stats.count[COUNT_POTS_BROKEN])); + GameplayStatsRow("Bushes Cut:", formatIntGameplayStat(gSaveContext.ship.stats.count[COUNT_BUSHES_CUT])); GameplayStatsRow("Buttons Pressed:", formatIntGameplayStat(buttonPresses)); if (buttonPresses > 0) { ImGui::TableNextRow(); ImGui::TableNextColumn(); if (ImGui::TreeNodeEx("Buttons...", ImGuiTreeNodeFlags_NoTreePushOnOpen)) { for (int i = COUNT_BUTTON_PRESSES_A; i <= COUNT_BUTTON_PRESSES_START; i++) { - GameplayStatsRow(countMappings[i], formatIntGameplayStat(gSaveContext.sohStats.count[i])); + GameplayStatsRow(countMappings[i], formatIntGameplayStat(gSaveContext.ship.stats.count[i])); } } } @@ -569,25 +569,25 @@ void DrawGameplayStatsCountsTab() { } void DrawGameplayStatsBreakdownTab() { - for (int i = 0; i < gSaveContext.sohStats.tsIdx; i++) { - std::string sceneName = ResolveSceneID(gSaveContext.sohStats.sceneTimestamps[i].scene, gSaveContext.sohStats.sceneTimestamps[i].room); + for (int i = 0; i < gSaveContext.ship.stats.tsIdx; i++) { + std::string sceneName = ResolveSceneID(gSaveContext.ship.stats.sceneTimestamps[i].scene, gSaveContext.ship.stats.sceneTimestamps[i].room); std::string name; - if (CVarGetInteger(CVAR_ENHANCEMENT("GameplayStats.RoomBreakdown"), 0) && gSaveContext.sohStats.sceneTimestamps[i].scene != SCENE_GROTTOS) { - name = fmt::format("{:s} Room {:d}", sceneName, gSaveContext.sohStats.sceneTimestamps[i].room); + if (CVarGetInteger(CVAR_ENHANCEMENT("GameplayStats.RoomBreakdown"), 0) && gSaveContext.ship.stats.sceneTimestamps[i].scene != SCENE_GROTTOS) { + name = fmt::format("{:s} Room {:d}", sceneName, gSaveContext.ship.stats.sceneTimestamps[i].room); } else { name = sceneName; } strcpy(sceneTimestampDisplay[i].name, name.c_str()); - sceneTimestampDisplay[i].time = CVarGetInteger(CVAR_ENHANCEMENT("GameplayStats.RoomBreakdown"), 0) ? - gSaveContext.sohStats.sceneTimestamps[i].roomTime : gSaveContext.sohStats.sceneTimestamps[i].sceneTime; + sceneTimestampDisplay[i].time = CVarGetInteger(CVAR_ENHANCEMENT("GameplayStats.RoomBreakdown"), 0) ? + gSaveContext.ship.stats.sceneTimestamps[i].roomTime : gSaveContext.ship.stats.sceneTimestamps[i].sceneTime; sceneTimestampDisplay[i].color = COLOR_GREY; - sceneTimestampDisplay[i].isRoom = gSaveContext.sohStats.sceneTimestamps[i].isRoom; + sceneTimestampDisplay[i].isRoom = gSaveContext.ship.stats.sceneTimestamps[i].isRoom; } ImGui::PushStyleVar(ImGuiStyleVar_CellPadding, { 4.0f, 4.0f }); ImGui::BeginTable("gameplayStatsCounts", 1, ImGuiTableFlags_BordersOuter); ImGui::TableSetupColumn("stat", ImGuiTableColumnFlags_WidthStretch); - for (int i = 0; i < gSaveContext.sohStats.tsIdx; i++) { + for (int i = 0; i < gSaveContext.ship.stats.tsIdx; i++) { TimestampInfo tsInfo = sceneTimestampDisplay[i]; bool canShow = !tsInfo.isRoom || CVarGetInteger(CVAR_ENHANCEMENT("GameplayStats.RoomBreakdown"), 0); if (tsInfo.time > 0 && strnlen(tsInfo.name, 40) > 1 && canShow) { @@ -595,10 +595,10 @@ void DrawGameplayStatsBreakdownTab() { } } std::string toPass; - if (CVarGetInteger(CVAR_ENHANCEMENT("GameplayStats.RoomBreakdown"), 0) && gSaveContext.sohStats.sceneNum != SCENE_GROTTOS) { - toPass = fmt::format("{:s} Room {:d}", ResolveSceneID(gSaveContext.sohStats.sceneNum, gSaveContext.sohStats.roomNum), gSaveContext.sohStats.roomNum); + if (CVarGetInteger(CVAR_ENHANCEMENT("GameplayStats.RoomBreakdown"), 0) && gSaveContext.ship.stats.sceneNum != SCENE_GROTTOS) { + toPass = fmt::format("{:s} Room {:d}", ResolveSceneID(gSaveContext.ship.stats.sceneNum, gSaveContext.ship.stats.roomNum), gSaveContext.ship.stats.roomNum); } else { - toPass = ResolveSceneID(gSaveContext.sohStats.sceneNum, gSaveContext.sohStats.roomNum); + toPass = ResolveSceneID(gSaveContext.ship.stats.sceneNum, gSaveContext.ship.stats.roomNum); } GameplayStatsRow(toPass.c_str(), formatTimestampGameplayStat(CURRENT_MODE_TIMER / 2)); ImGui::EndTable(); @@ -611,14 +611,14 @@ void DrawGameplayStatsOptionsTab() { UIWidgets::PaddedEnhancementCheckbox("Show latest timestamps on top", CVAR_ENHANCEMENT("GameplayStats.ReverseTimestamps"), true, false); UIWidgets::PaddedEnhancementCheckbox("Room Breakdown", CVAR_ENHANCEMENT("GameplayStats.RoomBreakdown"), true, false); ImGui::SameLine(); - UIWidgets::InsertHelpHoverText("Allows a more in-depth perspective of time spent in a certain map."); + UIWidgets::InsertHelpHoverText("Allows a more in-depth perspective of time spent in a certain map."); UIWidgets::PaddedEnhancementCheckbox("RTA Timing on new files", CVAR_ENHANCEMENT("GameplayStats.RTATiming"), true, false); ImGui::SameLine(); UIWidgets::InsertHelpHoverText( "Timestamps are relative to starting timestamp rather than in game time, usually necessary for races/speedruns.\n\n" "Starting timestamp is on first non-c-up input after intro cutscene.\n\n" "NOTE: THIS NEEDS TO BE SET BEFORE CREATING A FILE TO TAKE EFFECT" - ); + ); UIWidgets::PaddedEnhancementCheckbox("Show additional detail timers", CVAR_ENHANCEMENT("GameplayStats.ShowAdditionalTimers"), true, false); UIWidgets::PaddedEnhancementCheckbox("Show Debug Info", CVAR_ENHANCEMENT("GameplayStats.ShowDebugInfo")); } @@ -645,46 +645,46 @@ void GameplayStatsWindow::DrawElement() { } ImGui::EndTabBar(); } - + ImGui::Text("Note: Gameplay stats are saved to the current file and will be\nlost if you quit without saving."); } void InitStats(bool isDebug) { - gSaveContext.sohStats.heartPieces = isDebug ? 8 : 0; - gSaveContext.sohStats.heartContainers = isDebug ? 8 : 0; - for (int dungeon = 0; dungeon < ARRAY_COUNT(gSaveContext.sohStats.dungeonKeys); dungeon++) { - gSaveContext.sohStats.dungeonKeys[dungeon] = isDebug ? 8 : 0; + gSaveContext.ship.stats.heartPieces = isDebug ? 8 : 0; + gSaveContext.ship.stats.heartContainers = isDebug ? 8 : 0; + for (int dungeon = 0; dungeon < ARRAY_COUNT(gSaveContext.ship.stats.dungeonKeys); dungeon++) { + gSaveContext.ship.stats.dungeonKeys[dungeon] = isDebug ? 8 : 0; } - gSaveContext.sohStats.rtaTiming = CVarGetInteger(CVAR_ENHANCEMENT("GameplayStats.RTATiming"), 0); - gSaveContext.sohStats.fileCreatedAt = 0; - gSaveContext.sohStats.playTimer = 0; - gSaveContext.sohStats.pauseTimer = 0; - for (int timestamp = 0; timestamp < ARRAY_COUNT(gSaveContext.sohStats.itemTimestamp); timestamp++) { - gSaveContext.sohStats.itemTimestamp[timestamp] = 0; + gSaveContext.ship.stats.rtaTiming = CVarGetInteger(CVAR_ENHANCEMENT("GameplayStats.RTATiming"), 0); + gSaveContext.ship.stats.fileCreatedAt = 0; + gSaveContext.ship.stats.playTimer = 0; + gSaveContext.ship.stats.pauseTimer = 0; + for (int timestamp = 0; timestamp < ARRAY_COUNT(gSaveContext.ship.stats.itemTimestamp); timestamp++) { + gSaveContext.ship.stats.itemTimestamp[timestamp] = 0; } - for (int timestamp = 0; timestamp < ARRAY_COUNT(gSaveContext.sohStats.sceneTimestamps); timestamp++) { - gSaveContext.sohStats.sceneTimestamps[timestamp].sceneTime = 0; - gSaveContext.sohStats.sceneTimestamps[timestamp].roomTime = 0; - gSaveContext.sohStats.sceneTimestamps[timestamp].scene = 254; - gSaveContext.sohStats.sceneTimestamps[timestamp].room = 254; - gSaveContext.sohStats.sceneTimestamps[timestamp].isRoom = 0; + for (int timestamp = 0; timestamp < ARRAY_COUNT(gSaveContext.ship.stats.sceneTimestamps); timestamp++) { + gSaveContext.ship.stats.sceneTimestamps[timestamp].sceneTime = 0; + gSaveContext.ship.stats.sceneTimestamps[timestamp].roomTime = 0; + gSaveContext.ship.stats.sceneTimestamps[timestamp].scene = 254; + gSaveContext.ship.stats.sceneTimestamps[timestamp].room = 254; + gSaveContext.ship.stats.sceneTimestamps[timestamp].isRoom = 0; } - gSaveContext.sohStats.tsIdx = 0; - for (int count = 0; count < ARRAY_COUNT(gSaveContext.sohStats.count); count++) { - gSaveContext.sohStats.count[count] = 0; + gSaveContext.ship.stats.tsIdx = 0; + for (int count = 0; count < ARRAY_COUNT(gSaveContext.ship.stats.count); count++) { + gSaveContext.ship.stats.count[count] = 0; } - gSaveContext.sohStats.gameComplete = false; - for (int scenesIdx = 0; scenesIdx < ARRAY_COUNT(gSaveContext.sohStats.scenesDiscovered); scenesIdx++) { - gSaveContext.sohStats.scenesDiscovered[scenesIdx] = 0; + gSaveContext.ship.stats.gameComplete = false; + for (int scenesIdx = 0; scenesIdx < ARRAY_COUNT(gSaveContext.ship.stats.scenesDiscovered); scenesIdx++) { + gSaveContext.ship.stats.scenesDiscovered[scenesIdx] = 0; } - for (int entrancesIdx = 0; entrancesIdx < ARRAY_COUNT(gSaveContext.sohStats.entrancesDiscovered); entrancesIdx++) { - gSaveContext.sohStats.entrancesDiscovered[entrancesIdx] = 0; + for (int entrancesIdx = 0; entrancesIdx < ARRAY_COUNT(gSaveContext.ship.stats.entrancesDiscovered); entrancesIdx++) { + gSaveContext.ship.stats.entrancesDiscovered[entrancesIdx] = 0; } - SohUtils::CopyStringToCharArray(gSaveContext.sohStats.buildVersion, std::string((char*)gBuildVersion), - ARRAY_COUNT(gSaveContext.sohStats.buildVersion)); - gSaveContext.sohStats.buildVersionMajor = gBuildVersionMajor; - gSaveContext.sohStats.buildVersionMinor = gBuildVersionMinor; - gSaveContext.sohStats.buildVersionPatch = gBuildVersionPatch; + SohUtils::CopyStringToCharArray(gSaveContext.ship.stats.buildVersion, std::string((char*)gBuildVersion), + ARRAY_COUNT(gSaveContext.ship.stats.buildVersion)); + gSaveContext.ship.stats.buildVersionMajor = gBuildVersionMajor; + gSaveContext.ship.stats.buildVersionMinor = gBuildVersionMinor; + gSaveContext.ship.stats.buildVersionPatch = gBuildVersionPatch; } // Entries listed here will have a timestamp shown in the stat window diff --git a/soh/soh/Enhancements/gameplaystats.h b/soh/soh/Enhancements/gameplaystats.h index 9d41f2560..81190c01e 100644 --- a/soh/soh/Enhancements/gameplaystats.h +++ b/soh/soh/Enhancements/gameplaystats.h @@ -19,14 +19,17 @@ extern "C" { // Total gameplay time is tracked in tenths of seconds // I.E. game time counts frames at 20fps/2, pause time counts frames at 30fps/3 // Frame counts in z_play.c and z_kaleido_scope_call.c -#define GAMEPLAYSTAT_TOTAL_TIME (gSaveContext.sohStats.rtaTiming ?\ - (!gSaveContext.sohStats.gameComplete ?\ - (!gSaveContext.sohStats.fileCreatedAt ? 0 : ((GetUnixTimestamp() - gSaveContext.sohStats.fileCreatedAt) / 100)) :\ - (gSaveContext.sohStats.itemTimestamp[TIMESTAMP_DEFEAT_GANON])) :\ - (gSaveContext.sohStats.playTimer / 2 + gSaveContext.sohStats.pauseTimer / 3)) +#define GAMEPLAYSTAT_TOTAL_TIME (gSaveContext.ship.stats.rtaTiming ?\ + (!gSaveContext.ship.stats.gameComplete ?\ + (!gSaveContext.ship.stats.fileCreatedAt ? 0 : ((GetUnixTimestamp() - gSaveContext.ship.stats.fileCreatedAt) / 100)) :\ + (gSaveContext.ship.stats.itemTimestamp[TIMESTAMP_DEFEAT_GANON] \ + ? gSaveContext.ship.stats.itemTimestamp[TIMESTAMP_DEFEAT_GANON] \ + : gSaveContext.ship.stats.itemTimestamp[TIMESTAMP_TRIFORCE_COMPLETED])) \ + :\ + (gSaveContext.ship.stats.playTimer / 2 + gSaveContext.ship.stats.pauseTimer / 3)) #define CURRENT_MODE_TIMER (CVarGetInteger(CVAR_ENHANCEMENT("GameplayStats.RoomBreakdown"), 0) ?\ - gSaveContext.sohStats.roomTimer :\ - gSaveContext.sohStats.sceneTimer) + gSaveContext.ship.stats.roomTimer :\ + gSaveContext.ship.stats.sceneTimer) void InitStatTracker(); diff --git a/soh/soh/Enhancements/kaleido.cpp b/soh/soh/Enhancements/kaleido.cpp index 36cf9d0a2..8d578168c 100644 --- a/soh/soh/Enhancements/kaleido.cpp +++ b/soh/soh/Enhancements/kaleido.cpp @@ -124,9 +124,9 @@ namespace Rando { mEntries.push_back( std::make_shared( gTriforcePieceTex, G_IM_FMT_RGBA, G_IM_SIZ_32b, 32, 32, Color_RGBA8{ 255,255,255,255 }, 0, - yOffset, reinterpret_cast(&gSaveContext.triforcePiecesCollected), - ctx->GetOption(RSK_TRIFORCE_HUNT_PIECES_REQUIRED).GetContextOptionIndex() + 1, - ctx->GetOption(RSK_TRIFORCE_HUNT_PIECES_TOTAL).GetContextOptionIndex() + 1)); + yOffset, reinterpret_cast(&gSaveContext.ship.quest.data.randomizer.triforcePiecesCollected), + ctx->GetOption(RSK_TRIFORCE_HUNT_PIECES_REQUIRED).Get() + 1, + ctx->GetOption(RSK_TRIFORCE_HUNT_PIECES_TOTAL).Get() + 1)); yOffset += 18; } if (ctx->GetOption(RSK_SHUFFLE_OCARINA_BUTTONS)) { diff --git a/soh/soh/Enhancements/mods.cpp b/soh/soh/Enhancements/mods.cpp index b78368b80..b892a1282 100644 --- a/soh/soh/Enhancements/mods.cpp +++ b/soh/soh/Enhancements/mods.cpp @@ -15,7 +15,6 @@ #include "soh/Enhancements/nametag.h" #include "soh/Enhancements/timesaver_hook_handlers.h" #include "soh/Enhancements/TimeSavers/TimeSavers.h" -#include "soh/Enhancements/cheat_hook_handlers.h" #include "soh/Enhancements/randomizer/hook_handlers.h" #include "objects/object_gi_compass/object_gi_compass.h" @@ -68,136 +67,6 @@ static const ALIGN_ASSET(2) char tokinoma_room_0DL_007A70[] = dtokinoma_room_0DL #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; -void RegisterInfiniteMoney() { - GameInteractor::Instance->RegisterGameHook([]() { - if (!GameInteractor::IsSaveLoaded(true)) return; - if (CVarGetInteger(CVAR_CHEAT("InfiniteMoney"), 0) != 0 && (!IS_RANDO || Flags_GetRandomizerInf(RAND_INF_HAS_WALLET))) { - if (gSaveContext.rupees < CUR_CAPACITY(UPG_WALLET)) { - gSaveContext.rupees = CUR_CAPACITY(UPG_WALLET); - } - } - }); -} - -void RegisterInfiniteHealth() { - GameInteractor::Instance->RegisterGameHook([]() { - if (!GameInteractor::IsSaveLoaded(true)) return; - if (CVarGetInteger(CVAR_CHEAT("InfiniteHealth"), 0) != 0) { - if (gSaveContext.health < gSaveContext.healthCapacity) { - gSaveContext.health = gSaveContext.healthCapacity; - } - } - }); -} - -void RegisterInfiniteAmmo() { - GameInteractor::Instance->RegisterGameHook([]() { - if (!GameInteractor::IsSaveLoaded(true)) return; - if (CVarGetInteger(CVAR_CHEAT("InfiniteAmmo"), 0) != 0) { - // Deku Sticks - if (AMMO(ITEM_STICK) < CUR_CAPACITY(UPG_STICKS)) { - AMMO(ITEM_STICK) = CUR_CAPACITY(UPG_STICKS); - } - - // Deku Nuts - if (AMMO(ITEM_NUT) < CUR_CAPACITY(UPG_NUTS)) { - AMMO(ITEM_NUT) = CUR_CAPACITY(UPG_NUTS); - } - - // Bombs - if (AMMO(ITEM_BOMB) < CUR_CAPACITY(UPG_BOMB_BAG)) { - AMMO(ITEM_BOMB) = CUR_CAPACITY(UPG_BOMB_BAG); - } - - // Fairy Bow (Ammo) - if (AMMO(ITEM_BOW) < CUR_CAPACITY(UPG_QUIVER)) { - AMMO(ITEM_BOW) = CUR_CAPACITY(UPG_QUIVER); - } - - // Fairy Slingshot (Ammo) - if (AMMO(ITEM_SLINGSHOT) < CUR_CAPACITY(UPG_BULLET_BAG)) { - AMMO(ITEM_SLINGSHOT) = CUR_CAPACITY(UPG_BULLET_BAG); - } - - // Bombchus (max: 50, no upgrades) - if (INV_CONTENT(ITEM_BOMBCHU) == ITEM_BOMBCHU && AMMO(ITEM_BOMBCHU) < 50) { - AMMO(ITEM_BOMBCHU) = 50; - } - } - }); -} - -void RegisterInfiniteMagic() { - GameInteractor::Instance->RegisterGameHook([]() { - if (!GameInteractor::IsSaveLoaded(true)) return; - if (CVarGetInteger(CVAR_CHEAT("InfiniteMagic"), 0) != 0) { - if (gSaveContext.isMagicAcquired && gSaveContext.magic != (gSaveContext.isDoubleMagicAcquired + 1) * 0x30) { - gSaveContext.magic = (gSaveContext.isDoubleMagicAcquired + 1) * 0x30; - } - } - }); -} - -void RegisterInfiniteNayrusLove() { - GameInteractor::Instance->RegisterGameHook([]() { - if (!GameInteractor::IsSaveLoaded(true)) return; - if (CVarGetInteger(CVAR_CHEAT("InfiniteNayru"), 0) != 0) { - gSaveContext.nayrusLoveTimer = 0x44B; - } - }); -} - -void RegisterInfiniteISG() { - GameInteractor::Instance->RegisterGameHook([]() { - if (!GameInteractor::IsSaveLoaded(true)) return; - - if (CVarGetInteger(CVAR_CHEAT("EasyISG"), 0) != 0) { - Player* player = GET_PLAYER(gPlayState); - player->meleeWeaponState = 1; - } - }); -} - -//Permanent quick put away (QPA) glitched damage value -void RegisterEzQPA() { - GameInteractor::Instance->RegisterGameHook([]() { - if (!GameInteractor::IsSaveLoaded(true)) return; - - if (CVarGetInteger(CVAR_CHEAT("EasyQPA"), 0) != 0) { - Player* player = GET_PLAYER(gPlayState); - player->meleeWeaponQuads[0].info.toucher.dmgFlags = 0x16171617; - player->meleeWeaponQuads[1].info.toucher.dmgFlags = 0x16171617; - } - }); -} - -void RegisterUnrestrictedItems() { - GameInteractor::Instance->RegisterGameHook([]() { - if (!GameInteractor::IsSaveLoaded(true)) return; - - if (CVarGetInteger(CVAR_CHEAT("NoRestrictItems"), 0) != 0) { - u8 sunsBackup = gPlayState->interfaceCtx.restrictions.sunsSong; - memset(&gPlayState->interfaceCtx.restrictions, 0, sizeof(gPlayState->interfaceCtx.restrictions)); - gPlayState->interfaceCtx.restrictions.sunsSong = sunsBackup; - } - }); -} - -void RegisterFreezeTime() { - GameInteractor::Instance->RegisterGameHook([]() { - if (CVarGetInteger(CVAR_CHEAT("FreezeTime"), 0) != 0) { - if (CVarGetInteger(CVAR_GENERAL("PrevTime"), -1) == -1) { - CVarSetInteger(CVAR_GENERAL("PrevTime"), gSaveContext.dayTime); - } - - int32_t prevTime = CVarGetInteger(CVAR_GENERAL("PrevTime"), gSaveContext.dayTime); - gSaveContext.dayTime = prevTime; - } else { - CVarClear(CVAR_GENERAL("PrevTime")); - } - }); -} - /// Switches Link's age and respawns him at the last entrance he entered. void SwitchAge() { if (gPlayState == NULL) return; @@ -272,7 +141,7 @@ void AutoSave(GetItemEntry itemEntry) { // 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 - if ((CVarGetInteger(CVAR_ENHANCEMENT("Autosave"), AUTOSAVE_OFF) != AUTOSAVE_OFF) && (gPlayState != NULL) && (gSaveContext.pendingSale == ITEM_NONE) && + if ((CVarGetInteger(CVAR_ENHANCEMENT("Autosave"), AUTOSAVE_OFF) != AUTOSAVE_OFF) && (gPlayState != NULL) && (gSaveContext.ship.pendingSale == ITEM_NONE) && (gPlayState->gameplayFrames > 60 && gSaveContext.cutsceneIndex < 0xFFF0) && (gPlayState->sceneNum != SCENE_GANON_BOSS) && (gPlayState->sceneNum != SCENE_CHAMBER_OF_THE_SAGES)) { if (((CVarGetInteger(CVAR_ENHANCEMENT("Autosave"), AUTOSAVE_OFF) == AUTOSAVE_LOCATION_AND_ALL_ITEMS) || (CVarGetInteger(CVAR_ENHANCEMENT("Autosave"), AUTOSAVE_OFF) == AUTOSAVE_ALL_ITEMS)) && (item != ITEM_NONE)) { // Autosave for all items @@ -409,8 +278,8 @@ void UpdatePermanentHeartLossState() { if (!GameInteractor::IsSaveLoaded()) return; if (!CVarGetInteger(CVAR_ENHANCEMENT("PermanentHeartLoss"), 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 heartContainers = gSaveContext.ship.stats.heartContainers; // each worth 16 health + uint8_t heartPieces = gSaveContext.ship.stats.heartPieces; // each worth 4 health, but only in groups of 4 uint8_t startingHealth = 16 * (IS_RANDO ? (OTRGlobals::Instance->gRandomizer->GetRandoSettingValue(RSK_STARTING_HEARTS) + 1) : 3); @@ -508,7 +377,7 @@ void RegisterDaytimeGoldSkultullas() { bool IsHyperBossesActive() { return CVarGetInteger(CVAR_ENHANCEMENT("HyperBosses"), 0) || - (IS_BOSS_RUSH && gSaveContext.bossRushOptions[BR_OPTIONS_HYPERBOSSES] == BR_CHOICE_HYPERBOSSES_YES); + (IS_BOSS_RUSH && gSaveContext.ship.quest.data.bossRush.options[BR_OPTIONS_HYPERBOSSES] == BR_CHOICE_HYPERBOSSES_YES); } void UpdateHyperBossesState() { @@ -666,8 +535,8 @@ void UpdateMirrorModeState(int32_t sceneNum) { (sceneNum == SCENE_GANON_BOSS); if (mirroredMode == MIRRORED_WORLD_RANDOM_SEEDED || mirroredMode == MIRRORED_WORLD_DUNGEONS_RANDOM_SEEDED) { - uint32_t seed = sceneNum + (IS_RANDO ? Rando::Context::GetInstance()->GetSettings()->GetSeed() - : gSaveContext.sohStats.fileCreatedAt); + uint32_t seed = sceneNum + (IS_RANDO ? Rando::Context::GetInstance()->GetSeed() + : gSaveContext.ship.stats.fileCreatedAt); Random_Init(seed); } @@ -864,60 +733,60 @@ void RegisterEnemyDefeatCounts() { GameInteractor::Instance->RegisterGameHook([](void* refActor) { Actor* actor = static_cast(refActor); if (uniqueEnemyIdToStatCount.contains(actor->id)) { - gSaveContext.sohStats.count[uniqueEnemyIdToStatCount[actor->id]]++; + gSaveContext.ship.stats.count[uniqueEnemyIdToStatCount[actor->id]]++; } else { switch (actor->id) { case ACTOR_EN_BB: if (actor->params == ENBB_GREEN || actor->params == ENBB_GREEN_BIG) { - gSaveContext.sohStats.count[COUNT_ENEMIES_DEFEATED_BUBBLE_GREEN]++; + gSaveContext.ship.stats.count[COUNT_ENEMIES_DEFEATED_BUBBLE_GREEN]++; } else if (actor->params == ENBB_BLUE) { - gSaveContext.sohStats.count[COUNT_ENEMIES_DEFEATED_BUBBLE_BLUE]++; + gSaveContext.ship.stats.count[COUNT_ENEMIES_DEFEATED_BUBBLE_BLUE]++; } else if (actor->params == ENBB_WHITE) { - gSaveContext.sohStats.count[COUNT_ENEMIES_DEFEATED_BUBBLE_WHITE]++; + gSaveContext.ship.stats.count[COUNT_ENEMIES_DEFEATED_BUBBLE_WHITE]++; } else if (actor->params == ENBB_RED) { - gSaveContext.sohStats.count[COUNT_ENEMIES_DEFEATED_BUBBLE_RED]++; + gSaveContext.ship.stats.count[COUNT_ENEMIES_DEFEATED_BUBBLE_RED]++; } break; case ACTOR_EN_DEKUBABA: if (actor->params == DEKUBABA_BIG) { - gSaveContext.sohStats.count[COUNT_ENEMIES_DEFEATED_DEKU_BABA_BIG]++; + gSaveContext.ship.stats.count[COUNT_ENEMIES_DEFEATED_DEKU_BABA_BIG]++; } else { - gSaveContext.sohStats.count[COUNT_ENEMIES_DEFEATED_DEKU_BABA]++; + gSaveContext.ship.stats.count[COUNT_ENEMIES_DEFEATED_DEKU_BABA]++; } break; case ACTOR_EN_ZF: if (actor->params == ENZF_TYPE_DINOLFOS) { - gSaveContext.sohStats.count[COUNT_ENEMIES_DEFEATED_DINOLFOS]++; + gSaveContext.ship.stats.count[COUNT_ENEMIES_DEFEATED_DINOLFOS]++; } else { - gSaveContext.sohStats.count[COUNT_ENEMIES_DEFEATED_LIZALFOS]++; + gSaveContext.ship.stats.count[COUNT_ENEMIES_DEFEATED_LIZALFOS]++; } break; case ACTOR_EN_RD: if (actor->params >= -1) { - gSaveContext.sohStats.count[COUNT_ENEMIES_DEFEATED_REDEAD]++; + gSaveContext.ship.stats.count[COUNT_ENEMIES_DEFEATED_REDEAD]++; } else { - gSaveContext.sohStats.count[COUNT_ENEMIES_DEFEATED_GIBDO]++; + gSaveContext.ship.stats.count[COUNT_ENEMIES_DEFEATED_GIBDO]++; } break; case ACTOR_EN_IK: if (actor->params == 0) { - gSaveContext.sohStats.count[COUNT_ENEMIES_DEFEATED_IRON_KNUCKLE_NABOORU]++; + gSaveContext.ship.stats.count[COUNT_ENEMIES_DEFEATED_IRON_KNUCKLE_NABOORU]++; } else { - gSaveContext.sohStats.count[COUNT_ENEMIES_DEFEATED_IRON_KNUCKLE]++; + gSaveContext.ship.stats.count[COUNT_ENEMIES_DEFEATED_IRON_KNUCKLE]++; } break; case ACTOR_EN_FIREFLY: if (actor->params == KEESE_NORMAL_FLY || actor->params == KEESE_NORMAL_PERCH) { - gSaveContext.sohStats.count[COUNT_ENEMIES_DEFEATED_KEESE]++; + gSaveContext.ship.stats.count[COUNT_ENEMIES_DEFEATED_KEESE]++; } else if (actor->params == KEESE_FIRE_FLY || actor->params == KEESE_FIRE_PERCH) { - gSaveContext.sohStats.count[COUNT_ENEMIES_DEFEATED_KEESE_FIRE]++; + gSaveContext.ship.stats.count[COUNT_ENEMIES_DEFEATED_KEESE_FIRE]++; } else if (actor->params == KEESE_ICE_FLY) { - gSaveContext.sohStats.count[COUNT_ENEMIES_DEFEATED_KEESE_ICE]++; + gSaveContext.ship.stats.count[COUNT_ENEMIES_DEFEATED_KEESE_ICE]++; } break; @@ -925,80 +794,80 @@ void RegisterEnemyDefeatCounts() { { EnReeba* reeba = (EnReeba*)actor; if (reeba->isBig) { - gSaveContext.sohStats.count[COUNT_ENEMIES_DEFEATED_LEEVER_BIG]++; + gSaveContext.ship.stats.count[COUNT_ENEMIES_DEFEATED_LEEVER_BIG]++; } else { - gSaveContext.sohStats.count[COUNT_ENEMIES_DEFEATED_LEEVER]++; + gSaveContext.ship.stats.count[COUNT_ENEMIES_DEFEATED_LEEVER]++; } } break; case ACTOR_EN_MB: if (actor->params == 0) { - gSaveContext.sohStats.count[COUNT_ENEMIES_DEFEATED_MOBLIN_CLUB]++; + gSaveContext.ship.stats.count[COUNT_ENEMIES_DEFEATED_MOBLIN_CLUB]++; } else { - gSaveContext.sohStats.count[COUNT_ENEMIES_DEFEATED_MOBLIN]++; + gSaveContext.ship.stats.count[COUNT_ENEMIES_DEFEATED_MOBLIN]++; } break; case ACTOR_EN_PEEHAT: if (actor->params == PEAHAT_TYPE_LARVA) { - gSaveContext.sohStats.count[COUNT_ENEMIES_DEFEATED_PEAHAT_LARVA]++; + gSaveContext.ship.stats.count[COUNT_ENEMIES_DEFEATED_PEAHAT_LARVA]++; } else { - gSaveContext.sohStats.count[COUNT_ENEMIES_DEFEATED_PEAHAT]++; + gSaveContext.ship.stats.count[COUNT_ENEMIES_DEFEATED_PEAHAT]++; } break; - + case ACTOR_EN_POH: if (actor->params == EN_POH_FLAT || actor->params == EN_POH_SHARP) { - gSaveContext.sohStats.count[COUNT_ENEMIES_DEFEATED_POE_COMPOSER]++; + gSaveContext.ship.stats.count[COUNT_ENEMIES_DEFEATED_POE_COMPOSER]++; } else { - gSaveContext.sohStats.count[COUNT_ENEMIES_DEFEATED_POE]++; + gSaveContext.ship.stats.count[COUNT_ENEMIES_DEFEATED_POE]++; } break; case ACTOR_EN_PO_FIELD: if (actor->params == EN_PO_FIELD_BIG) { - gSaveContext.sohStats.count[COUNT_ENEMIES_DEFEATED_POE_BIG]++; + gSaveContext.ship.stats.count[COUNT_ENEMIES_DEFEATED_POE_BIG]++; } else { - gSaveContext.sohStats.count[COUNT_ENEMIES_DEFEATED_POE]++; + gSaveContext.ship.stats.count[COUNT_ENEMIES_DEFEATED_POE]++; } break; case ACTOR_EN_ST: if (actor->params == 1) { - gSaveContext.sohStats.count[COUNT_ENEMIES_DEFEATED_SKULLTULA_BIG]++; + gSaveContext.ship.stats.count[COUNT_ENEMIES_DEFEATED_SKULLTULA_BIG]++; } else { - gSaveContext.sohStats.count[COUNT_ENEMIES_DEFEATED_SKULLTULA]++; + gSaveContext.ship.stats.count[COUNT_ENEMIES_DEFEATED_SKULLTULA]++; } break; case ACTOR_EN_SW: if (((actor->params & 0xE000) >> 0xD) != 0) { - gSaveContext.sohStats.count[COUNT_ENEMIES_DEFEATED_SKULLTULA_GOLD]++; + gSaveContext.ship.stats.count[COUNT_ENEMIES_DEFEATED_SKULLTULA_GOLD]++; } else { - gSaveContext.sohStats.count[COUNT_ENEMIES_DEFEATED_SKULLWALLTULA]++; + gSaveContext.ship.stats.count[COUNT_ENEMIES_DEFEATED_SKULLWALLTULA]++; } break; case ACTOR_EN_TP: if (actor->params == TAILPASARAN_HEAD) { // Only count the head, otherwise each body segment will increment - gSaveContext.sohStats.count[COUNT_ENEMIES_DEFEATED_TAILPASARAN]++; + gSaveContext.ship.stats.count[COUNT_ENEMIES_DEFEATED_TAILPASARAN]++; } break; case ACTOR_EN_TITE: if (actor->params == TEKTITE_BLUE) { - gSaveContext.sohStats.count[COUNT_ENEMIES_DEFEATED_TEKTITE_BLUE]++; + gSaveContext.ship.stats.count[COUNT_ENEMIES_DEFEATED_TEKTITE_BLUE]++; } else { - gSaveContext.sohStats.count[COUNT_ENEMIES_DEFEATED_TEKTITE_RED]++; + gSaveContext.ship.stats.count[COUNT_ENEMIES_DEFEATED_TEKTITE_RED]++; } break; case ACTOR_EN_WF: if (actor->params == WOLFOS_WHITE) { - gSaveContext.sohStats.count[COUNT_ENEMIES_DEFEATED_WOLFOS_WHITE]++; + gSaveContext.ship.stats.count[COUNT_ENEMIES_DEFEATED_WOLFOS_WHITE]++; } else { - gSaveContext.sohStats.count[COUNT_ENEMIES_DEFEATED_WOLFOS]++; + gSaveContext.ship.stats.count[COUNT_ENEMIES_DEFEATED_WOLFOS]++; } break; } @@ -1011,196 +880,40 @@ void RegisterBossDefeatTimestamps() { Actor* actor = static_cast(refActor); switch (actor->id) { case ACTOR_BOSS_DODONGO: - gSaveContext.sohStats.itemTimestamp[TIMESTAMP_DEFEAT_KING_DODONGO] = GAMEPLAYSTAT_TOTAL_TIME; + gSaveContext.ship.stats.itemTimestamp[TIMESTAMP_DEFEAT_KING_DODONGO] = GAMEPLAYSTAT_TOTAL_TIME; break; case ACTOR_BOSS_FD2: - gSaveContext.sohStats.itemTimestamp[TIMESTAMP_DEFEAT_VOLVAGIA] = GAMEPLAYSTAT_TOTAL_TIME; + gSaveContext.ship.stats.itemTimestamp[TIMESTAMP_DEFEAT_VOLVAGIA] = GAMEPLAYSTAT_TOTAL_TIME; break; case ACTOR_BOSS_GANON: - gSaveContext.sohStats.itemTimestamp[TIMESTAMP_DEFEAT_GANONDORF] = GAMEPLAYSTAT_TOTAL_TIME; + gSaveContext.ship.stats.itemTimestamp[TIMESTAMP_DEFEAT_GANONDORF] = GAMEPLAYSTAT_TOTAL_TIME; break; case ACTOR_BOSS_GANON2: - gSaveContext.sohStats.itemTimestamp[TIMESTAMP_DEFEAT_GANON] = GAMEPLAYSTAT_TOTAL_TIME; - gSaveContext.sohStats.gameComplete = true; + gSaveContext.ship.stats.itemTimestamp[TIMESTAMP_DEFEAT_GANON] = GAMEPLAYSTAT_TOTAL_TIME; + gSaveContext.ship.stats.gameComplete = true; break; case ACTOR_BOSS_GANONDROF: - gSaveContext.sohStats.itemTimestamp[TIMESTAMP_DEFEAT_PHANTOM_GANON] = GAMEPLAYSTAT_TOTAL_TIME; + gSaveContext.ship.stats.itemTimestamp[TIMESTAMP_DEFEAT_PHANTOM_GANON] = GAMEPLAYSTAT_TOTAL_TIME; break; case ACTOR_BOSS_GOMA: - gSaveContext.sohStats.itemTimestamp[TIMESTAMP_DEFEAT_GOHMA] = GAMEPLAYSTAT_TOTAL_TIME; + gSaveContext.ship.stats.itemTimestamp[TIMESTAMP_DEFEAT_GOHMA] = GAMEPLAYSTAT_TOTAL_TIME; break; case ACTOR_BOSS_MO: - gSaveContext.sohStats.itemTimestamp[TIMESTAMP_DEFEAT_MORPHA] = GAMEPLAYSTAT_TOTAL_TIME; + gSaveContext.ship.stats.itemTimestamp[TIMESTAMP_DEFEAT_MORPHA] = GAMEPLAYSTAT_TOTAL_TIME; break; case ACTOR_BOSS_SST: - gSaveContext.sohStats.itemTimestamp[TIMESTAMP_DEFEAT_BONGO_BONGO] = GAMEPLAYSTAT_TOTAL_TIME; + gSaveContext.ship.stats.itemTimestamp[TIMESTAMP_DEFEAT_BONGO_BONGO] = GAMEPLAYSTAT_TOTAL_TIME; break; case ACTOR_BOSS_TW: - gSaveContext.sohStats.itemTimestamp[TIMESTAMP_DEFEAT_TWINROVA] = GAMEPLAYSTAT_TOTAL_TIME; + gSaveContext.ship.stats.itemTimestamp[TIMESTAMP_DEFEAT_TWINROVA] = GAMEPLAYSTAT_TOTAL_TIME; break; case ACTOR_BOSS_VA: - gSaveContext.sohStats.itemTimestamp[TIMESTAMP_DEFEAT_BARINADE] = GAMEPLAYSTAT_TOTAL_TIME; + gSaveContext.ship.stats.itemTimestamp[TIMESTAMP_DEFEAT_BARINADE] = GAMEPLAYSTAT_TOTAL_TIME; break; } }); } -typedef enum { - ADD_ICE_TRAP, - ADD_BURN_TRAP, - ADD_SHOCK_TRAP, - ADD_KNOCK_TRAP, - ADD_SPEED_TRAP, - ADD_BOMB_TRAP, - ADD_VOID_TRAP, - ADD_AMMO_TRAP, - ADD_KILL_TRAP, - ADD_TELEPORT_TRAP, - ADD_TRAP_MAX -} AltTrapType; - -const char* altTrapTypeCvars[] = { - CVAR_ENHANCEMENT("ExtraTraps.Ice"), - CVAR_ENHANCEMENT("ExtraTraps.Burn"), - CVAR_ENHANCEMENT("ExtraTraps.Shock"), - CVAR_ENHANCEMENT("ExtraTraps.Knockback"), - CVAR_ENHANCEMENT("ExtraTraps.Speed"), - CVAR_ENHANCEMENT("ExtraTraps.Bomb"), - CVAR_ENHANCEMENT("ExtraTraps.Void"), - CVAR_ENHANCEMENT("ExtraTraps.Ammo"), - CVAR_ENHANCEMENT("ExtraTraps.Kill"), - CVAR_ENHANCEMENT("ExtraTraps.Teleport") -}; - -std::vector getEnabledAddTraps () { - std::vector enabledAddTraps; - for (int i = 0; i < ADD_TRAP_MAX; i++) { - if (CVarGetInteger(altTrapTypeCvars[i], 0)) { - if (gSaveContext.equips.buttonItems[0] == ITEM_FISHING_POLE && (i == ADD_VOID_TRAP || i == ADD_TELEPORT_TRAP)) { - continue; // don't add void or teleport if you're holding the fishing pole, as this causes issues - } - enabledAddTraps.push_back(static_cast(i)); - } - } - if (enabledAddTraps.size() == 0) { - enabledAddTraps.push_back(ADD_ICE_TRAP); - } - return enabledAddTraps; -}; - -void RegisterAltTrapTypes() { - static AltTrapType roll = ADD_TRAP_MAX; - static int statusTimer = -1; - static int eventTimer = -1; - - GameInteractor::Instance->RegisterGameHook([](GetItemEntry itemEntry) { - if (!CVarGetInteger(CVAR_ENHANCEMENT("ExtraTraps.Enabled"), 0) || itemEntry.modIndex != MOD_RANDOMIZER || itemEntry.getItemId != RG_ICE_TRAP) { - return; - } - roll = RandomElement(getEnabledAddTraps()); - switch (roll) { - case ADD_ICE_TRAP: - GameInteractor::RawAction::FreezePlayer(); - break; - case ADD_BURN_TRAP: - GameInteractor::RawAction::BurnPlayer(); - break; - case ADD_SHOCK_TRAP: - GameInteractor::RawAction::ElectrocutePlayer(); - break; - case ADD_KNOCK_TRAP: - eventTimer = 3; - break; - case ADD_SPEED_TRAP: - Audio_PlaySoundGeneral(NA_SE_VO_KZ_MOVE, &gSfxDefaultPos, 4, &gSfxDefaultFreqAndVolScale, &gSfxDefaultFreqAndVolScale, &gSfxDefaultReverb); - GameInteractor::State::RunSpeedModifier = -2; - statusTimer = 200; - Overlay_DisplayText(10, "Speed Decreased!"); - break; - case ADD_BOMB_TRAP: - eventTimer = 3; - break; - case ADD_VOID_TRAP: - Audio_PlaySoundGeneral(NA_SE_EN_GANON_LAUGH, &gSfxDefaultPos, 4, &gSfxDefaultFreqAndVolScale, &gSfxDefaultFreqAndVolScale, &gSfxDefaultReverb); - eventTimer = 3; - break; - case ADD_AMMO_TRAP: - eventTimer = 3; - Overlay_DisplayText(5, "Ammo Halved!"); - break; - case ADD_KILL_TRAP: - GameInteractor::RawAction::SetPlayerHealth(0); - break; - case ADD_TELEPORT_TRAP: - eventTimer = 3; - break; - default: - break; - } - }); - GameInteractor::Instance->RegisterGameHook([]() { - Player* player = GET_PLAYER(gPlayState); - if (statusTimer == 0) { - GameInteractor::State::RunSpeedModifier = 0; - } - if (eventTimer == 0) { - switch (roll) { - case ADD_KNOCK_TRAP: - GameInteractor::RawAction::KnockbackPlayer(1); - break; - case ADD_BOMB_TRAP: - GameInteractor::RawAction::SpawnActor(ACTOR_EN_BOM, 1); - break; - case ADD_VOID_TRAP: - Play_TriggerRespawn(gPlayState); - break; - case ADD_AMMO_TRAP: - AMMO(ITEM_STICK) = AMMO(ITEM_STICK) * 0.5; - AMMO(ITEM_NUT) = AMMO(ITEM_NUT) * 0.5; - AMMO(ITEM_SLINGSHOT) = AMMO(ITEM_SLINGSHOT) * 0.5; - AMMO(ITEM_BOW) = AMMO(ITEM_BOW) * 0.5; - AMMO(ITEM_BOMB) = AMMO(ITEM_BOMB) * 0.5; - AMMO(ITEM_BOMBCHU) = AMMO(ITEM_BOMBCHU) * 0.5; - Audio_PlaySoundGeneral(NA_SE_VO_FR_SMILE_0, &gSfxDefaultPos, 4, &gSfxDefaultFreqAndVolScale, &gSfxDefaultFreqAndVolScale, &gSfxDefaultReverb); - break; - case ADD_TELEPORT_TRAP: { - int entrance; - int index = 1 + rand() % 10; - switch (index) { - case 1: - entrance = GI_TP_DEST_SERENADE; - break; - case 2: - entrance = GI_TP_DEST_REQUIEM; - break; - case 3: - entrance = GI_TP_DEST_BOLERO; - break; - case 4: - entrance = GI_TP_DEST_MINUET; - break; - case 5: - entrance = GI_TP_DEST_NOCTURNE; - break; - case 6: - entrance = GI_TP_DEST_PRELUDE; - break; - default: - entrance = GI_TP_DEST_LINKSHOUSE; - break; - } - GameInteractor::RawAction::TeleportPlayer(entrance); - break; - } - default: - break; - } - } - statusTimer--; - eventTimer--; - }); -} - void UpdateHurtContainerModeState(bool newState) { static bool hurtEnabled = false; if (hurtEnabled == newState) { @@ -1208,10 +921,10 @@ void UpdateHurtContainerModeState(bool newState) { } hurtEnabled = newState; - uint16_t getHeartPieces = gSaveContext.sohStats.heartPieces / 4; - uint16_t getHeartContainers = gSaveContext.sohStats.heartContainers; - - if (hurtEnabled) { + uint16_t getHeartPieces = gSaveContext.ship.stats.heartPieces / 4; + uint16_t getHeartContainers = gSaveContext.ship.stats.heartContainers; + + if (hurtEnabled) { gSaveContext.healthCapacity = 320 - ((getHeartPieces + getHeartContainers) * 16); } else { gSaveContext.healthCapacity = 48 + ((getHeartPieces + getHeartContainers) * 16); @@ -1279,7 +992,7 @@ void RegisterOpenAllHours() { GameInteractor::Instance->RegisterGameHook([](void* refActor) { Actor* actor = static_cast(refActor); - if (CVarGetInteger(CVAR_ENHANCEMENT("OpenAllHours"), 0) && (actor->id == ACTOR_EN_DOOR)) { + if (CVarGetInteger(CVAR_ENHANCEMENT("OpenAllHours"), 0) && (actor->id == ACTOR_EN_DOOR) && (!IS_RANDO || !OTRGlobals::Instance->gRandomizer->GetRandoSettingValue(RSK_LOCK_OVERWORLD_DOORS))) { switch (actor->params) { case 4753: // Night Market Bazaar case 1678: // Night Potion Shop @@ -1491,18 +1204,8 @@ void InitMods() { BossRush_RegisterHooks(); RandomizerRegisterHooks(); TimeSaverRegisterHooks(); - CheatsRegisterHooks(); TimeSavers_Register(); RegisterTTS(); - RegisterInfiniteMoney(); - RegisterInfiniteHealth(); - RegisterInfiniteAmmo(); - RegisterInfiniteMagic(); - RegisterInfiniteNayrusLove(); - RegisterInfiniteISG(); - RegisterEzQPA(); - RegisterUnrestrictedItems(); - RegisterFreezeTime(); RegisterOcarinaTimeTravel(); RegisterAutoSave(); RegisterDaytimeGoldSkultullas(); @@ -1520,7 +1223,6 @@ void InitMods() { RegisterDekuNutUpgradeFix(); RegisterEnemyDefeatCounts(); RegisterBossDefeatTimestamps(); - RegisterAltTrapTypes(); RegisterRandomizedEnemySizes(); RegisterOpenAllHours(); RegisterToTMedallions(); diff --git a/soh/soh/Enhancements/nametag.cpp b/soh/soh/Enhancements/nametag.cpp index c2d72eae0..49b0891fa 100644 --- a/soh/soh/Enhancements/nametag.cpp +++ b/soh/soh/Enhancements/nametag.cpp @@ -83,7 +83,7 @@ void DrawNameTag(PlayState* play, const NameTag* nameTag) { // Prefer the highest between world position and focus position if targetable float posY = nameTag->actor->world.pos.y; - if (nameTag->actor->flags & ACTOR_FLAG_TARGETABLE) { + if (nameTag->actor->flags & ACTOR_FLAG_ATTENTION_ENABLED) { posY = std::max(posY, nameTag->actor->focus.pos.y); } diff --git a/soh/soh/Enhancements/pausewarp.c b/soh/soh/Enhancements/pausewarp.c index b87952232..c767a3412 100644 --- a/soh/soh/Enhancements/pausewarp.c +++ b/soh/soh/Enhancements/pausewarp.c @@ -2,22 +2,23 @@ #include "global.h" #include "z64.h" #include "game-interactor/GameInteractor.h" +#include "soh/OTRGlobals.h" static const int songMessageMap[] = { - TEXT_WARP_MINUET_OF_FOREST, - TEXT_WARP_BOLERO_OF_FIRE, - TEXT_WARP_SERENADE_OF_WATER, - TEXT_WARP_REQUIEM_OF_SPIRIT, - TEXT_WARP_NOCTURNE_OF_SHADOW, - TEXT_WARP_PRELUDE_OF_LIGHT + TEXT_WARP_MINUET_OF_FOREST, + TEXT_WARP_BOLERO_OF_FIRE, + TEXT_WARP_SERENADE_OF_WATER, + TEXT_WARP_REQUIEM_OF_SPIRIT, + TEXT_WARP_NOCTURNE_OF_SHADOW, + TEXT_WARP_PRELUDE_OF_LIGHT }; static const int ocarinaSongMap[] = { - OCARINA_SONG_MINUET, - OCARINA_SONG_BOLERO, - OCARINA_SONG_SERENADE, - OCARINA_SONG_REQUIEM, - OCARINA_SONG_NOCTURNE, + OCARINA_SONG_MINUET, + OCARINA_SONG_BOLERO, + OCARINA_SONG_SERENADE, + OCARINA_SONG_REQUIEM, + OCARINA_SONG_NOCTURNE, OCARINA_SONG_PRELUDE }; @@ -31,12 +32,12 @@ static const int entranceIndexMap[] = { }; static const int songAudioMap[] = { - NA_BGM_OCA_MINUET, - NA_BGM_OCA_BOLERO, - NA_BGM_OCA_SERENADE, - NA_BGM_OCA_REQUIEM, - NA_BGM_OCA_NOCTURNE, - NA_BGM_OCA_LIGHT + NA_BGM_OCA_MINUET, + NA_BGM_OCA_BOLERO, + NA_BGM_OCA_SERENADE, + NA_BGM_OCA_REQUIEM, + NA_BGM_OCA_NOCTURNE, + NA_BGM_OCA_LIGHT }; static bool isWarpActive = false; @@ -87,6 +88,47 @@ void PauseWarp_HandleSelection() { int song = gPlayState->pauseCtx.cursorPoint[PAUSE_QUEST]; if (aButtonPressed && CHECK_QUEST_ITEM(song) && song >= QUEST_SONG_MINUET && song <= QUEST_SONG_PRELUDE && gPlayState->pauseCtx.pageIndex == PAUSE_QUEST && gPlayState->pauseCtx.state == 6) { + if (gSaveContext.ship.quest.id == QUEST_RANDOMIZER && Randomizer_GetSettingValue(RSK_SHUFFLE_OCARINA_BUTTONS)) { + bool canplay = false; + switch (song) { + case QUEST_SONG_MINUET: + canplay = Flags_GetRandomizerInf(RAND_INF_HAS_OCARINA_A) && + Flags_GetRandomizerInf(RAND_INF_HAS_OCARINA_C_LEFT) && + Flags_GetRandomizerInf(RAND_INF_HAS_OCARINA_C_RIGHT) && + Flags_GetRandomizerInf(RAND_INF_HAS_OCARINA_C_UP); + break; + case QUEST_SONG_BOLERO: + canplay = Flags_GetRandomizerInf(RAND_INF_HAS_OCARINA_A) && + Flags_GetRandomizerInf(RAND_INF_HAS_OCARINA_C_RIGHT) && + Flags_GetRandomizerInf(RAND_INF_HAS_OCARINA_C_DOWN); + break; + case QUEST_SONG_SERENADE: + canplay = Flags_GetRandomizerInf(RAND_INF_HAS_OCARINA_A) && + Flags_GetRandomizerInf(RAND_INF_HAS_OCARINA_C_LEFT) && + Flags_GetRandomizerInf(RAND_INF_HAS_OCARINA_C_RIGHT) && + Flags_GetRandomizerInf(RAND_INF_HAS_OCARINA_C_DOWN); + break; + case QUEST_SONG_REQUIEM: + canplay = Flags_GetRandomizerInf(RAND_INF_HAS_OCARINA_A) && + Flags_GetRandomizerInf(RAND_INF_HAS_OCARINA_C_RIGHT) && + Flags_GetRandomizerInf(RAND_INF_HAS_OCARINA_C_DOWN); + break; + case QUEST_SONG_NOCTURNE: + canplay = Flags_GetRandomizerInf(RAND_INF_HAS_OCARINA_A) && + Flags_GetRandomizerInf(RAND_INF_HAS_OCARINA_C_LEFT) && + Flags_GetRandomizerInf(RAND_INF_HAS_OCARINA_C_RIGHT) && + Flags_GetRandomizerInf(RAND_INF_HAS_OCARINA_C_DOWN); + break; + case QUEST_SONG_PRELUDE: + canplay = Flags_GetRandomizerInf(RAND_INF_HAS_OCARINA_C_LEFT) && + Flags_GetRandomizerInf(RAND_INF_HAS_OCARINA_C_RIGHT) && + Flags_GetRandomizerInf(RAND_INF_HAS_OCARINA_C_UP); + break; + } + if (!canplay) { + return; + } + } ActivateWarp(&gPlayState->pauseCtx, song); } } diff --git a/soh/soh/Enhancements/presets.cpp b/soh/soh/Enhancements/presets.cpp index a823844f6..4ba4b62be 100644 --- a/soh/soh/Enhancements/presets.cpp +++ b/soh/soh/Enhancements/presets.cpp @@ -3,7 +3,7 @@ #include #include #include -#include "soh/UIWidgets.hpp" +#include "soh/SohGui/UIWidgets.hpp" #include void clearCvars(std::vector cvarsToClear) { @@ -75,7 +75,7 @@ void DrawPresetSelector(PresetType presetTypeId) { } Ship::Context::GetInstance()->GetWindow()->GetGui()->SaveConsoleVariablesNextFrame(); if (presetTypeId == PRESET_TYPE_RANDOMIZER){ - Rando::Context::GetInstance()->GetSettings()->ReloadOptions(); + Rando::Settings::GetInstance()->ReloadOptions(); } } ImGui::PopStyleVar(1); diff --git a/soh/soh/Enhancements/presets.h b/soh/soh/Enhancements/presets.h index 1bc4550f5..31df92831 100644 --- a/soh/soh/Enhancements/presets.h +++ b/soh/soh/Enhancements/presets.h @@ -342,8 +342,6 @@ const std::vector cheatCvars = { CVAR_CHEAT("EasyISG"), CVAR_CHEAT("EasyQPA"), CVAR_CHEAT("TimelessEquipment"), - CVAR_CHEAT("EasyPauseBuffer"), - CVAR_CHEAT("EasyInputBuffer"), CVAR_CHEAT("NoRestrictItems"), CVAR_CHEAT("FreezeTime"), CVAR_GENERAL("PrevTime"), @@ -397,7 +395,7 @@ const std::vector randomizerCvars = { CVAR_RANDOMIZER_SETTING("BigPoesHint"), CVAR_RANDOMIZER_SETTING("BiggoronHint"), CVAR_RANDOMIZER_SETTING("BlueFireArrows"), - CVAR_RANDOMIZER_SETTING("BombchusInLogic"), + CVAR_RANDOMIZER_SETTING("BombchuBag"), CVAR_RANDOMIZER_SETTING("BossKeysanity"), CVAR_RANDOMIZER_SETTING("BridgeRewardOptions"), CVAR_RANDOMIZER_SETTING("ChickensHint"), @@ -408,7 +406,6 @@ const std::vector randomizerCvars = { CVAR_RANDOMIZER_SETTING("DoorOfTime"), CVAR_RANDOMIZER_SETTING("DungeonCount"), CVAR_RANDOMIZER_SETTING("EnableBombchuDrops"), - CVAR_RANDOMIZER_SETTING("EnableGlitchCutscenes"), CVAR_RANDOMIZER_SETTING("FishingPoleHint"), CVAR_RANDOMIZER_SETTING("Fishsanity"), CVAR_RANDOMIZER_SETTING("FishsanityAgeSplit"), @@ -1010,7 +1007,6 @@ const std::vector spockRacePresetEntries = { PRESET_ENTRY_S32(CVAR_ENHANCEMENT("MinimumFishWeightChild"), 3), PRESET_ENTRY_S32(CVAR_ENHANCEMENT("GoronPot"), 1), PRESET_ENTRY_S32(CVAR_ENHANCEMENT("ForgeTime"), 0), - PRESET_ENTRY_S32(CVAR_CHEAT("EasyPauseBuffer"), 1), PRESET_ENTRY_S32(CVAR_ENHANCEMENT("DampeAllNight"), 1), PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("10GSHint"), 1), PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("20GSHint"), 1), @@ -1019,7 +1015,7 @@ const std::vector spockRacePresetEntries = { PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("50GSHint"), 1), PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("AllLocationsReachable"), 0), PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("BlueFireArrows"), 1), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("BombchusInLogic"), 1), + PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("BombchuBag"), 1), PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("CompleteMaskQuest"), 1), PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("CuccosToReturn"), 1), PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("DampeHint"), 1), @@ -1062,7 +1058,6 @@ const std::vector spockRaceNoLogicPresetEntries = { PRESET_ENTRY_S32(CVAR_ENHANCEMENT("AdultMasks"), 1), PRESET_ENTRY_S32(CVAR_ENHANCEMENT("MinimumFishWeightAdult"), 6), PRESET_ENTRY_S32(CVAR_ENHANCEMENT("AssignableTunicsAndBoots"), 1), - PRESET_ENTRY_S32(CVAR_CHEAT("EasyPauseBuffer"), 1), PRESET_ENTRY_S32(CVAR_ENHANCEMENT("MinimumFishWeightChild"), 3), PRESET_ENTRY_S32(CVAR_ENHANCEMENT("ClimbSpeed"), 4), PRESET_ENTRY_S32(CVAR_COSMETIC("Goron.NeckLength"), 1000), @@ -1103,7 +1098,7 @@ const std::vector spockRaceNoLogicPresetEntries = { PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("50GSHint"), 1), PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("AllLocationsReachable"), 0), PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("BlueFireArrows"), 1), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("BombchusInLogic"), 1), + PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("BombchuBag"), 1), PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("BossKeysanity"), RO_DUNGEON_ITEM_LOC_ANYWHERE), PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("CompleteMaskQuest"), 1), PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("CuccosToReturn"), 1), @@ -1200,7 +1195,6 @@ const std::vector hellModePresetEntries = { PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("CuccosToReturn"), 1), PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("DoorOfTime"), RO_DOOROFTIME_OPEN), PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("EnableBombchuDrops"), 1), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("EnableGlitchCutscenes"), 1), PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("ClosedForest"), RO_CLOSED_FOREST_OFF), PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("GanonTrial"), RO_GANONS_TRIALS_SET_NUMBER), PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("GanonTrialCount"), 6), diff --git a/soh/soh/Enhancements/randomizer/3drando/fill.cpp b/soh/soh/Enhancements/randomizer/3drando/fill.cpp index 248fd960d..234bd6a8e 100644 --- a/soh/soh/Enhancements/randomizer/3drando/fill.cpp +++ b/soh/soh/Enhancements/randomizer/3drando/fill.cpp @@ -130,14 +130,14 @@ static bool UpdateToDAccess(Entrance* entrance, Region* connection) { static void ValidateOtherEntrance(GetAccessibleLocationsStruct& gals) { auto ctx = Rando::Context::GetInstance(); // Condition for validating Temple of Time Access - if (!gals.foundTempleOfTime && ((ctx->GetSettings()->ResolvedStartingAge() == RO_AGE_CHILD && RegionTable(RR_TEMPLE_OF_TIME)->Adult()) || - (ctx->GetSettings()->ResolvedStartingAge() == RO_AGE_ADULT && RegionTable(RR_TEMPLE_OF_TIME)->Child()))) { + if (!gals.foundTempleOfTime && ((ctx->GetOption(RSK_SELECTED_STARTING_AGE).Is(RO_AGE_CHILD) && RegionTable(RR_TEMPLE_OF_TIME)->Adult()) || + (ctx->GetOption(RSK_SELECTED_STARTING_AGE).Is(RO_AGE_ADULT) && RegionTable(RR_TEMPLE_OF_TIME)->Child()))) { gals.foundTempleOfTime = true; } // Condition for validating a valid starting region if (!gals.validatedStartingRegion) { - bool childAccess = ctx->GetSettings()->ResolvedStartingAge() == RO_AGE_CHILD || RegionTable(RR_TOT_BEYOND_DOOR_OF_TIME)->Child(); - bool adultAccess = ctx->GetSettings()->ResolvedStartingAge() == RO_AGE_ADULT || RegionTable(RR_TOT_BEYOND_DOOR_OF_TIME)->Adult(); + bool childAccess = ctx->GetOption(RSK_SELECTED_STARTING_AGE).Is(RO_AGE_CHILD) || RegionTable(RR_TOT_BEYOND_DOOR_OF_TIME)->Child(); + bool adultAccess = ctx->GetOption(RSK_SELECTED_STARTING_AGE).Is(RO_AGE_ADULT) || RegionTable(RR_TOT_BEYOND_DOOR_OF_TIME)->Adult(); Region* kokiri = RegionTable(RR_KOKIRI_FOREST); Region* kakariko = RegionTable(RR_KAKARIKO_VILLAGE); @@ -164,11 +164,11 @@ static void ApplyAllAdvancmentItems(){ static void ValidateSphereZero(GetAccessibleLocationsStruct& gals){ auto ctx = Rando::Context::GetInstance(); // Condition for verifying everything required for sphere 0, expanding search to all locations - if (logic->CanEmptyBigPoes && gals.validatedStartingRegion && gals.foundTempleOfTime && gals.haveTimeAccess) { + if (logic->CouldEmptyBigPoes && gals.validatedStartingRegion && gals.foundTempleOfTime && gals.haveTimeAccess) { // Apply all items that are necessary for checking all location access ApplyAllAdvancmentItems(); // Reset access as the non-starting age - if (ctx->GetSettings()->ResolvedStartingAge() == RO_AGE_CHILD) { + if (ctx->GetOption(RSK_SELECTED_STARTING_AGE).Is(RO_AGE_CHILD)) { for (RandomizerRegion regionKey : gals.regionPool) { RegionTable(regionKey)->adultDay = false; RegionTable(regionKey)->adultNight = false; @@ -238,10 +238,10 @@ static int GetMaxGSCount() { int maxBridge = 0; int maxLACS = 0; if (ctx->GetOption(RSK_RAINBOW_BRIDGE).Is(RO_BRIDGE_TOKENS)) { - maxBridge = ctx->GetOption(RSK_RAINBOW_BRIDGE_TOKEN_COUNT).GetContextOptionIndex(); + maxBridge = ctx->GetOption(RSK_RAINBOW_BRIDGE_TOKEN_COUNT).Get(); } if (ctx->GetOption(RSK_GANONS_BOSS_KEY).Is(RO_GANON_BOSS_KEY_LACS_TOKENS)) { - maxLACS = ctx->GetOption(RSK_LACS_TOKEN_COUNT).GetContextOptionIndex(); + maxLACS = ctx->GetOption(RSK_LACS_TOKEN_COUNT).Get(); } maxBridge = std::max(maxBridge, maxLACS); //Get the max amount of GS which could be useful from token reward locations @@ -266,7 +266,7 @@ static int GetMaxGSCount() { maxUseful = 10; } //Return max of the two possible reasons tokens could be important, minus the tokens in the starting inventory - return std::max(maxUseful, maxBridge) - ctx->GetOption(RSK_STARTING_SKULLTULA_TOKEN).GetContextOptionIndex(); + return std::max(maxUseful, maxBridge) - ctx->GetOption(RSK_STARTING_SKULLTULA_TOKEN).Get(); } std::string GetShopItemBaseName(std::string itemName) { @@ -565,7 +565,7 @@ void ValidateEntrances(bool checkPoeCollectorAccess, bool checkOtherEntranceAcce ctx->allLocationsReachable = false; if (checkPoeCollectorAccess){ - logic->CanEmptyBigPoes = false; + logic->CouldEmptyBigPoes = false; } if (checkOtherEntranceAccess){ diff --git a/soh/soh/Enhancements/randomizer/3drando/hint_list.cpp b/soh/soh/Enhancements/randomizer/3drando/hint_list.cpp index 49d090a26..fd1f5ae4d 100644 --- a/soh/soh/Enhancements/randomizer/3drando/hint_list.cpp +++ b/soh/soh/Enhancements/randomizer/3drando/hint_list.cpp @@ -1455,915 +1455,300 @@ void StaticData::HintTable_Init() { | JUNK HINT TEXT | ---------------------------*/ - hintTextTable[RHT_JUNK02] = HintText(CustomMessage("They say you must read the names of \"Special Deal\" shop items carefully.", - /*german*/ "", - /*french*/ "Selon moi, les \"Offres spéciales\" sont parfois trompeuses... Lisez les attentivement!")); - // /*spanish*/"Según dicen, se debería prestar atención a los nombres de las ofertas especiales." + hintTextTable[RHT_JUNK01] = HintText(CustomMessage("They say you must read the names of \"Special Deal\" shop items carefully.", + /*german*/ "", + /*french*/ "Selon moi, les \"Offres spéciales\" sont parfois trompeuses... Lisez les attentivement!")); - hintTextTable[RHT_JUNK03] = HintText(CustomMessage("They say that Zelda is a poor leader.", + hintTextTable[RHT_JUNK02] = HintText(CustomMessage("They say that Zelda is a poor leader.", /*german*/ "", /*french*/ "Selon moi, Zelda ne ferait pas un bon monarque.")); - // /*spanish*/Según dicen, Zelda es mala líder. - hintTextTable[RHT_JUNK04] = HintText(CustomMessage("These hints can be quite useful. This is an exception.", + hintTextTable[RHT_JUNK03] = HintText(CustomMessage("These hints can be quite useful. This is an exception.", /*german*/ "", /*french*/ "Ces indices sont très utiles, à l'exception de celui-ci.")); - // /*spanish*/Las pistas suelen servir de ayuda. En cambio, esta no. - hintTextTable[RHT_JUNK05] = HintText(CustomMessage("They say that the Lizalfos in Dodongo's Cavern like to play in lava.", + hintTextTable[RHT_JUNK04] = HintText(CustomMessage("They say that the Lizalfos in Dodongo's Cavern like to play in lava.", /*german*/ "", /*french*/ "Selon moi, les Lézalfos de la Caverne Dodongo aiment patauger dans la lave.")); - // /*spanish*/Según dicen, a los Lizalfos de la Cueva de los Dodongos les gusta jugar en la lava. - hintTextTable[RHT_JUNK06] = HintText(CustomMessage("They say that all the Zora drowned in Wind Waker.", + hintTextTable[RHT_JUNK05] = HintText(CustomMessage("They say that all the Zora drowned in Wind Waker.", /*german*/ "", /*french*/ "Selon moi, les Zoras se sont noyés dans Wind Waker.")); - // /*spanish*/Según dicen, en Wind Waker todos los zora se ahogaron. - hintTextTable[RHT_JUNK07] = HintText(CustomMessage("If Gorons eat rocks, does that mean I'm in danger?", + hintTextTable[RHT_JUNK06] = HintText(CustomMessage("If Gorons eat rocks, does that mean I'm in danger?", /*german*/ "", /*french*/ "Ne dis pas au Gorons que je suis ici. Ils mangent des roches, tu sais!")); - // /*spanish*/Si los Goron se tragan las piedras, ¿no me hace ser una especia vulnarable o algo así - hintTextTable[RHT_JUNK08] = HintText(CustomMessage("'Member when Ganon was a blue pig?^I 'member.", + hintTextTable[RHT_JUNK07] = HintText(CustomMessage("'Member when Ganon was a blue pig?^I 'member.", /*german*/ "", /*french*/ "Dans mon temps, Ganon était un cochon bleu...^Pff! Les jeunes de nos jours, et leur Ganondorf!")); - // /*spanish*/¿T'acuerdas cuando Ganon era un cerdo azul?^Qué tiempos, chico. - hintTextTable[RHT_JUNK09] = HintText(CustomMessage("One who does not have Triforce can't go in.", + hintTextTable[RHT_JUNK08] = HintText(CustomMessage("One who does not have Triforce can't go in.", /*german*/ "", /*french*/ "Ceux sans Triforce doivent rebrousser chemin.")); - // /*spanish*/Aquel que no porte la Trifuerza no podrá pasar. - hintTextTable[RHT_JUNK10] = HintText(CustomMessage("Save your future, end the Happy Mask Salesman.", + hintTextTable[RHT_JUNK09] = HintText(CustomMessage("Save your future, end the Happy Mask Salesman.", /*german*/ "", /*french*/ "Selon moi, tu t'éviteras des jours de malheur si tu vaincs le vendeur de masques...")); - // /*spanish*/Salva tu futuro, acaba con el dueño de La Máscara Feliz. - hintTextTable[RHT_JUNK11] = HintText(CustomMessage("Glitches are a pathway to many abilities some consider to be... Unnatural.", + hintTextTable[RHT_JUNK10] = HintText(CustomMessage("Glitches are a pathway to many abilities some consider to be... Unnatural.", /*german*/ "", /*french*/ "Les glitchs sont un moyen d'acquérir de nombreuses facultés considérées par certains comme... contraire ")); - // /*spanish*/ Los glitches son el camino a muchas habilidades que varios consideran... nada natural. - hintTextTable[RHT_JUNK12] = HintText(CustomMessage("I'm stoned. Get it?", + hintTextTable[RHT_JUNK11] = HintText(CustomMessage("I'm stoned. Get it?", /*german*/ "", /*french*/ "Allez, roche, papier, ciseau...&Roche.")); - // /*spanish*/Me he quedado de piedra. ¿Lo pillas? - hintTextTable[RHT_JUNK13] = HintText(CustomMessage("Hoot! Hoot! Would you like me to repeat that?", + hintTextTable[RHT_JUNK12] = HintText(CustomMessage("Hoot! Hoot! Would you like me to repeat that?", /*german*/ "", /*french*/ "Hou hou! Veux-tu que je répète tout ça?")); - // /*spanish*/¡Buuu, buuu! ¿Te lo vuelvo a repetir? - hintTextTable[RHT_JUNK14] = HintText(CustomMessage("Gorons are stupid. They eat rocks.", + hintTextTable[RHT_JUNK13] = HintText(CustomMessage("Gorons are stupid. They eat rocks.", /*german*/ "", /*french*/ "Les Gorons sont des vraies têtes dures.")); - // /*spanish*/Los Goron son tontos. Se comen las piedras. - hintTextTable[RHT_JUNK15] = HintText(CustomMessage("They say that Lon Lon Ranch prospered under Ingo.", + hintTextTable[RHT_JUNK14] = HintText(CustomMessage("They say that Lon Lon Ranch prospered under Ingo.", /*german*/ "", /*french*/ "Selon moi, le Ranch Lon Lon était plus prospère sous Ingo.")); - // /*spanish*/Según dicen, el Rancho Lon Lon prosperó gracias a Ingo. - hintTextTable[RHT_JUNK16] = HintText(CustomMessage("The single rupee is a unique item.", - /*german*/ "", - /*french*/ "Nul objet n'est plus unique que le rubis vert.")); - // /*spanish*/La rupia de uno es un objeto singular. - - hintTextTable[RHT_JUNK17] = HintText(CustomMessage("Without the Lens of Truth, the Treasure Chest Mini-Game is a 1 out of 32 chance.^Good luck!", + hintTextTable[RHT_JUNK15] = HintText(CustomMessage("They say without the Lens of Truth, the Treasure Chest Mini-Game is a 1 out of 32 chance.^Good luck!", /*german*/ "", /*french*/ "Gagner la Chasse-aux-Trésors est 1 chance sur 32.^Bonne chance!")); - // /*spanish*/Sin la Lupa de la Verdad, ganarías 1/32 veces en el Cofre del Tesoro.^¡Buena suerte con ello! - hintTextTable[RHT_JUNK18] = HintText(CustomMessage("Use bombs wisely.", + hintTextTable[RHT_JUNK16] = HintText(CustomMessage("Use bombs wisely.", /*german*/ "", /*french*/ "Utilise les bombes avec précaution.")); - // /*spanish*/No desperdicies las bombas. - hintTextTable[RHT_JUNK19] = HintText(CustomMessage("They say that Volvagia hates splinters", - /*german*/ "", - /*french*/ "Selon moi, Volvagia déteste les échardes.")); - // /*spanish*/Según dicen, Volvagia le teme a las astillas. - - hintTextTable[RHT_JUNK20] = HintText(CustomMessage("They say that funky monkeys can be spotted on Friday.", - /*german*/ "", - /*french*/ "Selon moi, des capucins coquins sortent le vendredi.")); - // /*spanish*/Según dicen, en los viernes puedes hallar monos marchosos. - - hintTextTable[RHT_JUNK21] = HintText(CustomMessage("I found you, faker!", - /*german*/ "", - /*french*/ "Ah-ha! Je t'ai trouvé!")); - // /*spanish*/¡Ahí estás, impostor! - - hintTextTable[RHT_JUNK22] = HintText(CustomMessage("They say the Groose is loose.", - /*german*/ "", - /*french*/ "Selon moi, Hergo est le vrai héros.")); - // /*spanish*/Según dicen, Malton es un espanto. - - hintTextTable[RHT_JUNK23] = HintText(CustomMessage("They say that players who select the \"ON\" option for \"MOTION CONTROL\" are the real \"Zelda players!\"", + hintTextTable[RHT_JUNK17] = HintText(CustomMessage("They say that players who select the \"ON\" option for \"MOTION CONTROL\" are the real \"Zelda players!\"", /*german*/ "", /*french*/ "Selon moi, ceux qui utilisent les contrôles gyroscopiques sont les VRAIS joueurs.")); - // /*spanish*/ "Según dicen, aquellos que juegan usando el control por movimiento son los verdaderos jugadores de Zelda." - hintTextTable[RHT_JUNK24] = HintText(CustomMessage("What happened to Sheik?", - /*german*/ "", - /*french*/ "Donc... Qu'est-ce qui arrive avec Sheik?")); - // /*spanish*/¿Qué la habrá pasado a Sheik? - - hintTextTable[RHT_JUNK25] = HintText(CustomMessage("L2P @.", + hintTextTable[RHT_JUNK18] = HintText(CustomMessage("L2P @.", /*german*/ "", /*french*/ "Arrête de lire les indices et joue comme un grand, @.")); - // /*spanish*/Mira que eres novato, @. - hintTextTable[RHT_JUNK26] = HintText(CustomMessage("I've heard you can cheat at Sploosh Kaboom.", - /*german*/ "", - /*french*/ "Selon moi, il y a une carte aux trésors à Mercantîle... Duh!")); - // /*spanish*/He oído por ahí que puedes hacer trampa en el Sploosh Kaboom. - - hintTextTable[RHT_JUNK27] = HintText(CustomMessage("I'm Lonk from Pennsylvania.", - /*german*/ "", - /*french*/ "Je suis Lonk, le héros de Pennsylvanie!")); - // /*spanish*/Soy Lonk, de Pensilvania. - - hintTextTable[RHT_JUNK28] = HintText(CustomMessage("I bet you'd like to have more bombs.", + hintTextTable[RHT_JUNK19] = HintText(CustomMessage("I bet you'd like to have more bombs.", /*german*/ "", /*french*/ "Je parie que tu veux plus de bombes.")); - // /*spanish*/Me apuesto a que quisieras tener más bombas. - hintTextTable[RHT_JUNK29] = HintText(CustomMessage("When all else fails, use Fire.", + hintTextTable[RHT_JUNK20] = HintText(CustomMessage("When all else fails, use Fire.", /*german*/ "", /*french*/ "Quand rien ne marche, utilise le feu.")); - // /*spanish*/Cuando nada funcione, usa el fuego. - hintTextTable[RHT_JUNK30] = HintText(CustomMessage("Here's a hint, @. Don't be bad.", + hintTextTable[RHT_JUNK21] = HintText(CustomMessage("Here's a hint, @. Don't be bad.", /*german*/ "", /*french*/ "Selon moi, la #Triforce# n'est pas dans le jeu... Duh!")); - // /*spanish*/Aquí tienes una pista, @: deja de ser manco. - hintTextTable[RHT_JUNK31] = HintText(CustomMessage("Game Over. Return of Ganon.", + hintTextTable[RHT_JUNK22] = HintText(CustomMessage("Game Over. Return of Ganon.", /*german*/ "", /*french*/ "Partie terminée. RETour de Ganon.")); - // /*spanish*/Fin de la partida. El regreso de Ganon. - hintTextTable[RHT_JUNK32] = HintText(CustomMessage("May the way of the Hero lead to the Triforce.", + hintTextTable[RHT_JUNK23] = HintText(CustomMessage("May the way of the Hero lead to the Triforce.", /*german*/ "", /*french*/ "Que le chemin du héros te mène à la Triforce.")); - // /*spanish*/Puede que la senda del héroe te lleve hacia la Trifuerza. - hintTextTable[RHT_JUNK33] = HintText(CustomMessage("Can't find an item? Scan an Amiibo.", + hintTextTable[RHT_JUNK24] = HintText(CustomMessage("Can't find an item? Scan an Amiibo.", /*german*/ "", /*french*/ "Tu cherches de quoi? Utilise un Amiibo!")); - // /*spanish*/¿No encuentras algo? Escanea un amiibo. - hintTextTable[RHT_JUNK34] = HintText(CustomMessage("They say this game has just a few glitches.", + hintTextTable[RHT_JUNK25] = HintText(CustomMessage("They say this game has just a few glitches.", /*german*/ "", /*french*/ "Selon moi, ce jeu est complètement exempt de glitchs.")); - // /*spanish*/Dicen que este juego apenas tiene glitches. - hintTextTable[RHT_JUNK35] = HintText(CustomMessage("BRRING BRRING This is Ulrira. Wrong number?", + hintTextTable[RHT_JUNK26] = HintText(CustomMessage("BRRING BRRING This is Ulrira. Wrong number?", /*german*/ "", /*french*/ "DRING DRING!! Pépé le Ramollo à l'appareil... Quoi? Faux numéro?")); - // /*spanish*/¡Ring! ¡Ring! Al habla Ulrira. ¿Me he equivocado de número? - hintTextTable[RHT_JUNK36] = HintText(CustomMessage("Tingle Tingle Kooloo Limpah!", + hintTextTable[RHT_JUNK27] = HintText(CustomMessage("Tingle Tingle Kooloo Limpah!", /*german*/ "", /*french*/ "Tingle! Tingle! Kooloolin... Pah!")); - // /*spanish*/Tingle, Tingle, Kurulín... ¡PA! - hintTextTable[RHT_JUNK37] = HintText(CustomMessage("L is real 2401", + hintTextTable[RHT_JUNK28] = HintText(CustomMessage("L is real 2401", /*german*/ "", /*french*/ "L is real 2401")); - // /*spanish*/L es real 2401. - hintTextTable[RHT_JUNK38] = HintText(CustomMessage("They say that Ganondorf will appear in the next Mario Tennis.", + hintTextTable[RHT_JUNK29] = HintText(CustomMessage("They say that Ganondorf will appear in the next Mario Tennis.", /*german*/ "", /*french*/ "Selon moi, Ganondorf sera la nouvelle recrue dans Mario Tennis.")); - // /*spanish*/Según dicen, Ganondorf estará en el próximo Mario Tennis. - hintTextTable[RHT_JUNK39] = HintText(CustomMessage("Medigoron sells the earliest Breath of the Wild demo.", + hintTextTable[RHT_JUNK30] = HintText(CustomMessage("They say Medigoron sells the earliest Breath of the Wild demo.", /*german*/ "", /*french*/ "Selon moi, Medigoron vend une démo de #Breath of the Wild#.")); - // /*spanish*/Medigoron vende la primera demo del Breath of the Wild. - hintTextTable[RHT_JUNK40] = HintText(CustomMessage("Can you move me? I don't get great service here.", + hintTextTable[RHT_JUNK31] = HintText(CustomMessage("Can you move me? I don't get great service here.", /*german*/ "", /*french*/ "Peux-tu me déplacer? J'ai pas une bonne réception ici.")); - // /*spanish*/¿Puedes llevarme a otro lado? Aquí nadie me presta atención. - hintTextTable[RHT_JUNK41] = HintText(CustomMessage("They say if you use Strength on the truck, you can find Mew.", + hintTextTable[RHT_JUNK32] = HintText(CustomMessage("They say if you use Strength on the truck, you can find Mew.", /*german*/ "", /*french*/ "Selon moi, #Mew# se trouve dessous le camion... Duh!")); - // /*spanish*/Según dicen, puedes hallar un Mew usando Fuerza contra el camión de Ciudad Carmín. - hintTextTable[RHT_JUNK42] = HintText(CustomMessage("I'm a helpful hint Gossip Stone!^See, I'm helping.", + hintTextTable[RHT_JUNK33] = HintText(CustomMessage("I'm a helpful hint Gossip Stone!^See, I'm helping.", /*german*/ "", /*french*/ "Salut! Je suis une pierre de bons conseils!^Tiens, tu vois? J'aide bien, hein?")); - // /*spanish*/Soy una Piedra Sheikah muy útil.^¡Mira cómo te ayudo! - hintTextTable[RHT_JUNK43] = HintText(CustomMessage("Dear @, please come to the castle. I've baked a cake for you.&Yours truly, Princess Zelda.", + hintTextTable[RHT_JUNK34] = HintText(CustomMessage("Dear @, please come to the castle. I've baked a cake for you.&Yours truly, Princess Zelda.", /*german*/ "", /*french*/ "Mon très cher @:&Viens vite au château, je t'ai préparé&un délicieux gâteau...^À bientôt, Princesse Zelda")); - // /*spanish*/Querido @: Por favor, ven al castillo. He hecho una tarta para ti.&Sinceramente tuya: Princesa Zelda. - hintTextTable[RHT_JUNK44] = HintText(CustomMessage("They say all toasters toast toast.", + hintTextTable[RHT_JUNK35] = HintText(CustomMessage("They say all toasters toast toast.", /*german*/ "", /*french*/ "Selon moi, les grille-pains grillent du pain.")); - // /*spanish*/Según dicen, todas las tostadoras tostan tostadas tostadas. - hintTextTable[RHT_JUNK45] = HintText(CustomMessage("You thought it would be a useful hint, but it was me, junk hint!", + hintTextTable[RHT_JUNK36] = HintText(CustomMessage("You thought it would be a useful hint, but it was me, junk hint!", /*german*/ "", /*french*/ "Tu t'attendais à un bon indice... Mais c'était moi, un mauvais indice!")); - // /*spanish*/Je... Creeías que iba a ser una piedra de utilidad, ¡pero no, era yo, la piedra de la agonía! - hintTextTable[RHT_JUNK46] = HintText(CustomMessage("They say that quest guidance can be found at a talking rock.", + hintTextTable[RHT_JUNK37] = HintText(CustomMessage("They say that quest guidance can be found at a talking rock.", /*german*/ "", /*french*/ "Selon moi, des #indices# se trouvent auprès d'une pierre parlante... Duh!")); - // /*spanish*/Según dicen, puedes consultarle ayuda a rocas parlanchinas. - hintTextTable[RHT_JUNK47] = HintText(CustomMessage("They say that the final item you're looking for can be found somewhere in Hyrule.", + hintTextTable[RHT_JUNK38] = HintText(CustomMessage("They say that the final item you're looking for can be found somewhere in Hyrule.", /*german*/ "", /*french*/ "Selon moi, le #dernier objet# se trouve quelque part dans Hyrule... Duh!")); - // /*spanish*/Según dicen, el último objeto que te falte puede estar en cualquier rincón de Hyrule. - hintTextTable[RHT_JUNK48] = HintText(CustomMessage("Mweep.^Mweep.^Mweep.^Mweep.^Mweep.^Mweep.^Mweep.^Mweep.^Mweep.^Mweep.^Mweep.^Mweep.", + hintTextTable[RHT_JUNK39] = HintText(CustomMessage("Mweep.^Mweep.^Mweep.^Mweep.^Mweep.^Mweep.^Mweep.^Mweep.^Mweep.^Mweep.^Mweep.^Mweep.", /*german*/ "", /*french*/ "Mwip.^Mwip.^Mwip.^Mwip.^Mwip.^Mwip.^Mwip.^Mwip.^Mwip.^Mwip.^Mwip.^Mwip.")); - // /*spanish*/Mweep.^Mweep.^Mweep.^Mweep.^Mweep.^Mweep.^Mweep.^Mweep.^Mweep.^Mweep.^Mweep.^Mweep. - hintTextTable[RHT_JUNK49] = HintText(CustomMessage("They say that Barinade fears Deku Nuts.", + hintTextTable[RHT_JUNK40] = HintText(CustomMessage("They say that Barinade fears Deku Nuts.", /*german*/ "", /*french*/ "Selon moi, Barinade a la frousse des noix Mojo.")); - // /*spanish*/Según dicen, lo que más teme a Barinade son las nueces deku. - hintTextTable[RHT_JUNK50] = HintText(CustomMessage("They say that Flare Dancers do not fear Goron-crafted blades.", + hintTextTable[RHT_JUNK41] = HintText(CustomMessage("They say that Flare Dancers do not fear Goron-crafted blades.", /*german*/ "", /*french*/ "Selon moi, le danse-flamme n'a pas peur des armes de Goron.")); - // /*spanish*/Según dicen, los Bailafuegos no le temen a las armas forjadas por Gorons. - hintTextTable[RHT_JUNK51] = HintText(CustomMessage("They say that Morpha is easily trapped in a corner.", + hintTextTable[RHT_JUNK42] = HintText(CustomMessage("They say that Morpha is easily trapped in a corner.", /*german*/ "", /*french*/ "Selon moi, Morpha est facilement coincé.")); - // /*spanish*/Según dicen, puedes atrapar a Morpha con facilidad en una esquina. - hintTextTable[RHT_JUNK52] = HintText(CustomMessage("They say that Bongo Bongo really hates the cold.", + hintTextTable[RHT_JUNK43] = HintText(CustomMessage("They say that Bongo Bongo really hates the cold.", /*german*/ "", /*french*/ "Selon moi, Bongo Bongo a facilement froid aux doigts.")); - // /*spanish*/Según dicen, Bongo Bongo odia a muerte el frío. - hintTextTable[RHT_JUNK53] = HintText(CustomMessage("They say that your sword is most powerful when you put it away.", + hintTextTable[RHT_JUNK44] = HintText(CustomMessage("They say that your sword is most powerful when you put it away.", /*german*/ "", /*french*/ "Selon moi, ton épée est à pleine puissance quand tu la rengaines.")); - // /*spanish*/Según dicen, tu espada se vuelve más poderosa si la guardas. - hintTextTable[RHT_JUNK54] = HintText(CustomMessage("They say that bombing the hole Volvagia last flew into can be rewarding.", + hintTextTable[RHT_JUNK45] = HintText(CustomMessage("They say that bombing the hole Volvagia last flew into can be rewarding.", /*german*/ "", /*french*/ "Selon moi, le trou où se creuse Volvagia est vulnérable aux bombes.")); - // /*spanish*/Según dicen, trae buena suerte colocar una bomba en el último agujero de donde salió Volvagia. - hintTextTable[RHT_JUNK55] = HintText(CustomMessage("They say that invisible ghosts can be exposed with Deku Nuts.", + hintTextTable[RHT_JUNK46] = HintText(CustomMessage("They say that invisible ghosts can be exposed with Deku Nuts.", /*german*/ "", /*french*/ "Selon moi, des fantômes invisibles apparaissent avec des noix Mojo.")); - // /*spanish*/Según dicen, puedes exponer a los espectros invisibles con nueces deku. - hintTextTable[RHT_JUNK56] = HintText(CustomMessage("They say that the real Phantom Ganon is bright and loud.", + hintTextTable[RHT_JUNK47] = HintText(CustomMessage("They say that the real Phantom Ganon is bright and loud.", /*german*/ "", /*french*/ "Selon moi, le vrai spectre de Ganon est clair et bruyant.")); - // /*spanish*/Según dicen, el verdadero Ganon Fantasma es brillante y ruidoso. - hintTextTable[RHT_JUNK57] = HintText(CustomMessage("They say that walking backwards is very fast.", + hintTextTable[RHT_JUNK48] = HintText(CustomMessage("They say that walking backwards is very fast.", /*german*/ "", /*french*/ "Selon moi, tu fais marche arrière très rapidement pour un héros.")); - // /*spanish*/Según dicen, es más rápido caminar hacia atrás. - hintTextTable[RHT_JUNK58] = HintText(CustomMessage("They say that leaping above the Market entrance enriches most children.", - /*german*/ "", - /*french*/ "Selon moi, les enfants riches se pavanent en haut du pont-levis.")); - // /*spanish*/Según dicen, saltar por las cadenas a la entrada de la plaza enriquece a muchos chiquillos. - - hintTextTable[RHT_JUNK59] = HintText(CustomMessage("They say Ingo is not very good at planning ahead.", + hintTextTable[RHT_JUNK49] = HintText(CustomMessage("They say Ingo is not very good at planning ahead.", /*german*/ "", /*french*/ "Selon moi, Ingo ne fait pas un très bon geôlier.")); - // /*spanish*/Según dicen, a Ingo no se le da especialmente bien planificar con antelación. - hintTextTable[RHT_JUNK60] = HintText(CustomMessage("You found a spiritual Stone! By which I mean, I worship Nayru.", + hintTextTable[RHT_JUNK50] = HintText(CustomMessage("You found a spiritual Stone! By which I mean, I worship Nayru.", /*german*/ "", /*french*/ "Vous avez trouvé une Pierre Ancestrale! En effet, je vénère la déesse Hylia.")); - // /*spanish*/¡Has encontrado una piedra espiritual! Es que le rindo culto a Nayru... - hintTextTable[RHT_JUNK61] = HintText(CustomMessage("They say that a flying strike with a Deku Stick is no stronger than a grounded one.", - /*german*/ "", - /*french*/ "Selon moi, un coup de bâton sauté n'est pas meilleur qu'au sol.")); - // /*spanish*/Según dicen, los golpes aéreos con palos deku son tan fuertes como los normales. - - hintTextTable[RHT_JUNK62] = HintText(CustomMessage("Open your eyes.^Open your eyes.^Wake up, @.", + hintTextTable[RHT_JUNK51] = HintText(CustomMessage("Open your eyes.^Open your eyes.^Wake up, @.", /*german*/ "", /*french*/ "Réveille-toi...^Réveille-toi.^Ouvre les yeux, @.")); - // /*spanish*/Abre los ojos...^Abre los ojos...^Despierta, @... - hintTextTable[RHT_JUNK63] = HintText(CustomMessage("They say that the Nocturne of Shadow can bring you very close to Ganon.", + hintTextTable[RHT_JUNK52] = HintText(CustomMessage("They say that the Nocturne of Shadow can bring you very close to Ganon.", /*german*/ "", /*french*/ "Selon moi, le nocturne de l'ombre peut t'amener très près de Ganon.")); - // /*spanish*/Según dicen, el Nocturno de la sombra te puede acercar mucho a Ganon. - hintTextTable[RHT_JUNK64] = HintText(CustomMessage("They say that Twinrova always casts the same spell the first three times.", + hintTextTable[RHT_JUNK53] = HintText(CustomMessage("They say that Twinrova always casts the same spell the first three times.", /*german*/ "", /*french*/ "Selon moi, Twinrova lance toujours les mêmes trois premiers sorts.")); - // /*spanish*/Según dicen, Birova siempre lanza el mismo hechizo las tres primeras veces. - hintTextTable[RHT_JUNK65] = HintText(CustomMessage("They say that the nightly builds may be unstable.", + hintTextTable[RHT_JUNK54] = HintText(CustomMessage("They say that the nightly builds may be unstable.", /*german*/ "", /*french*/ "Selon moi, les \"nightly builds\" peuvent être instables.")); - // /*spanish*/Según dicen, las últimas nightlies pueden llegar a ser algo inestables. - hintTextTable[RHT_JUNK66] = HintText(CustomMessage("You're playing a Randomizer. I'm randomized!^Here's a random number: #4#.&Enjoy your Randomizer!", + hintTextTable[RHT_JUNK55] = HintText(CustomMessage("You're playing a Randomizer. I'm randomized!^Here's a random number: #4#.&Enjoy your Randomizer!", /*german*/ "", /*french*/ "Tu joues à un randomizer. Je suis aléatoire!^Voici un nombre aléatoire: #4#.&Bonne partie!")); - // /*spanish*/¡Estás jugando un Randomizer! ¡Yo también estoy aleatorizada!^Aquí tienes un número aleatorio: #8#.&¡Diviértete! - hintTextTable[RHT_JUNK67] = HintText(CustomMessage("They say Ganondorf's bolts can be reflected with glass or steel.", + hintTextTable[RHT_JUNK56] = HintText(CustomMessage("They say Ganondorf's bolts can be reflected with glass or steel.", /*german*/ "", /*french*/ "Selon moi, les éclairs de Ganon se reflètent sur l'acier et le verre.")); - // /*spanish*/Según dicen, puedes reflejar las esferas de energía de Ganondorf con cristal y acero. - hintTextTable[RHT_JUNK68] = HintText(CustomMessage("They say Ganon's tail is vulnerable to nuts, arrows, swords, explosives, hammers...^...sticks, seeds, " + hintTextTable[RHT_JUNK57] = HintText(CustomMessage("They say Ganon's tail is vulnerable to nuts, arrows, swords, explosives, hammers...^...sticks, seeds, " "boomerangs...^...rods, shovels, iron balls, angry bees...", /*german*/ "", /*french*/ "Selon moi, la queue de Ganon est vulnérable aux noix, flèches, épées, bombes, marteaux...^...bâtons, " "graines, boomerangs...^...baguettes, pelles, boulets de fer, abeilles enragées...")); - // /*spanish*/Según dicen, la cola de Ganon es vulnerable a nueces, flechas, espadas, explosivos, - // martillos...^...palos, semillas, bumeráns...^...cetros, palas, bolas de hierro, abejas... - hintTextTable[RHT_JUNK69] = HintText(CustomMessage("They say that you're wasting time reading this hint, but I disagree. Talk to me again!", + hintTextTable[RHT_JUNK58] = HintText(CustomMessage("They say that you're wasting time reading this hint, but I disagree. Talk to me again!", /*german*/ "", /*french*/ "Selon moi... tu sais quoi? Parle-moi encore, et je te le dirai!")); - // /*spanish*/Según dicen, pierdes el tiempo en leer esta pista, pero no pienso igual. ¡Vuelve a hablarme, ya verás! - hintTextTable[RHT_JUNK70] = HintText(CustomMessage("They say Ganondorf knows where to find the instrument of his doom.", + hintTextTable[RHT_JUNK59] = HintText(CustomMessage("They say Ganondorf knows where to find the instrument of his doom.", /*german*/ "", /*french*/ "Selon moi, Ganondorf sait où il a caché son point faible.")); - // /*spanish*/Según dicen, Ganondorf sabe dónde hallar el instrumento de su perdición. - hintTextTable[RHT_JUNK71] = HintText(CustomMessage("I heard @ is pretty good at Zelda.", + hintTextTable[RHT_JUNK60] = HintText(CustomMessage("I heard @ is pretty good at Zelda.", /*german*/ "", /*french*/ "Apparemment, @ est super bon à Zelda.")); - // /*spanish*/He oído que a @ se le dan muy bien los Zelda. - hintTextTable[RHT_JUNK72] = HintText(CustomMessage("Hi @, we've been trying to reach you about your car's extended warranty. ", + hintTextTable[RHT_JUNK61] = HintText(CustomMessage("Hi @, we've been trying to reach you about your car's extended warranty. ", /*german*/ "", /*french*/ "Bonjour, @. Vous avez une voiture? Vous savez, nous offrons des assurances abordables...")); - // /*spanish*/Buenas, @. Le llamamos para ofrecerle un nuevo seguro de hogar que puede pagar en cómodos plazos, sin - // intereses ni comisiones. - hintTextTable[RHT_JUNK73] = HintText(CustomMessage("They say that the best weapon against Iron Knuckles is item 176.", - /*german*/ "", - /*french*/ "Selon moi, les hache-viandes sont vulnérables contre l'objet 176.")); - // /*spanish*/Según dicen, la mejor arma para enfrentarse a los Nudillos de hierro es el objeto 176. - - hintTextTable[RHT_JUNK74] = HintText(CustomMessage("They say that it's actually possible to beat the running man.", + hintTextTable[RHT_JUNK62] = HintText(CustomMessage("They say that it's actually possible to beat the running man.", /*german*/ "", /*french*/ "Selon moi, il est possible de battre le coureur.&Donc, tu prends ton arc, et...")); - // /*spanish*/Según dicen, con mucha perseverancia puedes ganarle al corredor con la capucha de conejo. - hintTextTable[RHT_JUNK75] = HintText(CustomMessage("They say that the stone-cold guardian of the Well is only present during work hours.", - /*german*/ "", - /*french*/ "Selon moi, le gardien de pierre du Puits quitte le soir pour aller se coucher.")); - // /*spanish*/Según dicen, la inmensa roca que bloquea el pozo solo trabaja en horas laborales. - - hintTextTable[RHT_JUNK76] = HintText(CustomMessage("They say this hint makes more sense in other languages.", + hintTextTable[RHT_JUNK63] = HintText(CustomMessage("They say this hint makes more sense in other languages.", /*german*/ "", /*french*/ "Selon moi, ces indices auraient pu être mieux traduits... Duh!")); - // /*spanish*/Según dicen, esta pista revela algo de vital importancia si cambias el idioma del juego... - hintTextTable[RHT_JUNK77] = HintText(CustomMessage("BOK? No way.", - /*german*/ "", - /*french*/ "BD'accord? Hors de question.")); - // /*spanish*/¿BVale? Ni hablar. + // ^ Junk hints above are from 3drando + // v Junk hints below are new to soh rando - // ^ junk hints above are from 3drando - // v junk hints below are new to soh rando + // Please keep hints to stuff related to ship directly, or to Nintendo/Zelda related stuff. + // And nothing that's super obscure that no one's going to understand. #define HINT_TEXT_NEEDS_TRANSLATION_FR \ "Erreur 0x69a504:&Traduction manquante^C'est de la faute à Purple Hato!&J'vous jure!" - - hintTextTable[RHT_JUNK78] = HintText(CustomMessage("They say blarg...^...or at least briaguya does.", + + hintTextTable[RHT_JUNK64] = HintText(CustomMessage("They say Greg is special.", /*german*/ "", - /*french*/ "Tout ce que j'ai à dire, c'est blarg...^... 'fin c'est plutôt ce que briaguya dirait.")); - // /*spanish*/blarg + /*french*/ HINT_TEXT_NEEDS_TRANSLATION_FR)); - hintTextTable[RHT_JUNK79] = HintText(CustomMessage("They say this peace is what all true warriors strive for.", + hintTextTable[RHT_JUNK65] = HintText(CustomMessage("They say the longer the Goron's neck, the wiser they are.", /*german*/ "", - /*french*/ "Selon moi, cette paix est ce pour quoi luttent tous les vrais guerriers.")); - // /*spanish*/blarg + /*french*/ HINT_TEXT_NEEDS_TRANSLATION_FR)); - hintTextTable[RHT_JUNK80] = HintText(CustomMessage("They say this ship is what all true gamers strive for.", + hintTextTable[RHT_JUNK66] = HintText(CustomMessage("They say this ship is what all true gamers strive for.", /*german*/ "", /*french*/ "Selon moi, cette version du port est ce pour quoi luttent tous les vrais gamers.")); - // /*spanish*/blarg - - hintTextTable[RHT_JUNK81] = HintText(CustomMessage("They say that Glowsticks can be found in the Raveyard.", + + hintTextTable[RHT_JUNK67] = HintText(CustomMessage("They say that Glowsticks can be found in the Raveyard.", /*german*/ "", /*french*/ "On peut trouver des Bâtons Lumineux sur le dancefloor du cimetière.")); - // /*spanish*/blarg - hintTextTable[RHT_JUNK_WTC_1] = HintText(CustomMessage("They say %rthere are no more than 18&people on this island.", - /*german*/ "", - /*french*/ HINT_TEXT_NEEDS_TRANSLATION_FR)); + hintTextTable[RHT_JUNK68] = HintText(CustomMessage("They say @'s uncle works for Nintendo.", + /*german*/ "", + /*french*/ HINT_TEXT_NEEDS_TRANSLATION_FR)); - hintTextTable[RHT_JUNK_WTC_2] = HintText(CustomMessage("They say I am one yet many", - /*german*/ "", - /*french*/ HINT_TEXT_NEEDS_TRANSLATION_FR)); + hintTextTable[RHT_JUNK69] = HintText(CustomMessage("They say pulling all gravestones in the graveyard leads to something magical.", + /*german*/ "", + /*french*/ HINT_TEXT_NEEDS_TRANSLATION_FR)); - hintTextTable[RHT_JUNK_WTC_3] = HintText(CustomMessage("They say its all in the name of guiding&humanity down the right path.", - /*german*/ "", - /*french*/ HINT_TEXT_NEEDS_TRANSLATION_FR)); + hintTextTable[RHT_JUNK70] = HintText(CustomMessage("They say holding L while pausing makes you win the game.", + /*german*/ "", + /*french*/ HINT_TEXT_NEEDS_TRANSLATION_FR)); - hintTextTable[RHT_JUNK_WTC_4] = HintText(CustomMessage("They say \"Repetition requested\"", - /*german*/ "", - /*french*/ HINT_TEXT_NEEDS_TRANSLATION_FR)); - - hintTextTable[RHT_JUNK_WTC_5] = HintText(CustomMessage("They say %rThe red tells only the truth!", - /*german*/ "", - /*french*/ HINT_TEXT_NEEDS_TRANSLATION_FR)); - - hintTextTable[RHT_JUNK_WTC_6] = HintText(CustomMessage("They say good tidings to you^my traitorous @", - /*german*/ "", - /*french*/ HINT_TEXT_NEEDS_TRANSLATION_FR)); - - hintTextTable[RHT_JUNK_WTC_7] = HintText(CustomMessage("They say when the seagulls cried,&none were left alive.", - /*german*/ "", - /*french*/ HINT_TEXT_NEEDS_TRANSLATION_FR)); - - hintTextTable[RHT_JUNK_WTC_8] = HintText(CustomMessage("They say she is lying with the red letters!", - /*german*/ "", - /*french*/ HINT_TEXT_NEEDS_TRANSLATION_FR)); - - hintTextTable[RHT_JUNK_WTC_9] = HintText(CustomMessage("They say we'll meet again,&when something else cries.", - /*german*/ "", - /*french*/ HINT_TEXT_NEEDS_TRANSLATION_FR)); - - hintTextTable[RHT_JUNK_WTC_10] = HintText(CustomMessage("They say \"Forgive me, but-^Your script will not be used.&....After all...^The one writing the rest of " - "the script...&will be me.\"", - /*german*/ "", - /*french*/ HINT_TEXT_NEEDS_TRANSLATION_FR)); - - hintTextTable[RHT_JUNK_WTC_11] = HintText(CustomMessage("They say tea is best enjoyed...^\"\"With your fellow monsters.\"\"", - /*german*/ "", - /*french*/ HINT_TEXT_NEEDS_TRANSLATION_FR)); - - - hintTextTable[RHT_JUNK_WTC_12] = HintText(CustomMessage("They say I shall make you some black tea. With my own hands, not magic.", - /*german*/ "", - /*french*/ HINT_TEXT_NEEDS_TRANSLATION_FR)); - - hintTextTable[RHT_JUNK_SEI_1] = HintText(CustomMessage("They say you know I've kiboshed before...^and I will kibosh again.", - /*german*/ "", - /*french*/ HINT_TEXT_NEEDS_TRANSLATION_FR)); - - hintTextTable[RHT_JUNK_SEI_2] = HintText(CustomMessage("They say if relationship @ walks through that door,^they will KILL independent @.", - /*german*/ "", - /*french*/ HINT_TEXT_NEEDS_TRANSLATION_FR)); - - hintTextTable[RHT_JUNK_SEI_3] = HintText(CustomMessage("They say you gotta have the BIG Salad.", - /*german*/ "", - /*french*/ HINT_TEXT_NEEDS_TRANSLATION_FR)); - - hintTextTable[RHT_JUNK_SEI_4] = HintText(CustomMessage("They say it's a festivus miracle", - /*german*/ "", - /*french*/ HINT_TEXT_NEEDS_TRANSLATION_FR)); - - hintTextTable[RHT_JUNK_SEI_5] = HintText(CustomMessage("They say there are no houses in Tuscany to rent.", - /*german*/ "", - /*french*/ HINT_TEXT_NEEDS_TRANSLATION_FR)); - - hintTextTable[RHT_JUNK_SEI_6] = HintText(CustomMessage("They say my last boyfriend had a real&Kroner comprehension problem.", - /*german*/ "", - /*french*/ HINT_TEXT_NEEDS_TRANSLATION_FR)); - - hintTextTable[RHT_JUNK_SEI_7] = HintText(CustomMessage("They say it's a festivus miracle.", - /*german*/ "", - /*french*/ HINT_TEXT_NEEDS_TRANSLATION_FR)); - - hintTextTable[RHT_JUNK_SEI_8] = HintText(CustomMessage("They say Louis quit the importing&to focus on the exporting.", - /*german*/ "", - /*french*/ HINT_TEXT_NEEDS_TRANSLATION_FR)); - - hintTextTable[RHT_JUNK_SEI_9] = HintText(CustomMessage("They say no thanks, I can't drink coffee&late at night, it keeps me up.", - /*german*/ "", - /*french*/ HINT_TEXT_NEEDS_TRANSLATION_FR)); - - hintTextTable[RHT_JUNK_SEI_10] = HintText(CustomMessage("They say it's not a lie if you believe it.", - /*german*/ "", - /*french*/ HINT_TEXT_NEEDS_TRANSLATION_FR)); - - hintTextTable[RHT_JUNK_SEI_11] = HintText(CustomMessage("They say there was a second spitter.", - /*german*/ "", - /*french*/ HINT_TEXT_NEEDS_TRANSLATION_FR)); - - hintTextTable[RHT_JUNK_SEI_12] = HintText(CustomMessage("They say there was a second spitter.", - /*german*/ "", - /*french*/ HINT_TEXT_NEEDS_TRANSLATION_FR)); - - hintTextTable[RHT_JUNK_SEI_13] = HintText(CustomMessage("They say the jerk store called,^they're running out of YOU.", - /*german*/ "", - /*french*/ HINT_TEXT_NEEDS_TRANSLATION_FR)); - - hintTextTable[RHT_JUNK_SEI_14] = HintText(CustomMessage("They say when you look annoyed all the time,&people thing you are busy.", - /*german*/ "", - /*french*/ HINT_TEXT_NEEDS_TRANSLATION_FR)); - - hintTextTable[RHT_JUNK_SEI_15] = HintText(CustomMessage("They say when you look annoyed all the time,&people think you are busy.", - /*german*/ "", - /*french*/ HINT_TEXT_NEEDS_TRANSLATION_FR)); - - hintTextTable[RHT_JUNK_SEI_16] = HintText(CustomMessage("They say he fires people like its a bodily function.", - /*german*/ "", - /*french*/ HINT_TEXT_NEEDS_TRANSLATION_FR)); - - hintTextTable[RHT_JUNK_SEI_17] = HintText(CustomMessage("They say he threatened to move the ship to New Jersey&just to upset people.", - /*german*/ "", - /*french*/ HINT_TEXT_NEEDS_TRANSLATION_FR)); - - hintTextTable[RHT_JUNK_SEI_18] = HintText(CustomMessage("They say there was significant shrinkage.", - /*german*/ "", - /*french*/ HINT_TEXT_NEEDS_TRANSLATION_FR)); - - hintTextTable[RHT_JUNK_SEI_19] = HintText(CustomMessage("They say if it wasn't for the toilet there'd be no books.", - /*german*/ "", - /*french*/ HINT_TEXT_NEEDS_TRANSLATION_FR)); - - hintTextTable[RHT_JUNK_SEI_20] = HintText(CustomMessage("They say if it wasn't for the toilet there'd be no books.", - /*german*/ "", - /*french*/ HINT_TEXT_NEEDS_TRANSLATION_FR)); - - hintTextTable[RHT_JUNK_SEI_21] = HintText(CustomMessage("They say don't trust men in capes.", - /*german*/ "", - /*french*/ HINT_TEXT_NEEDS_TRANSLATION_FR)); - - hintTextTable[RHT_JUNK_SEI_22] = HintText(CustomMessage("They say @'s uncle works for Nintendo.", - /*german*/ "", - /*french*/ HINT_TEXT_NEEDS_TRANSLATION_FR)); - - hintTextTable[RHT_JUNK_SEI_23] = HintText(CustomMessage("They say @'s stole the marble rye.", - /*german*/ "", - /*french*/ HINT_TEXT_NEEDS_TRANSLATION_FR)); - - hintTextTable[RHT_JUNK_SEI_24] = HintText(CustomMessage("They say there is no better harmony&than the black and white cookie.", - /*german*/ "", - /*french*/ HINT_TEXT_NEEDS_TRANSLATION_FR)); - - hintTextTable[RHT_JUNK_SEI_25] = HintText(CustomMessage("They say @ hasn't vomited since 1983.", - /*german*/ "", - /*french*/ HINT_TEXT_NEEDS_TRANSLATION_FR)); - - hintTextTable[RHT_JUNK_SEI_26] = HintText(CustomMessage("They say you gotta have the early bird special.", - /*german*/ "", - /*french*/ HINT_TEXT_NEEDS_TRANSLATION_FR)); - - hintTextTable[RHT_JUNK_SEI_27] = HintText(CustomMessage("They say a donation has been made in your name&to the human fund.", - /*german*/ "", - /*french*/ HINT_TEXT_NEEDS_TRANSLATION_FR)); - - hintTextTable[RHT_JUNK_SEI_28] = HintText(CustomMessage("They say you want to be my latex salesman.", - /*german*/ "", - /*french*/ HINT_TEXT_NEEDS_TRANSLATION_FR)); - - hintTextTable[RHT_JUNK_SEI_29] = HintText(CustomMessage("They say if every instinct you have is wrong...^... then the opposite would have to be right.", - /*german*/ "", - /*french*/ HINT_TEXT_NEEDS_TRANSLATION_FR)); - - hintTextTable[RHT_JUNK_OTR_MEANS_1] = HintText(CustomMessage("They say OTR stands for&Over the Rainbow", - /*german*/ "", - /*french*/ HINT_TEXT_NEEDS_TRANSLATION_FR)); - - hintTextTable[RHT_JUNK_OTR_MEANS_2] = HintText(CustomMessage("They say that OTR stands for&Onions, Tomatoes, and Radishes", - /*german*/ "", - /*french*/ HINT_TEXT_NEEDS_TRANSLATION_FR)); - - hintTextTable[RHT_JUNK_OTR_MEANS_3] = HintText(CustomMessage("They say that OTR stands for&Ocarina of Time Resources", - /*german*/ "", - /*french*/ HINT_TEXT_NEEDS_TRANSLATION_FR)); - - hintTextTable[RHT_JUNK_OTR_MEANS_4] = HintText(CustomMessage("They say that OTR stands for&Over the Road", - /*german*/ "", - /*french*/ HINT_TEXT_NEEDS_TRANSLATION_FR)); - - hintTextTable[RHT_JUNK_OTR_MEANS_5] = HintText(CustomMessage("They say that OTR stands for&Off the Record", - /*german*/ "", - /*french*/ HINT_TEXT_NEEDS_TRANSLATION_FR)); - - hintTextTable[RHT_JUNK_OTR_MEANS_6] = HintText(CustomMessage("They say that OTR stands for&Office of Tax and Revenue", - /*german*/ "", - /*french*/ HINT_TEXT_NEEDS_TRANSLATION_FR)); - - hintTextTable[RHT_JUNK_OTR_MEANS_7] = HintText(CustomMessage("They say OTR stands for&Over the Rainbow", - /*german*/ "", - /*french*/ HINT_TEXT_NEEDS_TRANSLATION_FR)); - - hintTextTable[RHT_JUNK_OTR_MEANS_8] = HintText(CustomMessage("They say that OTR stands for&Office of Trade Relations", - /*german*/ "", - /*french*/ HINT_TEXT_NEEDS_TRANSLATION_FR)); - - hintTextTable[RHT_JUNK_OTR_MEANS_9] = HintText(CustomMessage("They say that OTR stands for&Original Theatrical Release", - /*german*/ "", - /*french*/ HINT_TEXT_NEEDS_TRANSLATION_FR)); - - hintTextTable[RHT_JUNK_OTR_MEANS_10] = HintText(CustomMessage("They say that OTR stands for&Operational Test Requirement", - /*german*/ "", - /*french*/ HINT_TEXT_NEEDS_TRANSLATION_FR)); - - hintTextTable[RHT_JUNK_OTR_MEANS_11] = HintText(CustomMessage("They say that OTR stands for&Operational Trouble Report", - /*german*/ "", - /*french*/ HINT_TEXT_NEEDS_TRANSLATION_FR)); - - hintTextTable[RHT_JUNK_OTR_MEANS_12] = HintText(CustomMessage("They say that OTR stands for&Oxygen Transmission Rate", - /*german*/ "", - /*french*/ HINT_TEXT_NEEDS_TRANSLATION_FR)); - - hintTextTable[RHT_JUNK_OTR_MEANS_13] = HintText(CustomMessage("They say that OTR stands for&One Touch Recording", - /*german*/ "", - /*french*/ HINT_TEXT_NEEDS_TRANSLATION_FR)); - - hintTextTable[RHT_JUNK_OTR_MEANS_14] = HintText(CustomMessage("They say that OTR stands for&Olympic Torch Relay", - /*german*/ "", - /*french*/ HINT_TEXT_NEEDS_TRANSLATION_FR)); - - hintTextTable[RHT_JUNK_OTR_MEANS_15] = HintText(CustomMessage("They say that OTR stands for&Off the Rack", - /*german*/ "", - /*french*/ HINT_TEXT_NEEDS_TRANSLATION_FR)); - - hintTextTable[RHT_JUNK_OTR_MEANS_16] = HintText(CustomMessage("They say that OTR stands for&Overhead Transfer Rate", - /*german*/ "", - /*french*/ HINT_TEXT_NEEDS_TRANSLATION_FR)); - - hintTextTable[RHT_JUNK_OTR_MEANS_17] = HintText(CustomMessage("They say that OTR stands for&Operational TurnaRound", - /*german*/ "", - /*french*/ HINT_TEXT_NEEDS_TRANSLATION_FR)); - - hintTextTable[RHT_JUNK_OTR_MEANS_18] = HintText(CustomMessage("They say that OTR stands for&Opportunity to Recall", - /*german*/ "", - /*french*/ HINT_TEXT_NEEDS_TRANSLATION_FR)); - - hintTextTable[RHT_JUNK_OTR_MEANS_19] = HintText(CustomMessage("They say that OTR stands for&Operability Test Report", - /*german*/ "", - /*french*/ HINT_TEXT_NEEDS_TRANSLATION_FR)); - - hintTextTable[RHT_JUNK_OTR_MEANS_20] = HintText(CustomMessage("They say that OTR stands for&Overall Tuning Range", - /*german*/ "", - /*french*/ HINT_TEXT_NEEDS_TRANSLATION_FR)); - - hintTextTable[RHT_JUNK_OTR_MEANS_21] = HintText(CustomMessage("They say that OTR stands for&One Time Requisition", - /*german*/ "", - /*french*/ HINT_TEXT_NEEDS_TRANSLATION_FR)); - - hintTextTable[RHT_JUNK_OTR_MEANS_22] = HintText(CustomMessage("They say that OTR stands for&Oblivious to Reality", - /*german*/ "", - /*french*/ HINT_TEXT_NEEDS_TRANSLATION_FR)); - - hintTextTable[RHT_JUNK_OTR_MEANS_23] = HintText(CustomMessage("They say that OTR stands for&On the Run", - /*german*/ "", - /*french*/ HINT_TEXT_NEEDS_TRANSLATION_FR)); - - hintTextTable[RHT_JUNK_OTR_MEANS_24] = HintText(CustomMessage("They say that OTR stands for&On Time Reporting", - /*german*/ "", - /*french*/ HINT_TEXT_NEEDS_TRANSLATION_FR)); - - hintTextTable[RHT_JUNK_OTR_MEANS_25] = HintText(CustomMessage("They say that OTR stands for&Order to Receipt", - /*german*/ "", - /*french*/ HINT_TEXT_NEEDS_TRANSLATION_FR)); - - hintTextTable[RHT_JUNK_OTR_MEANS_26] = HintText(CustomMessage("They say that OTR stands for&Other Terrestrial Radio", - /*german*/ "", - /*french*/ HINT_TEXT_NEEDS_TRANSLATION_FR)); - - hintTextTable[RHT_JUNK_OTR_MEANS_27] = HintText(CustomMessage("They say that OTR stands for&On Target Reports", - /*german*/ "", - /*french*/ HINT_TEXT_NEEDS_TRANSLATION_FR)); - - hintTextTable[RHT_JUNK_OTR_MEANS_28] = HintText(CustomMessage("They say that OTR stands for&One Time Repair", - /*german*/ "", - /*french*/ HINT_TEXT_NEEDS_TRANSLATION_FR)); - - hintTextTable[RHT_JUNK_OTR_MEANS_29] = HintText(CustomMessage("They say that OTR stands for&Own the Room", - /*german*/ "", - /*french*/ HINT_TEXT_NEEDS_TRANSLATION_FR)); - - hintTextTable[RHT_JUNK_OTR_MEANS_30] = HintText(CustomMessage("They say that OTR stands for&Online Text Repository", - /*german*/ "", - /*french*/ HINT_TEXT_NEEDS_TRANSLATION_FR)); - - hintTextTable[RHT_JUNK_MISC_1] = HintText(CustomMessage("They say #Kenix# isn't a developer...^...Just a PR guy", - /*german*/ "", - /*french*/ HINT_TEXT_NEEDS_TRANSLATION_FR, - {QM_GREEN})); - - hintTextTable[RHT_JUNK_MISC_2] = HintText(CustomMessage("They say... No", - /*german*/ "", - /*french*/ HINT_TEXT_NEEDS_TRANSLATION_FR)); - - hintTextTable[RHT_JUNK_MISC_3] = HintText(CustomMessage("They say BIG RIGS: OTR", - /*german*/ "", - /*french*/ HINT_TEXT_NEEDS_TRANSLATION_FR)); - - hintTextTable[RHT_JUNK_MISC_4] = HintText(CustomMessage("They say you wanted to see me #Mr. Kenix#?", - /*german*/ "", - /*french*/ HINT_TEXT_NEEDS_TRANSLATION_FR, - {QM_PINK})); - - hintTextTable[RHT_JUNK_MISC_5] = HintText(CustomMessage("They say Louis once saw an&equals not get set equals", - /*german*/ "", - /*french*/ HINT_TEXT_NEEDS_TRANSLATION_FR)); - - hintTextTable[RHT_JUNK_MISC_6] = HintText(CustomMessage("They say only you can find your rom.", - /*german*/ "", - /*french*/ HINT_TEXT_NEEDS_TRANSLATION_FR)); - - hintTextTable[RHT_JUNK_MISC_7] = HintText(CustomMessage("They say ZAPD is good software.", - /*german*/ "", - /*french*/ HINT_TEXT_NEEDS_TRANSLATION_FR)); - - hintTextTable[RHT_JUNK_MISC_8] = HintText(CustomMessage("They say you can encounter&a parascode in tall grass.", - /*german*/ "", - /*french*/ HINT_TEXT_NEEDS_TRANSLATION_FR)); - - hintTextTable[RHT_JUNK_MISC_9] = HintText(CustomMessage("They say the ship sails on March 32nd.", - /*german*/ "", - /*french*/ HINT_TEXT_NEEDS_TRANSLATION_FR)); - - hintTextTable[RHT_JUNK_MISC_10] = HintText(CustomMessage("They say bombing dodongos is fun.", - /*german*/ "", - /*french*/ HINT_TEXT_NEEDS_TRANSLATION_FR)); - - hintTextTable[RHT_JUNK_MISC_11] = HintText(CustomMessage("They say shopkeepers don't give credits.", - /*german*/ "", - /*french*/ HINT_TEXT_NEEDS_TRANSLATION_FR)); - - hintTextTable[RHT_JUNK_MISC_12] = HintText(CustomMessage("They say shopkeepers don't give credits.", - /*german*/ "", - /*french*/ HINT_TEXT_NEEDS_TRANSLATION_FR)); - - hintTextTable[RHT_JUNK_MISC_13] = HintText(CustomMessage("They say Malon is glitched.", - /*german*/ "", - /*french*/ HINT_TEXT_NEEDS_TRANSLATION_FR)); - - hintTextTable[RHT_JUNK_MISC_14] = HintText(CustomMessage("They say do I look like I know&what a DList is?", - /*german*/ "", - /*french*/ HINT_TEXT_NEEDS_TRANSLATION_FR)); - - hintTextTable[RHT_JUNK_MISC_15] = HintText(CustomMessage("They say do I look like I know&what an AList is?", - /*german*/ "", - /*french*/ HINT_TEXT_NEEDS_TRANSLATION_FR)); - - hintTextTable[RHT_JUNK_MISC_16] = HintText(CustomMessage("They say the king drinks enthusiastically", - /*german*/ "", - /*french*/ HINT_TEXT_NEEDS_TRANSLATION_FR)); - - hintTextTable[RHT_JUNK_MISC_17] = HintText(CustomMessage("They say Rubies are on the path to&Lamp Oil, Rope, and Bombs", - /*german*/ "", - /*french*/ HINT_TEXT_NEEDS_TRANSLATION_FR)); - - hintTextTable[RHT_JUNK_SG_1] = HintText(CustomMessage("They say %rError. Human is dead, mismatch.", - /*german*/ "", - /*french*/ HINT_TEXT_NEEDS_TRANSLATION_FR)); - - hintTextTable[RHT_JUNK_SG_2] = HintText(CustomMessage("They say this is the choice of the&steins gate.", - /*german*/ "", - /*french*/ HINT_TEXT_NEEDS_TRANSLATION_FR)); - - hintTextTable[RHT_JUNK_SG_3] = HintText(CustomMessage("They say el psy kongroo.", - /*german*/ "", - /*french*/ HINT_TEXT_NEEDS_TRANSLATION_FR)); - - hintTextTable[RHT_JUNK_SG_4] = HintText(CustomMessage("They say tutturu~.", - /*german*/ "", - /*french*/ HINT_TEXT_NEEDS_TRANSLATION_FR)); - - hintTextTable[RHT_JUNK_SG_5] = HintText(CustomMessage("They say im not Christina!.", - /*german*/ "", - /*french*/ HINT_TEXT_NEEDS_TRANSLATION_FR)); - - hintTextTable[RHT_JUNK_SG_6] = HintText(CustomMessage("They say you know where to find an IBN5100.", - /*german*/ "", - /*french*/ HINT_TEXT_NEEDS_TRANSLATION_FR)); - - hintTextTable[RHT_JUNK_SG_7] = HintText(CustomMessage("They say when you're on a chicken bender&grab a box of chicken tenders.", - /*german*/ "", - /*french*/ HINT_TEXT_NEEDS_TRANSLATION_FR)); - - hintTextTable[RHT_JUNK_SG_8] = HintText(CustomMessage("Juicy Chicken #1! Wow!.", - /*german*/ "", - /*french*/ HINT_TEXT_NEEDS_TRANSLATION_FR)); - - hintTextTable[RHT_JUNK_CREW_1] = HintText(CustomMessage("They say that %gGanondorf's Mom%w is going out with %ySqueak%w!", - /*german*/ "", - /*french*/ HINT_TEXT_NEEDS_TRANSLATION_FR)); - - hintTextTable[RHT_JUNK_CREW_2] = HintText(CustomMessage("They say that %gProxySaw%w is still fixing %yCaladius's Bugs%w...", - /*german*/ "", - /*french*/ HINT_TEXT_NEEDS_TRANSLATION_FR)); - - hintTextTable[RHT_JUNK_CREW_3] = HintText(CustomMessage("They say that %gItsHeckinPat%w is still just %yEyeballing it%w.", - /*german*/ "", - /*french*/ HINT_TEXT_NEEDS_TRANSLATION_FR)); - - hintTextTable[RHT_JUNK_CREW_4] = HintText(CustomMessage("They say that %gCaladius%w is working on %yV2%w of something.", - /*german*/ "", - /*french*/ HINT_TEXT_NEEDS_TRANSLATION_FR)); - - hintTextTable[RHT_JUNK_CREW_5] = HintText(CustomMessage("They say that %gdice%w is a funny name for a %ytaco%w.", - /*german*/ "", - /*french*/ HINT_TEXT_NEEDS_TRANSLATION_FR)); - - hintTextTable[RHT_JUNK_CREW_6] = HintText(CustomMessage("They say %g2Ship Rando%w is still blocked by %yV3%w...", - /*german*/ "", - /*french*/ HINT_TEXT_NEEDS_TRANSLATION_FR)); - - hintTextTable[RHT_JUNK_CREW_7] = HintText(CustomMessage("They say if you click your heels and say %gframebuffer%w 3 times, %yArchez%w appears!", - /*german*/ "", - /*french*/ HINT_TEXT_NEEDS_TRANSLATION_FR)); - - hintTextTable[RHT_JUNK_CREW_8] = HintText(CustomMessage("They say %gVB%w stands for %yVirtual Bananas%w... Probably.", - /*german*/ "", - /*french*/ HINT_TEXT_NEEDS_TRANSLATION_FR)); - - hintTextTable[RHT_JUNK_CREW_9] = HintText(CustomMessage("They say %gZeru%w is still routing his %yHundo%w.", - /*german*/ "", - /*french*/ HINT_TEXT_NEEDS_TRANSLATION_FR)); - - hintTextTable[RHT_JUNK_CREW_10] = HintText(CustomMessage("They say %gRaccoonCloud%w is still looking for his %yHover Boots%w.", - /*german*/ "", - /*french*/ HINT_TEXT_NEEDS_TRANSLATION_FR)); - - hintTextTable[RHT_JUNK_CREW_11] = HintText(CustomMessage("They say %gItsHeckinPat%w foreclosed on his %yHut%w.", - /*german*/ "", - /*french*/ HINT_TEXT_NEEDS_TRANSLATION_FR)); - - hintTextTable[RHT_JUNK_CREW_12] = HintText(CustomMessage("They say %gRaccoonCloud%w is part of the %yInner Circle%w.", - /*german*/ "", - /*french*/ HINT_TEXT_NEEDS_TRANSLATION_FR)); - - hintTextTable[RHT_JUNK_CREW_13] = HintText(CustomMessage("They say %gMoonlitxShadows%w is the %rleader%w of the %yDork Army%w.", - /*german*/ "", - /*french*/ HINT_TEXT_NEEDS_TRANSLATION_FR)); - - hintTextTable[RHT_JUNK_CREW_14] = HintText(CustomMessage("They say %gGanondorf%w hates the %yInternet%w.", - /*german*/ "", - /*french*/ HINT_TEXT_NEEDS_TRANSLATION_FR)); - - hintTextTable[RHT_JUNK_CREW_15] = HintText(CustomMessage("They say %gMido's House%w hoards %yTrash%w.", - /*german*/ "", - /*french*/ HINT_TEXT_NEEDS_TRANSLATION_FR)); - - hintTextTable[RHT_JUNK_CREW_16] = HintText(CustomMessage("They say %gSweettalking Ganondorf%w rewards %yHis Heart%w.", - /*german*/ "", - /*french*/ HINT_TEXT_NEEDS_TRANSLATION_FR)); - - hintTextTable[RHT_JUNK_CREW_17] = HintText(CustomMessage("They say %gaMannus%w said %yGo To Bed%w!", - /*german*/ "", - /*french*/ HINT_TEXT_NEEDS_TRANSLATION_FR)); - - hintTextTable[RHT_JUNK_CREW_18] = HintText(CustomMessage("They say %gCaladius%w is a %yPinhead%w!", - /*german*/ "", - /*french*/ HINT_TEXT_NEEDS_TRANSLATION_FR)); - - hintTextTable[RHT_JUNK_CREW_19] = HintText(CustomMessage("They say %gRaccoonCloud%w loves the %yIce Cavern%w.", - /*german*/ "", - /*french*/ HINT_TEXT_NEEDS_TRANSLATION_FR)); - - hintTextTable[RHT_JUNK_CREW_20] = HintText(CustomMessage("They say %gNo One%w should forget %yHover Scrub%w!", - /*german*/ "", - /*french*/ HINT_TEXT_NEEDS_TRANSLATION_FR)); - - hintTextTable[RHT_JUNK_CREW_21] = HintText(CustomMessage("They say %gMoonlitxShadows%w likes to %ySlide%w.", - /*german*/ "", - /*french*/ HINT_TEXT_NEEDS_TRANSLATION_FR)); - - hintTextTable[RHT_JUNK_CREW_23] = HintText(CustomMessage("They say that %gBackwalking%w should be %rBanned%w!", - /*german*/ "", - /*french*/ HINT_TEXT_NEEDS_TRANSLATION_FR)); - - hintTextTable[RHT_JUNK_CREW_24] = HintText(CustomMessage("They say that %gGorons%w should always have %yLong Necks%w!", - /*german*/ "", - /*french*/ HINT_TEXT_NEEDS_TRANSLATION_FR)); - - hintTextTable[RHT_JUNK_CREW_25] = HintText(CustomMessage("They say that %gCaladius%w has a %ytendency to lose his shirt%w!", - /*german*/ "", - /*french*/ HINT_TEXT_NEEDS_TRANSLATION_FR)); - - hintTextTable[RHT_JUNK_CREW_26] = HintText(CustomMessage("They say that if your %rSkip keeps Failing%w, you're probably an %yESS Off%w.", - /*german*/ "", - /*french*/ HINT_TEXT_NEEDS_TRANSLATION_FR)); - - hintTextTable[RHT_JUNK_CREW_27] = HintText(CustomMessage("They say that %gLogic%w is just a %ySuggestion%w.", - /*german*/ "", - /*french*/ HINT_TEXT_NEEDS_TRANSLATION_FR)); - - hintTextTable[RHT_JUNK_CREW_28] = HintText(CustomMessage("They say there's %gAlways Logic%w in %yNo Logic%w...", - /*german*/ "", - /*french*/ HINT_TEXT_NEEDS_TRANSLATION_FR)); - - hintTextTable[RHT_JUNK_CREW_29] = HintText(CustomMessage("They said that %rFredomato%w has just %yone more push up%w to do!", - /*german*/ "", - /*french*/ HINT_TEXT_NEEDS_TRANSLATION_FR)); + hintTextTable[RHT_JUNK71] = HintText(CustomMessage("They say @'s body is ready.", + /*german*/ "", + /*french*/ HINT_TEXT_NEEDS_TRANSLATION_FR)); /*-------------------------- | DUNGEON HINT TEXT | diff --git a/soh/soh/Enhancements/randomizer/3drando/hint_list/hint_list_exclude_dungeon.cpp b/soh/soh/Enhancements/randomizer/3drando/hint_list/hint_list_exclude_dungeon.cpp index 2e0350e7c..ed447fe30 100644 --- a/soh/soh/Enhancements/randomizer/3drando/hint_list/hint_list_exclude_dungeon.cpp +++ b/soh/soh/Enhancements/randomizer/3drando/hint_list/hint_list_exclude_dungeon.cpp @@ -882,11 +882,11 @@ hintTextTable[RHT_FIRE_TEMPLE_NEAR_BOSS_CHEST] = HintText(CustomMessage("They sa /*german*/ "", /*french*/ "Selon moi, un #coeur dans le Temple du Feu# cache #[[1]]#.", {QM_RED, QM_GREEN})); - hintTextTable[RAND_INF_FIRE_TEMPLE_MQ_LOOP_STALFOS_SUN_FAIRY] = HintText(CustomMessage("They say that #calling the sun in a hot arena# reveals #[[1]]#.", + hintTextTable[RHT_FIRE_TEMPLE_MQ_LOOP_STALFOS_SUN_FAIRY] = HintText(CustomMessage("They say that #calling the sun in a hot arena# reveals #[[1]]#.", /*german*/ "!!!", /*french*/ "Selon moi, #appeler le soleil dans une arène chaude# révèle #[[1]]#.", {QM_RED, QM_GREEN})); - hintTextTable[RAND_INF_FIRE_TEMPLE_MQ_LOOP_KNUCKLE_SUN_FAIRY] = HintText(CustomMessage("They say that #calling the sun behind a knight's throne in a volcano# reveals #[[1]]#.", + hintTextTable[RHT_FIRE_TEMPLE_MQ_LOOP_KNUCKLE_SUN_FAIRY] = HintText(CustomMessage("They say that #calling the sun behind a knight's throne in a volcano# reveals #[[1]]#.", /*german*/ "!!!", /*french*/ "Selon moi, #appeler le soleil derrière le trône d’un chevalier dans un volcan# révèle #[[1]]#.", {QM_RED, QM_GREEN})); diff --git a/soh/soh/Enhancements/randomizer/3drando/hint_list/hint_list_exclude_overworld.cpp b/soh/soh/Enhancements/randomizer/3drando/hint_list/hint_list_exclude_overworld.cpp index 7837f2cb6..a6c6b99f3 100644 --- a/soh/soh/Enhancements/randomizer/3drando/hint_list/hint_list_exclude_overworld.cpp +++ b/soh/soh/Enhancements/randomizer/3drando/hint_list/hint_list_exclude_overworld.cpp @@ -1935,6 +1935,24 @@ void StaticData::HintTable_Init_Exclude_Overworld() { hintTextTable[RHT_DMC_UPPER_GROTTO_GOSSIP_STONE_FAIRY_BIG] = HintText(CustomMessage("They say that #playing a stormy tune for an odd stone within the side of a crater# reveals #[[1]]#.", /*german*/ "!!!", /*french*/ "Selon moi, jouer une mélodie orageuse pour une pierre étrange dans le côté d'un cratère révèle [[1]].", {QM_RED, QM_GREEN})); + + hintTextTable[RHT_LH_ISLAND_SUN_FAIRY] = HintText(CustomMessage("They say that #summoning the sun on the lake's island# calls #[[1]]#.", {QM_RED, QM_GREEN})); + + hintTextTable[RHT_HF_POND_STORMS_FAIRY] = HintText(CustomMessage("They say that #calling rain to the field's pond# summons #[[1]]#.", {QM_RED, QM_GREEN})); + + hintTextTable[RHT_HF_FENCE_GROTTO_STORMS_FAIRY] = HintText(CustomMessage("They say that #making it rain in a scrub's cave# wakes #[[1]]#.", {QM_RED, QM_GREEN})); + + hintTextTable[RHT_DMT_FLAG_SUN_FAIRY] = HintText(CustomMessage("They say that #changing the time in front of the trail's flag# reveals #[[1]]#.", {QM_RED, QM_GREEN})); + + hintTextTable[RHT_DMT_COW_GROTTO_STORMS_FAIRY] = HintText(CustomMessage("They say that #calling a storm for a lonely cow# reveals #[[1]]#.", {QM_RED, QM_GREEN})); + + hintTextTable[RHT_LW_SHORTCUT_STORMS_FAIRY] = HintText(CustomMessage("They say that #making it rain in the Lost Woods# reveals #[[1]]#.", {QM_RED, QM_GREEN})); + + hintTextTable[RHT_GF_KITCHEN_SUN_FAIRY] = HintText(CustomMessage("They say that #calling the sun in a guarded kitchen# exposes #[[1]]#.", {QM_RED, QM_GREEN})); + + hintTextTable[RHT_LW_DEKU_SCRUB_GROTTO_SUN_FAIRY] = HintText(CustomMessage("They say that #calling the sun for scrubs in the Lost Woods# reveals #[[1]]#.", { QM_RED, QM_GREEN })); + + hintTextTable[RHT_GRAVEYARD_ROYAL_FAMILYS_TOMB_SUN_FAIRY] = HintText(CustomMessage("They say that #calling the sun in a royal tomb# reveals #[[1]]#.", { QM_RED, QM_GREEN })); } } diff --git a/soh/soh/Enhancements/randomizer/3drando/hint_list/hint_list_item.cpp b/soh/soh/Enhancements/randomizer/3drando/hint_list/hint_list_item.cpp index 0bf60eb81..867da2b2c 100644 --- a/soh/soh/Enhancements/randomizer/3drando/hint_list/hint_list_item.cpp +++ b/soh/soh/Enhancements/randomizer/3drando/hint_list/hint_list_item.cpp @@ -1361,7 +1361,18 @@ void StaticData::HintTable_Init_Item() { // /*spanish*/un destructor de cerraduras final CustomMessage("a final lockpick", /*german*/"ein finaler Dietrich", /*french*/"un crochet à porte final")}); // /*spanish*/una apertura portentosa final - + hintTextTable[RHT_OVERWORLD_KEY] = HintText(CustomMessage("an Overworld Key", /*german*/"ein Überwelt-Schlüssel", /*french*/"une clé de l'Overworld"), + // /*spanish*/una llave del mundo exterior + { + CustomMessage("a small key", /*german*/"ein kleiner Schlüssel", /*french*/"une petite clé") + // /*spanish*/una llave + }, { + CustomMessage("a key to the world", /*german*/"ein Schlüssel zur Welt", /*french*/"une clé du monde"), + // /*spanish*/una llave al mundo + CustomMessage("a key to the kingdom", /*german*/"ein Schlüssel zum Königreich", /*french*/"une clé du royaume"), + // /*spanish*/una llave al reino + CustomMessage("a key to the universe", /*german*/"ein Schlüssel zum Universum", /*french*/"une clé de l'univers")}); + // /*spanish*/una llave al universo hintTextTable[RHT_FOREST_TEMPLE_KEY_RING] = HintText(CustomMessage("a Forest Temple Key Ring", /*german*/"ein Schlüsselbund des Waldtempels", /*french*/"un trousseau de clés du Temple de la Forêt"), // /*spanish*/un llavero del Templo del Bosque { @@ -1512,6 +1523,16 @@ void StaticData::HintTable_Init_Item() { CustomMessage("a gambler's lockpick", /*german*/"ein Spieler-Dietrich", /*french*/"un crochet à serrure de parieur")}); // /*spanish*/una apertura portentosa del juego de azar + hintTextTable[RHT_TREASURE_GAME_KEY_RING] = HintText(CustomMessage("a Chest Game Key Ring"), + { + CustomMessage("a key ring", /*german*/"ein Schlüsselbund", /*french*/"un trousseau de clés") + // /*spanish*/un llavero + }, { + CustomMessage("a gambler's toolbox for unlocking"), + CustomMessage("a gambler's season pass"), + CustomMessage("a gambler's jingling ring"), + CustomMessage("a gambler's skeleton key")}); + hintTextTable[RHT_KOKIRI_EMERALD] = HintText(CustomMessage("the Kokiri Emerald", /*german*/"der Kokiri-Smaragd", /*french*/"l'Émeraude Kokiri"), // /*spanish*/la Esmeralda de los Kokiri { @@ -2057,6 +2078,16 @@ void StaticData::HintTable_Init_Item() { }, { CustomMessage("a fish-puller", /*german*/"ein Fischzieher", /*french*/"(canne à pêche)")}); // /*spanish*/(caña de pescar) + + hintTextTable[RHT_BOMBCHU_BAG] = HintText(CustomMessage("Bombchu Bag", /*german*/"!!!", /*french*/"!!!"), + { + CustomMessage("explosives", /*german*/"ein Explosivpaket", /*french*/"un paquet d'explosifs"), + // /*spanish*/un montón de explosivos + CustomMessage("something that can remove boulders", /*german*/"etwas, das Geröll entfernen kann", /*french*/"une chose qui enlève les rochers") + // /*spanish*/algo que pueda quitar rocas + }, { + CustomMessage("sack of mice", /*german*/"!!!", /*french*/"!!!")}); + hintTextTable[RHT_SKELETON_KEY] = HintText(CustomMessage("a Skeleton Key", /*german*/ "ein Universalschlüssel", /*french*/ "une Clé Squelette"), // /*spanish*/una Llave Maestra { diff --git a/soh/soh/Enhancements/randomizer/3drando/hints.cpp b/soh/soh/Enhancements/randomizer/3drando/hints.cpp index 941f0924b..634c2ca56 100644 --- a/soh/soh/Enhancements/randomizer/3drando/hints.cpp +++ b/soh/soh/Enhancements/randomizer/3drando/hints.cpp @@ -112,10 +112,10 @@ StaticHintInfo::StaticHintInfo(HintType _type, std::vectorGetOption(RSK_RAINBOW_BRIDGE).Is(RO_BRIDGE_STONES)) { - stones = ctx->GetOption(RSK_RAINBOW_BRIDGE_STONE_COUNT).GetContextOptionIndex(); + stones = ctx->GetOption(RSK_RAINBOW_BRIDGE_STONE_COUNT).Get(); } else if (ctx->GetOption(RSK_RAINBOW_BRIDGE).Is(RO_BRIDGE_DUNGEON_REWARDS)) { - stones = ctx->GetOption(RSK_RAINBOW_BRIDGE_REWARD_COUNT).GetContextOptionIndex() - 6; + stones = ctx->GetOption(RSK_RAINBOW_BRIDGE_REWARD_COUNT).Get() - 6; } else if ((ctx->GetOption(RSK_RAINBOW_BRIDGE).Is(RO_BRIDGE_DUNGEONS)) && (ctx->GetOption(RSK_SHUFFLE_DUNGEON_REWARDS).Is(RO_DUNGEON_REWARDS_END_OF_DUNGEON))) { - stones = ctx->GetOption(RSK_RAINBOW_BRIDGE_DUNGEON_COUNT).GetContextOptionIndex() - 6; + stones = ctx->GetOption(RSK_RAINBOW_BRIDGE_DUNGEON_COUNT).Get() - 6; } if (ctx->GetOption(RSK_GANONS_BOSS_KEY).Is(RO_GANON_BOSS_KEY_LACS_STONES)) { - stones = std::max({ stones, ctx->GetOption(RSK_LACS_STONE_COUNT).GetContextOptionIndex() }); + stones = std::max({ stones, ctx->GetOption(RSK_LACS_STONE_COUNT).Get() }); } else if (ctx->GetOption(RSK_GANONS_BOSS_KEY).Is(RO_GANON_BOSS_KEY_LACS_STONES)) { - stones = std::max({ stones, (uint8_t)(ctx->GetOption(RSK_LACS_REWARD_COUNT).GetContextOptionIndex() - 6 )}); + stones = std::max({ stones, (uint8_t)(ctx->GetOption(RSK_LACS_REWARD_COUNT).Get() - 6 )}); } else if (ctx->GetOption(RSK_GANONS_BOSS_KEY).Is(RO_GANON_BOSS_KEY_LACS_DUNGEONS)) { - stones = std::max({ stones, (uint8_t)(ctx->GetOption(RSK_LACS_DUNGEON_COUNT).GetContextOptionIndex() - 6 )}); + stones = std::max({ stones, (uint8_t)(ctx->GetOption(RSK_LACS_DUNGEON_COUNT).Get() - 6 )}); } return stones; } @@ -242,18 +242,18 @@ uint8_t MedallionsRequiredBySettings() { auto ctx = Rando::Context::GetInstance(); uint8_t medallions = 0; if (ctx->GetOption(RSK_RAINBOW_BRIDGE).Is(RO_BRIDGE_MEDALLIONS)) { - medallions = ctx->GetOption(RSK_RAINBOW_BRIDGE_MEDALLION_COUNT).GetContextOptionIndex(); + medallions = ctx->GetOption(RSK_RAINBOW_BRIDGE_MEDALLION_COUNT).Get(); } else if (ctx->GetOption(RSK_RAINBOW_BRIDGE).Is(RO_BRIDGE_DUNGEON_REWARDS)) { - medallions = ctx->GetOption(RSK_RAINBOW_BRIDGE_REWARD_COUNT).GetContextOptionIndex() - 3; + medallions = ctx->GetOption(RSK_RAINBOW_BRIDGE_REWARD_COUNT).Get() - 3; } else if (ctx->GetOption(RSK_RAINBOW_BRIDGE).Is(RO_BRIDGE_DUNGEONS) && ctx->GetOption(RSK_SHUFFLE_DUNGEON_REWARDS).Is(RO_DUNGEON_REWARDS_END_OF_DUNGEON)) { - medallions = ctx->GetOption(RSK_RAINBOW_BRIDGE_DUNGEON_COUNT).GetContextOptionIndex() - 3; + medallions = ctx->GetOption(RSK_RAINBOW_BRIDGE_DUNGEON_COUNT).Get() - 3; } if (ctx->GetOption(RSK_GANONS_BOSS_KEY).Is(RO_GANON_BOSS_KEY_LACS_MEDALLIONS)) { - medallions = std::max({ medallions, ctx->GetOption(RSK_LACS_MEDALLION_COUNT).GetContextOptionIndex() }); + medallions = std::max({ medallions, ctx->GetOption(RSK_LACS_MEDALLION_COUNT).Get() }); } else if (ctx->GetOption(RSK_GANONS_BOSS_KEY).Is(RO_GANON_BOSS_KEY_LACS_REWARDS)) { - medallions = std::max({ medallions, (uint8_t)(ctx->GetOption(RSK_LACS_REWARD_COUNT).GetContextOptionIndex() - 3 )}); + medallions = std::max({ medallions, (uint8_t)(ctx->GetOption(RSK_LACS_REWARD_COUNT).Get() - 3 )}); } else if (ctx->GetOption(RSK_GANONS_BOSS_KEY).Is(RO_GANON_BOSS_KEY_LACS_DUNGEONS) && ctx->GetOption(RSK_SHUFFLE_DUNGEON_REWARDS).Is(RO_DUNGEON_REWARDS_END_OF_DUNGEON)) { - medallions = std::max({ medallions, (uint8_t)(ctx->GetOption(RSK_LACS_DUNGEON_COUNT).GetContextOptionIndex() - 3 )}); + medallions = std::max({ medallions, (uint8_t)(ctx->GetOption(RSK_LACS_DUNGEON_COUNT).Get() - 3 )}); } return medallions; } @@ -262,10 +262,10 @@ uint8_t TokensRequiredBySettings() { auto ctx = Rando::Context::GetInstance(); uint8_t tokens = 0; if (ctx->GetOption(RSK_RAINBOW_BRIDGE).Is(RO_BRIDGE_TOKENS)) { - tokens = ctx->GetOption(RSK_RAINBOW_BRIDGE_TOKEN_COUNT).GetContextOptionIndex(); + tokens = ctx->GetOption(RSK_RAINBOW_BRIDGE_TOKEN_COUNT).Get(); } if (ctx->GetOption(RSK_GANONS_BOSS_KEY).Is(RO_GANON_BOSS_KEY_LACS_TOKENS)) { - tokens = std::max({ tokens, ctx->GetOption(RSK_LACS_TOKEN_COUNT).GetContextOptionIndex() }); + tokens = std::max({ tokens, ctx->GetOption(RSK_LACS_TOKEN_COUNT).Get() }); } return tokens; } @@ -273,7 +273,7 @@ uint8_t TokensRequiredBySettings() { std::vector>> conditionalAlwaysHints = { std::make_pair(RC_MARKET_10_BIG_POES, []() { auto ctx = Rando::Context::GetInstance(); - return ctx->GetOption(RSK_BIG_POE_COUNT).GetContextOptionIndex() >= 3 && !ctx->GetOption(RSK_BIG_POES_HINT); + return ctx->GetOption(RSK_BIG_POE_COUNT).Get() >= 3 && !ctx->GetOption(RSK_BIG_POES_HINT); }), // Remember, the option's value being 3 means 4 are required std::make_pair(RC_DEKU_THEATER_MASK_OF_TRUTH, []() { auto ctx = Rando::Context::GetInstance(); @@ -483,7 +483,7 @@ static void CreateTrialHints(uint8_t copies) { AddGossipStoneHintCopies(copies, HINT_TYPE_HINT_KEY, "Trial", {RHT_ZERO_TRIALS}); } else { std::vector trials = ctx->GetTrials()->GetTrialList(); //there's probably a way to remove this assignment - if (ctx->GetOption(RSK_TRIAL_COUNT).GetContextOptionIndex() >= 4) {//4 or 5 required trials, get skipped trials + if (ctx->GetOption(RSK_TRIAL_COUNT).Get() >= 4) {//4 or 5 required trials, get skipped trials trials = FilterFromPool(trials, [](TrialInfo* trial){return trial->IsSkipped();}); } else {//1 to 3 trials, get requried trials auto requiredTrials = FilterFromPool(trials, [](TrialInfo* trial){return trial->IsRequired();}); @@ -611,7 +611,7 @@ uint8_t PlaceHints(std::vector& selectedHints, std::vectorGetOption(RSK_HINT_DISTRIBUTION).GetContextOptionIndex()]; + const HintSetting& hintSetting = hintSettingTable[ctx->GetOption(RSK_HINT_DISTRIBUTION).Get()]; std::vector distTable = hintSetting.distTable; // Apply impa's song exclusions when zelda is skipped @@ -738,7 +738,7 @@ void CreateAdultAltarHint() { void CreateStaticHintFromData(RandomizerHint hint, StaticHintInfo staticData){ auto ctx = Rando::Context::GetInstance(); if (!ctx->GetHint(hint)->IsEnabled()){ - Option option = ctx->GetOption(staticData.setting); + OptionValue& option = ctx->GetOption(staticData.setting); if ((std::holds_alternative(staticData.condition) && option.Is(std::get(staticData.condition))) || (std::holds_alternative(staticData.condition) && option.Is(std::get(staticData.condition)))){ diff --git a/soh/soh/Enhancements/randomizer/3drando/item_pool.cpp b/soh/soh/Enhancements/randomizer/3drando/item_pool.cpp index 6f908de22..ff41c204b 100644 --- a/soh/soh/Enhancements/randomizer/3drando/item_pool.cpp +++ b/soh/soh/Enhancements/randomizer/3drando/item_pool.cpp @@ -761,7 +761,7 @@ static void SetMinimalItemPool() { ReplaceMaxItem(RG_PROGRESSIVE_BOMB_BAG, 1); ReplaceMaxItem(RG_PIECE_OF_HEART, 0); // Need an extra heart container when starting with 1 heart to be able to reach 3 hearts - ReplaceMaxItem(RG_HEART_CONTAINER, (ctx->GetOption(RSK_STARTING_HEARTS).GetContextOptionIndex() == 18)? 1 : 0); + ReplaceMaxItem(RG_HEART_CONTAINER, (ctx->GetOption(RSK_STARTING_HEARTS).Get() == 18)? 1 : 0); } void GenerateItemPool() { @@ -827,7 +827,7 @@ void GenerateItemPool() { if (ctx->GetOption(RSK_TRIFORCE_HUNT)) { ctx->possibleIceTrapModels.push_back(RG_TRIFORCE_PIECE); - AddItemToMainPool(RG_TRIFORCE_PIECE, (ctx->GetOption(RSK_TRIFORCE_HUNT_PIECES_TOTAL).GetContextOptionIndex() + 1)); + AddItemToMainPool(RG_TRIFORCE_PIECE, (ctx->GetOption(RSK_TRIFORCE_HUNT_PIECES_TOTAL).Get() + 1)); ctx->PlaceItemInLocation(RC_TRIFORCE_COMPLETED, RG_TRIFORCE); // Win condition ctx->PlaceItemInLocation(RC_GANON, GetJunkItem(), false, true); } else { @@ -935,7 +935,7 @@ void GenerateItemPool() { if (fsMode.IsNot(RO_FISHSANITY_OFF)) { if (fsMode.Is(RO_FISHSANITY_POND) || fsMode.Is(RO_FISHSANITY_BOTH)) { // 17 max child pond fish - uint8_t pondCt = ctx->GetOption(RSK_FISHSANITY_POND_COUNT).GetContextOptionIndex(); + uint8_t pondCt = ctx->GetOption(RSK_FISHSANITY_POND_COUNT).Get(); for (uint8_t i = 0; i < pondCt; i++) { AddItemToMainPool(GetJunkItem()); } @@ -998,7 +998,7 @@ void GenerateItemPool() { if (/*!ProgressiveGoronSword TODO: Implement Progressive Goron Sword*/true) { AddItemToMainPool(RG_GIANTS_KNIFE); } - if (ctx->GetOption(RSK_BOMBCHUS_IN_LOGIC)) { + if (ctx->GetOption(RSK_BOMBCHU_BAG)) { AddItemToMainPool(RG_PROGRESSIVE_BOMBCHUS); } else { AddItemToMainPool(RG_BOMBCHU_10); @@ -1122,7 +1122,7 @@ void GenerateItemPool() { AddItemToMainPool(RG_PROGRESSIVE_NUT_UPGRADE); } - if (ctx->GetOption(RSK_BOMBCHUS_IN_LOGIC)) { + if (ctx->GetOption(RSK_BOMBCHU_BAG)) { AddItemToMainPool(RG_PROGRESSIVE_BOMBCHUS, 5); } else { AddItemToMainPool(RG_BOMBCHU_5); @@ -1276,6 +1276,33 @@ void GenerateItemPool() { } } + if (ctx->GetOption(RSK_LOCK_OVERWORLD_DOORS)) { + AddItemToPool(ItemPool, RG_GUARD_HOUSE_KEY); + AddItemToPool(ItemPool, RG_MARKET_BAZAAR_KEY); + AddItemToPool(ItemPool, RG_MARKET_POTION_SHOP_KEY); + AddItemToPool(ItemPool, RG_MASK_SHOP_KEY); + AddItemToPool(ItemPool, RG_MARKET_SHOOTING_GALLERY_KEY); + AddItemToPool(ItemPool, RG_BOMBCHU_BOWLING_KEY); + AddItemToPool(ItemPool, RG_TREASURE_CHEST_GAME_BUILDING_KEY); + AddItemToPool(ItemPool, RG_BOMBCHU_SHOP_KEY); + AddItemToPool(ItemPool, RG_RICHARDS_HOUSE_KEY); + AddItemToPool(ItemPool, RG_ALLEY_HOUSE_KEY); + AddItemToPool(ItemPool, RG_KAK_BAZAAR_KEY); + AddItemToPool(ItemPool, RG_KAK_POTION_SHOP_KEY); + AddItemToPool(ItemPool, RG_BOSS_HOUSE_KEY); + AddItemToPool(ItemPool, RG_GRANNYS_POTION_SHOP_KEY); + AddItemToPool(ItemPool, RG_SKULLTULA_HOUSE_KEY); + AddItemToPool(ItemPool, RG_IMPAS_HOUSE_KEY); + AddItemToPool(ItemPool, RG_WINDMILL_KEY); + AddItemToPool(ItemPool, RG_KAK_SHOOTING_GALLERY_KEY); + AddItemToPool(ItemPool, RG_DAMPES_HUT_KEY); + AddItemToPool(ItemPool, RG_TALONS_HOUSE_KEY); + AddItemToPool(ItemPool, RG_STABLES_KEY); + AddItemToPool(ItemPool, RG_BACK_TOWER_KEY); + AddItemToPool(ItemPool, RG_HYLIA_LAB_KEY); + AddItemToPool(ItemPool, RG_FISHING_HOLE_KEY); + } + //Shopsanity if ( ctx->GetOption(RSK_SHOPSANITY).Is(RO_SHOPSANITY_OFF) || @@ -1491,7 +1518,7 @@ void GenerateItemPool() { if (ctx->GetOption(RSK_GANONS_BOSS_KEY).Is(RO_GANON_BOSS_KEY_KAK_TOKENS)) { ctx->PlaceItemInLocation(RC_KAK_100_GOLD_SKULLTULA_REWARD, RG_GANONS_CASTLE_BOSS_KEY); - } else if (ctx->GetOption(RSK_GANONS_BOSS_KEY).GetContextOptionIndex() >= RO_GANON_BOSS_KEY_LACS_VANILLA && ctx->GetOption(RSK_GANONS_BOSS_KEY).IsNot(RO_GANON_BOSS_KEY_TRIFORCE_HUNT)) { + } else if (ctx->GetOption(RSK_GANONS_BOSS_KEY).Get() >= RO_GANON_BOSS_KEY_LACS_VANILLA && ctx->GetOption(RSK_GANONS_BOSS_KEY).IsNot(RO_GANON_BOSS_KEY_TRIFORCE_HUNT)) { ctx->PlaceItemInLocation(RC_TOT_LIGHT_ARROWS_CUTSCENE, RG_GANONS_CASTLE_BOSS_KEY); } else if (ctx->GetOption(RSK_GANONS_BOSS_KEY).Is(RO_GANON_BOSS_KEY_VANILLA)) { ctx->PlaceItemInLocation(RC_GANONS_TOWER_BOSS_KEY_CHEST, RG_GANONS_CASTLE_BOSS_KEY); diff --git a/soh/soh/Enhancements/randomizer/3drando/menu.cpp b/soh/soh/Enhancements/randomizer/3drando/menu.cpp index 07ba4fd07..6bcf21af9 100644 --- a/soh/soh/Enhancements/randomizer/3drando/menu.cpp +++ b/soh/soh/Enhancements/randomizer/3drando/menu.cpp @@ -44,12 +44,12 @@ bool GenerateRandomizer(std::set excludedLocations, std::setGetSettings()->SetSeedString(seedInput); - uint32_t seedHash = boost::hash_32{}(ctx->GetSettings()->GetSeedString()); - ctx->GetSettings()->SetSeed(seedHash & 0xFFFFFFFF); + ctx->SetSeedString(seedInput); + uint32_t seedHash = boost::hash_32{}(ctx->GetSeedString()); + ctx->SetSeed(seedHash & 0xFFFFFFFF); ctx->ClearItemLocations(); - int ret = Playthrough::Playthrough_Init(ctx->GetSettings()->GetSeed(), excludedLocations, enabledTricks); + int ret = Playthrough::Playthrough_Init(ctx->GetSeed(), excludedLocations, enabledTricks); if (ret < 0) { if (ret == -1) { // Failed to generate after 5 tries SPDLOG_ERROR("Failed to generate after 5 tries."); @@ -60,14 +60,6 @@ bool GenerateRandomizer(std::set excludedLocations, std::setGetOption(RSK_LOGIC_RULES).Is(RO_LOGIC_VANILLA)) { - for (Rando::Option* setting : ctx->GetSettings()->VanillaLogicDefaults) { - setting->RestoreDelayedOption(); - } - ctx->GetOption(RSK_KEYSANITY).RestoreDelayedOption(); - } - StopPerformanceTimer(PT_WHOLE_SEED); SPDLOG_DEBUG("Full Seed Genration Time: {}ms", GetPerformanceTimer(PT_WHOLE_SEED).count()); SPDLOG_DEBUG("LogicReset time: {}ms", GetPerformanceTimer(PT_LOGIC_RESET).count()); diff --git a/soh/soh/Enhancements/randomizer/3drando/playthrough.cpp b/soh/soh/Enhancements/randomizer/3drando/playthrough.cpp index 7787ee468..144dee80a 100644 --- a/soh/soh/Enhancements/randomizer/3drando/playthrough.cpp +++ b/soh/soh/Enhancements/randomizer/3drando/playthrough.cpp @@ -31,10 +31,12 @@ int Playthrough_Init(uint32_t seed, std::set excludedLocations, Regions::AccessReset(); StopPerformanceTimer(PT_REGION_RESET); - ctx->GetSettings()->FinalizeSettings(excludedLocations, enabledTricks); + ctx->FinalizeSettings(excludedLocations, enabledTricks); // once the settings have been finalized turn them into a string for hashing std::string settingsStr; - for (const Rando::OptionGroup& optionGroup : ctx->GetSettings()->GetOptionGroups()) { + auto& optionGroups = Rando::Settings::GetInstance()->GetOptionGroups(); + for (size_t i = 0; i < RSG_MAX; i++) { + auto& optionGroup = optionGroups[i]; // don't go through non-menus if (optionGroup.GetContainsType() == Rando::OptionGroupType::SUBGROUP) { continue; @@ -43,7 +45,15 @@ int Playthrough_Init(uint32_t seed, std::set excludedLocations, for (Rando::Option* option : optionGroup.GetOptions()) { if (option->IsCategory(Rando::OptionCategory::Setting)) { if (option->GetOptionCount() > 0) { - settingsStr += option->GetSelectedOptionText(); + if (i >= RSG_EXCLUDES_KOKIRI_FOREST && i <= RSG_EXCLUDES_GANONS_CASTLE) { + auto locationOption = static_cast(option); + settingsStr += option->GetOptionText(ctx->GetLocationOption(locationOption->GetKey()).Get()); + } else if (i == RSG_TRICKS) { + auto trickOption = static_cast(option); + settingsStr += option->GetOptionText(ctx->GetTrickOption(trickOption->GetKey()).Get()); + } else { + settingsStr += option->GetOptionText(ctx->GetOption(option->GetKey()).Get()); + } } } } @@ -53,9 +63,9 @@ int Playthrough_Init(uint32_t seed, std::set excludedLocations, settingsStr += (char*)gBuildVersion; } - uint32_t finalHash = boost::hash_32{}(std::to_string(ctx->GetSettings()->GetSeed()) + settingsStr); + uint32_t finalHash = boost::hash_32{}(std::to_string(ctx->GetSeed()) + settingsStr); Random_Init(finalHash); - ctx->GetSettings()->SetHash(std::to_string(finalHash)); + ctx->SetHash(std::to_string(finalHash)); if (ctx->GetOption(RSK_LOGIC_RULES).Is(RO_LOGIC_VANILLA)) { @@ -94,12 +104,12 @@ int Playthrough_Repeat(std::set excludedLocations, std::setGetSettings()->SetSeedString(std::to_string(rand() % 0xFFFFFFFF)); - repeatedSeed = boost::hash_32{}(ctx->GetSettings()->GetSeedString()); - ctx->GetSettings()->SetSeed(repeatedSeed % 0xFFFFFFFF); + ctx->SetSeedString(std::to_string(rand() % 0xFFFFFFFF)); + repeatedSeed = boost::hash_32{}(ctx->GetSeedString()); + ctx->SetSeed(repeatedSeed % 0xFFFFFFFF); SPDLOG_DEBUG("testing seed: %d", repeatedSeed); ClearProgress(); - Playthrough_Init(ctx->GetSettings()->GetSeed(), excludedLocations, enabledTricks); + Playthrough_Init(ctx->GetSeed(), excludedLocations, enabledTricks); SPDLOG_INFO("Seeds Generated: {}", i + 1); } diff --git a/soh/soh/Enhancements/randomizer/3drando/shops.cpp b/soh/soh/Enhancements/randomizer/3drando/shops.cpp index b778efccf..edaf8aa5d 100644 --- a/soh/soh/Enhancements/randomizer/3drando/shops.cpp +++ b/soh/soh/Enhancements/randomizer/3drando/shops.cpp @@ -156,7 +156,7 @@ int GetPriceFromMax(int max) { uint16_t GetPriceFromSettings(Rando::Location *loc, PriceSettingsStruct priceSettings) { auto ctx = Rando::Context::GetInstance(); - switch (ctx->GetOption(priceSettings.main).GetContextOptionIndex()){ + switch (ctx->GetOption(priceSettings.main).Get()){ case RO_PRICE_VANILLA: return loc->GetVanillaPrice(); case RO_PRICE_CHEAP_BALANCED: @@ -172,19 +172,19 @@ uint16_t GetPriceFromSettings(Rando::Location *loc, PriceSettingsStruct priceSet return 150; } case RO_PRICE_FIXED: - return (uint16_t)ctx->GetOption(priceSettings.fixedPrice).GetContextOptionIndex() * 5; + return (uint16_t)ctx->GetOption(priceSettings.fixedPrice).Get() * 5; case RO_PRICE_RANGE:{ - uint16_t range1 = (uint16_t)ctx->GetOption(priceSettings.range1).GetContextOptionIndex() * 5; - uint16_t range2 = (uint16_t)ctx->GetOption(priceSettings.range2).GetContextOptionIndex() * 5; + uint16_t range1 = (uint16_t)ctx->GetOption(priceSettings.range1).Get() * 5; + uint16_t range2 = (uint16_t)ctx->GetOption(priceSettings.range2).Get() * 5; return range1 < range2 ? Random(range1, range2+1) : Random(range2, range1+1); } case RO_PRICE_SET_BY_WALLET:{ - bool isTycoon = ctx->GetOption(RSK_INCLUDE_TYCOON_WALLET).GetContextOptionIndex(); - uint16_t noWeight = ctx->GetOption(priceSettings.noWallet).GetContextOptionIndex(); - uint16_t childWeight = ctx->GetOption(priceSettings.childWallet).GetContextOptionIndex(); - uint16_t adultWeight = ctx->GetOption(priceSettings.adultWallet).GetContextOptionIndex(); - uint16_t giantWeight = ctx->GetOption(priceSettings.giantWallet).GetContextOptionIndex(); - uint16_t tycoonWeight = isTycoon ? ctx->GetOption(priceSettings.tycoonWallet).GetContextOptionIndex() : 0; + bool isTycoon = ctx->GetOption(RSK_INCLUDE_TYCOON_WALLET).Get(); + uint16_t noWeight = ctx->GetOption(priceSettings.noWallet).Get(); + uint16_t childWeight = ctx->GetOption(priceSettings.childWallet).Get(); + uint16_t adultWeight = ctx->GetOption(priceSettings.adultWallet).Get(); + uint16_t giantWeight = ctx->GetOption(priceSettings.giantWallet).Get(); + uint16_t tycoonWeight = isTycoon ? ctx->GetOption(priceSettings.tycoonWallet).Get() : 0; uint16_t totalWeight = noWeight + childWeight + adultWeight + giantWeight + tycoonWeight; if (totalWeight == 0){ //if no weight, return from sane range return Random(0, 501); diff --git a/soh/soh/Enhancements/randomizer/3drando/spoiler_log.cpp b/soh/soh/Enhancements/randomizer/3drando/spoiler_log.cpp index bed532e9b..d78f1ef90 100644 --- a/soh/soh/Enhancements/randomizer/3drando/spoiler_log.cpp +++ b/soh/soh/Enhancements/randomizer/3drando/spoiler_log.cpp @@ -2,13 +2,14 @@ #include "../dungeon.h" #include "../static_data.h" -#include "../context.h" +#include "../settings.h" #include "../entrance.h" #include "random.hpp" #include "../trial.h" #include "hints.hpp" #include "pool_functions.hpp" #include "soh/Enhancements/randomizer/randomizer_check_objects.h" +#include "soh/Enhancements/randomizer/randomizer_entrance_tracker.h" #include #include @@ -45,7 +46,7 @@ std::string placementtxt; void GenerateHash() { auto ctx = Rando::Context::GetInstance(); - std::string hash = ctx->GetSettings()->GetHash(); + std::string hash = ctx->GetHash(); // adds leading 0s to the hash string if it has less than 10 digits. while (hash.length() < 10) { hash = "0" + hash; @@ -91,8 +92,8 @@ static void WriteShuffledEntrance(std::string sphereString, Entrance* entrance) int16_t destinationIndex = -1; int16_t replacementIndex = entrance->GetReplacement()->GetIndex(); int16_t replacementDestinationIndex = -1; - std::string name = entrance->GetName(); - std::string text = entrance->GetConnectedRegion()->regionName + " from " + entrance->GetReplacement()->GetParentRegion()->regionName; + std::string name = GetEntranceData(originalIndex)->source; + std::string text = GetEntranceData(replacementIndex)->destination; // Track the reverse destination, useful for savewarp handling if (entrance->GetReverse() != nullptr) { @@ -138,10 +139,10 @@ static void WriteShuffledEntrance(std::string sphereString, Entrance* entrance) // Writes the settings (without excluded locations, starting inventory and tricks) to the spoilerLog document. static void WriteSettings() { auto ctx = Rando::Context::GetInstance(); - std::array options = ctx->GetSettings()->GetAllOptions(); + std::array options = Rando::Settings::GetInstance()->GetAllOptions(); for (const Rando::Option& option : options) { if (option.GetName() != ""){ - jsonData["settings"][option.GetName()] = option.GetSelectedOptionText(); + jsonData["settings"][option.GetName()] = option.GetOptionText(ctx->GetOption(option.GetKey()).Get()); } } } @@ -156,9 +157,9 @@ std::string RemoveLineBreaks(std::string s) { static void WriteExcludedLocations() { auto ctx = Rando::Context::GetInstance(); - for (size_t i = 1; i < ctx->GetSettings()->GetExcludeLocationsOptions().size(); i++) { - for (const auto& location : ctx->GetSettings()->GetExcludeLocationsOptions()[i]) { - if (location->GetContextOptionIndex() == RO_LOCATION_INCLUDE) { + for (size_t i = 1; i < Rando::Settings::GetInstance()->GetExcludeLocationsOptions().size(); i++) { + for (const auto& location : Rando::Settings::GetInstance()->GetExcludeLocationsOptions()[i]) { + if (ctx->GetLocationOption(static_cast(location->GetKey())).Get() == RO_LOCATION_INCLUDE) { continue; } @@ -171,11 +172,11 @@ static void WriteExcludedLocations() { // Writes the starting inventory to the spoiler log, if there is any. static void WriteStartingInventory() { auto ctx = Rando::Context::GetInstance(); - const Rando::OptionGroup& optionGroup = ctx->GetSettings()->GetOptionGroup(RSG_STARTING_INVENTORY); + const Rando::OptionGroup& optionGroup = Rando::Settings::GetInstance()->GetOptionGroup(RSG_STARTING_INVENTORY); for (const Rando::OptionGroup* subGroup : optionGroup.GetSubGroups()) { if (subGroup->GetContainsType() == Rando::OptionGroupType::DEFAULT) { for (Rando::Option* option : subGroup->GetOptions()) { - jsonData["settings"][option->GetName()] = option->GetSelectedOptionText(); + jsonData["settings"][option->GetName()] = option->GetOptionText(ctx->GetOption(option->GetKey()).Get()); } } } @@ -185,8 +186,8 @@ static void WriteStartingInventory() { static void WriteEnabledTricks() { auto ctx = Rando::Context::GetInstance(); - for (const auto& setting : ctx->GetSettings()->GetOptionGroup(RSG_TRICKS).GetOptions()) { - if (setting->GetContextOptionIndex() != RO_GENERIC_ON) { + for (const auto& setting : Rando::Settings::GetInstance()->GetOptionGroup(RSG_TRICKS).GetOptions()) { + if (ctx->GetOption(setting->GetKey()).IsNot(RO_GENERIC_ON)) { continue; } jsonData["enabledTricks"].push_back(RemoveLineBreaks(setting->GetName()).c_str()); @@ -206,14 +207,19 @@ static void WriteMasterQuestDungeons() { } // Writes the required trials to the spoiler log, if there are any. -static void WriteRequiredTrials() { - auto ctx = Rando::Context::GetInstance(); - for (const auto& trial : ctx->GetTrials()->GetTrialList()) { - if (trial->IsRequired()) { - std::string trialName = trial->GetName().GetForCurrentLanguage(MF_CLEAN); - jsonData["requiredTrials"].push_back(RemoveLineBreaks(trialName)); - } +static void WriteChosenOptions() { + auto ctx = Rando::Context::GetInstance(); + for (const auto& trial : ctx->GetTrials()->GetTrialList()) { + if (trial->IsRequired()) { + std::string trialName = trial->GetName().GetForCurrentLanguage(MF_CLEAN); + jsonData["requiredTrials"].push_back(RemoveLineBreaks(trialName)); } + } + if (ctx->GetOption(RSK_SELECTED_STARTING_AGE).Is(RO_AGE_ADULT)){ + jsonData["SelectedStartingAge"] = "Adult"; + } else { + jsonData["SelectedStartingAge"] = "Child"; + } } // Writes the intended playthrough to the spoiler log, separated into spheres. @@ -316,8 +322,8 @@ const char* SpoilerLog_Write() { jsonData["version"] = (char*) gBuildVersion; jsonData["git_branch"] = (char*) gGitBranch; jsonData["git_commit"] = (char*) gGitCommitHash; - jsonData["seed"] = ctx->GetSettings()->GetSeedString(); - jsonData["finalSeed"] = ctx->GetSettings()->GetSeed(); + jsonData["seed"] = ctx->GetSeedString(); + jsonData["finalSeed"] = ctx->GetSeed(); // Write Hash int index = 0; @@ -331,7 +337,7 @@ const char* SpoilerLog_Write() { WriteStartingInventory(); WriteEnabledTricks(); WriteMasterQuestDungeons(); - WriteRequiredTrials(); + WriteChosenOptions(); WritePlaythrough(); ctx->playthroughLocations.clear(); diff --git a/soh/soh/Enhancements/randomizer/3drando/starting_inventory.cpp b/soh/soh/Enhancements/randomizer/3drando/starting_inventory.cpp index 4e1afddb7..c72b5f285 100644 --- a/soh/soh/Enhancements/randomizer/3drando/starting_inventory.cpp +++ b/soh/soh/Enhancements/randomizer/3drando/starting_inventory.cpp @@ -73,7 +73,7 @@ void GenerateStartingInventory() { // AddItemToInventory(RG_PROGRESSIVE_STICK_UPGRADE, StartingStickCapacity.Value()); // AddItemToInventory(RG_PROGRESSIVE_NUT_UPGRADE, StartingNutCapacity.Value()); // AddItemToInventory(RG_PROGRESSIVE_BOMB_BAG, StartingBombBag.Value()); - // AddItemToInventory((BombchusInLogic ? RG_PROGRESSIVE_BOMBCHUS : RG_BOMBCHU_20), StartingBombchus.Value()); + // AddItemToInventory((BombchuBag ? RG_PROGRESSIVE_BOMBCHUS : RG_BOMBCHU_20), StartingBombchus.Value()); // AddItemToInventory(RG_PROGRESSIVE_BOW, StartingBow.Value()); // AddItemToInventory(RG_FIRE_ARROWS, StartingFireArrows.Value()); // AddItemToInventory(RG_ICE_ARROWS, StartingIceArrows.Value()); @@ -112,7 +112,7 @@ void GenerateStartingInventory() { // AddItemToInventory(RG_EMPTY_BOTTLE, 1); // } // AddItemToInventory(RG_RUTOS_LETTER, StartingRutoBottle.Value()); - AddItemToInventory(RG_PROGRESSIVE_OCARINA, ctx->GetOption(RSK_STARTING_OCARINA).GetContextOptionIndex()); + AddItemToInventory(RG_PROGRESSIVE_OCARINA, ctx->GetOption(RSK_STARTING_OCARINA).Get()); AddItemToInventory(RG_ZELDAS_LULLABY, ctx->GetOption(RSK_STARTING_ZELDAS_LULLABY) ? 1 : 0); AddItemToInventory(RG_EPONAS_SONG, ctx->GetOption(RSK_STARTING_EPONAS_SONG) ? 1 : 0); AddItemToInventory(RG_SARIAS_SONG, ctx->GetOption(RSK_STARTING_SARIAS_SONG) ? 1 : 0); @@ -153,21 +153,21 @@ void GenerateStartingInventory() { // AddItemToInventory(RG_SPIRIT_MEDALLION, StartingSpiritMedallion.Value()); // AddItemToInventory(RG_SHADOW_MEDALLION, StartingShadowMedallion.Value()); // AddItemToInventory(RG_LIGHT_MEDALLION, StartingLightMedallion.Value()); - AddItemToInventory(RG_GOLD_SKULLTULA_TOKEN, ctx->GetOption(RSK_STARTING_SKULLTULA_TOKEN).GetContextOptionIndex()); + AddItemToInventory(RG_GOLD_SKULLTULA_TOKEN, ctx->GetOption(RSK_STARTING_SKULLTULA_TOKEN).Get()); - int8_t hearts = ctx->GetOption(RSK_STARTING_HEARTS).GetContextOptionIndex() - 2; + int8_t hearts = ctx->GetOption(RSK_STARTING_HEARTS).Get() - 2; AdditionalHeartContainers = 0; if (hearts < 0) { AddItemToInventory(RG_PIECE_OF_HEART, 4); // Plentiful and minimal have less than 4 standard pieces of heart so also replace the winner heart - if (ctx->GetOption(RSK_ITEM_POOL).GetContextOptionIndex() == 0 || ctx->GetOption(RSK_ITEM_POOL).GetContextOptionIndex() == 3) { + if (ctx->GetOption(RSK_ITEM_POOL).Get() == 0 || ctx->GetOption(RSK_ITEM_POOL).Get() == 3) { AddItemToInventory(RG_TREASURE_GAME_HEART); } AdditionalHeartContainers = 1 - hearts; } else if (hearts > 0) { // 16 containers in plentiful, 8 in balanced and 0 in the others - uint8_t maxContainers = 8 * std::max(0, 2 - ctx->GetOption(RSK_ITEM_POOL).GetContextOptionIndex()); + uint8_t maxContainers = 8 * std::max(0, 2 - ctx->GetOption(RSK_ITEM_POOL).Get()); if (hearts <= maxContainers) { AddItemToInventory(RG_HEART_CONTAINER, hearts); diff --git a/soh/soh/Enhancements/randomizer/LockOverworldDoors.cpp b/soh/soh/Enhancements/randomizer/LockOverworldDoors.cpp new file mode 100644 index 000000000..b8b8f4731 --- /dev/null +++ b/soh/soh/Enhancements/randomizer/LockOverworldDoors.cpp @@ -0,0 +1,154 @@ +#include +#include "soh/OTRGlobals.h" +#include "soh/Enhancements/game-interactor/GameInteractor_Hooks.h" +#include "soh/ShipInit.hpp" + +extern "C" { +extern PlayState* gPlayState; +#include "macros.h" +#include "src/overlays/actors/ovl_En_Door/z_en_door.h" +} + +#define RAND_GET_OPTION(option) Rando::Context::GetInstance()->GetOption(option).Get() + +using SceneDoorParamsPair = std::pair; +std::map lookupTable = { + {{ SCENE_MARKET_ENTRANCE_DAY, 447 }, RAND_INF_GUARD_HOUSE_UNLOCKED }, + {{ SCENE_MARKET_ENTRANCE_NIGHT, 447 }, RAND_INF_GUARD_HOUSE_UNLOCKED }, + {{ SCENE_MARKET_ENTRANCE_RUINS, 447 }, RAND_INF_GUARD_HOUSE_UNLOCKED }, + {{ SCENE_MARKET_GUARD_HOUSE, 447 }, RAND_INF_GUARD_HOUSE_UNLOCKED }, + {{ SCENE_MARKET_DAY, 4543 }, RAND_INF_MARKET_BAZAAR_UNLOCKED }, + {{ SCENE_MARKET_NIGHT, 4753 }, RAND_INF_MARKET_BAZAAR_UNLOCKED }, + {{ SCENE_MARKET_DAY, 1471 }, RAND_INF_MARKET_POTION_SHOP_UNLOCKED }, + {{ SCENE_MARKET_NIGHT, 1678 }, RAND_INF_MARKET_POTION_SHOP_UNLOCKED }, + {{ SCENE_MARKET_DAY, 3519 }, RAND_INF_MASK_SHOP_UNLOCKED }, + {{ SCENE_MARKET_NIGHT, 3728 }, RAND_INF_MASK_SHOP_UNLOCKED }, + {{ SCENE_MARKET_DAY, 2495 }, RAND_INF_MARKET_SHOOTING_GALLERY_UNLOCKED }, + {{ SCENE_MARKET_NIGHT, 2703 }, RAND_INF_MARKET_SHOOTING_GALLERY_UNLOCKED }, + {{ SCENE_SHOOTING_GALLERY, 447 }, RAND_INF_MARKET_SHOOTING_GALLERY_UNLOCKED }, + {{ SCENE_MARKET_DAY, 5567 }, RAND_INF_BOMBCHU_BOWLING_UNLOCKED }, + {{ SCENE_MARKET_NIGHT, 5567 }, RAND_INF_BOMBCHU_BOWLING_UNLOCKED }, + {{ SCENE_BOMBCHU_BOWLING_ALLEY, 447 }, RAND_INF_BOMBCHU_BOWLING_UNLOCKED }, + {{ SCENE_MARKET_DAY, 653 }, RAND_INF_TREASURE_CHEST_GAME_BUILDING_UNLOCKED }, + {{ SCENE_MARKET_NIGHT, 447 }, RAND_INF_TREASURE_CHEST_GAME_BUILDING_UNLOCKED }, + {{ SCENE_TREASURE_BOX_SHOP, 6591 }, RAND_INF_TREASURE_CHEST_GAME_BUILDING_UNLOCKED }, + {{ SCENE_BACK_ALLEY_DAY, 2689 }, RAND_INF_BOMBCHU_SHOP_UNLOCKED }, + {{ SCENE_BACK_ALLEY_NIGHT, 2495 }, RAND_INF_BOMBCHU_SHOP_UNLOCKED }, + {{ SCENE_BACK_ALLEY_DAY, 447 }, RAND_INF_RICHARDS_HOUSE_UNLOCKED }, + {{ SCENE_BACK_ALLEY_NIGHT, 447 }, RAND_INF_RICHARDS_HOUSE_UNLOCKED }, + {{ SCENE_DOG_LADY_HOUSE, 447 }, RAND_INF_RICHARDS_HOUSE_UNLOCKED }, + {{ SCENE_DOG_LADY_HOUSE, 447 }, RAND_INF_RICHARDS_HOUSE_UNLOCKED }, + {{ SCENE_BACK_ALLEY_HOUSE, 447 }, RAND_INF_ALLEY_HOUSE_UNLOCKED }, + {{ SCENE_BACK_ALLEY_DAY, 1665 }, RAND_INF_ALLEY_HOUSE_UNLOCKED }, + {{ SCENE_BACK_ALLEY_NIGHT, 1471 }, RAND_INF_ALLEY_HOUSE_UNLOCKED }, + {{ SCENE_KAKARIKO_VILLAGE, 6801 }, RAND_INF_KAK_BAZAAR_UNLOCKED }, // Adult Night + {{ SCENE_KAKARIKO_VILLAGE, 6591 }, RAND_INF_KAK_BAZAAR_UNLOCKED }, // Adult Day + {{ SCENE_KAKARIKO_VILLAGE, 6813 }, RAND_INF_KAK_BAZAAR_UNLOCKED }, // Child Day + {{ SCENE_KAKARIKO_VILLAGE, 6814 }, RAND_INF_KAK_BAZAAR_UNLOCKED }, // Child Night + {{ SCENE_KAKARIKO_VILLAGE, 8871 }, RAND_INF_KAK_POTION_SHOP_UNLOCKED }, // Child Day/Night Rear + {{ SCENE_KAKARIKO_VILLAGE, 8846 }, RAND_INF_KAK_POTION_SHOP_UNLOCKED }, // Adult Night Rear + {{ SCENE_KAKARIKO_VILLAGE, 8639 }, RAND_INF_KAK_POTION_SHOP_UNLOCKED }, // Adult Day Rear + {{ SCENE_KAKARIKO_VILLAGE, 7822 }, RAND_INF_KAK_POTION_SHOP_UNLOCKED }, // Adult Night + {{ SCENE_KAKARIKO_VILLAGE, 7615 }, RAND_INF_KAK_POTION_SHOP_UNLOCKED }, // Child Day/Night and Adult Day + {{ SCENE_KAKARIKO_VILLAGE, 2495 }, RAND_INF_BOSS_HOUSE_UNLOCKED }, + {{ SCENE_KAKARIKO_CENTER_GUEST_HOUSE, 447 }, RAND_INF_BOSS_HOUSE_UNLOCKED }, + {{ SCENE_KAKARIKO_VILLAGE, 3750 }, RAND_INF_GRANNYS_POTION_SHOP_UNLOCKED }, // Child + {{ SCENE_KAKARIKO_VILLAGE, 3519 }, RAND_INF_GRANNYS_POTION_SHOP_UNLOCKED }, // Adult + {{ SCENE_POTION_SHOP_GRANNY, 447 }, RAND_INF_GRANNYS_POTION_SHOP_UNLOCKED }, + {{ SCENE_KAKARIKO_VILLAGE, 5567 }, RAND_INF_SKULLTULA_HOUSE_UNLOCKED }, + {{ SCENE_HOUSE_OF_SKULLTULA, 447 }, RAND_INF_SKULLTULA_HOUSE_UNLOCKED }, + {{ SCENE_KAKARIKO_VILLAGE, 1471 }, RAND_INF_IMPAS_HOUSE_UNLOCKED }, + {{ SCENE_IMPAS_HOUSE, 447 }, RAND_INF_IMPAS_HOUSE_UNLOCKED }, + {{ SCENE_KAKARIKO_VILLAGE, 447 }, RAND_INF_WINDMILL_UNLOCKED }, + {{ SCENE_WINDMILL_AND_DAMPES_GRAVE, 2495 }, RAND_INF_WINDMILL_UNLOCKED }, + {{ SCENE_KAKARIKO_VILLAGE, 4543 }, RAND_INF_KAK_SHOOTING_GALLERY_UNLOCKED }, // Day + {{ SCENE_KAKARIKO_VILLAGE, 4751 }, RAND_INF_KAK_SHOOTING_GALLERY_UNLOCKED }, // Night + {{ SCENE_SHOOTING_GALLERY, 447 }, RAND_INF_KAK_SHOOTING_GALLERY_UNLOCKED }, + {{ SCENE_GRAVEYARD, 645 }, RAND_INF_DAMPES_HUT_UNLOCKED }, // Child Day + {{ SCENE_GRAVEYARD, 447 }, RAND_INF_DAMPES_HUT_UNLOCKED }, // Child Evening & Adult + {{ SCENE_GRAVEYARD, 774 }, RAND_INF_DAMPES_HUT_UNLOCKED }, // Child Night (After Dampes Tour) + {{ SCENE_GRAVEKEEPERS_HUT, 447 }, RAND_INF_DAMPES_HUT_UNLOCKED }, + {{ SCENE_LON_LON_RANCH, 2495 }, RAND_INF_TALONS_HOUSE_UNLOCKED }, + {{ SCENE_LON_LON_RANCH, 2473 }, RAND_INF_TALONS_HOUSE_UNLOCKED }, + {{ SCENE_LON_LON_RANCH, 2729 }, RAND_INF_TALONS_HOUSE_UNLOCKED }, + {{ SCENE_LON_LON_BUILDINGS, 1471 }, RAND_INF_TALONS_HOUSE_UNLOCKED }, + {{ SCENE_LON_LON_RANCH, 1471 }, RAND_INF_STABLES_UNLOCKED }, + {{ SCENE_STABLE, 447 }, RAND_INF_STABLES_UNLOCKED }, + {{ SCENE_LON_LON_RANCH, 447 }, RAND_INF_BACK_TOWER_UNLOCKED }, + {{ SCENE_LON_LON_BUILDINGS, 447 }, RAND_INF_BACK_TOWER_UNLOCKED }, + {{ SCENE_LAKE_HYLIA, 447 }, RAND_INF_HYLIA_LAB_UNLOCKED }, + {{ SCENE_LAKESIDE_LABORATORY, 447 }, RAND_INF_HYLIA_LAB_UNLOCKED }, + {{ SCENE_LAKE_HYLIA, 1471 }, RAND_INF_FISHING_HOLE_UNLOCKED }, + {{ SCENE_FISHING_POND, 447 }, RAND_INF_FISHING_HOLE_UNLOCKED }, +}; + +static void OnDoorInit(void* actorRef) { + EnDoor* enDoor = static_cast(actorRef); + enDoor->randomizerInf = RAND_INF_MAX; + + auto it = lookupTable.find({gPlayState->sceneNum, enDoor->actor.params}); + if (it != lookupTable.end()) { + if (it->second == RAND_INF_MARKET_SHOOTING_GALLERY_UNLOCKED && gSaveContext.entranceIndex == 0x3B) { + // Adult shooting gallery uses same scene and door params as child, so we manually handle it + enDoor->randomizerInf = RAND_INF_KAK_SHOOTING_GALLERY_UNLOCKED; + } else { + enDoor->randomizerInf = it->second; + } + if (!Flags_GetRandomizerInf(enDoor->randomizerInf)) { + // We don't want to override checkable doors, we still want those to not be openable even if they have a key + if (((enDoor->actor.params >> 7) & 7) != DOOR_CHECKABLE) { + enDoor->actor.params = (enDoor->actor.params & ~0x380) | (DOOR_LOCKED << 7); + enDoor->actionFunc = EnDoor_SetupType; + } else { + enDoor->lockTimer = 10; + } + } + } +} + +void RegisterLockOverworldDoors() { + bool shouldRegister = IS_RANDO && RAND_GET_OPTION(RSK_LOCK_OVERWORLD_DOORS); + + COND_ID_HOOK(OnActorInit, ACTOR_EN_DOOR, shouldRegister, OnDoorInit); + + COND_VB_SHOULD(VB_CONSUME_SMALL_KEY, shouldRegister, { + EnDoor* enDoor = va_arg(args, EnDoor*); + + if (enDoor->randomizerInf >= RAND_INF_GUARD_HOUSE_UNLOCKED && enDoor->randomizerInf <= RAND_INF_FISHING_HOLE_KEY_OBTAINED) { + Flags_SetRandomizerInf(enDoor->randomizerInf); + *should = false; + } + }); + + COND_VB_SHOULD(VB_NOT_HAVE_SMALL_KEY, shouldRegister, { + EnDoor* enDoor = va_arg(args, EnDoor*); + + if (enDoor->randomizerInf >= RAND_INF_GUARD_HOUSE_UNLOCKED && enDoor->randomizerInf <= RAND_INF_FISHING_HOLE_KEY_OBTAINED) { + *should = !Flags_GetRandomizerInf((RandomizerInf)(enDoor->randomizerInf + 1)); + } + }); + + COND_VB_SHOULD(VB_DOOR_BE_LOCKED, shouldRegister, { + EnDoor* enDoor = va_arg(args, EnDoor*); + + if (enDoor->randomizerInf >= RAND_INF_GUARD_HOUSE_UNLOCKED && enDoor->randomizerInf <= RAND_INF_FISHING_HOLE_KEY_OBTAINED) { + *should = !Flags_GetRandomizerInf(enDoor->randomizerInf); + } + }); + + // The door actor uses the same param to indicate if a door should be locked or be a scene transition, so it cannot be both. Here we're + // overriding the check for scene transition to also check if the door is being unlocked and should be a scene transition. + COND_VB_SHOULD(VB_DOOR_PLAY_SCENE_TRANSITION, shouldRegister, { + EnDoor* enDoor = va_arg(args, EnDoor*); + + if (!*should && ( + enDoor->actor.id == ACTOR_EN_DOOR && + ((enDoor->actor.params >> 7) & 7) == 1 && + enDoor->randomizerInf != RAND_INF_MAX + )) { + *should = true; + } + }); +} + +static RegisterShipInitFunc initFunc(RegisterLockOverworldDoors, { "IS_RANDO" }); diff --git a/soh/soh/Enhancements/randomizer/Plandomizer.cpp b/soh/soh/Enhancements/randomizer/Plandomizer.cpp index 3fc97eec7..e6c9399b5 100644 --- a/soh/soh/Enhancements/randomizer/Plandomizer.cpp +++ b/soh/soh/Enhancements/randomizer/Plandomizer.cpp @@ -1,5 +1,5 @@ #include "Plandomizer.h" -#include "soh/UIWidgets.hpp" +#include "soh/SohGui/UIWidgets.hpp" #include "soh/util.h" #include #include "soh/Notification/Notification.h" @@ -10,7 +10,7 @@ #include #include "soh/OTRGlobals.h" -#include "soh/ImGuiUtils.h" +#include "soh/SohGui/ImGuiUtils.h" #include "soh/Enhancements/randomizer/logic.h" #include "soh/Enhancements/randomizer/randomizer_check_objects.h" #include "soh/Enhancements/randomizer/rando_hash.h" @@ -77,7 +77,7 @@ std::unordered_map ocarinaButtonNames = { { RG_OCARINA_C_RIGHT_BUTTON, "C-RHT" }, }; -std::map bossSoulMapping = { +std::map bossSoulColorMapping = { { RG_GOHMA_SOUL, { 0.00f, 1.00f, 0.00f, 1.0f } }, { RG_KING_DODONGO_SOUL, { 1.00f, 0.00f, 0.39f, 1.0f } }, { RG_BARINADE_SOUL, { 0.20f, 1.00f, 1.00f, 1.0f } }, @@ -339,7 +339,7 @@ ImVec4 plandomizerGetItemColor(Rando::Item randoItem) { } if (randoItem.GetRandomizerGet() >= RG_GOHMA_SOUL && randoItem.GetRandomizerGet() <= RG_GANON_SOUL) { - itemColor = bossSoulMapping.at(randoItem.GetRandomizerGet()); + itemColor = bossSoulColorMapping.at(randoItem.GetRandomizerGet()); } return itemColor; diff --git a/soh/soh/Enhancements/randomizer/ShuffleFairies.cpp b/soh/soh/Enhancements/randomizer/ShuffleFairies.cpp index 82db62f2a..f9cd16c4d 100644 --- a/soh/soh/Enhancements/randomizer/ShuffleFairies.cpp +++ b/soh/soh/Enhancements/randomizer/ShuffleFairies.cpp @@ -129,46 +129,42 @@ void ShuffleFairies_OnVanillaBehaviorHandler(GIVanillaBehavior id, bool* should, } else if (id == VB_SPAWN_GOSSIP_STONE_FAIRY) { EnGs* gossipStone = (EnGs*)(actor); - // If not any of the songs that normally spawn a fairy, mimic vanilla behaviour. - if (gPlayState->msgCtx.ocarinaMode == OCARINA_MODE_01) { - Player* player = GET_PLAYER(gPlayState); - player->stateFlags2 |= PLAYER_STATE2_NEAR_OCARINA_ACTOR; - return; - } else if (gPlayState->msgCtx.unk_E3F2 != OCARINA_SONG_LULLABY && - gPlayState->msgCtx.unk_E3F2 != OCARINA_SONG_SARIAS && - gPlayState->msgCtx.unk_E3F2 != OCARINA_SONG_EPONAS && - gPlayState->msgCtx.unk_E3F2 != OCARINA_SONG_SUNS && - gPlayState->msgCtx.unk_E3F2 != OCARINA_SONG_TIME && - gPlayState->msgCtx.unk_E3F2 != OCARINA_SONG_STORMS && - gPlayState->msgCtx.ocarinaMode != OCARINA_MODE_04) { - return; - } + // Mimic vanilla behaviour, only go into this path if song played is one of the ones normally spawning a fairy. + // Otherwise fall back to vanilla behaviour. + if (gPlayState->msgCtx.ocarinaMode == OCARINA_MODE_04 && + (gPlayState->msgCtx.unk_E3F2 == OCARINA_SONG_LULLABY || + gPlayState->msgCtx.unk_E3F2 == OCARINA_SONG_SARIAS || + gPlayState->msgCtx.unk_E3F2 == OCARINA_SONG_EPONAS || + gPlayState->msgCtx.unk_E3F2 == OCARINA_SONG_SUNS || + gPlayState->msgCtx.unk_E3F2 == OCARINA_SONG_TIME || + gPlayState->msgCtx.unk_E3F2 == OCARINA_SONG_STORMS)) { - int32_t params = (gPlayState->sceneNum == SCENE_GROTTOS) ? Grotto_CurrentGrotto() : 0; - // Distinguish storms fairies from the normal song fairies - if (gPlayState->msgCtx.unk_E3F2 == OCARINA_SONG_STORMS) { - params |= 0x1000; - } + int32_t params = (gPlayState->sceneNum == SCENE_GROTTOS) ? Grotto_CurrentGrotto() : 0; + // Distinguish storms fairies from the normal song fairies + if (gPlayState->msgCtx.unk_E3F2 == OCARINA_SONG_STORMS) { + params |= 0x1000; + } - // Combine actor + song params with position to get the right randomizer check - params = TWO_ACTOR_PARAMS(params, (int32_t)gossipStone->actor.world.pos.z); + // Combine actor + song params with position to get the right randomizer check + params = TWO_ACTOR_PARAMS(params, (int32_t)gossipStone->actor.world.pos.z); - // Check if a fairy already exists with the same identity as the stone is trying to spawn. - // Because the gossip stone code runs several times after playing the song, we need to - // stop spawning the vanilla fairy as well when these fairies exist, otherwise both - // the randomized and the vanilla fairy will spawn. When the randomized fairy is already - // collected, the vanilla code will handle that part automatically. - FairyIdentity fairyIdentity = ShuffleFairies_GetFairyIdentity(params); - if (!ShuffleFairies_FairyExists(fairyIdentity)) { - if (ShuffleFairies_SpawnFairy(gossipStone->actor.world.pos.x, gossipStone->actor.world.pos.y, - gossipStone->actor.world.pos.z, params)) { - Audio_PlayActorSound2(&gossipStone->actor, NA_SE_EV_BUTTERFRY_TO_FAIRY); - // Set vanilla check for fairy spawned so it doesn't spawn the vanilla fairy afterwards as well. - gossipStone->unk_19D = 0; + // Check if a fairy already exists with the same identity as the stone is trying to spawn. + // Because the gossip stone code runs several times after playing the song, we need to + // stop spawning the vanilla fairy as well when these fairies exist, otherwise both + // the randomized and the vanilla fairy will spawn. When the randomized fairy is already + // collected, the vanilla code will handle that part automatically. + FairyIdentity fairyIdentity = ShuffleFairies_GetFairyIdentity(params); + if (!ShuffleFairies_FairyExists(fairyIdentity)) { + if (ShuffleFairies_SpawnFairy(gossipStone->actor.world.pos.x, gossipStone->actor.world.pos.y, + gossipStone->actor.world.pos.z, params)) { + Audio_PlayActorSound2(&gossipStone->actor, NA_SE_EV_BUTTERFRY_TO_FAIRY); + // Set vanilla check for fairy spawned so it doesn't spawn the vanilla fairy afterwards as well. + gossipStone->unk_19D = 0; + *should = false; + } + } else { *should = false; } - } else { - *should = false; } } } diff --git a/soh/soh/Enhancements/randomizer/ShuffleFreestanding.cpp b/soh/soh/Enhancements/randomizer/ShuffleFreestanding.cpp index e08bfbb92..7bf67b55d 100644 --- a/soh/soh/Enhancements/randomizer/ShuffleFreestanding.cpp +++ b/soh/soh/Enhancements/randomizer/ShuffleFreestanding.cpp @@ -23,7 +23,7 @@ void ShuffleFreestanding_OnVanillaBehaviorHandler(GIVanillaBehavior id, bool* sh Rando::Location* loc = OTRGlobals::Instance->gRandomizer->GetCheckObjectFromActor(item00->actor.id, gPlayState->sceneNum, params); uint8_t isDungeon = loc->IsDungeon(); uint8_t freestandingSetting = - Rando::Context::GetInstance()->GetOption(RSK_SHUFFLE_FREESTANDING).GetContextOptionIndex(); + Rando::Context::GetInstance()->GetOption(RSK_SHUFFLE_FREESTANDING).Get(); RandomizerCheck randomizerCheck = loc->GetRandomizerCheck(); bool checkObtained = Rando::Context::GetInstance()->GetItemLocation(randomizerCheck)->HasObtained(); diff --git a/soh/soh/Enhancements/randomizer/ShufflePots.cpp b/soh/soh/Enhancements/randomizer/ShufflePots.cpp index f5c7070dd..5b70b424e 100644 --- a/soh/soh/Enhancements/randomizer/ShufflePots.cpp +++ b/soh/soh/Enhancements/randomizer/ShufflePots.cpp @@ -28,7 +28,7 @@ extern "C" void ObjTsubo_RandomizerDraw(Actor* thisx, PlayState* play) { uint8_t ObjTsubo_RandomizerHoldsItem(ObjTsubo* potActor, PlayState* play) { RandomizerCheck rc = potActor->potIdentity.randomizerCheck; uint8_t isDungeon = Rando::StaticData::GetLocation(rc)->IsDungeon(); - uint8_t potSetting = Rando::Context::GetInstance()->GetOption(RSK_SHUFFLE_POTS).GetContextOptionIndex(); + uint8_t potSetting = Rando::Context::GetInstance()->GetOption(RSK_SHUFFLE_POTS).Get(); // Don't pull randomized item if pot isn't randomized or is already checked if (!IS_RANDO || (potSetting == RO_SHUFFLE_POTS_OVERWORLD && isDungeon) || @@ -87,7 +87,7 @@ void ShufflePots_OnVanillaBehaviorHandler(GIVanillaBehavior id, bool* should, va // Unlock early Ganon's Boss Key doors to allow access to the pots there when pots are shuffled in dungeon if (id == VB_LOCK_BOSS_DOOR) { DoorShutter* doorActor = va_arg(args, DoorShutter*); - uint8_t shufflePotSetting = Rando::Context::GetInstance()->GetOption(RSK_SHUFFLE_POTS).GetContextOptionIndex(); + uint8_t shufflePotSetting = Rando::Context::GetInstance()->GetOption(RSK_SHUFFLE_POTS).Get(); if (gPlayState->sceneNum == SCENE_GANONS_TOWER && doorActor->dyna.actor.world.pos.y == 800 && (shufflePotSetting == RO_SHUFFLE_POTS_DUNGEONS || shufflePotSetting == RO_SHUFFLE_POTS_ALL)) { *should = false; diff --git a/soh/soh/Enhancements/randomizer/adult_trade_shuffle.c b/soh/soh/Enhancements/randomizer/adult_trade_shuffle.c index c1acc100b..4bf481d2a 100644 --- a/soh/soh/Enhancements/randomizer/adult_trade_shuffle.c +++ b/soh/soh/Enhancements/randomizer/adult_trade_shuffle.c @@ -4,7 +4,7 @@ #include "macros.h" void Randomizer_ConsumeAdultTradeItem(PlayState* play, u8 itemId) { - gSaveContext.adultTradeItems &= ~ADULT_TRADE_FLAG(itemId); + gSaveContext.ship.quest.data.randomizer.adultTradeItems &= ~ADULT_TRADE_FLAG(itemId); Inventory_ReplaceItem(play, itemId, Randomizer_GetNextAdultTradeItem()); } @@ -13,7 +13,7 @@ u8 Randomizer_GetNextAdultTradeItem() { u8 currentTradeItemIndex = INV_CONTENT(ITEM_TRADE_ADULT) - ITEM_POCKET_EGG; for (int i = 0; i < numTradeItems; i++) { u8 tradeIndex = (currentTradeItemIndex + i + 1) % numTradeItems; - if (gSaveContext.adultTradeItems & (1 << tradeIndex)) { + if (gSaveContext.ship.quest.data.randomizer.adultTradeItems & (1 << tradeIndex)) { return ITEM_POCKET_EGG + tradeIndex; } } @@ -25,7 +25,7 @@ u8 Randomizer_GetPrevAdultTradeItem() { u8 currentTradeItemIndex = INV_CONTENT(ITEM_TRADE_ADULT) - ITEM_POCKET_EGG; for (int i = 0; i < numTradeItems; i++) { u8 tradeIndex = (currentTradeItemIndex - i - 1 + numTradeItems) % numTradeItems; - if (gSaveContext.adultTradeItems & (1 << tradeIndex)) { + if (gSaveContext.ship.quest.data.randomizer.adultTradeItems & (1 << tradeIndex)) { return ITEM_POCKET_EGG + tradeIndex; } } diff --git a/soh/soh/Enhancements/randomizer/adult_trade_shuffle.h b/soh/soh/Enhancements/randomizer/adult_trade_shuffle.h index 13d905026..f9894cf4e 100644 --- a/soh/soh/Enhancements/randomizer/adult_trade_shuffle.h +++ b/soh/soh/Enhancements/randomizer/adult_trade_shuffle.h @@ -4,7 +4,7 @@ #include #define ADULT_TRADE_FLAG(itemId) (1 << (itemId - ITEM_POCKET_EGG)) -#define PLAYER_HAS_SHUFFLED_ADULT_TRADE_ITEM(itemID) (gSaveContext.adultTradeItems & ADULT_TRADE_FLAG(itemID)) +#define PLAYER_HAS_SHUFFLED_ADULT_TRADE_ITEM(itemID) (IS_RANDO && gSaveContext.ship.quest.data.randomizer.adultTradeItems & ADULT_TRADE_FLAG(itemID)) void Randomizer_ConsumeAdultTradeItem(PlayState* play, u8 itemId); u8 Randomizer_GetNextAdultTradeItem(); diff --git a/soh/soh/Enhancements/randomizer/context.cpp b/soh/soh/Enhancements/randomizer/context.cpp index 7b33df771..79a60cc70 100644 --- a/soh/soh/Enhancements/randomizer/context.cpp +++ b/soh/soh/Enhancements/randomizer/context.cpp @@ -28,8 +28,31 @@ Context::Context() { mDungeons = std::make_shared(); mLogic = std::make_shared(); mTrials = std::make_shared(); - mSettings = std::make_shared(); mFishsanity = std::make_shared(); + VanillaLogicDefaults = { + // RANDOTODO check what this does + &mOptions[RSK_LINKS_POCKET], + &mOptions[RSK_SHUFFLE_DUNGEON_REWARDS], + &mOptions[RSK_SHUFFLE_SONGS], + &mOptions[RSK_SHOPSANITY], + &mOptions[RSK_SHOPSANITY_COUNT], + &mOptions[RSK_SHOPSANITY_PRICES], + &mOptions[RSK_SHOPSANITY_PRICES_AFFORDABLE], + &mOptions[RSK_FISHSANITY], + &mOptions[RSK_FISHSANITY_POND_COUNT], + &mOptions[RSK_FISHSANITY_AGE_SPLIT], + &mOptions[RSK_SHUFFLE_SCRUBS], + &mOptions[RSK_SHUFFLE_BEEHIVES], + &mOptions[RSK_SHUFFLE_COWS], + &mOptions[RSK_SHUFFLE_POTS], + &mOptions[RSK_SHUFFLE_FREESTANDING], + &mOptions[RSK_SHUFFLE_MERCHANTS], + &mOptions[RSK_SHUFFLE_FROG_SONG_RUPEES], + &mOptions[RSK_SHUFFLE_ADULT_TRADE], + &mOptions[RSK_SHUFFLE_100_GS_REWARD], + &mOptions[RSK_SHUFFLE_FAIRIES], + &mOptions[RSK_GOSSIP_STONE_HINTS], + }; } RandomizerArea Context::GetAreaFromString(std::string str) { @@ -94,7 +117,7 @@ void Context::PlaceItemInLocation(const RandomizerCheck locKey, const Randomizer const auto loc = GetItemLocation(locKey); SPDLOG_DEBUG(StaticData::RetrieveItem(item).GetName().GetEnglish() + " placed at " + StaticData::GetLocation(locKey)->GetName() + "\n"); - if (applyEffectImmediately || mSettings->GetOption(RSK_LOGIC_RULES).Is(RO_LOGIC_GLITCHLESS) || mSettings->GetOption(RSK_LOGIC_RULES).Is(RO_LOGIC_VANILLA)) { + if (applyEffectImmediately || mOptions[RSK_LOGIC_RULES].Is(RO_LOGIC_GLITCHLESS) || mOptions[RSK_LOGIC_RULES].Is(RO_LOGIC_VANILLA)) { StaticData::RetrieveItem(item).ApplyEffect(); } @@ -130,17 +153,17 @@ bool Context::IsQuestOfLocationActive(RandomizerCheck rc) { void Context::GenerateLocationPool() { allLocations.clear(); - if (mSettings->GetOption(RSK_TRIFORCE_HUNT)) { + if (mOptions[RSK_TRIFORCE_HUNT]) { AddLocation(RC_TRIFORCE_COMPLETED); } AddLocations(StaticData::GetOverworldLocations()); - if (mSettings->GetOption(RSK_FISHSANITY).IsNot(RO_FISHSANITY_OFF)) { + if (mOptions[RSK_FISHSANITY].IsNot(RO_FISHSANITY_OFF)) { AddLocations(mFishsanity->GetFishsanityLocations().first); } - if (mSettings->GetOption(RSK_SHUFFLE_POTS).Is(RO_SHUFFLE_POTS_OVERWORLD) || - mSettings->GetOption(RSK_SHUFFLE_POTS).Is(RO_SHUFFLE_POTS_ALL)) { + if (mOptions[RSK_SHUFFLE_POTS].Is(RO_SHUFFLE_POTS_OVERWORLD) || + mOptions[RSK_SHUFFLE_POTS].Is(RO_SHUFFLE_POTS_ALL)) { AddLocations(StaticData::GetOverworldPotLocations()); } @@ -153,7 +176,17 @@ void Context::AddExcludedOptions() { AddLocations(dungeon->GetEveryLocation(), &everyPossibleLocation); } for (const RandomizerCheck rc : everyPossibleLocation) { - GetItemLocation(rc)->AddExcludeOption(); + bool alreadyAdded = false; + Location* loc = StaticData::GetLocation(rc); + for (Option* location : Rando::Settings::GetInstance()->GetExcludeOptionsForArea(loc->GetArea())) + { + if (location->GetName() == loc->GetExcludedOption()->GetName()) { + alreadyAdded = true; + } + } + if (!alreadyAdded) { + Rando::Settings::GetInstance()->GetExcludeOptionsForArea(loc->GetArea()).push_back(loc->GetExcludedOption()); + } } } @@ -289,7 +322,7 @@ void Context::ParseSpoiler(const char* spoilerFileName) { nlohmann::json spoilerFileJson; spoilerFileStream >> spoilerFileJson; ParseHashIconIndexesJson(spoilerFileJson); - mSettings->ParseJson(spoilerFileJson); + Rando::Settings::GetInstance()->ParseJson(spoilerFileJson); ParseItemLocationsJson(spoilerFileJson); ParseHintJson(spoilerFileJson); mEntranceShuffler->ParseJson(spoilerFileJson); @@ -362,10 +395,6 @@ void Context::ParseHintJson(nlohmann::json spoilerFileJson) { CreateStaticHints(); } -std::shared_ptr Context::GetSettings() { - return mSettings; -} - std::shared_ptr Context::GetEntranceShuffler() { return mEntranceShuffler; } @@ -405,12 +434,20 @@ Sprite* Context::GetSeedTexture(const uint8_t index) { return &gSeedTextures[index]; } -Option& Context::GetOption(const RandomizerSettingKey key) const { - return mSettings->GetOption(key); +OptionValue& Context::GetOption(const RandomizerSettingKey key) { + return mOptions[key]; } -TrickOption& Context::GetTrickOption(const RandomizerTrick key) const { - return mSettings->GetTrickOption(key); +OptionValue& Context::GetTrickOption(const RandomizerTrick key) { + return mTrickOptions[key]; +} + +OptionValue& Context::GetLocationOption(const RandomizerCheck key) { + return itemLocationTable[key].GetExcludedOption(); +} + +RandoOptionLACSCondition Context::LACSCondition() const { + return mLACSCondition; } std::shared_ptr Context::GetKaleido() { @@ -419,4 +456,28 @@ std::shared_ptr Context::GetKaleido() { } return mKaleido; } + +std::string Context::GetHash() const { + return mHash; +} + +void Context::SetHash(std::string hash) { + mHash = std::move(hash); +} + +const std::string& Context::GetSeedString() const { + return mSeedString; +} + +void Context::SetSeedString(std::string seedString) { + mSeedString = std::move(seedString); +} + +uint32_t Context::GetSeed() const { + return mFinalSeed; +} + +void Context::SetSeed(const uint32_t seed) { + mFinalSeed = seed; +} } // namespace Rando diff --git a/soh/soh/Enhancements/randomizer/context.h b/soh/soh/Enhancements/randomizer/context.h index e2baf9559..cc71609eb 100644 --- a/soh/soh/Enhancements/randomizer/context.h +++ b/soh/soh/Enhancements/randomizer/context.h @@ -25,7 +25,6 @@ namespace Rando { class EntranceShuffler; class Logic; -class Settings; class Dungeons; class DungeonInfo; class TrialInfo; @@ -63,7 +62,24 @@ class Context { void SetSeedGenerated(bool seedGenerated = true); bool IsSpoilerLoaded() const; void SetSpoilerLoaded(bool spoilerLoaded = true); - std::shared_ptr GetSettings(); + + /** + * @brief Reset all RandomizerTrick keys. + */ + void ResetTrickOptions(); + + /** + * @brief Runs before seed generation to ensure all options are compatible with each + * other and resolve options that have been set to random (such as random trial count, + * or starting age). + * + * @param excludedLocations Set of locations that should be forced to have junk items. + * @param enabledTricks Set of tricks that should be considered logically possible. Tricks + * are things that are possible to do in gameplay but are difficult, not intuitive or that + * require more extensive game knowledge, i.e. opening invisible chests without the Lens of Truth. + */ + void FinalizeSettings(const std::set& excludedLocations, + const std::set& enabledTricks); std::shared_ptr GetEntranceShuffler(); std::shared_ptr GetDungeons(); std::shared_ptr GetFishsanity(); @@ -74,8 +90,17 @@ class Context { TrialInfo* GetTrial(size_t key) const; TrialInfo* GetTrial(TrialKey key) const; static Sprite* GetSeedTexture(uint8_t index); - Option& GetOption(RandomizerSettingKey key) const; - TrickOption& GetTrickOption(RandomizerTrick key) const; + OptionValue& GetOption(RandomizerSettingKey key); + OptionValue& GetTrickOption(RandomizerTrick key); + OptionValue& GetLocationOption(RandomizerCheck key); + + /** + * @brief Gets the resolved Light Arrow CutScene check condition. + * There is no direct option for this, it is inferred based on the value of a few other options. + * + * @return RandoOptionLACSCondition + */ + RandoOptionLACSCondition LACSCondition() const; GetItemEntry GetFinalGIEntry(RandomizerCheck rc, bool checkObtainability = true, GetItemID ogItemId = GI_NONE); void ParseSpoiler(const char* spoilerFileName); void ParseHashIconIndexesJson(nlohmann::json spoilerFileJson); @@ -87,16 +112,61 @@ class Context { std::vector everyPossibleLocation = {}; std::vector possibleIceTrapModels = {}; std::unordered_map iceTrapModels = {}; + std::vector VanillaLogicDefaults = {}; std::array hashIconIndexes = {}; bool playthroughBeatable = false; bool allLocationsReachable = false; RandomizerArea GetAreaFromString(std::string str); + /** + * @brief Get the hash for the current seed. + * + * @return std::string + */ + std::string GetHash() const; + + /** + * @brief Get the Seed String + * + * @return const std::string& + */ + const std::string& GetSeedString() const; + + /** + * @brief Set the Seed String + * + * @param seedString + */ + void SetSeedString(std::string seedString); + + /** + * @brief Get the Seed + * + * @return const uint32_t + */ + uint32_t GetSeed() const; + + /** + * @brief Set the Seed + * + * @param seed + */ + void SetSeed(uint32_t seed); + + /** + * @brief Set the Seed Hash for the current seed. + * + * @param hash + */ + void SetHash(std::string hash); + private: static std::weak_ptr mContext; std::array hintTable = {}; std::array itemLocationTable = {}; - std::shared_ptr mSettings; + std::array mOptions; + std::array mTrickOptions; + RandoOptionLACSCondition mLACSCondition = RO_LACS_VANILLA; std::shared_ptr mEntranceShuffler; std::shared_ptr mDungeons; std::shared_ptr mLogic; @@ -105,5 +175,8 @@ class Context { std::shared_ptr mKaleido; bool mSeedGenerated = false; bool mSpoilerLoaded = false; + std::string mHash; + std::string mSeedString; + uint32_t mFinalSeed = 0; }; } // namespace Rando \ No newline at end of file diff --git a/soh/soh/Enhancements/randomizer/draw.cpp b/soh/soh/Enhancements/randomizer/draw.cpp index bd7f92a84..0a89e4dae 100644 --- a/soh/soh/Enhancements/randomizer/draw.cpp +++ b/soh/soh/Enhancements/randomizer/draw.cpp @@ -16,32 +16,84 @@ #include "objects/object_gi_fire/object_gi_fire.h" #include "objects/object_fish/object_fish.h" #include "objects/object_toki_objects/object_toki_objects.h" +#include "objects/object_gi_bomb_2/object_gi_bomb_2.h" #include "objects/gameplay_field_keep/gameplay_field_keep.h" +#include "objects/object_goma/object_goma.h" +#include "objects/object_kingdodongo/object_kingdodongo.h" +#include "objects/object_bv/object_bv.h" +#include "objects/object_gnd/object_gnd.h" +#include "objects/object_fd/object_fd.h" +#include "objects/object_mo/object_mo.h" +#include "objects/object_sst/object_sst.h" +#include "overlays/actors/ovl_Boss_Goma/z_boss_goma.h" +#include "overlays/ovl_Boss_Sst/ovl_Boss_Sst.h" +#include "objects/object_tw/object_tw.h" +#include "objects/object_ganon2/object_ganon2.h" #include "soh_assets.h" +#include "dungeon.h" #include "soh/Enhancements/cosmetics/cosmeticsTypes.h" extern "C" { +extern PlayState* gPlayState; extern SaveContext gSaveContext; } +const char* SmallBodyCvarValue[10] = { + CVAR_COSMETIC("Key.ForestSmallBody.Value"), + CVAR_COSMETIC("Key.FireSmallBody.Value"), + CVAR_COSMETIC("Key.WaterSmallBody.Value"), + CVAR_COSMETIC("Key.SpiritSmallBody.Value"), + CVAR_COSMETIC("Key.ShadowSmallBody.Value"), + CVAR_COSMETIC("Key.WellSmallBody.Value"), + CVAR_COSMETIC("Key.GTGSmallBody.Value"), + CVAR_COSMETIC("Key.FortSmallBody.Value"), + CVAR_COSMETIC("Key.GanonsSmallBody.Value"), + CVAR_COSMETIC("Key.ChestGameSmallBody.Value"), +}; + +const char* SmallEmblemCvarValue[10] = { + CVAR_COSMETIC("Key.ForestSmallEmblem.Value"), + CVAR_COSMETIC("Key.FireSmallEmblem.Value"), + CVAR_COSMETIC("Key.WaterSmallEmblem.Value"), + CVAR_COSMETIC("Key.SpiritSmallEmblem.Value"), + CVAR_COSMETIC("Key.ShadowSmallEmblem.Value"), + CVAR_COSMETIC("Key.WellSmallEmblem.Value"), + CVAR_COSMETIC("Key.GTGSmallEmblem.Value"), + CVAR_COSMETIC("Key.FortSmallEmblem.Value"), + CVAR_COSMETIC("Key.GanonsSmallEmblem.Value"), + CVAR_COSMETIC("Key.ChestGameEmblem.Value"), +}; + +Color_RGB8 SmallEmblemDefaultValue[10] = { + { 4, 195, 46 }, // Forest + { 237, 95, 95 }, // Fire + { 85, 180, 223 }, // Water + { 222, 158, 47 }, // Spirit + { 126, 16, 177 }, // Shadow + { 227, 110, 255 }, // Well + { 221, 212, 60 }, // GTG + { 255, 255, 255 }, // Fortress + { 80, 80, 80 }, // Ganons + { 255, 255, 255 }, // Chest Game +}; + extern "C" u8 Randomizer_GetSettingValue(RandomizerSettingKey randoSettingKey); extern "C" void Randomizer_DrawSmallKey(PlayState* play, GetItemEntry* getItemEntry) { - s8 keysCanBeOutsideDungeon = getItemEntry->getItemId == RG_GERUDO_FORTRESS_SMALL_KEY ? - Randomizer_GetSettingValue(RSK_GERUDO_KEYS) != RO_GERUDO_KEYS_VANILLA : - DUNGEON_ITEMS_CAN_BE_OUTSIDE_DUNGEON(RSK_KEYSANITY); - s8 isColoredKeysEnabled = keysCanBeOutsideDungeon && CVarGetInteger(CVAR_RANDOMIZER_ENHANCEMENT("MatchKeyColors"), 1); - s16 color_slot = getItemEntry->getItemId - RG_FOREST_TEMPLE_SMALL_KEY; - s16 colors[9][3] = { - { 4, 195, 46 }, // Forest Temple - { 237, 95, 95 }, // Fire Temple - { 85, 180, 223 }, // Water Temple - { 222, 158, 47 }, // Spirit Temple - { 126, 16, 177 }, // Shadow Temple - { 227, 110, 255 }, // Bottom of the Well - { 221, 212, 60 }, // Gerudo Training Ground - { 255, 255, 255 }, // Thieves' Hideout - { 80, 80, 80 } // Ganon's Castle + s8 isCustomKeysEnabled = CVarGetInteger(CVAR_RANDOMIZER_ENHANCEMENT("CustomKeyModels"), 0); + int slot = getItemEntry->drawItemId - RG_FOREST_TEMPLE_SMALL_KEY; + + Gfx* customIconDLs[] = { + (Gfx*)gSmallKeyIconForestTempleDL, + (Gfx*)gSmallKeyIconFireTempleDL, + (Gfx*)gSmallKeyIconWaterTempleDL, + (Gfx*)gSmallKeyIconSpiritTempleDL, + (Gfx*)gSmallKeyIconShadowTempleDL, + (Gfx*)gSmallKeyIconBottomoftheWellDL, + (Gfx*)gSmallKeyIconGerudoTrainingGroundDL, + (Gfx*)gSmallKeyIconGerudoFortressDL, + (Gfx*)gSmallKeyIconGanonsCastleDL, + (Gfx*)gSmallKeyIconTreasureChestGameDL, }; OPEN_DISPS(play->state.gfxCtx); @@ -51,14 +103,28 @@ extern "C" void Randomizer_DrawSmallKey(PlayState* play, GetItemEntry* getItemEn gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(play->state.gfxCtx, (char*)__FILE__, __LINE__), G_MTX_MODELVIEW | G_MTX_LOAD); - if (isColoredKeysEnabled) { - gDPSetGrayscaleColor(POLY_OPA_DISP++, colors[color_slot][0], colors[color_slot][1], colors[color_slot][2], 255); + Color_RGB8 keyColor = { 255, 255, 255 }; + keyColor = CVarGetColor24(SmallBodyCvarValue[slot], keyColor); + + if (isCustomKeysEnabled) { + gDPSetEnvColor(POLY_OPA_DISP++, keyColor.r, keyColor.g, keyColor.b, 255); + gSPDisplayList(POLY_OPA_DISP++, (Gfx*)gSmallKeyCustomDL); + + Gfx_SetupDL_25Xlu(play->state.gfxCtx); + + Color_RGB8 emblemColor = SmallEmblemDefaultValue[slot]; + emblemColor = CVarGetColor24(SmallEmblemCvarValue[slot], emblemColor); + + gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(play->state.gfxCtx, (char*)__FILE__, __LINE__), + G_MTX_MODELVIEW | G_MTX_LOAD); + gDPSetEnvColor(POLY_XLU_DISP++, emblemColor.r, emblemColor.g, emblemColor.b, 255); + + gSPDisplayList(POLY_XLU_DISP++, customIconDLs[slot]); + + } else { + gDPSetGrayscaleColor(POLY_OPA_DISP++, keyColor.r, keyColor.g, keyColor.b, 255); gSPGrayscale(POLY_OPA_DISP++, true); - } - - gSPDisplayList(POLY_OPA_DISP++, (Gfx*)gGiSmallKeyDL); - - if (isColoredKeysEnabled) { + gSPDisplayList(POLY_OPA_DISP++, (Gfx*)gGiSmallKeyDL); gSPGrayscale(POLY_OPA_DISP++, false); } @@ -109,19 +175,25 @@ extern "C" void Randomizer_DrawCompass(PlayState* play, GetItemEntry* getItemEnt } extern "C" void Randomizer_DrawBossKey(PlayState* play, GetItemEntry* getItemEntry) { - s8 keysCanBeOutsideDungeon = getItemEntry->getItemId == RG_GANONS_CASTLE_BOSS_KEY ? - DUNGEON_ITEMS_CAN_BE_OUTSIDE_DUNGEON(RSK_GANONS_BOSS_KEY) : - DUNGEON_ITEMS_CAN_BE_OUTSIDE_DUNGEON(RSK_BOSS_KEYSANITY); - s8 isColoredKeysEnabled = keysCanBeOutsideDungeon && CVarGetInteger(CVAR_RANDOMIZER_ENHANCEMENT("MatchKeyColors"), 1); - s16 color_slot; - color_slot = getItemEntry->getItemId - RG_FOREST_TEMPLE_BOSS_KEY; - s16 colors[6][3] = { - { 4, 195, 46 }, // Forest Temple - { 237, 95, 95 }, // Fire Temple - { 85, 180, 223 }, // Water Temple - { 222, 158, 47 }, // Spirit Temple - { 126, 16, 177 }, // Shadow Temple - { 210, 0, 0 } // Ganon's Castle + s8 isCustomKeysEnabled = CVarGetInteger(CVAR_RANDOMIZER_ENHANCEMENT("CustomKeyModels"), 1); + s16 slot = getItemEntry->getItemId - RG_FOREST_TEMPLE_BOSS_KEY; + + std::string CvarValue[6] = { + "gCosmetics.Key.ForestBoss", + "gCosmetics.Key.FireBoss", + "gCosmetics.Key.WaterBoss", + "gCosmetics.Key.SpiritBoss", + "gCosmetics.Key.ShadowBoss", + "gCosmetics.Key.GanonsBoss", + }; + + Gfx* CustomdLists[] = { + (Gfx*)gBossKeyIconForestTempleDL, + (Gfx*)gBossKeyIconFireTempleDL, + (Gfx*)gBossKeyIconWaterTempleDL, + (Gfx*)gBossKeyIconSpiritTempleDL, + (Gfx*)gBossKeyIconShadowTempleDL, + (Gfx*)gBossKeyIconGanonsCastleDL, }; OPEN_DISPS(play->state.gfxCtx); @@ -131,15 +203,22 @@ extern "C" void Randomizer_DrawBossKey(PlayState* play, GetItemEntry* getItemEnt gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(play->state.gfxCtx, (char*)__FILE__, __LINE__), G_MTX_MODELVIEW | G_MTX_LOAD); - if (color_slot == 5 && isColoredKeysEnabled) { // Ganon's Boss Key - gDPSetGrayscaleColor(POLY_OPA_DISP++, 80, 80, 80, 255); - gSPGrayscale(POLY_OPA_DISP++, true); - } - - gSPDisplayList(POLY_OPA_DISP++, (Gfx*)gGiBossKeyDL); - - if (color_slot == 5 && isColoredKeysEnabled) { // Ganon's Boss Key - gSPGrayscale(POLY_OPA_DISP++, false); + Color_RGB8 keyColor = { 255, 255, 0 }; + //Supposed to use CVAR_COSMETIC but I can't figure out the syntax + keyColor = CVarGetColor24((CvarValue[slot] + "Body.Value").c_str(), keyColor); + + if (isCustomKeysEnabled){ + gDPSetEnvColor(POLY_OPA_DISP++, keyColor.r, keyColor.g, keyColor.b, 255); + gSPDisplayList(POLY_OPA_DISP++, (Gfx*)gBossKeyCustomDL); + } else { + if (CVarGetInteger((CvarValue[slot] + "Body.Changed").c_str(), false)){ + gDPSetGrayscaleColor(POLY_OPA_DISP++, keyColor.r, keyColor.g, keyColor.b, 255); + gSPGrayscale(POLY_OPA_DISP++, true); + gSPDisplayList(POLY_OPA_DISP++, (Gfx*)gGiBossKeyDL); + gSPGrayscale(POLY_OPA_DISP++, false); + } else { + gSPDisplayList(POLY_OPA_DISP++, (Gfx*)gGiBossKeyDL); + } } Gfx_SetupDL_25Xlu(play->state.gfxCtx); @@ -147,62 +226,140 @@ extern "C" void Randomizer_DrawBossKey(PlayState* play, GetItemEntry* getItemEnt gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(play->state.gfxCtx, (char*)__FILE__, __LINE__), G_MTX_MODELVIEW | G_MTX_LOAD); - if (isColoredKeysEnabled) { - gDPSetGrayscaleColor(POLY_XLU_DISP++, colors[color_slot][0], colors[color_slot][1], colors[color_slot][2], 255); - gSPGrayscale(POLY_XLU_DISP++, true); - } - - gSPDisplayList(POLY_XLU_DISP++, (Gfx*)gGiBossKeyGemDL); - - if (isColoredKeysEnabled) { - gSPGrayscale(POLY_XLU_DISP++, false); + Color_RGB8 gemColor = { 255, 0, 0 }; + gemColor = CVarGetColor24((CvarValue[slot] + "Gem.Value").c_str(), gemColor); + + if (isCustomKeysEnabled){ + gDPSetEnvColor(POLY_XLU_DISP++, gemColor.r, gemColor.g, gemColor.b, 255); + gSPDisplayList(POLY_XLU_DISP++, CustomdLists[slot]); + } else { + if (CVarGetInteger((CvarValue[slot] + "Gem.Changed").c_str(), false)){ + gDPSetGrayscaleColor(POLY_XLU_DISP++, gemColor.r, gemColor.g, gemColor.b, 255); + gSPGrayscale(POLY_XLU_DISP++, true); + gSPDisplayList(POLY_XLU_DISP++, (Gfx*)gGiBossKeyGemDL); + gSPGrayscale(POLY_XLU_DISP++, false); + } else { + gSPDisplayList(POLY_XLU_DISP++, (Gfx*)gGiBossKeyGemDL); + } } CLOSE_DISPS(play->state.gfxCtx); } extern "C" void Randomizer_DrawKeyRing(PlayState* play, GetItemEntry* getItemEntry) { - s16 color_slot = getItemEntry->getItemId - RG_FOREST_TEMPLE_KEY_RING; - s16 colors[9][3] = { - { 4, 195, 46 }, // Forest Temple - { 237, 95, 95 }, // Fire Temple - { 85, 180, 223 }, // Water Temple - { 222, 158, 47 }, // Spirit Temple - { 126, 16, 177 }, // Shadow Temple - { 227, 110, 255 }, // Bottom of the Well - { 221, 212, 60 }, // Gerudo Training Ground - { 255, 255, 255 }, // Thieves' Hideout - { 80, 80, 80 } // Ganon's Castle + s8 isCustomKeysEnabled = CVarGetInteger(CVAR_RANDOMIZER_ENHANCEMENT("CustomKeyModels"), 0); + int slot = getItemEntry->drawItemId - RG_FOREST_TEMPLE_KEY_RING; + + Gfx* CustomIconDLs[] = { + (Gfx*)gKeyringIconForestTempleDL, + (Gfx*)gKeyringIconFireTempleDL, + (Gfx*)gKeyringIconWaterTempleDL, + (Gfx*)gKeyringIconSpiritTempleDL, + (Gfx*)gKeyringIconShadowTempleDL, + (Gfx*)gKeyringIconBottomoftheWellDL, + (Gfx*)gKeyringIconGerudoTrainingGroundDL, + (Gfx*)gKeyringIconGerudoFortressDL, + (Gfx*)gKeyringIconGanonsCastleDL, + (Gfx*)gKeyringIconTreasureChestGameDL, + }; + + Gfx* CustomKeysDLs[] = { + (Gfx*)gKeyringKeysForestTempleDL, + (Gfx*)gKeyringKeysFireTempleDL, + (Gfx*)gKeyringKeysWaterTempleDL, + (Gfx*)gKeyringKeysSpiritTempleDL, + (Gfx*)gKeyringKeysShadowTempleDL, + (Gfx*)gKeyringKeysBottomoftheWellDL, + (Gfx*)gKeyringKeysGerudoTrainingGroundDL, + (Gfx*)gKeyringKeysGerudoFortressDL, + (Gfx*)gKeyringKeysGanonsCastleDL, + (Gfx*)gKeyringKeysTreasureChestGameDL, + }; + + Gfx* CustomKeysMQDLs[] = { + (Gfx*)gKeyringKeysForestTempleMQDL, + (Gfx*)gKeyringKeysFireTempleMQDL, + (Gfx*)gKeyringKeysWaterTempleMQDL, + (Gfx*)gKeyringKeysSpiritTempleMQDL, + (Gfx*)gKeyringKeysShadowTempleMQDL, + (Gfx*)gKeyringKeysBottomoftheWellMQDL, + (Gfx*)gKeyringKeysGerudoTrainingGroundMQDL, + (Gfx*)gKeyringKeysGerudoFortressDL, + (Gfx*)gKeyringKeysGanonsCastleMQDL, + (Gfx*)gKeyringKeysTreasureChestGameDL, + }; + + //RANDOTODO make DungeonInfo static and vanilla accessible to allow all these key model data vars to be stored there. + //(Rando::DungeonKey)0 means the keyring is not tied to a dungeon and should not be checked for an MQ variant + Rando::DungeonKey SlotToDungeon[10] = { + Rando::FOREST_TEMPLE, + Rando::FIRE_TEMPLE, + Rando::WATER_TEMPLE, + Rando::SPIRIT_TEMPLE, + Rando::SHADOW_TEMPLE, + Rando::BOTTOM_OF_THE_WELL, + Rando::GERUDO_TRAINING_GROUND, + (Rando::DungeonKey)0, //Gerudo Fortress + Rando::GANONS_CASTLE, + (Rando::DungeonKey)0, //Treasure Chest Game }; OPEN_DISPS(play->state.gfxCtx); Gfx_SetupDL_25Opa(play->state.gfxCtx); - gDPSetGrayscaleColor(POLY_OPA_DISP++, colors[color_slot][0], colors[color_slot][1], colors[color_slot][2], 255); - gSPGrayscale(POLY_OPA_DISP++, true); + Color_RGB8 keyColor = { 255, 255, 255 }; + keyColor = CVarGetColor24(SmallBodyCvarValue[slot], keyColor); - Matrix_Scale(0.5f, 0.5f, 0.5f, MTXMODE_APPLY); - Matrix_RotateZ(0.8f, MTXMODE_APPLY); - Matrix_RotateX(-2.16f, MTXMODE_APPLY); - Matrix_RotateY(-0.56f, MTXMODE_APPLY); - Matrix_RotateZ(-0.86f, MTXMODE_APPLY); - Matrix_Translate(28.29f, 0, 0, MTXMODE_APPLY); - Matrix_Translate(-(3.12f * 2), -(-0.34f * 2), -(17.53f * 2), MTXMODE_APPLY); - Matrix_RotateX(-(-0.31f * 2), MTXMODE_APPLY); - Matrix_RotateY(-(0.19f * 2), MTXMODE_APPLY); - Matrix_RotateZ(-(0.20f * 2), MTXMODE_APPLY); - for (int i = 0; i < 5; i++) { + if (isCustomKeysEnabled) { gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(play->state.gfxCtx, (char*)__FILE__, __LINE__), - G_MTX_MODELVIEW | G_MTX_LOAD); - Matrix_Translate(3.12f, -0.34f, 17.53f, MTXMODE_APPLY); - Matrix_RotateX(-0.31f, MTXMODE_APPLY); - Matrix_RotateY(0.19f, MTXMODE_APPLY); - Matrix_RotateZ(0.20f, MTXMODE_APPLY); - gSPDisplayList(POLY_OPA_DISP++, (Gfx*)gGiSmallKeyDL); - } + G_MTX_MODELVIEW | G_MTX_LOAD); - gSPGrayscale(POLY_OPA_DISP++, false); + gDPSetEnvColor(POLY_OPA_DISP++, keyColor.r, keyColor.g, keyColor.b, 255); + if (SlotToDungeon[slot] != 0 && Rando::Context::GetInstance()->GetDungeon(SlotToDungeon[slot])->IsMQ()){ + gSPDisplayList(POLY_OPA_DISP++, (Gfx*)CustomKeysMQDLs[slot]); + } else { + gSPDisplayList(POLY_OPA_DISP++, (Gfx*)CustomKeysDLs[slot]); + } + + Color_RGB8 ringColor = { 255, 255, 255 }; + ringColor = CVarGetColor24(CVAR_COSMETIC("Key.KeyringRing.Value"), ringColor); + gDPSetEnvColor(POLY_OPA_DISP++, ringColor.r, ringColor.g, ringColor.b, 255); + gSPDisplayList(POLY_OPA_DISP++, (Gfx*)gKeyringRingDL); + + Color_RGB8 emblemColor = SmallEmblemDefaultValue[slot]; + emblemColor = CVarGetColor24(SmallEmblemCvarValue[slot], emblemColor); + + Gfx_SetupDL_25Opa(play->state.gfxCtx); + gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(play->state.gfxCtx, (char*)__FILE__, __LINE__), + G_MTX_MODELVIEW | G_MTX_LOAD); + gDPSetEnvColor(POLY_OPA_DISP++, emblemColor.r, emblemColor.g, emblemColor.b, 255); + + gSPDisplayList(POLY_OPA_DISP++, CustomIconDLs[slot]); + } else { + gDPSetGrayscaleColor(POLY_OPA_DISP++, keyColor.r, keyColor.g, keyColor.b, 255); + gSPGrayscale(POLY_OPA_DISP++, true); + Matrix_Scale(0.5f, 0.5f, 0.5f, MTXMODE_APPLY); + Matrix_RotateZ(0.8f, MTXMODE_APPLY); + Matrix_RotateX(-2.16f, MTXMODE_APPLY); + Matrix_RotateY(-0.56f, MTXMODE_APPLY); + Matrix_RotateZ(-0.86f, MTXMODE_APPLY); + Matrix_Translate(28.29f, 0, 0, MTXMODE_APPLY); + Matrix_Translate(-(3.12f * 2), -(-0.34f * 2), -(17.53f * 2), MTXMODE_APPLY); + Matrix_RotateX(-(-0.31f * 2), MTXMODE_APPLY); + Matrix_RotateY(-(0.19f * 2), MTXMODE_APPLY); + Matrix_RotateZ(-(0.20f * 2), MTXMODE_APPLY); + for (int i = 0; i < 5; i++) { + gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(play->state.gfxCtx, (char*)__FILE__, __LINE__), + G_MTX_MODELVIEW | G_MTX_LOAD); + Matrix_Translate(3.12f, -0.34f, 17.53f, MTXMODE_APPLY); + Matrix_RotateX(-0.31f, MTXMODE_APPLY); + Matrix_RotateY(0.19f, MTXMODE_APPLY); + Matrix_RotateZ(0.20f, MTXMODE_APPLY); + gSPDisplayList(POLY_OPA_DISP++, (Gfx*)gGiSmallKeyDL); + } + gSPGrayscale(POLY_OPA_DISP++, false); + } CLOSE_DISPS(play->state.gfxCtx); } @@ -263,7 +420,7 @@ extern "C" void Randomizer_DrawTriforcePiece(PlayState* play, GetItemEntry getIt Gfx_SetupDL_25Xlu(play->state.gfxCtx); - uint8_t current = gSaveContext.triforcePiecesCollected; + uint8_t current = gSaveContext.ship.quest.data.randomizer.triforcePiecesCollected; Matrix_Scale(0.035f, 0.035f, 0.035f, MTXMODE_APPLY); @@ -287,7 +444,7 @@ extern "C" void Randomizer_DrawTriforcePieceGI(PlayState* play, GetItemEntry get Gfx_SetupDL_25Xlu(play->state.gfxCtx); - uint8_t current = gSaveContext.triforcePiecesCollected; + uint8_t current = gSaveContext.ship.quest.data.randomizer.triforcePiecesCollected; uint8_t required = OTRGlobals::Instance->gRandomizer->GetRandoSettingValue(RSK_TRIFORCE_HUNT_PIECES_REQUIRED) + 1; Matrix_Scale(triforcePieceScale, triforcePieceScale, triforcePieceScale, MTXMODE_APPLY); @@ -350,8 +507,452 @@ extern "C" void Randomizer_DrawMysteryItem(PlayState* play, GetItemEntry getItem CLOSE_DISPS(play->state.gfxCtx); } +Gfx* GetEmptyDlist(GraphicsContext* gfxCtx) { + Gfx* dListHead; + Gfx* dList; + + dList = dListHead = (Gfx*)Graph_Alloc(gfxCtx, sizeof(Gfx) * 1); + + gSPEndDisplayList(dListHead++); + + return dList; +} + +extern "C" s32 OverrideLimbDrawGohma(PlayState* play, s32 limbIndex, Gfx** dList, Vec3f* pos, Vec3s* rot, void* thisx) { + OPEN_DISPS(play->state.gfxCtx); + + gDPPipeSync(POLY_OPA_DISP++); + gDPSetEnvColor(POLY_OPA_DISP++, 0, 255, 170, 255); + + switch (limbIndex) { + case BOSSGOMA_LIMB_EYE: + gDPSetEnvColor(POLY_OPA_DISP++, 255, 255, 255, 63); + break; + + case BOSSGOMA_LIMB_IRIS: + gDPSetEnvColor(POLY_OPA_DISP++, 255, 255, 255, 255); + break; + } + + CLOSE_DISPS(play->state.gfxCtx); + return false; +} + +#define LIMB_COUNT_GOHMA 86 +extern "C" void DrawGohma(PlayState* play) { + static bool initialized = false; + static SkelAnime skelAnime; + static Vec3s jointTable[LIMB_COUNT_GOHMA]; + static Vec3s otherTable[LIMB_COUNT_GOHMA]; + static u32 lastUpdate = 0; + + if (!initialized) { + initialized = true; + SkelAnime_Init(play, &skelAnime, (SkeletonHeader*)&gGohmaSkel, (AnimationHeader*)&gGohmaIdleCrouchedAnim, + jointTable, otherTable, LIMB_COUNT_GOHMA); + } + + if (lastUpdate != play->state.frames) { + lastUpdate = play->state.frames; + SkelAnime_Update(&skelAnime); + } + + OPEN_DISPS(play->state.gfxCtx); + + Gfx_SetupDL_25Opa(play->state.gfxCtx); + Matrix_Translate(0.0f, -20.0f, 0.0f, MTXMODE_APPLY); + Matrix_Scale(0.005f, 0.005f, 0.005f, MTXMODE_APPLY); + + gSPSegment(POLY_OPA_DISP++, 0x08, (uintptr_t)GetEmptyDlist(play->state.gfxCtx)); + SkelAnime_DrawSkeletonOpa(play, &skelAnime, OverrideLimbDrawGohma, NULL, NULL); + + CLOSE_DISPS(play->state.gfxCtx); +} + +#define LIMB_COUNT_KING_DODONGO 49 +extern "C" void DrawKingDodongo(PlayState* play) { + static bool initialized = false; + static SkelAnime skelAnime; + static Vec3s jointTable[LIMB_COUNT_KING_DODONGO]; + static Vec3s otherTable[LIMB_COUNT_KING_DODONGO]; + static u32 lastUpdate = 0; + + if (!initialized) { + initialized = true; + SkelAnime_Init(play, &skelAnime, (SkeletonHeader*)&object_kingdodongo_Skel_01B310, + (AnimationHeader*)&object_kingdodongo_Anim_00F0D8, jointTable, otherTable, + LIMB_COUNT_KING_DODONGO); + } + + if (lastUpdate != play->state.frames) { + lastUpdate = play->state.frames; + SkelAnime_Update(&skelAnime); + } + + OPEN_DISPS(play->state.gfxCtx); + + Gfx_SetupDL_25Opa(play->state.gfxCtx); + Matrix_Translate(0.0f, -20.0f, 0.0f, MTXMODE_APPLY); + Matrix_Scale(0.003f, 0.003f, 0.003f, MTXMODE_APPLY); + + SkelAnime_DrawSkeletonOpa(play, &skelAnime, NULL, NULL, NULL); + + CLOSE_DISPS(play->state.gfxCtx); +} + +extern "C" s32 OverrideLimbDrawBarinade(PlayState* play, s32 limbIndex, Gfx** dList, Vec3f* pos, Vec3s* rot, void* thisx) { + OPEN_DISPS(play->state.gfxCtx); + + s16 unk_1AC = play->gameplayFrames * 0xC31; + f32 unk_1A0 = 0.0f; + f32 unk_1A4 = 0.0f; + + if (limbIndex == 20) { + gDPPipeSync(POLY_OPA_DISP++); + gSPSegment(POLY_OPA_DISP++, 0x08, + (uintptr_t)Gfx_TwoTexScroll(play->state.gfxCtx, 0, 0, 0, 8, 16, 1, 0, + (play->gameplayFrames * -2) % 64, 16, 16)); + gDPSetEnvColor(POLY_OPA_DISP++, 0, 0, 0, 200); + Matrix_RotateX(-M_PI / 2, MTXMODE_APPLY); + } else if ((limbIndex >= 10) && (limbIndex < 20)) { + rot->x -= 0x4000; + *dList = NULL; + } else if (limbIndex == 6) { + unk_1A4 = (Math_SinS(unk_1AC) * 0.05f) + 1.0f; + Matrix_Scale(unk_1A4, unk_1A4, unk_1A4, MTXMODE_APPLY); + } else if (limbIndex == 61) { + unk_1A0 = (Math_CosS(unk_1AC) * 0.1f) + 1.0f; + Matrix_Scale(unk_1A0, unk_1A0, unk_1A0, MTXMODE_APPLY); + } else if (limbIndex == 7) { + rot->x -= 0xCCC; + } + + CLOSE_DISPS(play->state.gfxCtx); + return false; +} + +extern "C" void PostLimbDrawBarinade(PlayState* play, s32 limbIndex, Gfx** dList, Vec3s* rot, void* thisx) { + OPEN_DISPS(play->state.gfxCtx); + + if (limbIndex == 25) { + gSPSegment(POLY_XLU_DISP++, 0x09, + (uintptr_t)Gfx_TwoTexScroll(play->state.gfxCtx, 0, 0, (play->gameplayFrames * 10) % 128, 16, 32, 1, + 0, (play->gameplayFrames * 5) % 128, 16, 32)); + gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(play->state.gfxCtx, (char*)__FILE__, __LINE__), + G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW); + gSPDisplayList(POLY_XLU_DISP++, (Gfx*)gBarinadeDL_008D70); + } else if ((limbIndex >= 10) && (limbIndex < 20)) { + if (((limbIndex >= 16) || (limbIndex == 10))) { + gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(play->state.gfxCtx, (char*)__FILE__, __LINE__), + G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW); + gSPDisplayList(POLY_XLU_DISP++, (Gfx*)gBarinadeDL_008BB8); + } else if ((limbIndex >= 11)) { + gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(play->state.gfxCtx, (char*)__FILE__, __LINE__), + G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW); + gSPDisplayList(POLY_XLU_DISP++, (Gfx*)gBarinadeDL_008BB8); + } + } else if ((*dList != NULL) && (limbIndex >= 29) && (limbIndex < 56)) { + gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(play->state.gfxCtx, (char*)__FILE__, __LINE__), + G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW); + gSPDisplayList(POLY_XLU_DISP++, *dList); + } + + CLOSE_DISPS(play->state.gfxCtx); +} + +#define LIMB_COUNT_BARINADE 64 +extern "C" void DrawBarinade(PlayState* play) { + static bool initialized = false; + static SkelAnime skelAnime; + static Vec3s jointTable[LIMB_COUNT_BARINADE]; + static Vec3s otherTable[LIMB_COUNT_BARINADE]; + static u32 lastUpdate = 0; + + if (!initialized) { + initialized = true; + SkelAnime_Init(play, &skelAnime, (SkeletonHeader*)&gBarinadeBodySkel, (AnimationHeader*)&gBarinadeBodyAnim, + jointTable, otherTable, LIMB_COUNT_BARINADE); + + // Freeze barniade on the last frame + f32 lastFrame = Animation_GetLastFrame((AnimationHeader*)&gBarinadeBodyAnim); + Animation_Change(&skelAnime, (AnimationHeader*)&gBarinadeBodyAnim, 1.0f, lastFrame, lastFrame, ANIMMODE_ONCE, + 0.0f); + } + + if (lastUpdate != play->state.frames) { + lastUpdate = play->state.frames; + SkelAnime_Update(&skelAnime); + } + + OPEN_DISPS(play->state.gfxCtx); + + Gfx_SetupDL_25Opa(play->state.gfxCtx); + Gfx_SetupDL_25Xlu(play->state.gfxCtx); + Matrix_Translate(0.0f, -25.0f, 0.0f, MTXMODE_APPLY); + Matrix_Scale(0.03f, 0.03f, 0.03f, MTXMODE_APPLY); + + gSPSegment(POLY_OPA_DISP++, 0x08, + (uintptr_t)Gfx_TwoTexScroll(play->state.gfxCtx, 0, 0, 0, 8, 16, 1, 0, (play->gameplayFrames * -10) % 16, + 16, 16)); + gSPSegment(POLY_OPA_DISP++, 0x09, + (uintptr_t)Gfx_TwoTexScroll(play->state.gfxCtx, 0, 0, (play->gameplayFrames * -10) % 32, 16, 0x20, 1, 0, + (play->gameplayFrames * -5) % 32, 16, 32)); + + SkelAnime_DrawSkeletonOpa(play, &skelAnime, OverrideLimbDrawBarinade, PostLimbDrawBarinade, NULL); + + CLOSE_DISPS(play->state.gfxCtx); +} + +#define LIMB_COUNT_PHANTOM_GANON 26 +extern "C" void DrawPhantomGanon(PlayState* play) { + static bool initialized = false; + static SkelAnime skelAnime; + static Vec3s jointTable[LIMB_COUNT_PHANTOM_GANON]; + static Vec3s otherTable[LIMB_COUNT_PHANTOM_GANON]; + static u32 lastUpdate = 0; + + if (!initialized) { + initialized = true; + SkelAnime_Init(play, &skelAnime, (SkeletonHeader*)&gPhantomGanonSkel, + (AnimationHeader*)&gPhantomGanonNeutralAnim, jointTable, otherTable, LIMB_COUNT_PHANTOM_GANON); + } + + if (lastUpdate != play->state.frames) { + lastUpdate = play->state.frames; + SkelAnime_Update(&skelAnime); + } + + OPEN_DISPS(play->state.gfxCtx); + + Gfx_SetupDL_25Opa(play->state.gfxCtx); + Matrix_Translate(0.0f, 10.0f, 0.0f, MTXMODE_APPLY); + Matrix_Scale(0.007f, 0.007f, 0.007f, MTXMODE_APPLY); + + // Eye color + gDPSetEnvColor(POLY_OPA_DISP++, 255, 255, 255, 255); + gSPSegment(POLY_OPA_DISP++, 0x08, (uintptr_t)GetEmptyDlist(play->state.gfxCtx)); + SkelAnime_DrawSkeletonOpa(play, &skelAnime, NULL, NULL, NULL); + + CLOSE_DISPS(play->state.gfxCtx); +} + +#define LIMB_COUNT_VOLVAGIA 7 +extern "C" void DrawVolvagia(PlayState* play) { + static bool initialized = false; + static SkelAnime skelAnime; + static Vec3s jointTable[LIMB_COUNT_VOLVAGIA]; + static Vec3s otherTable[LIMB_COUNT_VOLVAGIA]; + static u32 lastUpdate = 0; + + if (!initialized) { + initialized = true; + SkelAnime_Init(play, &skelAnime, (SkeletonHeader*)&gVolvagiaHeadSkel, + (AnimationHeader*)&gVolvagiaHeadEmergeAnim, jointTable, otherTable, LIMB_COUNT_VOLVAGIA); + } + + if (lastUpdate != play->state.frames) { + lastUpdate = play->state.frames; + SkelAnime_Update(&skelAnime); + } + + OPEN_DISPS(play->state.gfxCtx); + + Gfx_SetupDL_25Opa(play->state.gfxCtx); + Matrix_Scale(0.007f, 0.007f, 0.007f, MTXMODE_APPLY); + + gSPSegment(POLY_OPA_DISP++, 0x09, (uintptr_t)gVolvagiaEyeOpenTex); + gSPSegment(POLY_OPA_DISP++, 0x08, + (uintptr_t)Gfx_TwoTexScroll(play->state.gfxCtx, 0, play->state.frames * 4, 120, 0x20, 0x20, 1, + play->state.frames * 3, play->state.frames * -2, 0x20, 0x20)); + + gDPSetPrimColor(POLY_OPA_DISP++, 0, 0, 255, 255, 255, 255); + gDPSetEnvColor(POLY_OPA_DISP++, 255, 255, 255, 255); + + SkelAnime_DrawSkeletonOpa(play, &skelAnime, NULL, NULL, NULL); + + CLOSE_DISPS(play->state.gfxCtx); +} + +extern "C" void DrawMorpha(PlayState* play) { + OPEN_DISPS(play->state.gfxCtx); + + Gfx_SetupDL_25Xlu(play->state.gfxCtx); + + Matrix_Scale(0.015f, 0.015f, 0.015f, MTXMODE_APPLY); + + gSPSegment(POLY_XLU_DISP++, 0x08, + (uintptr_t)Gfx_TwoTexScroll(play->state.gfxCtx, 0, play->state.frames * 3, play->state.frames * 3, 32, + 32, 1, play->state.frames * -3, play->state.frames * -3, 32, 32)); + + gSPSegment(POLY_XLU_DISP++, 0x09, + (uintptr_t)Gfx_TwoTexScroll(play->state.gfxCtx, 0, play->state.frames * 3, 0, 32, 32, 1, 0, + play->state.frames * -5, 32, 32)); + + Matrix_RotateX(play->state.frames * 0.1f, MTXMODE_APPLY); + Matrix_RotateZ(play->state.frames * 0.16f, MTXMODE_APPLY); + + gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(play->state.gfxCtx, (char*)__FILE__, __LINE__), + G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW); + + gDPSetPrimColor(POLY_XLU_DISP++, 0x80, 0x80, 255, 255, 255, 255); + + gSPDisplayList(POLY_XLU_DISP++, (Gfx*)gMorphaCoreMembraneDL); + + gDPPipeSync(POLY_XLU_DISP++); + + gDPSetEnvColor(POLY_XLU_DISP++, 0, 220, 255, 128); + gDPSetPrimColor(POLY_XLU_DISP++, 0x80, 0x80, 255, 255, 255, 255); + + gSPDisplayList(POLY_XLU_DISP++, (Gfx*)gMorphaCoreNucleusDL); + + CLOSE_DISPS(play->state.gfxCtx); +} + +#define LIMB_COUNT_BONGO_BONGO 27 +extern "C" void DrawBongoBongo(PlayState* play) { + static bool initialized = false; + static SkelAnime skelAnime; + static Vec3s jointTable[LIMB_COUNT_BONGO_BONGO]; + static Vec3s otherTable[LIMB_COUNT_BONGO_BONGO]; + static u32 lastUpdate = 0; + + if (!initialized) { + initialized = true; + SkelAnime_InitFlex(play, &skelAnime, (FlexSkeletonHeader*)&gBongoLeftHandSkel, + (AnimationHeader*)&gBongoLeftHandIdleAnim, jointTable, otherTable, LIMB_COUNT_BONGO_BONGO); + } + + if (lastUpdate != play->state.frames) { + lastUpdate = play->state.frames; + SkelAnime_Update(&skelAnime); + } + + OPEN_DISPS(play->state.gfxCtx); + + Gfx_SetupDL_25Opa(play->state.gfxCtx); + Matrix_Translate(0.0f, -25.0f, 0.0f, MTXMODE_APPLY); + Matrix_Scale(0.006f, 0.006f, 0.006f, MTXMODE_APPLY); + + gSPSegment(POLY_OPA_DISP++, 0x08, (uintptr_t)GetEmptyDlist(play->state.gfxCtx)); + + gDPSetPrimColor(POLY_OPA_DISP++, 0x80, 0x80, 255, 255, 255, 255); + SkelAnime_DrawSkeletonOpa(play, &skelAnime, NULL, NULL, NULL); + + CLOSE_DISPS(play->state.gfxCtx); +} + +extern "C" s32 OverrideLimbDrawKotake(PlayState* play, s32 limbIndex, Gfx** dList, Vec3f* pos, Vec3s* rot, void* thisx) { + if (limbIndex == 21) { // Head + *dList = (Gfx*)gTwinrovaKotakeHeadDL; + } + + return false; +} + +extern "C" void PostLimbDrawKotake(PlayState* play, s32 limbIndex, Gfx** dList, Vec3s* rot, void* thisx) { + OPEN_DISPS(play->state.gfxCtx); + + if (limbIndex == 21) { // Head + gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(play->state.gfxCtx, (char*)__FILE__, __LINE__), + G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW); + gSPDisplayList(POLY_XLU_DISP++, (Gfx*)gTwinrovaKotakeIceHairDL); + } + + CLOSE_DISPS(play->state.gfxCtx); +} + +#define LIMB_COUNT_KOTAKE 27 +extern "C" void DrawKotake(PlayState* play) { + static bool initialized = false; + static SkelAnime skelAnime; + static Vec3s jointTable[LIMB_COUNT_KOTAKE]; + static Vec3s otherTable[LIMB_COUNT_KOTAKE]; + static u32 lastUpdate = 0; + + if (!initialized) { + initialized = true; + SkelAnime_InitFlex(play, &skelAnime, (FlexSkeletonHeader*)&gTwinrovaKotakeSkel, + (AnimationHeader*)&gTwinrovaKotakeKoumeFlyAnim, jointTable, otherTable, LIMB_COUNT_KOTAKE); + } + + if (lastUpdate != play->state.frames) { + lastUpdate = play->state.frames; + SkelAnime_Update(&skelAnime); + } + + OPEN_DISPS(play->state.gfxCtx); + + Gfx_SetupDL_25Opa(play->state.gfxCtx); + Gfx_SetupDL_25Xlu(play->state.gfxCtx); + Matrix_Translate(0.0f, -10.0f, 0.0f, MTXMODE_APPLY); + Matrix_Scale(0.01f, 0.01f, 0.01f, MTXMODE_APPLY); + + gSPSegment(POLY_OPA_DISP++, 10, (uintptr_t)gTwinrovaKotakeKoumeEyeOpenTex); + gSPSegment(POLY_XLU_DISP++, 10, (uintptr_t)gTwinrovaKotakeKoumeEyeOpenTex); + gSPSegment(POLY_XLU_DISP++, 8, + (uintptr_t)Gfx_TwoTexScroll(play->state.gfxCtx, 0, 0 & 0x7F, 0 & 0x7F, 0x20, 0x20, 1, + play->state.frames & 0x7F, (play->state.frames * -7) & 0xFF, 0x20, 0x40)); + + gSPSegment(POLY_XLU_DISP++, 9, + (uintptr_t)Gfx_TexScroll(play->state.gfxCtx, 0 & 0x7F, play->state.frames & 0xFF, 0x20, 0x40)); + + SkelAnime_DrawSkeletonOpa(play, &skelAnime, OverrideLimbDrawKotake, PostLimbDrawKotake, NULL); + + CLOSE_DISPS(play->state.gfxCtx); +} + +extern "C" s32 OverrideLimbDrawGanon(PlayState* play, s32 limbIndex, Gfx** dList, Vec3f* pos, Vec3s* rot, void* thisx) { + OPEN_DISPS(play->state.gfxCtx); + + if (limbIndex >= 42) { // Tail + // Brighten up tail + gDPSetEnvColor(POLY_OPA_DISP++, 255, 255, 255, 255); + } + + CLOSE_DISPS(play->state.gfxCtx); + return false; +} + +#define LIMB_COUNT_GANON 47 +extern "C" void DrawGanon(PlayState* play) { + static bool initialized = false; + static SkelAnime skelAnime; + static Vec3s jointTable[LIMB_COUNT_GANON]; + static Vec3s otherTable[LIMB_COUNT_GANON]; + static u32 lastUpdate = 0; + + if (!initialized) { + initialized = true; + SkelAnime_InitFlex(play, &skelAnime, (FlexSkeletonHeader*)&gGanonSkel, (AnimationHeader*)&gGanonGuardIdleAnim, + jointTable, otherTable, LIMB_COUNT_GANON); + } + + if (lastUpdate != play->state.frames) { + lastUpdate = play->state.frames; + SkelAnime_Update(&skelAnime); + } + + OPEN_DISPS(play->state.gfxCtx); + + Gfx_SetupDL_25Opa(play->state.gfxCtx); + Matrix_Translate(0.0f, -33.0f, 0.0f, MTXMODE_APPLY); + Matrix_Scale(0.005f, 0.005f, 0.005f, MTXMODE_APPLY); + + gSPSegment(POLY_OPA_DISP++, 0x08, (uintptr_t)gGanonEyeOpenTex); + + SkelAnime_DrawSkeletonOpa(play, &skelAnime, OverrideLimbDrawGanon, NULL, NULL); + + CLOSE_DISPS(play->state.gfxCtx); +} + extern "C" void Randomizer_DrawBossSoul(PlayState* play, GetItemEntry* getItemEntry) { - s16 slot = getItemEntry->getItemId - RG_GOHMA_SOUL; + s16 slot; + if (getItemEntry->getItemId != RG_ICE_TRAP) { + slot = getItemEntry->getItemId - RG_GOHMA_SOUL; + } else { + slot = getItemEntry->drawItemId - RG_GOHMA_SOUL; + } + s16 flameColors[9][3] = { { 0, 255, 0 }, // Gohma { 255, 0, 100 }, // King Dodongo @@ -361,42 +962,75 @@ extern "C" void Randomizer_DrawBossSoul(PlayState* play, GetItemEntry* getItemEn { 85, 180, 223 }, // Morpha { 126, 16, 177 }, // Bongo Bongo { 222, 158, 47 }, // Twinrova - { 80, 80, 80 }, // Ganon/Dorf + { 150, 150, 150 }, // Ganon/Dorf }; - OPEN_DISPS(play->state.gfxCtx); + // Draw the blue fire DL but coloured to the boss soul. + OPEN_DISPS(play->state.gfxCtx); Gfx_SetupDL_25Xlu(play->state.gfxCtx); + gSPSegment(POLY_XLU_DISP++, 8, + (uintptr_t)Gfx_TwoTexScroll(play->state.gfxCtx, 0, 0 * (play->state.frames * 0), + 0 * (play->state.frames * 0), 16, 32, 1, 1 * (play->state.frames * 1), + -1 * (play->state.frames * 8), 16, 32)); + Matrix_Push(); + Matrix_Translate(0.0f, -70.0f, 0.0f, MTXMODE_APPLY); + Matrix_Scale(5.0f, 5.0f, 5.0f, MTXMODE_APPLY); + Matrix_ReplaceRotation(&play->billboardMtxF); gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(play->state.gfxCtx, (char*)__FILE__, __LINE__), G_MTX_MODELVIEW | G_MTX_LOAD); - if (slot == 8) { // For Ganon only... - gDPSetPrimColor(POLY_XLU_DISP++, 0, 0, 0, 0, 0, 255); - } else { - gDPSetPrimColor(POLY_XLU_DISP++, 0, 0, 255, 255, 255, 255); - } - gSPDisplayList(POLY_XLU_DISP++, (Gfx*)gBossSoulSkullDL); - - if (slot >= 0) { - Gfx_SetupDL_25Xlu(play->state.gfxCtx); - gSPSegment(POLY_XLU_DISP++, 8, (uintptr_t)Gfx_TwoTexScroll( - play->state.gfxCtx, 0, 0 * (play->state.frames * 0), - 0 * (play->state.frames * 0), 16, 32, 1, 1 * (play->state.frames * 1), - -1 * (play->state.frames * 8), 16, 32 - )); - Matrix_Push(); - Matrix_Translate(0.0f, -70.0f, 0.0f, MTXMODE_APPLY); - Matrix_Scale(5.0f, 5.0f, 5.0f, MTXMODE_APPLY); - Matrix_ReplaceRotation(&play->billboardMtxF); - gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(play->state.gfxCtx, (char*)__FILE__, __LINE__), - G_MTX_MODELVIEW | G_MTX_LOAD); - gDPSetGrayscaleColor(POLY_XLU_DISP++, flameColors[slot][0], flameColors[slot][1], flameColors[slot][2], 255); - gSPGrayscale(POLY_XLU_DISP++, true); - gSPDisplayList(POLY_XLU_DISP++, (Gfx*)gGiBlueFireFlameDL); - gSPGrayscale(POLY_XLU_DISP++, false); - Matrix_Pop(); - } - + gDPSetGrayscaleColor(POLY_XLU_DISP++, flameColors[slot][0], flameColors[slot][1], flameColors[slot][2], 255); + gSPGrayscale(POLY_XLU_DISP++, true); + gSPDisplayList(POLY_XLU_DISP++, (Gfx*)gGiBlueFireFlameDL); + gSPGrayscale(POLY_XLU_DISP++, false); + Matrix_Pop(); CLOSE_DISPS(play->state.gfxCtx); + // Draw the generic boss soul model + if (CVarGetInteger(CVAR_RANDOMIZER_ENHANCEMENT("SimplerBossSoulModels"), 0)) { + OPEN_DISPS(play->state.gfxCtx); + gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(play->state.gfxCtx, (char*)__FILE__, __LINE__), + G_MTX_MODELVIEW | G_MTX_LOAD); + if (slot == 8) { // For Ganon only... + gDPSetEnvColor(POLY_XLU_DISP++, 0, 0, 0, 255); + } else { + gDPSetEnvColor(POLY_XLU_DISP++, 255, 255, 255, 255); + } + gSPDisplayList(POLY_XLU_DISP++, (Gfx*)gBossSoulSkullDL); + CLOSE_DISPS(play->state.gfxCtx); + // Draw the boss' skeleton + } else { + switch (slot) { + case 0: // Gohma + DrawGohma(play); + break; + case 1: // King Dodongo + DrawKingDodongo(play); + break; + case 2: // Barinade + DrawBarinade(play); + break; + case 3: // Phantom Ganon + DrawPhantomGanon(play); + break; + case 4: // Volvagia + DrawVolvagia(play); + break; + case 5: // Morpha + DrawMorpha(play); + break; + case 6: // Bongo Bongo + DrawBongoBongo(play); + break; + case 7: // Twinrova + DrawKotake(play); + break; + case 8: // Ganon + DrawGanon(play); + break; + default: + break; + } + } } extern "C" void Randomizer_DrawOcarinaButton(PlayState* play, GetItemEntry* getItemEntry) { @@ -545,52 +1179,68 @@ extern "C" void Randomizer_DrawFishingPoleGI(PlayState* play, GetItemEntry* getI CLOSE_DISPS(play->state.gfxCtx); } -int skeletonKeyHue = 0; - -// Runs every frame to update rainbow hue, taken from CosmeticsEditor.cpp. -Color_RGBA8 GetSkeletonKeyColor() { - float rainbowSpeed = 0.6f; - - float frequency = 2 * M_PI / (360 * rainbowSpeed); - Color_RGBA8 color; - color.r = sin(frequency * skeletonKeyHue + 0) * 127 + 128; - color.g = sin(frequency * skeletonKeyHue + (2 * M_PI / 3)) * 127 + 128; - color.b = sin(frequency * skeletonKeyHue + (4 * M_PI / 3)) * 127 + 128; - color.a = 255; - - skeletonKeyHue++; - if (skeletonKeyHue >= (360 * rainbowSpeed)) skeletonKeyHue = 0; - - return color; -} - -int skeletonKeyRotation = 0; extern "C" void Randomizer_DrawSkeletonKey(PlayState* play, GetItemEntry* getItemEntry) { OPEN_DISPS(play->state.gfxCtx); - Color_RGBA8 color = GetSkeletonKeyColor(); - Gfx_SetupDL_25Opa(play->state.gfxCtx); - skeletonKeyRotation += 1; - - if (skeletonKeyRotation > 40) { - skeletonKeyRotation -= 80; - } - - Matrix_RotateZ(M_PI / 40 * skeletonKeyRotation, MTXMODE_APPLY); - Matrix_RotateY(M_PI / 40 * skeletonKeyRotation, MTXMODE_APPLY); - gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(play->state.gfxCtx, (char*)__FILE__, __LINE__), G_MTX_MODELVIEW | G_MTX_LOAD); - gDPSetGrayscaleColor(POLY_OPA_DISP++, color.r, color.g, color.b, color.a); - gSPGrayscale(POLY_OPA_DISP++, true); - - gSPDisplayList(POLY_OPA_DISP++, (Gfx*)gGiSmallKeyDL); - - gSPGrayscale(POLY_OPA_DISP++, false); + Color_RGB8 keyColor = { 255, 255, 170 }; + keyColor = CVarGetColor24(CVAR_COSMETIC("Key.Skeleton.Value"), keyColor); + gDPSetEnvColor(POLY_OPA_DISP++, keyColor.r, keyColor.g, keyColor.b, 255); + gSPDisplayList(POLY_OPA_DISP++, (Gfx*)gSkeletonKeyDL); CLOSE_DISPS(play->state.gfxCtx); -} \ No newline at end of file +} + +extern "C" void Randomizer_DrawBombchuBag(PlayState* play, GetItemEntry* getItemEntry){ + OPEN_DISPS(play->state.gfxCtx); + + Gfx_SetupDL_26Opa(play->state.gfxCtx); + gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(play->state.gfxCtx, (char*)__FILE__, __LINE__), + G_MTX_MODELVIEW | G_MTX_LOAD); + + Color_RGB8 maskColor = { 0, 100, 150 }; + maskColor = CVarGetColor24(CVAR_COSMETIC("Equipment.ChuFace.Value"), maskColor); + gDPSetEnvColor(POLY_OPA_DISP++, maskColor.r, maskColor.g, maskColor.b, 255); + + gSPDisplayList(POLY_OPA_DISP++, (Gfx*)gBombchuBagMaskDL); + + Color_RGB8 bodyColor = { 180, 130, 50 }; + bodyColor = CVarGetColor24(CVAR_COSMETIC("Equipment.ChuBody.Value"), bodyColor); + gDPSetEnvColor(POLY_OPA_DISP++, bodyColor.r, bodyColor.g, bodyColor.b, 255); + + gSPDisplayList(POLY_OPA_DISP++, (Gfx*)gBombchuBagBodyDL); + CLOSE_DISPS(play->state.gfxCtx); +} + +extern "C" void Randomizer_DrawBombchuBagInLogic(PlayState* play, GetItemEntry* getItemEntry) { + if(IS_RANDO && OTRGlobals::Instance->gRandomizer->GetRandoSettingValue(RSK_BOMBCHU_BAG)){ + Randomizer_DrawBombchuBag(play, getItemEntry); + } else { + OPEN_DISPS(play->state.gfxCtx); + Gfx_SetupDL_26Opa(play->state.gfxCtx); + gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(play->state.gfxCtx, (char*)__FILE__, __LINE__), + G_MTX_MODELVIEW | G_MTX_LOAD); + gSPDisplayList(POLY_OPA_DISP++, (Gfx*)gGiBombchuDL); + CLOSE_DISPS(play->state.gfxCtx); + } +} + +extern "C" void Randomizer_DrawOverworldKey(PlayState* play, GetItemEntry* getItemEntry) { + OPEN_DISPS(play->state.gfxCtx); + + Gfx_SetupDL_25Opa(play->state.gfxCtx); + + gDPSetPrimColor(POLY_OPA_DISP++, 0, 0, 255, 255, 255, 255); + gDPSetEnvColor(POLY_OPA_DISP++, 255, 255, 255, 255); + gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(play->state.gfxCtx, (char*)__FILE__, __LINE__), + G_MTX_MODELVIEW | G_MTX_LOAD); + + gSPDisplayList(POLY_OPA_DISP++, (Gfx*)gHouseKeyDL); + + CLOSE_DISPS(play->state.gfxCtx); +} diff --git a/soh/soh/Enhancements/randomizer/draw.h b/soh/soh/Enhancements/randomizer/draw.h index 538494685..3fc5c86b4 100644 --- a/soh/soh/Enhancements/randomizer/draw.h +++ b/soh/soh/Enhancements/randomizer/draw.h @@ -23,6 +23,9 @@ void Randomizer_DrawBronzeScale(PlayState* play, GetItemEntry* getItemEntry); void Randomizer_DrawFishingPoleGI(PlayState* play, GetItemEntry* getItemEntry); void Randomizer_DrawSkeletonKey(PlayState* play, GetItemEntry* getItemEntry); void Randomizer_DrawMysteryItem(PlayState* play, GetItemEntry getItemEntry); +void Randomizer_DrawBombchuBagInLogic(PlayState* play, GetItemEntry* getItemEntry); +void Randomizer_DrawBombchuBag(PlayState* play, GetItemEntry* getItemEntry); +void Randomizer_DrawOverworldKey(PlayState* play, GetItemEntry* getItemEntry); #define GET_ITEM_MYSTERY \ { ITEM_NONE_FE, 0, 0, 0, 0, MOD_RANDOMIZER, MOD_RANDOMIZER, ITEM_NONE_FE, 0, false, ITEM_FROM_NPC, ITEM_CATEGORY_JUNK, ITEM_NONE_FE, MOD_RANDOMIZER, (CustomDrawFunc)Randomizer_DrawMysteryItem } diff --git a/soh/soh/Enhancements/randomizer/dungeon.cpp b/soh/soh/Enhancements/randomizer/dungeon.cpp index 85afc0d3e..d83bc9251 100644 --- a/soh/soh/Enhancements/randomizer/dungeon.cpp +++ b/soh/soh/Enhancements/randomizer/dungeon.cpp @@ -148,8 +148,8 @@ void DungeonInfo::PlaceVanillaSmallKeys() const { // Gets the chosen dungeon locations for a playthrough (so either MQ or Vanilla) std::vector DungeonInfo::GetDungeonLocations() const { auto locations = masterQuest ? mqLocations : vanillaLocations; - if (Context::GetInstance()->GetSettings()->GetOption(RSK_SHUFFLE_POTS).Is(RO_SHUFFLE_POTS_DUNGEONS) || - Context::GetInstance()->GetSettings()->GetOption(RSK_SHUFFLE_POTS).Is(RO_SHUFFLE_POTS_ALL)) { + if (Context::GetInstance()->GetOption(RSK_SHUFFLE_POTS).Is(RO_SHUFFLE_POTS_DUNGEONS) || + Context::GetInstance()->GetOption(RSK_SHUFFLE_POTS).Is(RO_SHUFFLE_POTS_ALL)) { auto potLocations = masterQuest ? mqPots : vanillaPots; AddElementsToPool(locations, potLocations); } diff --git a/soh/soh/Enhancements/randomizer/entrance.cpp b/soh/soh/Enhancements/randomizer/entrance.cpp index 1e28aa2c3..81afbf33c 100644 --- a/soh/soh/Enhancements/randomizer/entrance.cpp +++ b/soh/soh/Enhancements/randomizer/entrance.cpp @@ -20,15 +20,11 @@ void Entrance::SetCondition(ConditionFn newCondition) { } bool Entrance::GetConditionsMet() const { - auto ctx = Rando::Context::GetInstance(); - if (ctx->GetOption(RSK_LOGIC_RULES).Is(RO_LOGIC_NO_LOGIC) || ctx->GetOption(RSK_LOGIC_RULES).Is(RO_LOGIC_VANILLA)) { - return true; - } else if (ctx->GetOption(RSK_LOGIC_RULES).Is(RO_LOGIC_GLITCHLESS)) { - return condition_function(); - } else if (ctx->GetOption(RSK_LOGIC_RULES).Is(RO_LOGIC_GLITCHED)) { - return condition_function(); - } - return false; + auto ctx = Rando::Context::GetInstance(); + if (ctx->GetOption(RSK_LOGIC_RULES).Is(RO_LOGIC_GLITCHLESS)) { + return condition_function(); + } + return true; } std::string Entrance::to_string() const { @@ -536,10 +532,10 @@ static bool ValidateWorld(Entrance* entrancePlaced) { // The player should be able to get back to ToT after going through time, without having collected any items // This is important to ensure that the player never loses access to the pedestal after going through time - if (ctx->GetSettings()->ResolvedStartingAge() == RO_AGE_CHILD && !RegionTable(RR_TEMPLE_OF_TIME)->Adult()) { + if (ctx->GetOption(RSK_SELECTED_STARTING_AGE).Is(RO_AGE_CHILD) && !RegionTable(RR_TEMPLE_OF_TIME)->Adult()) { SPDLOG_DEBUG("Path to Temple of Time as adult is not guaranteed\n"); return false; - } else if (ctx->GetSettings()->ResolvedStartingAge() == RO_AGE_ADULT && + } else if (ctx->GetOption(RSK_SELECTED_STARTING_AGE).Is(RO_AGE_ADULT) && !RegionTable(RR_TEMPLE_OF_TIME)->Child()) { SPDLOG_DEBUG("Path to Temple of Time as child is not guaranteed\n"); return false; @@ -1322,12 +1318,12 @@ int EntranceShuffler::ShuffleAllEntrances() { (ctx->GetOption(RSK_MIX_OVERWORLD_ENTRANCES) ? 1 : 0) + (ctx->GetOption(RSK_MIX_INTERIOR_ENTRANCES) ? 1 : 0) + (ctx->GetOption(RSK_MIX_GROTTO_ENTRANCES) ? 1 : 0); if (totalMixedPools < 2) { - ctx->GetOption(RSK_MIXED_ENTRANCE_POOLS).SetContextIndex(RO_GENERIC_OFF); - ctx->GetOption(RSK_MIX_DUNGEON_ENTRANCES).SetContextIndex(RO_GENERIC_OFF); - ctx->GetOption(RSK_MIX_BOSS_ENTRANCES).SetContextIndex(RO_GENERIC_OFF); - ctx->GetOption(RSK_MIX_OVERWORLD_ENTRANCES).SetContextIndex(RO_GENERIC_OFF); - ctx->GetOption(RSK_MIX_INTERIOR_ENTRANCES).SetContextIndex(RO_GENERIC_OFF); - ctx->GetOption(RSK_MIX_GROTTO_ENTRANCES).SetContextIndex(RO_GENERIC_OFF); + ctx->GetOption(RSK_MIXED_ENTRANCE_POOLS).Set(RO_GENERIC_OFF); + ctx->GetOption(RSK_MIX_DUNGEON_ENTRANCES).Set(RO_GENERIC_OFF); + ctx->GetOption(RSK_MIX_BOSS_ENTRANCES).Set(RO_GENERIC_OFF); + ctx->GetOption(RSK_MIX_OVERWORLD_ENTRANCES).Set(RO_GENERIC_OFF); + ctx->GetOption(RSK_MIX_INTERIOR_ENTRANCES).Set(RO_GENERIC_OFF); + ctx->GetOption(RSK_MIX_GROTTO_ENTRANCES).Set(RO_GENERIC_OFF); } if (ctx->GetOption(RSK_MIXED_ENTRANCE_POOLS)) { std::set poolsToMix = {}; diff --git a/soh/soh/Enhancements/randomizer/fishsanity.cpp b/soh/soh/Enhancements/randomizer/fishsanity.cpp index f3ff89d70..2769faf31 100644 --- a/soh/soh/Enhancements/randomizer/fishsanity.cpp +++ b/soh/soh/Enhancements/randomizer/fishsanity.cpp @@ -17,7 +17,7 @@ extern PlayState* gPlayState; #define FSi OTRGlobals::Instance->gRandoContext->GetFishsanity() -#define RAND_GET_OPTION(option) Rando::Context::GetInstance()->GetOption(option).GetContextOptionIndex() +#define RAND_GET_OPTION(option) Rando::Context::GetInstance()->GetOption(option).Get() /** * @brief Parallel list of pond fish checks for both ages @@ -440,7 +440,7 @@ namespace Rando { // Reset fish group counter when the group gets culled if (actor->id == ACTOR_OBJ_MURE && gPlayState->sceneNum == SCENE_ZORAS_DOMAIN && fishGroupCounter > 0 && - !(actor->flags & ACTOR_FLAG_UPDATE_WHILE_CULLED) && fs->GetOverworldFishShuffled()) { + !(actor->flags & ACTOR_FLAG_UPDATE_CULLING_DISABLED) && fs->GetOverworldFishShuffled()) { fishGroupCounter = 0; } } diff --git a/soh/soh/Enhancements/randomizer/hint.cpp b/soh/soh/Enhancements/randomizer/hint.cpp index e248eebe0..29a9a969f 100644 --- a/soh/soh/Enhancements/randomizer/hint.cpp +++ b/soh/soh/Enhancements/randomizer/hint.cpp @@ -559,23 +559,23 @@ CustomMessage Hint::GetBridgeReqsText() { } else if (ctx->GetOption(RSK_RAINBOW_BRIDGE).Is(RO_BRIDGE_STONES)) { bridgeMessage = StaticData::hintTextTable[RHT_BRIDGE_STONES_HINT].GetHintMessage(); - bridgeMessage.InsertNumber(ctx->GetOption(RSK_RAINBOW_BRIDGE_STONE_COUNT).GetContextOptionIndex()); + bridgeMessage.InsertNumber(ctx->GetOption(RSK_RAINBOW_BRIDGE_STONE_COUNT).Get()); } else if (ctx->GetOption(RSK_RAINBOW_BRIDGE).Is(RO_BRIDGE_MEDALLIONS)) { bridgeMessage = StaticData::hintTextTable[RHT_BRIDGE_MEDALLIONS_HINT].GetHintMessage(); - bridgeMessage.InsertNumber(ctx->GetOption(RSK_RAINBOW_BRIDGE_MEDALLION_COUNT).GetContextOptionIndex()); + bridgeMessage.InsertNumber(ctx->GetOption(RSK_RAINBOW_BRIDGE_MEDALLION_COUNT).Get()); } else if (ctx->GetOption(RSK_RAINBOW_BRIDGE).Is(RO_BRIDGE_DUNGEON_REWARDS)) { bridgeMessage = StaticData::hintTextTable[RHT_BRIDGE_REWARDS_HINT].GetHintMessage(); - bridgeMessage.InsertNumber(ctx->GetOption(RSK_RAINBOW_BRIDGE_REWARD_COUNT).GetContextOptionIndex()); + bridgeMessage.InsertNumber(ctx->GetOption(RSK_RAINBOW_BRIDGE_REWARD_COUNT).Get()); } else if (ctx->GetOption(RSK_RAINBOW_BRIDGE).Is(RO_BRIDGE_DUNGEONS)) { bridgeMessage = StaticData::hintTextTable[RHT_BRIDGE_DUNGEONS_HINT].GetHintMessage(); - bridgeMessage.InsertNumber(ctx->GetOption(RSK_RAINBOW_BRIDGE_DUNGEON_COUNT).GetContextOptionIndex()); + bridgeMessage.InsertNumber(ctx->GetOption(RSK_RAINBOW_BRIDGE_DUNGEON_COUNT).Get()); } else if (ctx->GetOption(RSK_RAINBOW_BRIDGE).Is(RO_BRIDGE_TOKENS)) { bridgeMessage = StaticData::hintTextTable[RHT_BRIDGE_TOKENS_HINT].GetHintMessage(); - bridgeMessage.InsertNumber(ctx->GetOption(RSK_RAINBOW_BRIDGE_TOKEN_COUNT).GetContextOptionIndex()); + bridgeMessage.InsertNumber(ctx->GetOption(RSK_RAINBOW_BRIDGE_TOKEN_COUNT).Get()); } else if (ctx->GetOption(RSK_RAINBOW_BRIDGE).Is(RO_BRIDGE_GREG)) { return StaticData::hintTextTable[RHT_BRIDGE_GREG_HINT].GetHintMessage(); @@ -613,23 +613,23 @@ CustomMessage Hint::GetGanonBossKeyText() { } else if (ctx->GetOption(RSK_GANONS_BOSS_KEY).Is(RO_GANON_BOSS_KEY_LACS_STONES)) { ganonBossKeyMessage = StaticData::hintTextTable[RHT_LACS_STONES_HINT].GetHintMessage(); - ganonBossKeyMessage.InsertNumber(ctx->GetOption(RSK_LACS_STONE_COUNT).GetContextOptionIndex()); + ganonBossKeyMessage.InsertNumber(ctx->GetOption(RSK_LACS_STONE_COUNT).Get()); } else if (ctx->GetOption(RSK_GANONS_BOSS_KEY).Is(RO_GANON_BOSS_KEY_LACS_MEDALLIONS)) { ganonBossKeyMessage = StaticData::hintTextTable[RHT_LACS_MEDALLIONS_HINT].GetHintMessage(); - ganonBossKeyMessage.InsertNumber(ctx->GetOption(RSK_LACS_MEDALLION_COUNT).GetContextOptionIndex()); + ganonBossKeyMessage.InsertNumber(ctx->GetOption(RSK_LACS_MEDALLION_COUNT).Get()); } else if (ctx->GetOption(RSK_GANONS_BOSS_KEY).Is(RO_GANON_BOSS_KEY_LACS_REWARDS)) { ganonBossKeyMessage = StaticData::hintTextTable[RHT_LACS_REWARDS_HINT].GetHintMessage(); - ganonBossKeyMessage.InsertNumber(ctx->GetOption(RSK_LACS_REWARD_COUNT).GetContextOptionIndex()); + ganonBossKeyMessage.InsertNumber(ctx->GetOption(RSK_LACS_REWARD_COUNT).Get()); } else if (ctx->GetOption(RSK_GANONS_BOSS_KEY).Is(RO_GANON_BOSS_KEY_LACS_DUNGEONS)) { ganonBossKeyMessage = StaticData::hintTextTable[RHT_LACS_DUNGEONS_HINT].GetHintMessage(); - ganonBossKeyMessage.InsertNumber(ctx->GetOption(RSK_LACS_DUNGEON_COUNT).GetContextOptionIndex()); + ganonBossKeyMessage.InsertNumber(ctx->GetOption(RSK_LACS_DUNGEON_COUNT).Get()); } else if (ctx->GetOption(RSK_GANONS_BOSS_KEY).Is(RO_GANON_BOSS_KEY_LACS_TOKENS)) { ganonBossKeyMessage = StaticData::hintTextTable[RHT_LACS_TOKENS_HINT].GetHintMessage(); - ganonBossKeyMessage.InsertNumber(ctx->GetOption(RSK_LACS_TOKEN_COUNT).GetContextOptionIndex()); + ganonBossKeyMessage.InsertNumber(ctx->GetOption(RSK_LACS_TOKEN_COUNT).Get()); } else if (ctx->GetOption(RSK_GANONS_BOSS_KEY).Is(RO_GANON_BOSS_KEY_TRIFORCE_HUNT)) { return StaticData::hintTextTable[RHT_GANON_BK_TRIFORCE_HINT].GetHintMessage(); diff --git a/soh/soh/Enhancements/randomizer/hook_handlers.cpp b/soh/soh/Enhancements/randomizer/hook_handlers.cpp index 409fa45d1..e323e810a 100644 --- a/soh/soh/Enhancements/randomizer/hook_handlers.cpp +++ b/soh/soh/Enhancements/randomizer/hook_handlers.cpp @@ -12,7 +12,7 @@ #include "soh/Enhancements/randomizer/ShuffleFreestanding.h" #include "soh/Enhancements/game-interactor/GameInteractor.h" #include "soh/Enhancements/game-interactor/GameInteractor_Hooks.h" -#include "soh/ImGuiUtils.h" +#include "soh/SohGui/ImGuiUtils.h" #include "soh/Notification/Notification.h" #include "soh/SaveManager.h" #include "soh/Enhancements/randomizer/ShuffleFairies.h" @@ -69,7 +69,7 @@ extern void EnMk_Wait(EnMk* enMk, PlayState* play); extern void func_80ABA778(EnNiwLady* enNiwLady, PlayState* play); } -#define RAND_GET_OPTION(option) Rando::Context::GetInstance()->GetOption(option).GetContextOptionIndex() +#define RAND_GET_OPTION(option) Rando::Context::GetInstance()->GetOption(option).Get() bool LocMatchesQuest(Rando::Location loc) { if (loc.GetQuest() == RCQUEST_BOTH) { @@ -273,11 +273,14 @@ void RandomizerOnPlayerUpdateForRCQueueHandler() { RandomizerCheck rc = randomizerQueuedChecks.front(); auto loc = Rando::Context::GetInstance()->GetItemLocation(rc); - GetItemEntry getItemEntry = Rando::Context::GetInstance()->GetFinalGIEntry(rc, true, (GetItemID)Rando::StaticData::GetLocation(rc)->GetVanillaItem()); + RandomizerGet vanillaRandomizerGet = Rando::StaticData::GetLocation(rc)->GetVanillaItem(); + GetItemID vanillaItem = (GetItemID)Rando::StaticData::RetrieveItem(vanillaRandomizerGet).GetItemID(); + GetItemEntry getItemEntry = Rando::Context::GetInstance()->GetFinalGIEntry(rc, true, (GetItemID)vanillaRandomizerGet); if (loc->HasObtained()) { SPDLOG_INFO("RC {} already obtained, skipping", static_cast(rc)); } else { + iceTrapScale = 0.0f; randomizerQueuedCheck = rc; randomizerQueuedItemEntry = getItemEntry; SPDLOG_INFO("Queueing Item mod {} item {} from RC {}", getItemEntry.modIndex, getItemEntry.itemId, static_cast(rc)); @@ -405,7 +408,8 @@ void EnItem00_DrawRandomizedItem(EnItem00* enItem00, PlayState* play) { f32 mtxScale = CVarGetFloat(CVAR_ENHANCEMENT("TimeSavers.SkipGetItemAnimationScale"), 10.0f); Matrix_Scale(mtxScale, mtxScale, mtxScale, MTXMODE_APPLY); GetItemEntry randoItem = enItem00->itemEntry; - if (CVarGetInteger(CVAR_RANDOMIZER_ENHANCEMENT("MysteriousShuffle"), 0)) { + if (CVarGetInteger(CVAR_RANDOMIZER_ENHANCEMENT("MysteriousShuffle"), 0) && + enItem00->actor.params != ITEM00_SOH_GIVE_ITEM_ENTRY) { randoItem = GET_ITEM_MYSTERY; } EnItem00_CustomItemsParticles(&enItem00->actor, play, randoItem); @@ -643,7 +647,7 @@ void RandomizerOnDialogMessageHandler() { MessageContext *msgCtx = &gPlayState->msgCtx; Actor *actor = msgCtx->talkActor; auto ctx = Rando::Context::GetInstance(); - bool revealMerchant = ctx->GetOption(RSK_MERCHANT_TEXT_HINT).GetContextOptionIndex() != RO_GENERIC_OFF; + bool revealMerchant = ctx->GetOption(RSK_MERCHANT_TEXT_HINT).Get() != RO_GENERIC_OFF; bool nonBeanMerchants = ctx->GetOption(RSK_SHUFFLE_MERCHANTS).Is(RO_SHUFFLE_MERCHANTS_ALL_BUT_BEANS) || ctx->GetOption(RSK_SHUFFLE_MERCHANTS).Is(RO_SHUFFLE_MERCHANTS_ALL); @@ -712,7 +716,7 @@ void RandomizerOnDialogMessageHandler() { } break; case TEXT_SCRUB_RANDOM: - if (ctx->GetOption(RSK_SCRUB_TEXT_HINT).GetContextOptionIndex() != RO_GENERIC_OFF) { + if (ctx->GetOption(RSK_SCRUB_TEXT_HINT).Get() != RO_GENERIC_OFF) { EnDns* enDns = (EnDns*)actor; reveal = OTRGlobals::Instance->gRandomizer->GetCheckFromRandomizerInf((RandomizerInf)enDns->sohScrubIdentity.randomizerInf); } @@ -1010,7 +1014,7 @@ void RandomizerOnVanillaBehaviorHandler(GIVanillaBehavior id, bool* should, va_l Item_Give(gPlayState, item00->itemEntry.itemId); } else if (item00->itemEntry.modIndex == MOD_RANDOMIZER) { if (item00->itemEntry.getItemId == RG_ICE_TRAP) { - gSaveContext.pendingIceTrapCount++; + gSaveContext.ship.pendingIceTrapCount++; } else { Randomizer_Item_Give(gPlayState, item00->itemEntry); } @@ -1112,14 +1116,14 @@ void RandomizerOnVanillaBehaviorHandler(GIVanillaBehavior id, bool* should, va_l enJs->actor.parent = NULL; enJs->actor.textId = TEXT_CARPET_SALESMAN_ARMS_DEALER; enJs->actionFunc = (EnJsActionFunc)func_80A890C0; - enJs->actor.flags |= ACTOR_FLAG_WILL_TALK; + enJs->actor.flags |= ACTOR_FLAG_TALK_OFFER_AUTO_ACCEPTED; Flags_SetRandomizerInf(RAND_INF_MERCHANTS_CARPET_SALESMAN); *should = true; } break; } case VB_GIVE_BOMBCHUS_FROM_CARPET_SALESMAN: { - *should = RAND_GET_OPTION(RSK_BOMBCHUS_IN_LOGIC) == false || INV_CONTENT(ITEM_BOMBCHU) == ITEM_BOMBCHU; + *should = RAND_GET_OPTION(RSK_BOMBCHU_BAG) == false || INV_CONTENT(ITEM_BOMBCHU) == ITEM_BOMBCHU; break; } case VB_CHECK_RANDO_PRICE_OF_MEDIGORON: { @@ -1195,7 +1199,7 @@ void RandomizerOnVanillaBehaviorHandler(GIVanillaBehavior id, bool* should, va_l Flags_SetItemGetInf(ITEMGETINF_30); granny->actor.textId = 0x504F; granny->actionFunc = (EnDsActionFunc)EnDs_TalkAfterGiveOddPotion; - granny->actor.flags &= ~ACTOR_FLAG_PLAYER_TALKED_TO; + granny->actor.flags &= ~ACTOR_FLAG_TALK; *should = false; break; } @@ -1533,7 +1537,7 @@ void RandomizerOnVanillaBehaviorHandler(GIVanillaBehavior id, bool* should, va_l case VB_BE_ABLE_TO_PLAY_BOMBCHU_BOWLING: { // Only check for bomb bag when bombchus aren't in logic // and only check for bombchus when bombchus are in logic - *should = INV_CONTENT((RAND_GET_OPTION(RSK_BOMBCHUS_IN_LOGIC) ? ITEM_BOMBCHU : ITEM_BOMB)) != ITEM_NONE; + *should = INV_CONTENT((RAND_GET_OPTION(RSK_BOMBCHU_BAG) ? ITEM_BOMBCHU : ITEM_BOMB)) != ITEM_NONE; break; } case VB_SHOULD_CHECK_FOR_FISHING_RECORD: { @@ -1585,7 +1589,7 @@ void RandomizerOnVanillaBehaviorHandler(GIVanillaBehavior id, bool* should, va_l case VB_TRADE_TIMER_EYEDROPS:{ EnMk* enMk = va_arg(args, EnMk*); Flags_SetRandomizerInf(RAND_INF_ADULT_TRADES_LH_TRADE_FROG); - enMk->actor.flags &= ~ACTOR_FLAG_WILL_TALK; + enMk->actor.flags &= ~ACTOR_FLAG_TALK_OFFER_AUTO_ACCEPTED; enMk->actionFunc = EnMk_Wait; enMk->flags |= 1; *should = false; @@ -1631,6 +1635,12 @@ void RandomizerOnVanillaBehaviorHandler(GIVanillaBehavior id, bool* should, va_l } break; } + case VB_HEALTH_METER_BE_CRITICAL: { + if (gSaveContext.health == gSaveContext.healthCapacity) { + *should = false; + } + break; + } case VB_FREEZE_ON_SKULL_TOKEN: case VB_TRADE_TIMER_ODD_MUSHROOM: case VB_TRADE_TIMER_FROG: @@ -2362,6 +2372,8 @@ void RandomizerRegisterHooks() { static uint32_t shuffleFreestandingOnVanillaBehaviorHook = 0; GameInteractor::Instance->RegisterGameHook([](int32_t fileNum) { + ShipInit::Init("IS_RANDO"); + randomizerQueuedChecks = std::queue(); randomizerQueuedCheck = RC_UNKNOWN_CHECK; randomizerQueuedItemEntry = GET_ITEM_NONE; @@ -2392,7 +2404,7 @@ void RandomizerRegisterHooks() { GameInteractor::Instance->UnregisterGameHook(shufflePotsOnActorInitHook); GameInteractor::Instance->UnregisterGameHook(shufflePotsOnVanillaBehaviorHook); - GameInteractor::Instance->UnregisterGameHook(shuffleFreestandingOnVanillaBehaviorHook); + GameInteractor::Instance->UnregisterGameHook(shuffleFreestandingOnVanillaBehaviorHook); onFlagSetHook = 0; onSceneFlagSetHook = 0; diff --git a/soh/soh/Enhancements/randomizer/item.cpp b/soh/soh/Enhancements/randomizer/item.cpp index 5f94ad6e4..6f0309223 100644 --- a/soh/soh/Enhancements/randomizer/item.cpp +++ b/soh/soh/Enhancements/randomizer/item.cpp @@ -340,13 +340,11 @@ std::shared_ptr Item::GetGIEntry() const { // NOLINT(*-no-recursio break; case RG_PROGRESSIVE_BOMBCHUS: if (logic->CurrentInventory(ITEM_BOMBCHU) == ITEM_NONE) { - actual = RG_BOMBCHU_20; + actual = RG_BOMBCHU_BAG; } else if (infiniteUpgrades != RO_INF_UPGRADES_OFF) { actual = RG_BOMBCHU_INF; - } else if (logic->GetAmmo(ITEM_BOMBCHU) < 5) { - actual = RG_BOMBCHU_10; } else { - actual = RG_BOMBCHU_5; + actual = RG_BOMBCHU_10; } break; default: @@ -385,7 +383,7 @@ bool Item::IsBottleItem() const { bool Item::IsMajorItem() const { const auto ctx = Context::GetInstance(); if (type == ITEMTYPE_TOKEN) { - return ctx->GetOption(RSK_RAINBOW_BRIDGE).Is(RO_BRIDGE_TOKENS) || ctx->GetSettings()->LACSCondition() == RO_LACS_TOKENS; + return ctx->GetOption(RSK_RAINBOW_BRIDGE).Is(RO_BRIDGE_TOKENS) || ctx->LACSCondition() == RO_LACS_TOKENS; } if (type == ITEMTYPE_DROP || type == ITEMTYPE_EVENT || type == ITEMTYPE_SHOP || type == ITEMTYPE_MAP || @@ -398,7 +396,7 @@ bool Item::IsMajorItem() const { } if ((randomizerGet == RG_BOMBCHU_5 || randomizerGet == RG_BOMBCHU_10 || randomizerGet == RG_BOMBCHU_20) && - !ctx->GetOption(RSK_BOMBCHUS_IN_LOGIC)) { + !ctx->GetOption(RSK_BOMBCHU_BAG)) { return false; } diff --git a/soh/soh/Enhancements/randomizer/item_list.cpp b/soh/soh/Enhancements/randomizer/item_list.cpp index 2fbcc0ccc..0b94aab39 100644 --- a/soh/soh/Enhancements/randomizer/item_list.cpp +++ b/soh/soh/Enhancements/randomizer/item_list.cpp @@ -66,7 +66,7 @@ void Rando::StaticData::InitItemTable() { itemTable[RG_PROGRESSIVE_SCALE] = Item(RG_PROGRESSIVE_SCALE, Text{ "Progressive Scale", "Écaille (prog.)", "Progressive Schuppe" }, ITEMTYPE_ITEM, 0x86, true, LOGIC_PROGRESSIVE_SCALE, RHT_PROGRESSIVE_SCALE, true); itemTable[RG_PROGRESSIVE_NUT_UPGRADE] = Item(RG_PROGRESSIVE_NUT_UPGRADE, Text{ "Progressive Nut Capacity", "Capacité de Noix (prog.)", "Progressive Nuß-Kapazität" }, ITEMTYPE_ITEM, 0x87, true, LOGIC_PROGRESSIVE_NUT_BAG, RHT_PROGRESSIVE_NUT_UPGRADE, true); itemTable[RG_PROGRESSIVE_STICK_UPGRADE] = Item(RG_PROGRESSIVE_STICK_UPGRADE, Text{ "Progressive Stick Capacity", "Capacité de Bâtons (prog.)", "Progressive Stab-Kapazität" }, ITEMTYPE_ITEM, 0x88, true, LOGIC_PROGRESSIVE_STICK_BAG, RHT_PROGRESSIVE_STICK_UPGRADE, true); - itemTable[RG_PROGRESSIVE_BOMBCHUS] = Item(RG_PROGRESSIVE_BOMBCHUS, Text{ "Progressive Bombchu", "Missiles (prog.)", "Progressive Krabbelminen" }, ITEMTYPE_ITEM, 0x89, true, LOGIC_BOMBCHUS, RHT_PROGRESSIVE_BOMBCHUS, RG_PROGRESSIVE_BOMBCHUS, OBJECT_GI_BOMB_2, GID_BOMBCHU, 0x33, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_RANDOMIZER, true); + itemTable[RG_PROGRESSIVE_BOMBCHUS] = Item(RG_PROGRESSIVE_BOMBCHUS, Text{ "Progressive Bombchu", "Missiles (prog.)", "Progressive Krabbelminen" }, ITEMTYPE_ITEM, 0x89, true, LOGIC_BOMBCHUS, RHT_PROGRESSIVE_BOMBCHUS, true); itemTable[RG_PROGRESSIVE_MAGIC_METER] = Item(RG_PROGRESSIVE_MAGIC_METER, Text{ "Progressive Magic Meter", "Jauge de Magie (prog.)", "Progressives Magisches Maß" }, ITEMTYPE_ITEM, 0x8A, true, LOGIC_PROGRESSIVE_MAGIC, RHT_PROGRESSIVE_MAGIC_METER, true); itemTable[RG_PROGRESSIVE_OCARINA] = Item(RG_PROGRESSIVE_OCARINA, Text{ "Progressive Ocarina", "Ocarina (prog.)", "Progressive Okarina" }, ITEMTYPE_ITEM, 0x8B, true, LOGIC_PROGRESSIVE_OCARINA, RHT_PROGRESSIVE_OCARINA, true); itemTable[RG_PROGRESSIVE_GORONSWORD] = Item(RG_PROGRESSIVE_GORONSWORD, Text{ "Progressive Goron Sword", "Épée Goron (prog.)", "Progressives Goronen-Schwert" }, ITEMTYPE_ITEM, 0xD4, true, LOGIC_PROGRESSIVE_GIANT_KNIFE, RHT_PROGRESSIVE_GORONSWORD, true); @@ -159,6 +159,54 @@ void Rando::StaticData::InitItemTable() { itemTable[RG_GANONS_CASTLE_SMALL_KEY] = Item(RG_GANONS_CASTLE_SMALL_KEY, Text{ "Ganon's Castle Small Key", "Petite Clé du Château de Ganon", "Kleiner Schlüssel für Ganons Schloß" }, ITEMTYPE_SMALLKEY, 0xB7, true, LOGIC_GANONS_CASTLE_KEYS, RHT_GANONS_CASTLE_SMALL_KEY, RG_GANONS_CASTLE_SMALL_KEY, OBJECT_GI_KEY, GID_KEY_SMALL, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_SHORT, ITEM_CATEGORY_SMALL_KEY,MOD_RANDOMIZER); itemTable[RG_GANONS_CASTLE_SMALL_KEY].SetCustomDrawFunc(Randomizer_DrawSmallKey); itemTable[RG_TREASURE_GAME_SMALL_KEY] = Item(RG_TREASURE_GAME_SMALL_KEY, Text{ "Chest Game Small Key", "Petite Clé du jeu la Chasse-aux-Trésors", "Kleiner Schlüssel für das Truhenspiel" }, ITEMTYPE_SMALLKEY, GI_DOOR_KEY, true, LOGIC_TREASURE_GAME_KEYS, RHT_TREASURE_GAME_SMALL_KEY, ITEM_KEY_SMALL, OBJECT_GI_KEY, GID_KEY_SMALL, 0xF3, 0x80, CHEST_ANIM_SHORT, ITEM_CATEGORY_SMALL_KEY,MOD_NONE); + itemTable[RG_GUARD_HOUSE_KEY] = Item(RG_GUARD_HOUSE_KEY, Text{ "Guard House Key", "", "Schlüssel für das Haus der Wachen" }, ITEMTYPE_ITEM, GI_DOOR_KEY, true, LOGIC_GUARD_HOUSE_KEY, RHT_OVERWORLD_KEY, RG_GUARD_HOUSE_KEY, OBJECT_GI_KEY, GID_KEY_SMALL, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_SHORT, ITEM_CATEGORY_SMALL_KEY,MOD_RANDOMIZER); + itemTable[RG_GUARD_HOUSE_KEY].SetCustomDrawFunc(Randomizer_DrawOverworldKey); + itemTable[RG_MARKET_BAZAAR_KEY] = Item(RG_MARKET_BAZAAR_KEY, Text{ "Market Bazaar Key", "", "Schlüssel für den Basar des Marktes" }, ITEMTYPE_ITEM, GI_DOOR_KEY, true, LOGIC_MARKET_BAZAAR_KEY, RHT_OVERWORLD_KEY, RG_MARKET_BAZAAR_KEY, OBJECT_GI_KEY, GID_KEY_SMALL, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_SHORT, ITEM_CATEGORY_SMALL_KEY,MOD_RANDOMIZER); + itemTable[RG_MARKET_BAZAAR_KEY].SetCustomDrawFunc(Randomizer_DrawOverworldKey); + itemTable[RG_MARKET_POTION_SHOP_KEY] = Item(RG_MARKET_POTION_SHOP_KEY, Text{ "Market Potion Shop Key", "", "Schlüssel für den Magie-Laden des Marktes" }, ITEMTYPE_ITEM, GI_DOOR_KEY, true, LOGIC_MARKET_POTION_SHOP_KEY, RHT_OVERWORLD_KEY, RG_MARKET_POTION_SHOP_KEY, OBJECT_GI_KEY, GID_KEY_SMALL, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_SHORT, ITEM_CATEGORY_SMALL_KEY,MOD_RANDOMIZER); + itemTable[RG_MARKET_POTION_SHOP_KEY].SetCustomDrawFunc(Randomizer_DrawOverworldKey); + itemTable[RG_MASK_SHOP_KEY] = Item(RG_MASK_SHOP_KEY, Text{ "Mask Shop Key", "", "Schlüssel für den Maskenladen" }, ITEMTYPE_ITEM, GI_DOOR_KEY, true, LOGIC_MASK_SHOP_KEY, RHT_OVERWORLD_KEY, RG_MASK_SHOP_KEY, OBJECT_GI_KEY, GID_KEY_SMALL, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_SHORT, ITEM_CATEGORY_SMALL_KEY,MOD_RANDOMIZER); + itemTable[RG_MASK_SHOP_KEY].SetCustomDrawFunc(Randomizer_DrawOverworldKey); + itemTable[RG_MARKET_SHOOTING_GALLERY_KEY] = Item(RG_MARKET_SHOOTING_GALLERY_KEY, Text{ "Market Shooting Gallery Key", "", "Schlüssel für die Schießbude des Marktes" }, ITEMTYPE_ITEM, GI_DOOR_KEY, true, LOGIC_MARKET_SHOOTING_GALLERY_KEY, RHT_OVERWORLD_KEY, RG_MARKET_SHOOTING_GALLERY_KEY, OBJECT_GI_KEY, GID_KEY_SMALL, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_SHORT, ITEM_CATEGORY_SMALL_KEY,MOD_RANDOMIZER); + itemTable[RG_MARKET_SHOOTING_GALLERY_KEY].SetCustomDrawFunc(Randomizer_DrawOverworldKey); + itemTable[RG_BOMBCHU_BOWLING_KEY] = Item(RG_BOMBCHU_BOWLING_KEY, Text{ "Bombchu Bowling Alley Key", "", "Schlüssel für die Minenbowlingbahn" }, ITEMTYPE_ITEM, GI_DOOR_KEY, true, LOGIC_BOMBCHU_BOWLING_KEY, RHT_OVERWORLD_KEY, RG_BOMBCHU_BOWLING_KEY, OBJECT_GI_KEY, GID_KEY_SMALL, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_SHORT, ITEM_CATEGORY_SMALL_KEY,MOD_RANDOMIZER); + itemTable[RG_BOMBCHU_BOWLING_KEY].SetCustomDrawFunc(Randomizer_DrawOverworldKey); + itemTable[RG_TREASURE_CHEST_GAME_BUILDING_KEY] = Item(RG_TREASURE_CHEST_GAME_BUILDING_KEY, Text{ "Treasure Chest Game Building Key", "", "Schlüssel für das Haus des Schatzkisten-Pokers" }, ITEMTYPE_ITEM, GI_DOOR_KEY, true, LOGIC_TREASURE_CHEST_GAME_BUILDING_KEY,RHT_OVERWORLD_KEY, RG_TREASURE_CHEST_GAME_BUILDING_KEY, OBJECT_GI_KEY, GID_KEY_SMALL, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_SHORT, ITEM_CATEGORY_SMALL_KEY,MOD_RANDOMIZER); + itemTable[RG_TREASURE_CHEST_GAME_BUILDING_KEY].SetCustomDrawFunc(Randomizer_DrawOverworldKey); + itemTable[RG_BOMBCHU_SHOP_KEY] = Item(RG_BOMBCHU_SHOP_KEY, Text{ "Bombchu Shop Key", "", "Schlüssel für den Krabbelminenladen" }, ITEMTYPE_ITEM, GI_DOOR_KEY, true, LOGIC_BOMBCHU_SHOP_KEY, RHT_OVERWORLD_KEY, RG_BOMBCHU_SHOP_KEY, OBJECT_GI_KEY, GID_KEY_SMALL, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_SHORT, ITEM_CATEGORY_SMALL_KEY,MOD_RANDOMIZER); + itemTable[RG_BOMBCHU_SHOP_KEY].SetCustomDrawFunc(Randomizer_DrawOverworldKey); + itemTable[RG_RICHARDS_HOUSE_KEY] = Item(RG_RICHARDS_HOUSE_KEY, Text{ "Richard's House Key", "", "Schlüssel für das Haus von Richard" }, ITEMTYPE_ITEM, GI_DOOR_KEY, true, LOGIC_RICHARDS_HOUSE_KEY, RHT_OVERWORLD_KEY, RG_RICHARDS_HOUSE_KEY, OBJECT_GI_KEY, GID_KEY_SMALL, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_SHORT, ITEM_CATEGORY_SMALL_KEY,MOD_RANDOMIZER); + itemTable[RG_RICHARDS_HOUSE_KEY].SetCustomDrawFunc(Randomizer_DrawOverworldKey); + itemTable[RG_ALLEY_HOUSE_KEY] = Item(RG_ALLEY_HOUSE_KEY, Text{ "Alley House Key", "", "Schlüssel für das Gäßchenhaus" }, ITEMTYPE_ITEM, GI_DOOR_KEY, true, LOGIC_ALLEY_HOUSE_KEY, RHT_OVERWORLD_KEY, RG_ALLEY_HOUSE_KEY, OBJECT_GI_KEY, GID_KEY_SMALL, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_SHORT, ITEM_CATEGORY_SMALL_KEY,MOD_RANDOMIZER); + itemTable[RG_ALLEY_HOUSE_KEY].SetCustomDrawFunc(Randomizer_DrawOverworldKey); + itemTable[RG_KAK_BAZAAR_KEY] = Item(RG_KAK_BAZAAR_KEY, Text{ "Kakariko Bazaar Key", "", "Schlüssel für den Basar von Kakariko" }, ITEMTYPE_ITEM, GI_DOOR_KEY, true, LOGIC_KAK_BAZAAR_KEY, RHT_OVERWORLD_KEY, RG_KAK_BAZAAR_KEY, OBJECT_GI_KEY, GID_KEY_SMALL, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_SHORT, ITEM_CATEGORY_SMALL_KEY,MOD_RANDOMIZER); + itemTable[RG_KAK_BAZAAR_KEY].SetCustomDrawFunc(Randomizer_DrawOverworldKey); + itemTable[RG_KAK_POTION_SHOP_KEY] = Item(RG_KAK_POTION_SHOP_KEY, Text{ "Kakariko Potion Shop Key", "", "Schlüssel für den Magie-Laden von Kakariko" }, ITEMTYPE_ITEM, GI_DOOR_KEY, true, LOGIC_KAK_POTION_SHOP_KEY, RHT_OVERWORLD_KEY, RG_KAK_POTION_SHOP_KEY, OBJECT_GI_KEY, GID_KEY_SMALL, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_SHORT, ITEM_CATEGORY_SMALL_KEY,MOD_RANDOMIZER); + itemTable[RG_KAK_POTION_SHOP_KEY].SetCustomDrawFunc(Randomizer_DrawOverworldKey); + itemTable[RG_BOSS_HOUSE_KEY] = Item(RG_BOSS_HOUSE_KEY, Text{ "Boss's House Key", "", "Schlüssel für das Haus des Chefs" }, ITEMTYPE_ITEM, GI_DOOR_KEY, true, LOGIC_BOSS_HOUSE_KEY, RHT_OVERWORLD_KEY, RG_BOSS_HOUSE_KEY, OBJECT_GI_KEY, GID_KEY_SMALL, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_SHORT, ITEM_CATEGORY_SMALL_KEY,MOD_RANDOMIZER); + itemTable[RG_BOSS_HOUSE_KEY].SetCustomDrawFunc(Randomizer_DrawOverworldKey); + itemTable[RG_GRANNYS_POTION_SHOP_KEY] = Item(RG_GRANNYS_POTION_SHOP_KEY, Text{ "Granny's Potion Shop Key", "", "Schlüssel für Asas Hexenladen" }, ITEMTYPE_ITEM, GI_DOOR_KEY, true, LOGIC_GRANNYS_POTION_SHOP_KEY, RHT_OVERWORLD_KEY, RG_GRANNYS_POTION_SHOP_KEY, OBJECT_GI_KEY, GID_KEY_SMALL, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_SHORT, ITEM_CATEGORY_SMALL_KEY,MOD_RANDOMIZER); + itemTable[RG_GRANNYS_POTION_SHOP_KEY].SetCustomDrawFunc(Randomizer_DrawOverworldKey); + itemTable[RG_SKULLTULA_HOUSE_KEY] = Item(RG_SKULLTULA_HOUSE_KEY, Text{ "Skulltula House Key", "", "Schlüssel für das Skulltula-Haus" }, ITEMTYPE_ITEM, GI_DOOR_KEY, true, LOGIC_SKULLTULA_HOUSE_KEY, RHT_OVERWORLD_KEY, RG_SKULLTULA_HOUSE_KEY, OBJECT_GI_KEY, GID_KEY_SMALL, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_SHORT, ITEM_CATEGORY_SMALL_KEY,MOD_RANDOMIZER); + itemTable[RG_SKULLTULA_HOUSE_KEY].SetCustomDrawFunc(Randomizer_DrawOverworldKey); + itemTable[RG_IMPAS_HOUSE_KEY] = Item(RG_IMPAS_HOUSE_KEY, Text{ "Impa's House Key", "", "Schlüssel für das Haus von Impa" }, ITEMTYPE_ITEM, GI_DOOR_KEY, true, LOGIC_IMPAS_HOUSE_KEY, RHT_OVERWORLD_KEY, RG_IMPAS_HOUSE_KEY, OBJECT_GI_KEY, GID_KEY_SMALL, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_SHORT, ITEM_CATEGORY_SMALL_KEY,MOD_RANDOMIZER); + itemTable[RG_IMPAS_HOUSE_KEY].SetCustomDrawFunc(Randomizer_DrawOverworldKey); + itemTable[RG_WINDMILL_KEY] = Item(RG_WINDMILL_KEY, Text{ "Windmill Key", "", "Schlüssel für die Windmühle" }, ITEMTYPE_ITEM, GI_DOOR_KEY, true, LOGIC_WINDMILL_KEY, RHT_OVERWORLD_KEY, RG_WINDMILL_KEY, OBJECT_GI_KEY, GID_KEY_SMALL, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_SHORT, ITEM_CATEGORY_SMALL_KEY,MOD_RANDOMIZER); + itemTable[RG_WINDMILL_KEY].SetCustomDrawFunc(Randomizer_DrawOverworldKey); + itemTable[RG_KAK_SHOOTING_GALLERY_KEY] = Item(RG_KAK_SHOOTING_GALLERY_KEY, Text{ "Kakariko Shooting Gallery Key", "", "Schlüssel für die Schießbude von Kakariko" }, ITEMTYPE_ITEM, GI_DOOR_KEY, true, LOGIC_KAK_SHOOTING_GALLERY_KEY, RHT_OVERWORLD_KEY, RG_KAK_SHOOTING_GALLERY_KEY, OBJECT_GI_KEY, GID_KEY_SMALL, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_SHORT, ITEM_CATEGORY_SMALL_KEY,MOD_RANDOMIZER); + itemTable[RG_KAK_SHOOTING_GALLERY_KEY].SetCustomDrawFunc(Randomizer_DrawOverworldKey); + itemTable[RG_DAMPES_HUT_KEY] = Item(RG_DAMPES_HUT_KEY, Text{ "Dampe's Hut Key", "", "Schlüssel für die Hütte von Boris" }, ITEMTYPE_ITEM, GI_DOOR_KEY, true, LOGIC_DAMPES_HUT_KEY, RHT_OVERWORLD_KEY, RG_DAMPES_HUT_KEY, OBJECT_GI_KEY, GID_KEY_SMALL, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_SHORT, ITEM_CATEGORY_SMALL_KEY,MOD_RANDOMIZER); + itemTable[RG_DAMPES_HUT_KEY].SetCustomDrawFunc(Randomizer_DrawOverworldKey); + itemTable[RG_TALONS_HOUSE_KEY] = Item(RG_TALONS_HOUSE_KEY, Text{ "Talon's House Key", "", "Schlüssel für das Haus von Talon" }, ITEMTYPE_ITEM, GI_DOOR_KEY, true, LOGIC_TALONS_HOUSE_KEY, RHT_OVERWORLD_KEY, RG_TALONS_HOUSE_KEY, OBJECT_GI_KEY, GID_KEY_SMALL, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_SHORT, ITEM_CATEGORY_SMALL_KEY,MOD_RANDOMIZER); + itemTable[RG_TALONS_HOUSE_KEY].SetCustomDrawFunc(Randomizer_DrawOverworldKey); + itemTable[RG_STABLES_KEY] = Item(RG_STABLES_KEY, Text{ "Stables Key", "", "Schlüssel für die Ställe" }, ITEMTYPE_ITEM, GI_DOOR_KEY, true, LOGIC_STABLES_KEY, RHT_OVERWORLD_KEY, RG_STABLES_KEY, OBJECT_GI_KEY, GID_KEY_SMALL, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_SHORT, ITEM_CATEGORY_SMALL_KEY,MOD_RANDOMIZER); + itemTable[RG_STABLES_KEY].SetCustomDrawFunc(Randomizer_DrawOverworldKey); + itemTable[RG_BACK_TOWER_KEY] = Item(RG_BACK_TOWER_KEY, Text{ "Back Tower Key", "", "Schlüssel für den hinteren Turm" }, ITEMTYPE_ITEM, GI_DOOR_KEY, true, LOGIC_BACK_TOWER_KEY, RHT_OVERWORLD_KEY, RG_BACK_TOWER_KEY, OBJECT_GI_KEY, GID_KEY_SMALL, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_SHORT, ITEM_CATEGORY_SMALL_KEY,MOD_RANDOMIZER); + itemTable[RG_BACK_TOWER_KEY].SetCustomDrawFunc(Randomizer_DrawOverworldKey); + itemTable[RG_HYLIA_LAB_KEY] = Item(RG_HYLIA_LAB_KEY, Text{ "Hylia Laboratory Key", "", "Schlüssel für das Hylia-Labor" }, ITEMTYPE_ITEM, GI_DOOR_KEY, true, LOGIC_HYLIA_LAB_KEY, RHT_OVERWORLD_KEY, RG_HYLIA_LAB_KEY, OBJECT_GI_KEY, GID_KEY_SMALL, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_SHORT, ITEM_CATEGORY_SMALL_KEY,MOD_RANDOMIZER); + itemTable[RG_HYLIA_LAB_KEY].SetCustomDrawFunc(Randomizer_DrawOverworldKey); + itemTable[RG_FISHING_HOLE_KEY] = Item(RG_FISHING_HOLE_KEY, Text{ "Fishing Hole Key", "", "Schlüssel für den Fischweiher" }, ITEMTYPE_ITEM, GI_DOOR_KEY, true, LOGIC_FISHING_HOLE_KEY, RHT_OVERWORLD_KEY, RG_FISHING_HOLE_KEY, OBJECT_GI_KEY, GID_KEY_SMALL, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_SHORT, ITEM_CATEGORY_SMALL_KEY,MOD_RANDOMIZER); + itemTable[RG_FISHING_HOLE_KEY].SetCustomDrawFunc(Randomizer_DrawOverworldKey); // Key Rings itemTable[RG_FOREST_TEMPLE_KEY_RING] = Item(RG_FOREST_TEMPLE_KEY_RING, Text{ "Forest Temple Key Ring", "Trousseau du Temple de la Forêt", "Schlüsselbund für den Waldtempel" }, ITEMTYPE_SMALLKEY, 0xD5, true, LOGIC_FOREST_TEMPLE_KEYS, RHT_FOREST_TEMPLE_KEY_RING, RG_FOREST_TEMPLE_KEY_RING, OBJECT_GI_KEY, GID_KEY_SMALL, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_SHORT, ITEM_CATEGORY_SMALL_KEY,MOD_RANDOMIZER); itemTable[RG_FOREST_TEMPLE_KEY_RING].SetCustomDrawFunc(Randomizer_DrawKeyRing); @@ -178,6 +226,8 @@ void Rando::StaticData::InitItemTable() { itemTable[RG_GERUDO_FORTRESS_KEY_RING].SetCustomDrawFunc(Randomizer_DrawKeyRing); itemTable[RG_GANONS_CASTLE_KEY_RING] = Item(RG_GANONS_CASTLE_KEY_RING, Text{ "Ganon's Castle Key Ring", "Trousseau du Château de Ganon", "Schlüsselbund für Ganons Schloß" }, ITEMTYPE_SMALLKEY, 0xDD, true, LOGIC_GANONS_CASTLE_KEYS, RHT_GANONS_CASTLE_KEY_RING, RG_GANONS_CASTLE_KEY_RING, OBJECT_GI_KEY, GID_KEY_SMALL, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_SHORT, ITEM_CATEGORY_SMALL_KEY,MOD_RANDOMIZER); itemTable[RG_GANONS_CASTLE_KEY_RING].SetCustomDrawFunc(Randomizer_DrawKeyRing); + itemTable[RG_TREASURE_GAME_KEY_RING] = Item(RG_TREASURE_GAME_KEY_RING, Text{ "Chest Game Key Ring", "Trousseau du jeu la Chasse-aux-Trésors", "Schlüsselbund für das Truhenspiel" }, ITEMTYPE_SMALLKEY, 0xDE, true, LOGIC_TREASURE_GAME_KEYS, RHT_TREASURE_GAME_KEY_RING, RG_TREASURE_GAME_KEY_RING, OBJECT_GI_KEY, GID_KEY_SMALL, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_SHORT, ITEM_CATEGORY_SMALL_KEY,MOD_RANDOMIZER); + itemTable[RG_TREASURE_GAME_KEY_RING].SetCustomDrawFunc(Randomizer_DrawKeyRing); // Dungeon Rewards itemTable[RG_KOKIRI_EMERALD] = Item(RG_KOKIRI_EMERALD, Text{ "Kokiri's Emerald", "Émeraude Kokiri", "Kokiri-Smaragd" }, ITEMTYPE_DUNGEONREWARD, 0xCB, true, LOGIC_KOKIRI_EMERALD, RHT_KOKIRI_EMERALD, ITEM_KOKIRI_EMERALD, OBJECT_GI_JEWEL, GID_KOKIRI_EMERALD, 0x80, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_NONE); itemTable[RG_GORON_RUBY] = Item(RG_GORON_RUBY, Text{ "Goron's Ruby", "Rubis Goron", "Goronen-Rubin" }, ITEMTYPE_DUNGEONREWARD, 0xCC, true, LOGIC_GORON_RUBY, RHT_GORON_RUBY, ITEM_GORON_RUBY, OBJECT_GI_JEWEL, GID_GORON_RUBY, 0x81, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_NONE); @@ -208,6 +258,7 @@ void Rando::StaticData::InitItemTable() { itemTable[RG_BOMBCHU_5] = Item(RG_BOMBCHU_5, Text{ "Bombchus (5)", "Missiles (5)", "Krabbelminen (5)" }, ITEMTYPE_REFILL, GI_BOMBCHUS_5, true, LOGIC_BOMBCHUS, RHT_BOMBCHUS_5, ITEM_BOMBCHUS_5, OBJECT_GI_BOMB_2, GID_BOMBCHU, 0x33, 0x80, CHEST_ANIM_SHORT, ITEM_CATEGORY_JUNK, MOD_NONE); itemTable[RG_BOMBCHU_10] = Item(RG_BOMBCHU_10, Text{ "Bombchus (10)", "Missiles (10)", "Krabbelminen (10)" }, ITEMTYPE_REFILL, GI_BOMBCHUS_10, true, LOGIC_BOMBCHUS, RHT_BOMBCHUS_10, ITEM_BOMBCHU, OBJECT_GI_BOMB_2, GID_BOMBCHU, 0x33, 0x80, CHEST_ANIM_SHORT, ITEM_CATEGORY_JUNK, MOD_NONE); itemTable[RG_BOMBCHU_20] = Item(RG_BOMBCHU_20, Text{ "Bombchus (20)", "Missiles (20)", "Krabbelminen (20)" }, ITEMTYPE_REFILL, GI_BOMBCHUS_20, true, LOGIC_BOMBCHUS, RHT_BOMBCHUS_20, ITEM_BOMBCHUS_20, OBJECT_GI_BOMB_2, GID_BOMBCHU, 0x33, 0x80, CHEST_ANIM_SHORT, ITEM_CATEGORY_JUNK, MOD_NONE); + itemTable[RG_BOMBCHU_20].SetCustomDrawFunc(Randomizer_DrawBombchuBagInLogic); itemTable[RG_ARROWS_5] = Item(RG_ARROWS_5, Text{ "Arrows (5)", "Flèches (5)", "Pfeile (5)" }, ITEMTYPE_REFILL, GI_ARROWS_SMALL, false, LOGIC_NONE, RHT_ARROWS_5, ITEM_ARROWS_SMALL, OBJECT_GI_ARROW, GID_ARROWS_SMALL, 0xE6, 0x48, CHEST_ANIM_SHORT, ITEM_CATEGORY_JUNK, MOD_NONE); itemTable[RG_ARROWS_10] = Item(RG_ARROWS_10, Text{ "Arrows (10)", "Flèches (10)", "Pfeile (10)" }, ITEMTYPE_REFILL, GI_ARROWS_MEDIUM, false, LOGIC_NONE, RHT_ARROWS_10, ITEM_ARROWS_MEDIUM, OBJECT_GI_ARROW, GID_ARROWS_MEDIUM, 0xE6, 0x49, CHEST_ANIM_SHORT, ITEM_CATEGORY_JUNK, MOD_NONE); itemTable[RG_ARROWS_30] = Item(RG_ARROWS_30, Text{ "Arrows (30)", "Flèches (30)", "Pfeile (30)" }, ITEMTYPE_REFILL, GI_ARROWS_LARGE, false, LOGIC_NONE, RHT_ARROWS_30, ITEM_ARROWS_LARGE, OBJECT_GI_ARROW, GID_ARROWS_LARGE, 0xE6, 0x4A, CHEST_ANIM_SHORT, ITEM_CATEGORY_JUNK, MOD_NONE); @@ -288,6 +339,9 @@ void Rando::StaticData::InitItemTable() { itemTable[RG_BRONZE_SCALE] = Item(RG_BRONZE_SCALE, Text{ "Bronze Scale", "Écaille de Bronze", "Bronzene Schuppe" }, ITEMTYPE_ITEM, GI_SCALE_SILVER, true, LOGIC_PROGRESSIVE_WALLET, RHT_BRONZE_SCALE, RG_BRONZE_SCALE, OBJECT_GI_SCALE, GID_SCALE_SILVER, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_RANDOMIZER); itemTable[RG_BRONZE_SCALE].SetCustomDrawFunc(Randomizer_DrawBronzeScale); + itemTable[RG_BOMBCHU_BAG] = Item(RG_BOMBCHU_BAG, Text{ "Bombchu Bag", "!!!", "!!!" }, ITEMTYPE_ITEM, RG_BOMBCHU_BAG, true, LOGIC_BOMBCHUS, RHT_BOMBCHU_BAG, RG_BOMBCHU_BAG, OBJECT_GI_BOMB_2, GID_BOMBCHU, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_RANDOMIZER); + itemTable[RG_BOMBCHU_BAG].SetCustomDrawFunc(Randomizer_DrawBombchuBag); + itemTable[RG_QUIVER_INF] = Item(RG_QUIVER_INF, Text{ "Infinite Quiver", "Carquois Infini", "Unendlicher Köcher" }, ITEMTYPE_ITEM, RG_QUIVER_INF, true, LOGIC_PROGRESSIVE_BOW, RHT_QUIVER_INF, RG_QUIVER_INF, OBJECT_GI_ARROWCASE, GID_QUIVER_50, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_LESSER, MOD_RANDOMIZER); itemTable[RG_BOMB_BAG_INF] = Item(RG_BOMB_BAG_INF, Text{ "Infinite Bomb Bag", "Sac de Bombes Infini", "Unendliche Bombentasche" }, ITEMTYPE_ITEM, RG_BOMB_BAG_INF, true, LOGIC_PROGRESSIVE_BOMB_BAG, RHT_BOMB_BAG_INF, RG_BOMB_BAG_INF, OBJECT_GI_BOMBPOUCH, GID_BOMB_BAG_40, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_LESSER, MOD_RANDOMIZER); itemTable[RG_BULLET_BAG_INF] = Item(RG_BULLET_BAG_INF, Text{ "Infinite Bullet Bag", "Sac de Graines Infinis", "Unendliche Samentasche" }, ITEMTYPE_ITEM, RG_BULLET_BAG_INF, true, LOGIC_PROGRESSIVE_BULLET_BAG, RHT_BULLET_BAG_INF, RG_BULLET_BAG_INF, OBJECT_GI_DEKUPOUCH, GID_BULLET_BAG, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_LESSER, MOD_RANDOMIZER); @@ -295,6 +349,7 @@ void Rando::StaticData::InitItemTable() { itemTable[RG_NUT_UPGRADE_INF] = Item(RG_NUT_UPGRADE_INF, Text{ "Infinite Nut Capacity", "Noix Mojo Infinies", "Unendliche Nuß-Kapazität" }, ITEMTYPE_ITEM, RG_NUT_UPGRADE_INF, true, LOGIC_PROGRESSIVE_NUT_BAG, RHT_NUT_UPGRADE_INF, RG_NUT_UPGRADE_INF, OBJECT_GI_NUTS, GID_NUTS, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_LESSER, MOD_RANDOMIZER); itemTable[RG_MAGIC_INF] = Item(RG_MAGIC_INF, Text{ "Infinite Magic Meter", "Magie Infinie", "Unendliches Magisches Maß" }, ITEMTYPE_ITEM, RG_MAGIC_INF, true, LOGIC_PROGRESSIVE_MAGIC, RHT_MAGIC_INF, RG_MAGIC_INF, OBJECT_GI_MAGICPOT, GID_MAGIC_LARGE, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_LESSER, MOD_RANDOMIZER); itemTable[RG_BOMBCHU_INF] = Item(RG_BOMBCHU_INF, Text{ "Infinite Bombchus", "Missiles Teigneux Infinis", "Unendliche Krabbelminen" }, ITEMTYPE_ITEM, RG_BOMBCHU_INF, true, LOGIC_BOMBCHUS, RHT_BOMBCHU_INF, RG_BOMBCHU_INF, OBJECT_GI_BOMB_2, GID_BOMBCHU, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_LESSER, MOD_RANDOMIZER); + itemTable[RG_BOMBCHU_INF].SetCustomDrawFunc(Randomizer_DrawBombchuBag); itemTable[RG_WALLET_INF] = Item(RG_WALLET_INF, Text{ "Infinite Wallet", "Bourse Infinie", "Unendliche Geldbörse" }, ITEMTYPE_ITEM, RG_WALLET_INF, true, LOGIC_PROGRESSIVE_WALLET, RHT_WALLET_INF, RG_WALLET_INF, OBJECT_GI_PURSE, GID_WALLET_GIANT, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_LESSER, MOD_RANDOMIZER); itemTable[RG_SKELETON_KEY] = Item(RG_SKELETON_KEY, Text{ "Skeleton Key", "Clé Squelette", "Skelettschlüssel" }, ITEMTYPE_ITEM, GI_STONE_OF_AGONY, true, LOGIC_SKELETON_KEY, RHT_SKELETON_KEY, RG_SKELETON_KEY, OBJECT_GI_MAP, GID_STONE_OF_AGONY, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_RANDOMIZER); diff --git a/soh/soh/Enhancements/randomizer/item_location.cpp b/soh/soh/Enhancements/randomizer/item_location.cpp index 47c1f09f1..00e0366ab 100644 --- a/soh/soh/Enhancements/randomizer/item_location.cpp +++ b/soh/soh/Enhancements/randomizer/item_location.cpp @@ -178,34 +178,15 @@ void ItemLocation::SetHidden(const bool hidden_) { } bool ItemLocation::IsExcluded() { - return excludedOption.GetContextOptionIndex(); + return excludedOption.Is(RO_LOCATION_EXCLUDE); } -Option* ItemLocation::GetExcludedOption() { - return &excludedOption; +OptionValue& ItemLocation::GetExcludedOption() { + return excludedOption; } -void ItemLocation::AddExcludeOption() { - if (const std::string name = StaticData::GetLocation(rc)->GetName(); name.length() < 23) { - excludedOption = Option::Bool(name, {"Include", "Exclude"}, OptionCategory::Setting, "", "", WidgetType::Checkbox, RO_LOCATION_INCLUDE); - } else { - const size_t lastSpace = name.rfind(' ', 23); - std::string settingText = name; - settingText.replace(lastSpace, 1, "\n "); - - excludedOption = Option::Bool(settingText, {"Include", "Exclude"}, OptionCategory::Setting, "", "", WidgetType::Checkbox, RO_LOCATION_INCLUDE); - } - // RANDOTODO: this without string compares and loops - bool alreadyAdded = false; - const Location* loc = StaticData::GetLocation(rc); - for (Option* location : Context::GetInstance()->GetSettings()->GetExcludeOptionsForArea(loc->GetArea())) { - if (location->GetName() == excludedOption.GetName()) { - alreadyAdded = true; - } - } - if (!alreadyAdded) { - Context::GetInstance()->GetSettings()->GetExcludeOptionsForArea(loc->GetArea()).push_back(&excludedOption); - } +void ItemLocation::SetExcludedOption(uint8_t val) { + excludedOption.Set(val); } bool ItemLocation::IsVisible() const { diff --git a/soh/soh/Enhancements/randomizer/item_location.h b/soh/soh/Enhancements/randomizer/item_location.h index 4ec8b8b9e..142ac1c0b 100644 --- a/soh/soh/Enhancements/randomizer/item_location.h +++ b/soh/soh/Enhancements/randomizer/item_location.h @@ -3,7 +3,7 @@ #include "randomizerTypes.h" #include "3drando/text.hpp" #include "static_data.h" -#include "settings.h" +#include "option.h" namespace Rando { class ItemLocation { @@ -46,8 +46,8 @@ class ItemLocation { void AddHintedBy(RandomizerHint hintKey); bool IsHidden() const; bool IsExcluded(); - void AddExcludeOption(); - Option* GetExcludedOption(); + OptionValue& GetExcludedOption(); + void SetExcludedOption(uint8_t val); void SetHidden(bool hidden_); bool IsVisible() const; void SetVisible(bool visibleInImGui_); @@ -65,7 +65,7 @@ class ItemLocation { bool addedToPool = false; RandomizerGet placedItem = RG_NONE; RandomizerGet delayedItem = RG_NONE; - Option excludedOption = Option::Bool(StaticData::GetLocation(rc)->GetName(), {"Include", "Exclude"}, OptionCategory::Setting, "", "", WidgetType::Checkbox, RO_LOCATION_INCLUDE); + OptionValue excludedOption = OptionValue(RO_LOCATION_INCLUDE); uint16_t price = 0; RandomizerRegion parentRegion = RR_NONE; std::set areas = {}; diff --git a/soh/soh/Enhancements/randomizer/location.cpp b/soh/soh/Enhancements/randomizer/location.cpp index 20dc211a8..f5c78884b 100644 --- a/soh/soh/Enhancements/randomizer/location.cpp +++ b/soh/soh/Enhancements/randomizer/location.cpp @@ -2,6 +2,7 @@ #include "static_data.h" #include #include +#include "option.h" RandomizerCheck Rando::Location::GetRandomizerCheck() const { return rc; @@ -86,6 +87,10 @@ int16_t Rando::Location::GetVanillaPrice() const { return vanillaPrice; } +Rando::Option* Rando::Location::GetExcludedOption() { + return &excludedOption; +} + RandomizerCheckArea GetAreaFromScene(uint8_t scene) { switch (scene) { case SCENE_LINKS_HOUSE: diff --git a/soh/soh/Enhancements/randomizer/location.h b/soh/soh/Enhancements/randomizer/location.h index 9de741dbf..bd96c3ae1 100644 --- a/soh/soh/Enhancements/randomizer/location.h +++ b/soh/soh/Enhancements/randomizer/location.h @@ -10,6 +10,7 @@ #include "z64actor_enum.h" #include "z64scene.h" #include "../../util.h" +#include "option.h" namespace Rando { class SpoilerCollectionCheck { @@ -59,7 +60,17 @@ class Location { : rc(rc_), quest(quest_), checkType(checkType_), area(area_), actorId(actorId_), scene(scene_), actorParams(actorParams_), shortName(std::move(shortName_)), spoilerName(std::move(spoilerName_)), hintKey(hintKey_), vanillaItem(vanillaItem_), - isVanillaCompletion(isVanillaCompletion_), collectionCheck(collectionCheck_), vanillaPrice(vanillaPrice_) {} + isVanillaCompletion(isVanillaCompletion_), collectionCheck(collectionCheck_), vanillaPrice(vanillaPrice_) { + if (spoilerName.length() < 23) { + excludedOption = LocationOption(rc, spoilerName); + } else { + const size_t lastSpace = spoilerName.rfind(' ', 23); + std::string settingText = spoilerName; + settingText.replace(lastSpace, 1, "\n "); + + excludedOption = LocationOption(rc, spoilerName); + } + } Location(const RandomizerCheck rc_, const RandomizerCheckQuest quest_, const RandomizerCheckType checkType_, const RandomizerCheckArea area_, const ActorID actorId_, const SceneID scene_, const int32_t actorParams_, std::string shortName_, const RandomizerHintTextKey hintKey_, const RandomizerGet vanillaItem_, @@ -67,7 +78,17 @@ class Location { const int vanillaPrice_ = 0) : rc(rc_), quest(quest_), checkType(checkType_), area(area_), actorId(actorId_), scene(scene_), actorParams(actorParams_), shortName(shortName_), spoilerName(SpoilerNameFromShortName(shortName_, area_)), hintKey(hintKey_), vanillaItem(vanillaItem_), isVanillaCompletion(isVanillaCompletion_), - collectionCheck(collectionCheck_), vanillaPrice(vanillaPrice_) {} + collectionCheck(collectionCheck_), vanillaPrice(vanillaPrice_) { + if (spoilerName.length() < 23) { + excludedOption = LocationOption(rc, spoilerName); + } else { + const size_t lastSpace = spoilerName.rfind(' ', 23); + std::string settingText = spoilerName; + settingText.replace(lastSpace, 1, "\n "); + + excludedOption = LocationOption(rc, spoilerName); + } + } static std::string SpoilerNameFromShortName(std::string shortName, RandomizerCheckArea area) { if (area < 0 || area >= RCAREA_INVALID) { @@ -96,10 +117,13 @@ class Location { const HintText& GetHint() const; RandomizerGet GetVanillaItem() const; int16_t GetVanillaPrice() const; + Option* GetExcludedOption(); - static Location Base(RandomizerCheck rc, RandomizerCheckQuest quest_, RandomizerCheckType checkType_, ActorID actorId_, SceneID scene_, int32_t actorParams_, - std::string&& shortName_, std::string&& spoilerName_, RandomizerHintTextKey hintKey, RandomizerGet vanillaItem, - SpoilerCollectionCheck collectionCheck = SpoilerCollectionCheck(), bool isVanillaCompletion_ = false, uint16_t vanillaPrice_ = 0); + static Location Base(RandomizerCheck rc, RandomizerCheckQuest quest_, RandomizerCheckType checkType_, + ActorID actorId_, SceneID scene_, int32_t actorParams_, std::string&& shortName_, + std::string&& spoilerName_, RandomizerHintTextKey hintKey, RandomizerGet vanillaItem, + SpoilerCollectionCheck collectionCheck = SpoilerCollectionCheck(), + bool isVanillaCompletion_ = false, uint16_t vanillaPrice_ = 0); static Location Base(RandomizerCheck rc, RandomizerCheckQuest quest_, RandomizerCheckType checkType_, ActorID actorId_, SceneID scene_, int32_t actorParams_, std::string&& shortName_, RandomizerHintTextKey hintKey, RandomizerGet vanillaItem, SpoilerCollectionCheck collectionCheck = SpoilerCollectionCheck(), @@ -205,5 +229,6 @@ class Location { SpoilerCollectionCheck collectionCheck; int16_t vanillaPrice; bool isHintable = false; + Option excludedOption; }; } // namespace Rando \ No newline at end of file diff --git a/soh/soh/Enhancements/randomizer/location_access.cpp b/soh/soh/Enhancements/randomizer/location_access.cpp index 7c9cf7e7f..a45e27cd0 100644 --- a/soh/soh/Enhancements/randomizer/location_access.cpp +++ b/soh/soh/Enhancements/randomizer/location_access.cpp @@ -267,7 +267,7 @@ void RegionTable_Init() { }, { //Locations LOCATION(RC_LINKS_POCKET, true), - LOCATION(RC_TRIFORCE_COMPLETED, logic->GetSaveContext()->triforcePiecesCollected >= ctx->GetOption(RSK_TRIFORCE_HUNT_PIECES_REQUIRED).GetContextOptionIndex() + 1;), + LOCATION(RC_TRIFORCE_COMPLETED, logic->GetSaveContext()->ship.quest.data.randomizer.triforcePiecesCollected >= ctx->GetOption(RSK_TRIFORCE_HUNT_PIECES_REQUIRED).Get() + 1;), LOCATION(RC_SARIA_SONG_HINT, logic->CanUse(RG_SARIAS_SONG)), }, { //Exits @@ -409,7 +409,7 @@ void ReplaceAllInString(std::string& s, std::string const& toReplace, std::strin std::string CleanCheckConditionString(std::string condition) { ReplaceAllInString(condition, "logic->", ""); ReplaceAllInString(condition, "ctx->", ""); - ReplaceAllInString(condition, ".GetContextOptionIndex()", ""); + ReplaceAllInString(condition, ".Get()", ""); ReplaceAllInString(condition, "GetSaveContext()->", ""); return condition; } @@ -438,13 +438,13 @@ namespace Regions { } if (/*Settings::HasNightStart TODO:: Randomize Starting Time*/ false) { - if (ctx->GetSettings()->ResolvedStartingAge() == RO_AGE_CHILD) { + if (ctx->GetOption(RSK_SELECTED_STARTING_AGE).Is(RO_AGE_CHILD)) { RegionTable(RR_ROOT)->childNight = true; } else { RegionTable(RR_ROOT)->adultNight = true; } } else { - if (ctx->GetSettings()->ResolvedStartingAge() == RO_AGE_CHILD) { + if (ctx->GetOption(RSK_SELECTED_STARTING_AGE).Is(RO_AGE_CHILD)) { RegionTable(RR_ROOT)->childDay = true; } else { RegionTable(RR_ROOT)->adultDay = true; @@ -465,13 +465,13 @@ namespace Regions { } if (/*Settings::HasNightStart TODO:: Randomize Starting Time*/ false) { - if (ctx->GetSettings()->ResolvedStartingAge() == RO_AGE_CHILD) { + if (ctx->GetOption(RSK_SELECTED_STARTING_AGE).Is(RO_AGE_CHILD)) { RegionTable(RR_ROOT)->childNight = true; } else { RegionTable(RR_ROOT)->adultNight = true; } } else { - if (ctx->GetSettings()->ResolvedStartingAge() == RO_AGE_CHILD) { + if (ctx->GetOption(RSK_SELECTED_STARTING_AGE).Is(RO_AGE_CHILD)) { RegionTable(RR_ROOT)->childDay = true; } else { RegionTable(RR_ROOT)->adultDay = true; diff --git a/soh/soh/Enhancements/randomizer/location_access.h b/soh/soh/Enhancements/randomizer/location_access.h index 3af0a498d..986d08d6a 100644 --- a/soh/soh/Enhancements/randomizer/location_access.h +++ b/soh/soh/Enhancements/randomizer/location_access.h @@ -23,14 +23,10 @@ class EventAccess { bool ConditionsMet() const { auto ctx = Rando::Context::GetInstance(); - if (ctx->GetOption(RSK_LOGIC_RULES).Is(RO_LOGIC_NO_LOGIC) || ctx->GetOption(RSK_LOGIC_RULES).Is(RO_LOGIC_VANILLA)) { - return true; - } else if (ctx->GetOption(RSK_LOGIC_RULES).Is(RO_LOGIC_GLITCHLESS)) { - return condition_function(); - } else if (ctx->GetOption(RSK_LOGIC_RULES).Is(RO_LOGIC_GLITCHED)) { + if (ctx->GetOption(RSK_LOGIC_RULES).Is(RO_LOGIC_GLITCHLESS)) { return condition_function(); } - return false; + return true; } bool CheckConditionAtAgeTime(bool& age, bool& time) { @@ -71,14 +67,10 @@ class LocationAccess { bool GetConditionsMet() const { auto ctx = Rando::Context::GetInstance(); - if (ctx->GetOption(RSK_LOGIC_RULES).Is(RO_LOGIC_NO_LOGIC) || ctx->GetOption(RSK_LOGIC_RULES).Is(RO_LOGIC_VANILLA)) { - return true; - } else if (ctx->GetOption(RSK_LOGIC_RULES).Is(RO_LOGIC_GLITCHLESS)) { - return condition_function(); - } else if (ctx->GetOption(RSK_LOGIC_RULES).Is(RO_LOGIC_GLITCHED)) { + if (ctx->GetOption(RSK_LOGIC_RULES).Is(RO_LOGIC_GLITCHLESS)) { return condition_function(); } - return false; + return true; } bool CheckConditionAtAgeTime(bool& age, bool& time) const; diff --git a/soh/soh/Enhancements/randomizer/location_access/dungeons/bottom_of_the_well.cpp b/soh/soh/Enhancements/randomizer/location_access/dungeons/bottom_of_the_well.cpp index 588d32bf1..171542ea3 100644 --- a/soh/soh/Enhancements/randomizer/location_access/dungeons/bottom_of_the_well.cpp +++ b/soh/soh/Enhancements/randomizer/location_access/dungeons/bottom_of_the_well.cpp @@ -49,7 +49,7 @@ void RegionTable_Init_BottomOfTheWell() { LOCATION(RC_BOTTOM_OF_THE_WELL_FRONT_LEFT_FAKE_WALL_CHEST, true), LOCATION(RC_BOTTOM_OF_THE_WELL_RIGHT_BOTTOM_FAKE_WALL_CHEST, true), LOCATION(RC_BOTTOM_OF_THE_WELL_COMPASS_CHEST, true), - //N64 has no extra check here, but I can't get past without dealing with the spider or taking a hit + //N64 has no extra check here, but I can't get past without dealing with the spider or taking a hit, they probably assume sticks LOCATION(RC_BOTTOM_OF_THE_WELL_CENTER_SKULLTULA_CHEST, logic->CanPassEnemy(RE_BIG_SKULLTULA) || logic->TakeDamage()), //Not technically behind a wall, but still logically needs lens due to pits LOCATION(RC_BOTTOM_OF_THE_WELL_BACK_LEFT_BOMBABLE_CHEST, logic->HasExplosives()), @@ -111,7 +111,7 @@ void RegionTable_Init_BottomOfTheWell() { areaTable[RR_BOTTOM_OF_THE_WELL_COFFIN_ROOM] = Region("Bottom of the Well Coffin Room", "Bottom of the Well", {RA_BOTTOM_OF_THE_WELL}, NO_DAY_NIGHT_CYCLE, {}, { //Locations LOCATION(RC_BOTTOM_OF_THE_WELL_FREESTANDING_KEY, logic->HasFireSourceWithTorch() || logic->CanUse(RG_FAIRY_BOW)), - LOCATION(RC_BOTTOM_OF_THE_WELL_COFFIN_ROOM_FRONT_LEFT_HEART, logic->HasFireSourceWithTorch() || logic->CanUse(RG_FAIRY_BOW)), + LOCATION(RC_BOTTOM_OF_THE_WELL_COFFIN_ROOM_FRONT_LEFT_HEART, true), LOCATION(RC_BOTTOM_OF_THE_WELL_COFFIN_ROOM_MIDDLE_RIGHT_HEART, logic->HasFireSourceWithTorch() || logic->CanUse(RG_FAIRY_BOW)), }, { //Exits diff --git a/soh/soh/Enhancements/randomizer/location_access/dungeons/dodongos_cavern.cpp b/soh/soh/Enhancements/randomizer/location_access/dungeons/dodongos_cavern.cpp index eb8be8bb7..189d1c867 100644 --- a/soh/soh/Enhancements/randomizer/location_access/dungeons/dodongos_cavern.cpp +++ b/soh/soh/Enhancements/randomizer/location_access/dungeons/dodongos_cavern.cpp @@ -60,7 +60,7 @@ void RegionTable_Init_DodongosCavern() { }, { //Exits Entrance(RR_DODONGOS_CAVERN_LOBBY, []{return true;}), - //Shield seems to be in logic to drop a pot on thier head as they hit you to blow up the wall + //Shield seems to be in logic to drop a pot on their head as they hit you to blow up the wall Entrance(RR_DODONGOS_CAVERN_SE_ROOM, []{return Here(RR_DODONGOS_CAVERN_SE_CORRIDOR, []{return logic->BlastOrSmash() || logic->CanAttack() || (logic->TakeDamage() && logic->CanShield());});}), Entrance(RR_DODONGOS_CAVERN_NEAR_LOWER_LIZALFOS, []{return true;}), }); diff --git a/soh/soh/Enhancements/randomizer/location_access/dungeons/spirit_temple.cpp b/soh/soh/Enhancements/randomizer/location_access/dungeons/spirit_temple.cpp index 30481922c..8b8b4d465 100644 --- a/soh/soh/Enhancements/randomizer/location_access/dungeons/spirit_temple.cpp +++ b/soh/soh/Enhancements/randomizer/location_access/dungeons/spirit_temple.cpp @@ -45,12 +45,12 @@ void RegionTable_Init_SpiritTemple() { areaTable[RR_SPIRIT_TEMPLE_CHILD_CLIMB] = Region("Child Spirit Temple Climb", "Spirit Temple", {RA_SPIRIT_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, { //Locations - LOCATION(RC_SPIRIT_TEMPLE_CHILD_CLIMB_NORTH_CHEST, logic->HasProjectile(HasProjectileAge::Both) || ((logic->SmallKeys(RR_SPIRIT_TEMPLE, 3) || (logic->SmallKeys(RR_SPIRIT_TEMPLE, 2) && ctx->GetOption(RSK_BOMBCHUS_IN_LOGIC) && logic->BombchuRefill() && ctx->GetOption(RSK_SHUFFLE_DUNGEON_ENTRANCES).Is(RO_DUNGEON_ENTRANCE_SHUFFLE_OFF))) && logic->CanUse(RG_SILVER_GAUNTLETS) && logic->HasProjectile(HasProjectileAge::Adult)) || (logic->SmallKeys(RR_SPIRIT_TEMPLE, 5) && logic->IsChild && logic->HasProjectile(HasProjectileAge::Child))), - LOCATION(RC_SPIRIT_TEMPLE_CHILD_CLIMB_EAST_CHEST, logic->HasProjectile(HasProjectileAge::Both) || ((logic->SmallKeys(RR_SPIRIT_TEMPLE, 3) || (logic->SmallKeys(RR_SPIRIT_TEMPLE, 2) && ctx->GetOption(RSK_BOMBCHUS_IN_LOGIC) && logic->BombchuRefill() && ctx->GetOption(RSK_SHUFFLE_DUNGEON_ENTRANCES).Is(RO_DUNGEON_ENTRANCE_SHUFFLE_OFF))) && logic->CanUse(RG_SILVER_GAUNTLETS) && logic->HasProjectile(HasProjectileAge::Adult)) || (logic->SmallKeys(RR_SPIRIT_TEMPLE, 5) && logic->IsChild && logic->HasProjectile(HasProjectileAge::Child))), + LOCATION(RC_SPIRIT_TEMPLE_CHILD_CLIMB_NORTH_CHEST, logic->HasProjectile(HasProjectileAge::Both) || ((logic->SmallKeys(RR_SPIRIT_TEMPLE, 3) || (logic->SmallKeys(RR_SPIRIT_TEMPLE, 2) && ctx->GetOption(RSK_BOMBCHU_BAG) && logic->BombchuRefill() && ctx->GetOption(RSK_SHUFFLE_DUNGEON_ENTRANCES).Is(RO_DUNGEON_ENTRANCE_SHUFFLE_OFF))) && logic->CanUse(RG_SILVER_GAUNTLETS) && logic->HasProjectile(HasProjectileAge::Adult)) || (logic->SmallKeys(RR_SPIRIT_TEMPLE, 5) && logic->IsChild && logic->HasProjectile(HasProjectileAge::Child))), + LOCATION(RC_SPIRIT_TEMPLE_CHILD_CLIMB_EAST_CHEST, logic->HasProjectile(HasProjectileAge::Both) || ((logic->SmallKeys(RR_SPIRIT_TEMPLE, 3) || (logic->SmallKeys(RR_SPIRIT_TEMPLE, 2) && ctx->GetOption(RSK_BOMBCHU_BAG) && logic->BombchuRefill() && ctx->GetOption(RSK_SHUFFLE_DUNGEON_ENTRANCES).Is(RO_DUNGEON_ENTRANCE_SHUFFLE_OFF))) && logic->CanUse(RG_SILVER_GAUNTLETS) && logic->HasProjectile(HasProjectileAge::Adult)) || (logic->SmallKeys(RR_SPIRIT_TEMPLE, 5) && logic->IsChild && logic->HasProjectile(HasProjectileAge::Child))), LOCATION(RC_SPIRIT_TEMPLE_GS_SUN_ON_FLOOR_ROOM, logic->HasProjectile(HasProjectileAge::Both) || logic->CanUse(RG_DINS_FIRE) || (logic->TakeDamage() && (logic->CanJumpslashExceptHammer() || logic->HasProjectile(HasProjectileAge::Child))) || (logic->IsChild && logic->SmallKeys(RR_SPIRIT_TEMPLE, 5) && logic->HasProjectile(HasProjectileAge::Child)) || - ((logic->SmallKeys(RR_SPIRIT_TEMPLE, 3) || (logic->SmallKeys(RR_SPIRIT_TEMPLE, 2) && ctx->GetOption(RSK_BOMBCHUS_IN_LOGIC) && logic->BombchuRefill() && ctx->GetOption(RSK_SHUFFLE_DUNGEON_ENTRANCES).Is(RO_DUNGEON_ENTRANCE_SHUFFLE_OFF))) && logic->CanUse(RG_SILVER_GAUNTLETS) && (logic->HasProjectile(HasProjectileAge::Adult) || (logic->TakeDamage() && logic->CanJumpslashExceptHammer())))), + ((logic->SmallKeys(RR_SPIRIT_TEMPLE, 3) || (logic->SmallKeys(RR_SPIRIT_TEMPLE, 2) && ctx->GetOption(RSK_BOMBCHU_BAG) && logic->BombchuRefill() && ctx->GetOption(RSK_SHUFFLE_DUNGEON_ENTRANCES).Is(RO_DUNGEON_ENTRANCE_SHUFFLE_OFF))) && logic->CanUse(RG_SILVER_GAUNTLETS) && (logic->HasProjectile(HasProjectileAge::Adult) || (logic->TakeDamage() && logic->CanJumpslashExceptHammer())))), LOCATION(RC_SPIRIT_TEMPLE_CHILD_CLIMB_POT_1, logic->CanBreakPots()), }, { //Exits @@ -72,11 +72,11 @@ void RegionTable_Init_SpiritTemple() { areaTable[RR_SPIRIT_TEMPLE_CENTRAL_CHAMBER] = Region("Spirit Temple Central Chamber", "Spirit Temple", {RA_SPIRIT_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, { //Locations - LOCATION(RC_SPIRIT_TEMPLE_MAP_CHEST, ((logic->HasExplosives() || logic->SmallKeys(RR_SPIRIT_TEMPLE, 3) || (logic->SmallKeys(RR_SPIRIT_TEMPLE, 2) && ctx->GetOption(RSK_BOMBCHUS_IN_LOGIC) && logic->BombchuRefill() && ctx->GetOption(RSK_SHUFFLE_DUNGEON_ENTRANCES).Is(RO_DUNGEON_ENTRANCE_SHUFFLE_OFF))) && + LOCATION(RC_SPIRIT_TEMPLE_MAP_CHEST, ((logic->HasExplosives() || logic->SmallKeys(RR_SPIRIT_TEMPLE, 3) || (logic->SmallKeys(RR_SPIRIT_TEMPLE, 2) && ctx->GetOption(RSK_BOMBCHU_BAG) && logic->BombchuRefill() && ctx->GetOption(RSK_SHUFFLE_DUNGEON_ENTRANCES).Is(RO_DUNGEON_ENTRANCE_SHUFFLE_OFF))) && (logic->CanUse(RG_DINS_FIRE) || ((logic->CanUse(RG_FIRE_ARROWS) || ctx->GetTrickOption(RT_SPIRIT_MAP_CHEST)) && logic->CanUse(RG_FAIRY_BOW) && logic->CanUse(RG_STICKS) ))) || (logic->SmallKeys(RR_SPIRIT_TEMPLE, 5) && logic->HasExplosives() && logic->CanUse(RG_STICKS)) || (logic->SmallKeys(RR_SPIRIT_TEMPLE, 3) && (logic->CanUse(RG_FIRE_ARROWS) || (ctx->GetTrickOption(RT_SPIRIT_MAP_CHEST) && logic->CanUse(RG_FAIRY_BOW))) && logic->CanUse(RG_SILVER_GAUNTLETS))), - LOCATION(RC_SPIRIT_TEMPLE_SUN_BLOCK_ROOM_CHEST, ((logic->HasExplosives() || logic->SmallKeys(RR_SPIRIT_TEMPLE, 3) || (logic->SmallKeys(RR_SPIRIT_TEMPLE, 2) && ctx->GetOption(RSK_BOMBCHUS_IN_LOGIC) && logic->BombchuRefill() && ctx->GetOption(RSK_SHUFFLE_DUNGEON_ENTRANCES).Is(RO_DUNGEON_ENTRANCE_SHUFFLE_OFF))) && + LOCATION(RC_SPIRIT_TEMPLE_SUN_BLOCK_ROOM_CHEST, ((logic->HasExplosives() || logic->SmallKeys(RR_SPIRIT_TEMPLE, 3) || (logic->SmallKeys(RR_SPIRIT_TEMPLE, 2) && ctx->GetOption(RSK_BOMBCHU_BAG) && logic->BombchuRefill() && ctx->GetOption(RSK_SHUFFLE_DUNGEON_ENTRANCES).Is(RO_DUNGEON_ENTRANCE_SHUFFLE_OFF))) && (logic->CanUse(RG_DINS_FIRE) || ((logic->CanUse(RG_FIRE_ARROWS) || ctx->GetTrickOption(RT_SPIRIT_SUN_CHEST)) && logic->CanUse(RG_FAIRY_BOW) && logic->CanUse(RG_STICKS) ))) || (logic->SmallKeys(RR_SPIRIT_TEMPLE, 5) && logic->HasExplosives() && logic->CanUse(RG_STICKS)) || (logic->SmallKeys(RR_SPIRIT_TEMPLE, 3) && (logic->CanUse(RG_FIRE_ARROWS) || (ctx->GetTrickOption(RT_SPIRIT_SUN_CHEST) && logic->CanUse(RG_FAIRY_BOW))) && logic->CanUse(RG_SILVER_GAUNTLETS))), @@ -85,19 +85,19 @@ void RegionTable_Init_SpiritTemple() { LOCATION(RC_SPIRIT_TEMPLE_GS_HALL_AFTER_SUN_BLOCK_ROOM, (logic->HasExplosives() && logic->CanUse(RG_BOOMERANG) && logic->CanUse(RG_HOOKSHOT)) || (logic->CanUse(RG_BOOMERANG) && logic->SmallKeys(RR_SPIRIT_TEMPLE, 5) && logic->HasExplosives()) || (logic->CanUse(RG_HOOKSHOT) && logic->CanUse(RG_SILVER_GAUNTLETS) && (logic->SmallKeys(RR_SPIRIT_TEMPLE, 3) || (logic->SmallKeys(RR_SPIRIT_TEMPLE, 2) && - logic->CanUse(RG_BOOMERANG) && ctx->GetOption(RSK_BOMBCHUS_IN_LOGIC) && logic->BombchuRefill() && ctx->GetOption(RSK_SHUFFLE_DUNGEON_ENTRANCES).Is(RO_DUNGEON_ENTRANCE_SHUFFLE_OFF))))), - LOCATION(RC_SPIRIT_TEMPLE_GS_LOBBY, ((logic->HasExplosives() || logic->SmallKeys(RR_SPIRIT_TEMPLE, 3) || (logic->SmallKeys(RR_SPIRIT_TEMPLE, 2) && ctx->GetOption(RSK_BOMBCHUS_IN_LOGIC) && logic->BombchuRefill() && ctx->GetOption(RSK_SHUFFLE_DUNGEON_ENTRANCES).Is(RO_DUNGEON_ENTRANCE_SHUFFLE_OFF))) && + logic->CanUse(RG_BOOMERANG) && ctx->GetOption(RSK_BOMBCHU_BAG) && logic->BombchuRefill() && ctx->GetOption(RSK_SHUFFLE_DUNGEON_ENTRANCES).Is(RO_DUNGEON_ENTRANCE_SHUFFLE_OFF))))), + LOCATION(RC_SPIRIT_TEMPLE_GS_LOBBY, ((logic->HasExplosives() || logic->SmallKeys(RR_SPIRIT_TEMPLE, 3) || (logic->SmallKeys(RR_SPIRIT_TEMPLE, 2) && ctx->GetOption(RSK_BOMBCHU_BAG) && logic->BombchuRefill() && ctx->GetOption(RSK_SHUFFLE_DUNGEON_ENTRANCES).Is(RO_DUNGEON_ENTRANCE_SHUFFLE_OFF))) && ctx->GetTrickOption(RT_SPIRIT_LOBBY_GS) && logic->CanUse(RG_BOOMERANG) && (logic->CanUse(RG_HOOKSHOT) || logic->CanUse(RG_HOVER_BOOTS) || ctx->GetTrickOption(RT_SPIRIT_LOBBY_JUMP))) || (ctx->GetTrickOption(RT_SPIRIT_LOBBY_GS) && logic->SmallKeys(RR_SPIRIT_TEMPLE, 5) && logic->HasExplosives() && logic->CanUse(RG_BOOMERANG)) || (logic->SmallKeys(RR_SPIRIT_TEMPLE, 3) && logic->CanUse(RG_SILVER_GAUNTLETS) && (logic->CanUse(RG_HOOKSHOT) || logic->CanUse(RG_HOVER_BOOTS) || ctx->GetTrickOption(RT_SPIRIT_LOBBY_JUMP)))), - LOCATION(RC_SPIRIT_TEMPLE_AFTER_SUN_BLOCK_POT_1, logic->CanBreakPots() && (logic->SmallKeys(RR_SPIRIT_TEMPLE, 3) || (logic->SmallKeys(RR_SPIRIT_TEMPLE, 2) && ctx->GetOption(RSK_BOMBCHUS_IN_LOGIC) && logic->BombchuRefill() && ctx->GetOption(RSK_SHUFFLE_DUNGEON_ENTRANCES).Is(RO_DUNGEON_ENTRANCE_SHUFFLE_OFF)))), - LOCATION(RC_SPIRIT_TEMPLE_AFTER_SUN_BLOCK_POT_2, logic->CanBreakPots() && (logic->SmallKeys(RR_SPIRIT_TEMPLE, 3) || (logic->SmallKeys(RR_SPIRIT_TEMPLE, 2) && ctx->GetOption(RSK_BOMBCHUS_IN_LOGIC) && logic->BombchuRefill() && ctx->GetOption(RSK_SHUFFLE_DUNGEON_ENTRANCES).Is(RO_DUNGEON_ENTRANCE_SHUFFLE_OFF)))), - LOCATION(RC_SPIRIT_TEMPLE_CENTRAL_CHAMBER_POT_1, logic->CanBreakPots() && (logic->SmallKeys(RR_SPIRIT_TEMPLE, 3) || (logic->SmallKeys(RR_SPIRIT_TEMPLE, 2) && ctx->GetOption(RSK_BOMBCHUS_IN_LOGIC) && logic->BombchuRefill() && ctx->GetOption(RSK_SHUFFLE_DUNGEON_ENTRANCES).Is(RO_DUNGEON_ENTRANCE_SHUFFLE_OFF)))), - LOCATION(RC_SPIRIT_TEMPLE_CENTRAL_CHAMBER_POT_2, logic->CanBreakPots() && (logic->SmallKeys(RR_SPIRIT_TEMPLE, 3) || (logic->SmallKeys(RR_SPIRIT_TEMPLE, 2) && ctx->GetOption(RSK_BOMBCHUS_IN_LOGIC) && logic->BombchuRefill() && ctx->GetOption(RSK_SHUFFLE_DUNGEON_ENTRANCES).Is(RO_DUNGEON_ENTRANCE_SHUFFLE_OFF)))), - LOCATION(RC_SPIRIT_TEMPLE_CENTRAL_CHAMBER_POT_3, logic->CanBreakPots() && (logic->SmallKeys(RR_SPIRIT_TEMPLE, 3) || (logic->SmallKeys(RR_SPIRIT_TEMPLE, 2) && ctx->GetOption(RSK_BOMBCHUS_IN_LOGIC) && logic->BombchuRefill() && ctx->GetOption(RSK_SHUFFLE_DUNGEON_ENTRANCES).Is(RO_DUNGEON_ENTRANCE_SHUFFLE_OFF)))), - LOCATION(RC_SPIRIT_TEMPLE_CENTRAL_CHAMBER_POT_4, logic->CanBreakPots() && (logic->SmallKeys(RR_SPIRIT_TEMPLE, 3) || (logic->SmallKeys(RR_SPIRIT_TEMPLE, 2) && ctx->GetOption(RSK_BOMBCHUS_IN_LOGIC) && logic->BombchuRefill() && ctx->GetOption(RSK_SHUFFLE_DUNGEON_ENTRANCES).Is(RO_DUNGEON_ENTRANCE_SHUFFLE_OFF)))), - LOCATION(RC_SPIRIT_TEMPLE_CENTRAL_CHAMBER_POT_5, logic->CanBreakPots() && (logic->SmallKeys(RR_SPIRIT_TEMPLE, 3) || (logic->SmallKeys(RR_SPIRIT_TEMPLE, 2) && ctx->GetOption(RSK_BOMBCHUS_IN_LOGIC) && logic->BombchuRefill() && ctx->GetOption(RSK_SHUFFLE_DUNGEON_ENTRANCES).Is(RO_DUNGEON_ENTRANCE_SHUFFLE_OFF)))), - LOCATION(RC_SPIRIT_TEMPLE_CENTRAL_CHAMBER_POT_6, logic->CanBreakPots() && (logic->SmallKeys(RR_SPIRIT_TEMPLE, 3) || (logic->SmallKeys(RR_SPIRIT_TEMPLE, 2) && ctx->GetOption(RSK_BOMBCHUS_IN_LOGIC) && logic->BombchuRefill() && ctx->GetOption(RSK_SHUFFLE_DUNGEON_ENTRANCES).Is(RO_DUNGEON_ENTRANCE_SHUFFLE_OFF)))), + LOCATION(RC_SPIRIT_TEMPLE_AFTER_SUN_BLOCK_POT_1, logic->CanBreakPots() && (logic->SmallKeys(RR_SPIRIT_TEMPLE, 3) || (logic->SmallKeys(RR_SPIRIT_TEMPLE, 2) && ctx->GetOption(RSK_BOMBCHU_BAG) && logic->BombchuRefill() && ctx->GetOption(RSK_SHUFFLE_DUNGEON_ENTRANCES).Is(RO_DUNGEON_ENTRANCE_SHUFFLE_OFF)))), + LOCATION(RC_SPIRIT_TEMPLE_AFTER_SUN_BLOCK_POT_2, logic->CanBreakPots() && (logic->SmallKeys(RR_SPIRIT_TEMPLE, 3) || (logic->SmallKeys(RR_SPIRIT_TEMPLE, 2) && ctx->GetOption(RSK_BOMBCHU_BAG) && logic->BombchuRefill() && ctx->GetOption(RSK_SHUFFLE_DUNGEON_ENTRANCES).Is(RO_DUNGEON_ENTRANCE_SHUFFLE_OFF)))), + LOCATION(RC_SPIRIT_TEMPLE_CENTRAL_CHAMBER_POT_1, logic->CanBreakPots() && (logic->SmallKeys(RR_SPIRIT_TEMPLE, 3) || (logic->SmallKeys(RR_SPIRIT_TEMPLE, 2) && ctx->GetOption(RSK_BOMBCHU_BAG) && logic->BombchuRefill() && ctx->GetOption(RSK_SHUFFLE_DUNGEON_ENTRANCES).Is(RO_DUNGEON_ENTRANCE_SHUFFLE_OFF)))), + LOCATION(RC_SPIRIT_TEMPLE_CENTRAL_CHAMBER_POT_2, logic->CanBreakPots() && (logic->SmallKeys(RR_SPIRIT_TEMPLE, 3) || (logic->SmallKeys(RR_SPIRIT_TEMPLE, 2) && ctx->GetOption(RSK_BOMBCHU_BAG) && logic->BombchuRefill() && ctx->GetOption(RSK_SHUFFLE_DUNGEON_ENTRANCES).Is(RO_DUNGEON_ENTRANCE_SHUFFLE_OFF)))), + LOCATION(RC_SPIRIT_TEMPLE_CENTRAL_CHAMBER_POT_3, logic->CanBreakPots() && (logic->SmallKeys(RR_SPIRIT_TEMPLE, 3) || (logic->SmallKeys(RR_SPIRIT_TEMPLE, 2) && ctx->GetOption(RSK_BOMBCHU_BAG) && logic->BombchuRefill() && ctx->GetOption(RSK_SHUFFLE_DUNGEON_ENTRANCES).Is(RO_DUNGEON_ENTRANCE_SHUFFLE_OFF)))), + LOCATION(RC_SPIRIT_TEMPLE_CENTRAL_CHAMBER_POT_4, logic->CanBreakPots() && (logic->SmallKeys(RR_SPIRIT_TEMPLE, 3) || (logic->SmallKeys(RR_SPIRIT_TEMPLE, 2) && ctx->GetOption(RSK_BOMBCHU_BAG) && logic->BombchuRefill() && ctx->GetOption(RSK_SHUFFLE_DUNGEON_ENTRANCES).Is(RO_DUNGEON_ENTRANCE_SHUFFLE_OFF)))), + LOCATION(RC_SPIRIT_TEMPLE_CENTRAL_CHAMBER_POT_5, logic->CanBreakPots() && (logic->SmallKeys(RR_SPIRIT_TEMPLE, 3) || (logic->SmallKeys(RR_SPIRIT_TEMPLE, 2) && ctx->GetOption(RSK_BOMBCHU_BAG) && logic->BombchuRefill() && ctx->GetOption(RSK_SHUFFLE_DUNGEON_ENTRANCES).Is(RO_DUNGEON_ENTRANCE_SHUFFLE_OFF)))), + LOCATION(RC_SPIRIT_TEMPLE_CENTRAL_CHAMBER_POT_6, logic->CanBreakPots() && (logic->SmallKeys(RR_SPIRIT_TEMPLE, 3) || (logic->SmallKeys(RR_SPIRIT_TEMPLE, 2) && ctx->GetOption(RSK_BOMBCHU_BAG) && logic->BombchuRefill() && ctx->GetOption(RSK_SHUFFLE_DUNGEON_ENTRANCES).Is(RO_DUNGEON_ENTRANCE_SHUFFLE_OFF)))), }, { //Exits Entrance(RR_SPIRIT_TEMPLE_OUTDOOR_HANDS, []{return logic->CanJumpslashExceptHammer() || logic->HasExplosives();}), @@ -267,7 +267,7 @@ void RegionTable_Init_SpiritTemple() { LOCATION(RC_SPIRIT_TEMPLE_MQ_CHILD_CLIMB_NORTH_CHEST, MQSpiritSharedBrokenWallRoom(RR_SPIRIT_TEMPLE_MQ_BROKEN_WALL_ROOM, []{return logic->CanKillEnemy(RE_BEAMOS);})), //Sunlights only temp spawn this chest, which is unintuitive/a bug. //chest is only reachable as adult glitchlessly, so we can skip the shared in favour of IsAdult as adult access is always Certain - LOCATION(RC_SPIRIT_TEMPLE_MQ_CHILD_CLIMB_SOUTH_CHEST, logic->IsAdult && logic->HasExplosives() && (ctx->GetOption(RSK_SUNLIGHT_ARROWS) && logic->CanUse(RG_LIGHT_ARROWS)) && logic->CanUse(RG_HOOKSHOT)), + LOCATION(RC_SPIRIT_TEMPLE_MQ_CHILD_CLIMB_SOUTH_CHEST, logic->IsAdult && (logic->HasExplosives() || (ctx->GetOption(RSK_SUNLIGHT_ARROWS) && logic->CanUse(RG_LIGHT_ARROWS))) && logic->CanUse(RG_HOOKSHOT)), }, { //Exits Entrance(RR_SPIRIT_TEMPLE_MQ_UNDER_LIKE_LIKE, []{return logic->CanHitSwitch();}), diff --git a/soh/soh/Enhancements/randomizer/location_access/overworld/death_mountain_trail.cpp b/soh/soh/Enhancements/randomizer/location_access/overworld/death_mountain_trail.cpp index d67086371..bd0362598 100644 --- a/soh/soh/Enhancements/randomizer/location_access/overworld/death_mountain_trail.cpp +++ b/soh/soh/Enhancements/randomizer/location_access/overworld/death_mountain_trail.cpp @@ -71,6 +71,7 @@ void RegionTable_Init_DeathMountainTrail() { LOCATION(RC_DMT_COW_GROTTO_RUPEE_5, true), LOCATION(RC_DMT_COW_GROTTO_RUPEE_6, true), LOCATION(RC_DMT_COW_GROTTO_RED_RUPEE, true), + LOCATION(RC_DMT_COW_GROTTO_STORMS_FAIRY, logic->CanUse(RG_SONG_OF_STORMS)), }, { //Exits Entrance(RR_DEATH_MOUNTAIN_SUMMIT, []{return true;}), diff --git a/soh/soh/Enhancements/randomizer/location_access/overworld/graveyard.cpp b/soh/soh/Enhancements/randomizer/location_access/overworld/graveyard.cpp index d6ded1312..727431b1f 100644 --- a/soh/soh/Enhancements/randomizer/location_access/overworld/graveyard.cpp +++ b/soh/soh/Enhancements/randomizer/location_access/overworld/graveyard.cpp @@ -24,7 +24,7 @@ void RegionTable_Init_Graveyard() { Entrance(RR_GRAVEYARD_COMPOSERS_GRAVE, []{return logic->CanUse(RG_ZELDAS_LULLABY);}), Entrance(RR_GRAVEYARD_HEART_PIECE_GRAVE, []{return logic->IsAdult || logic->AtNight;}), Entrance(RR_GRAVEYARD_DAMPES_GRAVE, []{return logic->IsAdult;}), - Entrance(RR_GRAVEYARD_DAMPES_HOUSE, []{return logic->IsAdult /*|| logic->AtDampeTime*/;}), //TODO: This needs to be handled in ToD rework + Entrance(RR_GRAVEYARD_DAMPES_HOUSE, []{return logic->IsAdult && logic->CanOpenOverworldDoor(RG_DAMPES_HUT_KEY) /*|| logic->AtDampeTime*/;}), //TODO: This needs to be handled in ToD rework Entrance(RR_KAKARIKO_VILLAGE, []{return true;}), Entrance(RR_GRAVEYARD_WARP_PAD_REGION, []{return false;}), }); @@ -63,8 +63,9 @@ void RegionTable_Init_Graveyard() { areaTable[RR_GRAVEYARD_COMPOSERS_GRAVE] = Region("Graveyard Composers Grave", "Graveyard Composers Grave", {}, NO_DAY_NIGHT_CYCLE, {}, { //Locations - LOCATION(RC_GRAVEYARD_ROYAL_FAMILYS_TOMB_CHEST, logic->HasFireSource()), - LOCATION(RC_SONG_FROM_ROYAL_FAMILYS_TOMB, logic->CanUseProjectile() || logic->CanJumpslash()), + LOCATION(RC_GRAVEYARD_ROYAL_FAMILYS_TOMB_CHEST, logic->HasFireSource()), + LOCATION(RC_SONG_FROM_ROYAL_FAMILYS_TOMB, logic->CanUseProjectile() || logic->CanJumpslash()), + LOCATION(RC_GRAVEYARD_ROYAL_FAMILYS_TOMB_SUN_FAIRY, logic->CanUse(RG_SUNS_SONG)), }, { //Exits Entrance(RR_THE_GRAVEYARD, []{return true;}), @@ -103,7 +104,7 @@ void RegionTable_Init_Graveyard() { LOCATION(RC_DAMPE_HINT, logic->IsAdult), }, { //Exits - Entrance(RR_THE_GRAVEYARD, []{return true;}), + Entrance(RR_THE_GRAVEYARD, []{return logic->CanOpenOverworldDoor(RG_DAMPES_HUT_KEY);}), }); areaTable[RR_GRAVEYARD_WARP_PAD_REGION] = Region("Graveyard Warp Pad Region", "Graveyard", {RA_THE_GRAVEYARD}, NO_DAY_NIGHT_CYCLE, { diff --git a/soh/soh/Enhancements/randomizer/location_access/overworld/haunted_wasteland.cpp b/soh/soh/Enhancements/randomizer/location_access/overworld/haunted_wasteland.cpp index 60e616f76..abedcc571 100644 --- a/soh/soh/Enhancements/randomizer/location_access/overworld/haunted_wasteland.cpp +++ b/soh/soh/Enhancements/randomizer/location_access/overworld/haunted_wasteland.cpp @@ -14,11 +14,11 @@ void RegionTable_Init_HauntedWasteland() { //Events EventAccess(&logic->FairyPot, []{return true;}), EventAccess(&logic->NutPot, []{return true;}), - EventAccess(&logic->CarpetMerchant, []{return logic->HasItem(RG_ADULT_WALLET) && CanBuyAnother(RC_WASTELAND_BOMBCHU_SALESMAN) && (logic->CanJumpslashExceptHammer() || logic->CanUse(RG_HOVER_BOOTS));}), + EventAccess(&logic->CarpetMerchant, []{return logic->HasItem(RG_ADULT_WALLET) && CanBuyAnother(RC_WASTELAND_BOMBCHU_SALESMAN) && (logic->CanJumpslash() || logic->CanUse(RG_HOVER_BOOTS));}), }, { //Locations LOCATION(RC_WASTELAND_CHEST, logic->HasFireSource()), - LOCATION(RC_WASTELAND_BOMBCHU_SALESMAN, logic->CanJumpslashExceptHammer() || logic->CanUse(RG_HOVER_BOOTS)), + LOCATION(RC_WASTELAND_BOMBCHU_SALESMAN, logic->CanJumpslash() || logic->CanUse(RG_HOVER_BOOTS)), LOCATION(RC_WASTELAND_GS, logic->HookshotOrBoomerang()), LOCATION(RC_WASTELAND_NEAR_GS_POT_1, logic->CanBreakPots()), LOCATION(RC_WASTELAND_NEAR_GS_POT_2, logic->CanBreakPots()), diff --git a/soh/soh/Enhancements/randomizer/location_access/overworld/kakariko.cpp b/soh/soh/Enhancements/randomizer/location_access/overworld/kakariko.cpp index 7d22f30a0..8fe55c45f 100644 --- a/soh/soh/Enhancements/randomizer/location_access/overworld/kakariko.cpp +++ b/soh/soh/Enhancements/randomizer/location_access/overworld/kakariko.cpp @@ -33,14 +33,14 @@ void RegionTable_Init_Kakariko() { }, { //Exits Entrance(RR_HYRULE_FIELD, []{return true;}), - Entrance(RR_KAK_CARPENTER_BOSS_HOUSE, []{return true;}), - Entrance(RR_KAK_HOUSE_OF_SKULLTULA, []{return true;}), - Entrance(RR_KAK_IMPAS_HOUSE, []{return true;}), - Entrance(RR_KAK_WINDMILL, []{return true;}), - Entrance(RR_KAK_BAZAAR, []{return logic->IsAdult && logic->AtDay;}), - Entrance(RR_KAK_SHOOTING_GALLERY, []{return logic->IsAdult && logic->AtDay;}), + Entrance(RR_KAK_CARPENTER_BOSS_HOUSE, []{return logic->CanOpenOverworldDoor(RG_BOSS_HOUSE_KEY);}), + Entrance(RR_KAK_HOUSE_OF_SKULLTULA, []{return logic->CanOpenOverworldDoor(RG_SKULLTULA_HOUSE_KEY);}), + Entrance(RR_KAK_IMPAS_HOUSE, []{return logic->CanOpenOverworldDoor(RG_IMPAS_HOUSE_KEY);}), + Entrance(RR_KAK_WINDMILL, []{return logic->CanOpenOverworldDoor(RG_WINDMILL_KEY);}), + Entrance(RR_KAK_BAZAAR, []{return logic->IsAdult && logic->AtDay && logic->CanOpenOverworldDoor(RG_KAK_BAZAAR_KEY);}), + Entrance(RR_KAK_SHOOTING_GALLERY, []{return logic->IsAdult && logic->AtDay && logic->CanOpenOverworldDoor(RG_KAK_SHOOTING_GALLERY_KEY);}), Entrance(RR_KAK_WELL, []{return logic->IsAdult || logic->DrainWell || logic->CanUse(RG_IRON_BOOTS);}), - Entrance(RR_KAK_POTION_SHOP_FRONT, []{return logic->AtDay || logic->IsChild;}), + Entrance(RR_KAK_POTION_SHOP_FRONT, []{return (logic->AtDay || logic->IsChild) && logic->CanOpenOverworldDoor(RG_KAK_POTION_SHOP_KEY);}), Entrance(RR_KAK_REDEAD_GROTTO, []{return logic->CanOpenBombGrotto();}), Entrance(RR_KAK_IMPAS_LEDGE, []{return (logic->IsChild && logic->AtDay) || (logic->IsAdult && ctx->GetTrickOption(RT_VISIBLE_COLLISION));}), Entrance(RR_KAK_WATCHTOWER, []{return logic->IsAdult || logic->AtDay || logic->CanKillEnemy(RE_GOLD_SKULLTULA, ED_LONGSHOT) || (ctx->GetTrickOption(RT_KAK_TOWER_GS) && logic->CanJumpslashExceptHammer());}), @@ -95,8 +95,8 @@ void RegionTable_Init_Kakariko() { //Exits Entrance(RR_KAKARIKO_VILLAGE, []{return true;}), Entrance(RR_KAK_OPEN_GROTTO, []{return true;}), - Entrance(RR_KAK_ODD_POTION_BUILDING, []{return logic->IsAdult;}), - Entrance(RR_KAK_POTION_SHOP_BACK, []{return logic->IsAdult && logic->AtDay;}), + Entrance(RR_KAK_ODD_POTION_BUILDING, []{return logic->IsAdult && logic->CanOpenOverworldDoor(RG_GRANNYS_POTION_SHOP_KEY);}), + Entrance(RR_KAK_POTION_SHOP_BACK, []{return logic->IsAdult && logic->AtDay && logic->CanOpenOverworldDoor(RG_KAK_POTION_SHOP_KEY);}), }); areaTable[RR_KAK_CARPENTER_BOSS_HOUSE] = Region("Kak Carpenter Boss House", "Kak Carpenter Boss House", {}, NO_DAY_NIGHT_CYCLE, { @@ -104,7 +104,7 @@ void RegionTable_Init_Kakariko() { EventAccess(&logic->WakeUpAdultTalon, []{return logic->IsAdult && logic->CanUse(RG_POCKET_EGG);}), }, {}, { //Exits - Entrance(RR_KAKARIKO_VILLAGE, []{return true;}), + Entrance(RR_KAKARIKO_VILLAGE, []{return logic->CanOpenOverworldDoor(RG_BOSS_HOUSE_KEY);}), }); areaTable[RR_KAK_HOUSE_OF_SKULLTULA] = Region("Kak House of Skulltula", "Kak House of Skulltula", {}, NO_DAY_NIGHT_CYCLE, {}, { @@ -117,7 +117,7 @@ void RegionTable_Init_Kakariko() { LOCATION(RC_KAK_100_GOLD_SKULLTULA_REWARD, logic->GetGSCount() >= 100), }, { //Exits - Entrance(RR_KAKARIKO_VILLAGE, []{return true;}), + Entrance(RR_KAKARIKO_VILLAGE, []{return logic->CanOpenOverworldDoor(RG_SKULLTULA_HOUSE_KEY);}), }); areaTable[RR_KAK_IMPAS_HOUSE] = Region("Kak Impas House", "Kak Impas House", {}, NO_DAY_NIGHT_CYCLE, {}, { @@ -125,7 +125,7 @@ void RegionTable_Init_Kakariko() { LOCATION(RC_KAK_IMPAS_HOUSE_COW, logic->CanUse(RG_EPONAS_SONG)), }, { //Exits - Entrance(RR_KAKARIKO_VILLAGE, []{return true;}), + Entrance(RR_KAKARIKO_VILLAGE, []{return logic->CanOpenOverworldDoor(RG_IMPAS_HOUSE_KEY);}), }); areaTable[RR_KAK_IMPAS_HOUSE_BACK] = Region("Kak Impas House Back", "Kak Impas House", {}, NO_DAY_NIGHT_CYCLE, {}, { @@ -146,7 +146,7 @@ void RegionTable_Init_Kakariko() { LOCATION(RC_SONG_FROM_WINDMILL, logic->IsAdult && logic->HasItem(RG_FAIRY_OCARINA)), }, { //Exits - Entrance(RR_KAKARIKO_VILLAGE, []{return true;}), + Entrance(RR_KAKARIKO_VILLAGE, []{return logic->CanOpenOverworldDoor(RG_WINDMILL_KEY);}), }); areaTable[RR_KAK_BAZAAR] = Region("Kak Bazaar", "Kak Bazaar", {}, NO_DAY_NIGHT_CYCLE, {}, { @@ -169,7 +169,7 @@ void RegionTable_Init_Kakariko() { LOCATION(RC_KAK_SHOOTING_GALLERY_REWARD, logic->HasItem(RG_CHILD_WALLET) && logic->IsAdult && logic->CanUse(RG_FAIRY_BOW)), }, { //Exits - Entrance(RR_KAKARIKO_VILLAGE, []{return true;}), + Entrance(RR_KAKARIKO_VILLAGE, []{return logic->CanOpenOverworldDoor(RG_KAK_SHOOTING_GALLERY_KEY);}), }); areaTable[RR_KAK_POTION_SHOP_FRONT] = Region("Kak Potion Shop Front", "Kak Potion Shop", {}, NO_DAY_NIGHT_CYCLE, {}, { @@ -203,7 +203,7 @@ void RegionTable_Init_Kakariko() { LOCATION(RC_KAK_GRANNYS_SHOP, logic->IsAdult && (logic->CanUse(RG_ODD_MUSHROOM) || logic->TradeQuestStep(RG_ODD_MUSHROOM))), }, { // Exits - Entrance(RR_KAK_BACKYARD, []{return true;}), + Entrance(RR_KAK_BACKYARD, []{return logic->CanOpenOverworldDoor(RG_GRANNYS_POTION_SHOP_KEY);}), }); areaTable[RR_KAK_REDEAD_GROTTO] = Region("Kak Redead Grotto", "Kak Redead Grotto", {}, NO_DAY_NIGHT_CYCLE, {}, { diff --git a/soh/soh/Enhancements/randomizer/location_access/overworld/lake_hylia.cpp b/soh/soh/Enhancements/randomizer/location_access/overworld/lake_hylia.cpp index 148acad13..8833441e9 100644 --- a/soh/soh/Enhancements/randomizer/location_access/overworld/lake_hylia.cpp +++ b/soh/soh/Enhancements/randomizer/location_access/overworld/lake_hylia.cpp @@ -44,7 +44,7 @@ void RegionTable_Init_LakeHylia() { Entrance(RR_ZORAS_DOMAIN, []{return logic->IsChild && (logic->HasItem(RG_SILVER_SCALE) || logic->CanUse(RG_IRON_BOOTS));}), Entrance(RR_LH_OWL_FLIGHT, []{return logic->IsChild;}), Entrance(RR_LH_FISHING_ISLAND, []{return ((logic->IsChild || logic->WaterTempleClear) && logic->HasItem(RG_BRONZE_SCALE)) || (logic->IsAdult && (logic->CanUse(RG_SCARECROW) || CanPlantBean(RR_LAKE_HYLIA)));}), - Entrance(RR_LH_LAB, []{return true;}), + Entrance(RR_LH_LAB, []{return logic->CanOpenOverworldDoor(RG_HYLIA_LAB_KEY);}), Entrance(RR_WATER_TEMPLE_ENTRYWAY, []{return logic->CanUse(RG_HOOKSHOT) && ((logic->CanUse(RG_IRON_BOOTS) || (ctx->GetTrickOption(RT_LH_WATER_HOOKSHOT) && logic->HasItem(RG_GOLDEN_SCALE))) || (logic->IsAdult && logic->CanUse(RG_LONGSHOT) && logic->HasItem(RG_GOLDEN_SCALE)));}), Entrance(RR_LH_GROTTO, []{return true;}), }); @@ -52,7 +52,7 @@ void RegionTable_Init_LakeHylia() { areaTable[RR_LH_FISHING_ISLAND] = Region("LH Fishing Island", "Lake Hylia", {RA_LAKE_HYLIA}, DAY_NIGHT_CYCLE, {}, {}, { //Exits Entrance(RR_LAKE_HYLIA, []{return logic->HasItem(RG_BRONZE_SCALE);}), - Entrance(RR_LH_FISHING_POND, []{return true;}), + Entrance(RR_LH_FISHING_POND, []{return logic->CanOpenOverworldDoor(RG_FISHING_HOLE_KEY);}), }); areaTable[RR_LH_OWL_FLIGHT] = Region("LH Owl Flight", "Lake Hylia", {RA_LAKE_HYLIA}, NO_DAY_NIGHT_CYCLE, {}, {}, { @@ -70,7 +70,7 @@ void RegionTable_Init_LakeHylia() { LOCATION(RC_LH_LAB_RIGHT_RUPEE, logic->CanUse(RG_IRON_BOOTS) || logic->HasItem(RG_GOLDEN_SCALE)), }, { //Exits - Entrance(RR_LAKE_HYLIA, []{return true;}), + Entrance(RR_LAKE_HYLIA, []{return logic->CanOpenOverworldDoor(RG_HYLIA_LAB_KEY);}), }); // TODO: should some of these helpers be done via events instead? @@ -115,7 +115,7 @@ void RegionTable_Init_LakeHylia() { LOCATION(RC_FISHING_POLE_HINT, true), }, { //Exits - Entrance(RR_LH_FISHING_ISLAND, []{return true;}), + Entrance(RR_LH_FISHING_ISLAND, []{return logic->CanOpenOverworldDoor(RG_FISHING_HOLE_KEY);}), }); areaTable[RR_LH_GROTTO] = Region("LH Grotto", "LH Grotto", {}, NO_DAY_NIGHT_CYCLE, {}, { diff --git a/soh/soh/Enhancements/randomizer/location_access/overworld/lon_lon_ranch.cpp b/soh/soh/Enhancements/randomizer/location_access/overworld/lon_lon_ranch.cpp index df73b78d9..fa1d7451e 100644 --- a/soh/soh/Enhancements/randomizer/location_access/overworld/lon_lon_ranch.cpp +++ b/soh/soh/Enhancements/randomizer/location_access/overworld/lon_lon_ranch.cpp @@ -25,9 +25,9 @@ void RegionTable_Init_LonLonRanch() { }, { //Exits Entrance(RR_HYRULE_FIELD, []{return true;}), - Entrance(RR_LLR_TALONS_HOUSE, []{return true;}), - Entrance(RR_LLR_STABLES, []{return true;}), - Entrance(RR_LLR_TOWER, []{return true;}), + Entrance(RR_LLR_TALONS_HOUSE, []{return logic->CanOpenOverworldDoor(RG_TALONS_HOUSE_KEY);}), + Entrance(RR_LLR_STABLES, []{return logic->CanOpenOverworldDoor(RG_STABLES_KEY);}), + Entrance(RR_LLR_TOWER, []{return logic->CanOpenOverworldDoor(RG_BACK_TOWER_KEY);}), Entrance(RR_LLR_GROTTO, []{return logic->IsChild;}), }); @@ -39,7 +39,7 @@ void RegionTable_Init_LonLonRanch() { LOCATION(RC_LLR_TALONS_HOUSE_POT_3, logic->CanBreakPots()), }, { //Exits - Entrance(RR_LON_LON_RANCH, []{return true;}), + Entrance(RR_LON_LON_RANCH, []{return logic->CanOpenOverworldDoor(RG_TALONS_HOUSE_KEY);}), }); areaTable[RR_LLR_STABLES] = Region("LLR Stables", "LLR Stables", {}, NO_DAY_NIGHT_CYCLE, {}, { @@ -48,7 +48,7 @@ void RegionTable_Init_LonLonRanch() { LOCATION(RC_LLR_STABLES_RIGHT_COW, logic->CanUse(RG_EPONAS_SONG)), }, { //Exits - Entrance(RR_LON_LON_RANCH, []{return true;}), + Entrance(RR_LON_LON_RANCH, []{return logic->CanOpenOverworldDoor(RG_STABLES_KEY);}), }); areaTable[RR_LLR_TOWER] = Region("LLR Tower", "LLR Tower", {}, NO_DAY_NIGHT_CYCLE, {}, { @@ -58,7 +58,7 @@ void RegionTable_Init_LonLonRanch() { LOCATION(RC_LLR_TOWER_RIGHT_COW, logic->CanUse(RG_EPONAS_SONG)), }, { //Exits - Entrance(RR_LON_LON_RANCH, []{return true;}), + Entrance(RR_LON_LON_RANCH, []{return logic->CanOpenOverworldDoor(RG_BACK_TOWER_KEY);}), }); areaTable[RR_LLR_GROTTO] = Region("LLR Grotto", "LLR Grotto", {}, NO_DAY_NIGHT_CYCLE, {}, { diff --git a/soh/soh/Enhancements/randomizer/location_access/overworld/lost_woods.cpp b/soh/soh/Enhancements/randomizer/location_access/overworld/lost_woods.cpp index 6d38b05bd..17aaff639 100644 --- a/soh/soh/Enhancements/randomizer/location_access/overworld/lost_woods.cpp +++ b/soh/soh/Enhancements/randomizer/location_access/overworld/lost_woods.cpp @@ -105,9 +105,10 @@ void RegionTable_Init_LostWoods() { areaTable[RR_LW_SCRUBS_GROTTO] = Region("LW Scrubs Grotto", "LW Scrubs Grotto", {}, NO_DAY_NIGHT_CYCLE, {}, { //Locations - LOCATION(RC_LW_DEKU_SCRUB_GROTTO_REAR, logic->CanStunDeku()), - LOCATION(RC_LW_DEKU_SCRUB_GROTTO_FRONT, logic->CanStunDeku()), - LOCATION(RC_LW_DEKU_SCRUB_GROTTO_BEEHIVE, logic->CanBreakUpperBeehives()), + LOCATION(RC_LW_DEKU_SCRUB_GROTTO_REAR, logic->CanStunDeku()), + LOCATION(RC_LW_DEKU_SCRUB_GROTTO_FRONT, logic->CanStunDeku()), + LOCATION(RC_LW_DEKU_SCRUB_GROTTO_BEEHIVE, logic->CanBreakUpperBeehives()), + LOCATION(RC_LW_DEKU_SCRUB_GROTTO_SUN_FAIRY, logic->CanUse(RG_SUNS_SONG)), }, { //Exits Entrance(RR_LW_BEYOND_MIDO, []{return true;}), diff --git a/soh/soh/Enhancements/randomizer/location_access/overworld/market.cpp b/soh/soh/Enhancements/randomizer/location_access/overworld/market.cpp index 8a6991301..e0ef67aa5 100644 --- a/soh/soh/Enhancements/randomizer/location_access/overworld/market.cpp +++ b/soh/soh/Enhancements/randomizer/location_access/overworld/market.cpp @@ -8,7 +8,7 @@ void RegionTable_Init_Market() { //Exits Entrance(RR_HYRULE_FIELD, []{return logic->IsAdult || logic->AtDay;}), Entrance(RR_THE_MARKET, []{return true;}), - Entrance(RR_MARKET_GUARD_HOUSE, []{return true;}), + Entrance(RR_MARKET_GUARD_HOUSE, []{return logic->CanOpenOverworldDoor(RG_GUARD_HOUSE_KEY);}), }); areaTable[RR_THE_MARKET] = Region("Market", "Market", {RA_THE_MARKET}, NO_DAY_NIGHT_CYCLE, {}, {}, { @@ -16,26 +16,27 @@ void RegionTable_Init_Market() { Entrance(RR_MARKET_ENTRANCE, []{return true;}), Entrance(RR_TOT_ENTRANCE, []{return true;}), Entrance(RR_CASTLE_GROUNDS, []{return true;}), - Entrance(RR_MARKET_BAZAAR, []{return logic->IsChild && logic->AtDay;}), - Entrance(RR_MARKET_MASK_SHOP, []{return logic->IsChild && logic->AtDay;}), - Entrance(RR_MARKET_SHOOTING_GALLERY, []{return logic->IsChild && logic->AtDay;}), - Entrance(RR_MARKET_BOMBCHU_BOWLING, []{return logic->IsChild;}), - Entrance(RR_MARKET_TREASURE_CHEST_GAME, []{return logic->IsChild && logic->AtNight;}), - Entrance(RR_MARKET_POTION_SHOP, []{return logic->IsChild && logic->AtDay;}), + Entrance(RR_MARKET_BAZAAR, []{return logic->IsChild && logic->AtDay && logic->CanOpenOverworldDoor(RG_MARKET_BAZAAR_KEY);}), + Entrance(RR_MARKET_MASK_SHOP, []{return logic->IsChild && logic->AtDay && logic->CanOpenOverworldDoor(RG_MASK_SHOP_KEY);}), + Entrance(RR_MARKET_SHOOTING_GALLERY, []{return logic->IsChild && logic->AtDay && logic->CanOpenOverworldDoor(RG_MARKET_SHOOTING_GALLERY_KEY);}), + Entrance(RR_MARKET_BOMBCHU_BOWLING, []{return logic->IsChild && logic->CanOpenOverworldDoor(RG_BOMBCHU_BOWLING_KEY);}), + Entrance(RR_MARKET_TREASURE_CHEST_GAME, []{return logic->IsChild && logic->AtNight && logic->CanOpenOverworldDoor(RG_TREASURE_CHEST_GAME_BUILDING_KEY);}), + Entrance(RR_MARKET_POTION_SHOP, []{return logic->IsChild && logic->AtDay && logic->CanOpenOverworldDoor(RG_MARKET_POTION_SHOP_KEY);}), Entrance(RR_MARKET_BACK_ALLEY, []{return logic->IsChild;}), }); areaTable[RR_MARKET_BACK_ALLEY] = Region("Market Back Alley", "Market", {RA_THE_MARKET}, NO_DAY_NIGHT_CYCLE, {}, {}, { //Exits Entrance(RR_THE_MARKET, []{return true;}), - Entrance(RR_MARKET_BOMBCHU_SHOP, []{return logic->AtNight;}), - Entrance(RR_MARKET_DOG_LADY_HOUSE, []{return true;}), - Entrance(RR_MARKET_MAN_IN_GREEN_HOUSE, []{return logic->AtNight;}), + Entrance(RR_MARKET_BOMBCHU_SHOP, []{return logic->AtNight && logic->CanOpenOverworldDoor(RG_BOMBCHU_SHOP_KEY);}), + Entrance(RR_MARKET_DOG_LADY_HOUSE, []{return logic->CanOpenOverworldDoor(RG_RICHARDS_HOUSE_KEY);}), + Entrance(RR_MARKET_MAN_IN_GREEN_HOUSE, []{return logic->AtNight && logic->CanOpenOverworldDoor(RG_ALLEY_HOUSE_KEY);}), }); areaTable[RR_MARKET_GUARD_HOUSE] = Region("Market Guard House", "Market Guard House", {}, NO_DAY_NIGHT_CYCLE, { //Events - EventAccess(&logic->CanEmptyBigPoes, []{return logic->IsAdult;}), + EventAccess(&logic->CouldEmptyBigPoes, []{return logic->IsAdult;}), + EventAccess(&logic->CanEmptyBigPoes, []{return logic->IsAdult;}), }, { //Locations LOCATION(RC_MARKET_10_BIG_POES, logic->IsAdult && logic->BigPoeKill), @@ -97,7 +98,7 @@ void RegionTable_Init_Market() { LOCATION(RC_MK_GUARD_HOUSE_ADULT_POT_11, logic->IsAdult && logic->CanBreakPots()), }, { //Exits - Entrance(RR_MARKET_ENTRANCE, []{return true;}), + Entrance(RR_MARKET_ENTRANCE, []{return logic->CanOpenOverworldDoor(RG_GUARD_HOUSE_KEY);}), }); areaTable[RR_MARKET_BAZAAR] = Region("Market Bazaar", "Market Bazaar", {}, NO_DAY_NIGHT_CYCLE, {}, { @@ -132,7 +133,7 @@ void RegionTable_Init_Market() { LOCATION(RC_MARKET_SHOOTING_GALLERY_REWARD, logic->IsChild && logic->HasItem(RG_CHILD_WALLET)), }, { //Exits - Entrance(RR_THE_MARKET, []{return true;}), + Entrance(RR_THE_MARKET, []{return logic->CanOpenOverworldDoor(RG_MARKET_SHOOTING_GALLERY_KEY);}), }); areaTable[RR_MARKET_BOMBCHU_BOWLING] = Region("Market Bombchu Bowling", "Market Bombchu Bowling", {}, NO_DAY_NIGHT_CYCLE, { @@ -144,7 +145,7 @@ void RegionTable_Init_Market() { LOCATION(RC_MARKET_BOMBCHU_BOWLING_SECOND_PRIZE, logic->CouldPlayBowling && logic->BombchusEnabled()), }, { //Exits - Entrance(RR_THE_MARKET, []{return true;}), + Entrance(RR_THE_MARKET, []{return logic->CanOpenOverworldDoor(RG_BOMBCHU_BOWLING_KEY);}), }); areaTable[RR_MARKET_POTION_SHOP] = Region("Market Potion Shop", "Market Potion Shop", {}, NO_DAY_NIGHT_CYCLE, {}, { @@ -178,7 +179,7 @@ void RegionTable_Init_Market() { LOCATION(RC_MARKET_TREASURE_CHEST_GAME_ITEM_5, logic->HasItem(RG_CHILD_WALLET) && ((ctx->GetOption(RSK_SHUFFLE_CHEST_MINIGAME).Is(RO_CHEST_GAME_SINGLE_KEYS) && logic->SmallKeys(RR_MARKET_TREASURE_CHEST_GAME, 5)) || (ctx->GetOption(RSK_SHUFFLE_CHEST_MINIGAME).Is(RO_CHEST_GAME_PACK) && logic->SmallKeys(RR_MARKET_TREASURE_CHEST_GAME, 1)) || (logic->CanUse(RG_LENS_OF_TRUTH) && !ctx->GetOption(RSK_SHUFFLE_CHEST_MINIGAME)))), }, { //Exits - Entrance(RR_THE_MARKET, []{return true;}), + Entrance(RR_THE_MARKET, []{return logic->CanOpenOverworldDoor(RG_TREASURE_CHEST_GAME_BUILDING_KEY);}), }); areaTable[RR_MARKET_BOMBCHU_SHOP] = Region("Market Bombchu Shop", "Market Bombchu Shop", {}, NO_DAY_NIGHT_CYCLE, {}, { @@ -201,7 +202,7 @@ void RegionTable_Init_Market() { LOCATION(RC_MARKET_LOST_DOG, logic->IsChild && logic->AtNight), }, { //Exits - Entrance(RR_MARKET_BACK_ALLEY, []{return true;}), + Entrance(RR_MARKET_BACK_ALLEY, []{return logic->CanOpenOverworldDoor(RG_RICHARDS_HOUSE_KEY);}), }); areaTable[RR_MARKET_MAN_IN_GREEN_HOUSE] = Region("Market Man in Green House", "Market Man in Green House", {}, NO_DAY_NIGHT_CYCLE, {}, { @@ -211,6 +212,6 @@ void RegionTable_Init_Market() { LOCATION(RC_MK_BACK_ALLEY_HOUSE_POT_3, logic->CanBreakPots()), }, { //Exits - Entrance(RR_MARKET_BACK_ALLEY, []{return true;}), + Entrance(RR_MARKET_BACK_ALLEY, []{return logic->CanOpenOverworldDoor(RG_ALLEY_HOUSE_KEY);}), }); } \ No newline at end of file diff --git a/soh/soh/Enhancements/randomizer/location_list.cpp b/soh/soh/Enhancements/randomizer/location_list.cpp index 19ee1c7d0..54c1d8f81 100644 --- a/soh/soh/Enhancements/randomizer/location_list.cpp +++ b/soh/soh/Enhancements/randomizer/location_list.cpp @@ -1800,8 +1800,11 @@ void Rando::StaticData::InitLocationTable() { // locationTable[RC_HF_POND_STORMS_FAIRY] = Location::Fairy(RC_HF_POND_STORMS_FAIRY, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_HYRULE_FIELD, TWO_ACTOR_PARAMS(0x1000, 5012), "Pond Song of Storms Fairy", "Pond Song of Storms Fairy", RHT_HF_POND_STORMS_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_POND_STORMS_FAIRY)); locationTable[RC_HF_FENCE_GROTTO_STORMS_FAIRY] = Location::Fairy(RC_HF_FENCE_GROTTO_STORMS_FAIRY, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_GROTTOS, TWO_ACTOR_PARAMS(0x1000, -308), "Inside Fence Storms Fairy", "Inside Fence Storms Fairy", RHT_HF_FENCE_GROTTO_STORMS_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_FENCE_GROTTO_STORMS_FAIRY)); locationTable[RC_DMT_FLAG_SUN_FAIRY] = Location::Fairy(RC_DMT_FLAG_SUN_FAIRY, RCQUEST_BOTH, RCAREA_DEATH_MOUNTAIN_TRAIL, SCENE_DEATH_MOUNTAIN_TRAIL, TWO_ACTOR_PARAMS(0x1000, 464), "Flag Sun's Song Fairy", "Flag Sun's Song Fairy", RHT_DMT_FLAG_SUN_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DMT_FLAG_SUN_FAIRY)); + locationTable[RC_DMT_COW_GROTTO_STORMS_FAIRY] = Location::Fairy(RC_DMT_COW_GROTTO_STORMS_FAIRY, RCQUEST_BOTH, RCAREA_DEATH_MOUNTAIN_TRAIL, SCENE_GROTTOS, TWO_ACTOR_PARAMS(0x1000, -311), "Cow Grotto Song of Storms Fairy", "Cow Grotto Song of Storms Fairy", RHT_DMT_COW_GROTTO_STORMS_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DMT_COW_GROTTO_STORMS_FAIRY)); locationTable[RC_LW_SHORTCUT_STORMS_FAIRY] = Location::Fairy(RC_LW_SHORTCUT_STORMS_FAIRY, RCQUEST_BOTH, RCAREA_LOST_WOODS, SCENE_LOST_WOODS, TWO_ACTOR_PARAMS(0x1000, -795), "Shortcuts Song of Storms Fairy", "Shortcuts Song of Storms Fairy", RHT_LW_SHORTCUT_STORMS_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LW_SHORTCUT_STORMS_FAIRY)); locationTable[RC_GF_KITCHEN_SUN_FAIRY] = Location::Fairy(RC_GF_KITCHEN_SUN_FAIRY, RCQUEST_BOTH, RCAREA_GERUDO_FORTRESS, SCENE_THIEVES_HIDEOUT, TWO_ACTOR_PARAMS(0x1000, -621), "Kitchen Sun's Song Fairy", "Kitchen Sun's Song Fairy", RHT_GF_KITCHEN_SUN_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GF_KITCHEN_SUN_FAIRY)); + locationTable[RC_LW_DEKU_SCRUB_GROTTO_SUN_FAIRY] = Location::Fairy(RC_LW_DEKU_SCRUB_GROTTO_SUN_FAIRY, RCQUEST_BOTH, RCAREA_LOST_WOODS, SCENE_GROTTOS, TWO_ACTOR_PARAMS(0x1000, 741), "Scrub Grotto Sun's Song Fairy", "Scrub Grotto Sun's Song Fairy", RHT_LW_DEKU_SCRUB_GROTTO_SUN_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LW_DEKU_SCRUB_GROTTO_SUN_FAIRY)); + locationTable[RC_GRAVEYARD_ROYAL_FAMILYS_TOMB_SUN_FAIRY] = Location::Fairy(RC_GRAVEYARD_ROYAL_FAMILYS_TOMB_SUN_FAIRY, RCQUEST_BOTH, RCAREA_GRAVEYARD, SCENE_ROYAL_FAMILYS_TOMB, TWO_ACTOR_PARAMS(0x1000, 1476), "Composer's Grave Sun's Song Fairy", "Composer's Grave Sun's Song Fairy", RHT_GRAVEYARD_ROYAL_FAMILYS_TOMB_SUN_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GRAVEYARD_ROYAL_FAMILYS_TOMB_SUN_FAIRY)); locationTable[RC_SPIRIT_TEMPLE_BOULDER_ROOM_SUN_FAIRY] = Location::Fairy(RC_SPIRIT_TEMPLE_BOULDER_ROOM_SUN_FAIRY, RCQUEST_VANILLA,RCAREA_SPIRIT_TEMPLE, SCENE_SPIRIT_TEMPLE, TWO_ACTOR_PARAMS(0x1000, -1896), "After Boulder Room Sun's Song Fairy", "After Boulder Room Sun's Song Fairy", RHT_SPIRIT_TEMPLE_BOULDER_ROOM_SUN_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SPIRIT_TEMPLE_BOULDER_ROOM_SUN_FAIRY)); locationTable[RC_SPIRIT_TEMPLE_ARMOS_ROOM_SUN_FAIRY] = Location::Fairy(RC_SPIRIT_TEMPLE_ARMOS_ROOM_SUN_FAIRY, RCQUEST_VANILLA,RCAREA_SPIRIT_TEMPLE, SCENE_SPIRIT_TEMPLE, TWO_ACTOR_PARAMS(0x1000, -220), "Four Armos Room Sun's Song Fairy", "Four Armos Room Sun's Song Fairy", RHT_SPIRIT_TEMPLE_ARMOS_ROOM_SUN_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SPIRIT_TEMPLE_ARMOS_ROOM_SUN_FAIRY)); @@ -1985,7 +1988,7 @@ void Rando::StaticData::InitLocationTable() { // locationTable[RC_BOTTOM_OF_THE_WELL_BASEMENT_PLATFORM_BACK_LEFT_RUPEE] = Location::Collectable(RC_BOTTOM_OF_THE_WELL_BASEMENT_PLATFORM_BACK_LEFT_RUPEE, RCQUEST_VANILLA, RCTYPE_FREESTANDING, ACTOR_EN_ITEM00, SCENE_BOTTOM_OF_THE_WELL, TWO_ACTOR_PARAMS(-19, -828), "Basement Platform Back Left Rupee", RHT_BOTTOM_OF_THE_WELL_RUPEE, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_PLATFORM_BACK_LEFT_RUPEE)); locationTable[RC_BOTTOM_OF_THE_WELL_BASEMENT_PLATFORM_MIDDLE_RUPEE] = Location::Collectable(RC_BOTTOM_OF_THE_WELL_BASEMENT_PLATFORM_MIDDLE_RUPEE, RCQUEST_VANILLA, RCTYPE_FREESTANDING, ACTOR_EN_ITEM00, SCENE_BOTTOM_OF_THE_WELL, TWO_ACTOR_PARAMS(47, -805), "Basement Platform Middle Rupee", RHT_BOTTOM_OF_THE_WELL_RUPEE, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_PLATFORM_MIDDLE_RUPEE)); locationTable[RC_BOTTOM_OF_THE_WELL_BASEMENT_PLATFORM_BACK_RIGHT_RUPEE] = Location::Collectable(RC_BOTTOM_OF_THE_WELL_BASEMENT_PLATFORM_BACK_RIGHT_RUPEE, RCQUEST_VANILLA, RCTYPE_FREESTANDING, ACTOR_EN_ITEM00, SCENE_BOTTOM_OF_THE_WELL, TWO_ACTOR_PARAMS(94, -762), "Basement Platform Back Right Rupee", RHT_BOTTOM_OF_THE_WELL_RUPEE, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_PLATFORM_BACK_RIGHT_RUPEE)); - locationTable[RC_BOTTOM_OF_THE_WELL_BASEMENT_PLATFORM_RIGHT_RUPEE] = Location::Collectable(RC_BOTTOM_OF_THE_WELL_BASEMENT_PLATFORM_RIGHT_RUPEE, RCQUEST_VANILLA, RCTYPE_FREESTANDING, ACTOR_EN_ITEM00, SCENE_BOTTOM_OF_THE_WELL, TWO_ACTOR_PARAMS(-85, -710), "Basement Platform Right Rupee", RHT_BOTTOM_OF_THE_WELL_RUPEE, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_PLATFORM_RIGHT_RUPEE)); + locationTable[RC_BOTTOM_OF_THE_WELL_BASEMENT_PLATFORM_RIGHT_RUPEE] = Location::Collectable(RC_BOTTOM_OF_THE_WELL_BASEMENT_PLATFORM_RIGHT_RUPEE, RCQUEST_VANILLA, RCTYPE_FREESTANDING, ACTOR_EN_ITEM00, SCENE_BOTTOM_OF_THE_WELL, TWO_ACTOR_PARAMS(85, -710), "Basement Platform Right Rupee", RHT_BOTTOM_OF_THE_WELL_RUPEE, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_PLATFORM_RIGHT_RUPEE)); locationTable[RC_BOTTOM_OF_THE_WELL_COFFIN_ROOM_FRONT_LEFT_HEART] = Location::Collectable(RC_BOTTOM_OF_THE_WELL_COFFIN_ROOM_FRONT_LEFT_HEART, RCQUEST_VANILLA, RCTYPE_FREESTANDING, ACTOR_EN_ITEM00, SCENE_BOTTOM_OF_THE_WELL, TWO_ACTOR_PARAMS(-1947, -625), "Coffin Room Front Left Heart", RHT_BOTTOM_OF_THE_WELL_HEART, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_BOTTOM_OF_THE_WELL_COFFIN_ROOM_FRONT_LEFT_HEART)); locationTable[RC_BOTTOM_OF_THE_WELL_COFFIN_ROOM_MIDDLE_RIGHT_HEART] = Location::Collectable(RC_BOTTOM_OF_THE_WELL_COFFIN_ROOM_MIDDLE_RIGHT_HEART, RCQUEST_VANILLA, RCTYPE_FREESTANDING, ACTOR_EN_ITEM00, SCENE_BOTTOM_OF_THE_WELL, TWO_ACTOR_PARAMS(-2144, -859), "Coffin Room Middle Right Heart", RHT_BOTTOM_OF_THE_WELL_HEART, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_BOTTOM_OF_THE_WELL_COFFIN_ROOM_MIDDLE_RIGHT_HEART)); diff --git a/soh/soh/Enhancements/randomizer/logic.cpp b/soh/soh/Enhancements/randomizer/logic.cpp index 2b92484b3..1ea19d3ad 100644 --- a/soh/soh/Enhancements/randomizer/logic.cpp +++ b/soh/soh/Enhancements/randomizer/logic.cpp @@ -140,6 +140,31 @@ namespace Rando { case RG_TWINROVA_SOUL: case RG_GANON_SOUL: case RG_SKELETON_KEY: + // Overworld Keys + case RG_GUARD_HOUSE_KEY: + case RG_MARKET_BAZAAR_KEY: + case RG_MARKET_POTION_SHOP_KEY: + case RG_MASK_SHOP_KEY: + case RG_MARKET_SHOOTING_GALLERY_KEY: + case RG_BOMBCHU_BOWLING_KEY: + case RG_TREASURE_CHEST_GAME_BUILDING_KEY: + case RG_BOMBCHU_SHOP_KEY: + case RG_RICHARDS_HOUSE_KEY: + case RG_ALLEY_HOUSE_KEY: + case RG_KAK_BAZAAR_KEY: + case RG_KAK_POTION_SHOP_KEY: + case RG_BOSS_HOUSE_KEY: + case RG_GRANNYS_POTION_SHOP_KEY: + case RG_SKULLTULA_HOUSE_KEY: + case RG_IMPAS_HOUSE_KEY: + case RG_WINDMILL_KEY: + case RG_KAK_SHOOTING_GALLERY_KEY: + case RG_DAMPES_HUT_KEY: + case RG_TALONS_HOUSE_KEY: + case RG_STABLES_KEY: + case RG_BACK_TOWER_KEY: + case RG_HYLIA_LAB_KEY: + case RG_FISHING_HOLE_KEY: return CheckRandoInf(RandoGetToRandInf.at(itemName)); // Boss Keys case RG_EPONA: @@ -382,6 +407,18 @@ namespace Rando { } } + bool Logic::CanOpenOverworldDoor(RandomizerGet key) { + if (!ctx->GetOption(RSK_LOCK_OVERWORLD_DOORS)) { + return true; + } + + if (HasItem(RG_SKELETON_KEY)) { + return true; + } + + return HasItem(key); + } + uint8_t GetDifficultyValueFromString(Rando::Option& glitchOption) { return 0; } @@ -649,7 +686,7 @@ namespace Rando { //RANDOTODO Dark link is buggy right now, retest when he is not return CanJumpslash() || CanUse(RG_FAIRY_BOW); case RE_ANUBIS: - //there's a restoration that allows beating them with mirror shield + some way to trigger thier attack + //there's a restoration that allows beating them with mirror shield + some way to trigger their attack return HasFireSource(); case RE_BEAMOS: return HasExplosives(); @@ -880,13 +917,26 @@ namespace Rando { uint8_t Logic::BottleCount() { uint8_t count = 0; - if (!CanEmptyBigPoes){ - return 0; - } - for (int i = SLOT_BOTTLE_1; i <= SLOT_BOTTLE_4; i++) { - uint8_t item = GetSaveContext()->inventory.items[i]; - if (item != ITEM_NONE && (item != ITEM_LETTER_RUTO || (item == ITEM_LETTER_RUTO && DeliverLetter))) { - count++; + if (CouldEmptyBigPoes){ + for (int i = SLOT_BOTTLE_1; i <= SLOT_BOTTLE_4; i++) { + uint8_t item = GetSaveContext()->inventory.items[i]; + switch (item) { + case ITEM_LETTER_RUTO: + if (DeliverLetter) { + count++; + } + break; + case ITEM_BIG_POE: + if (CanEmptyBigPoes) { + count++; + } + break; + case ITEM_NONE: + break; + default: + count++; + break; + } } } return count; @@ -951,7 +1001,7 @@ namespace Rando { } bool Logic::BombchusEnabled(){ - return ctx->GetOption(RSK_BOMBCHUS_IN_LOGIC) ? CheckInventory(ITEM_BOMBCHU, true) : HasItem(RG_BOMB_BAG); + return ctx->GetOption(RSK_BOMBCHU_BAG) ? CheckInventory(ITEM_BOMBCHU, true) : HasItem(RG_BOMB_BAG); } // TODO: Implement Ammo Drop Setting in place of bombchu drops @@ -1025,7 +1075,7 @@ namespace Rando { 10 for OHKO. This is the number of shifts to apply, not a real multiplier */ - uint8_t Multiplier = (ctx->GetOption(RSK_DAMAGE_MULTIPLIER).GetContextOptionIndex() < 6) ? ctx->GetOption(RSK_DAMAGE_MULTIPLIER).GetContextOptionIndex() : 10; + uint8_t Multiplier = (ctx->GetOption(RSK_DAMAGE_MULTIPLIER).Get() < 6) ? ctx->GetOption(RSK_DAMAGE_MULTIPLIER).Get() : 10; //(Hearts() << (2 + HasItem(RG_DOUBLE_DEFENSE))) is quarter hearts after DD //>> Multiplier halves on normal and does nothing on half, meaning we're working with half hearts on normal damage return ((Hearts() << (2 + HasItem(RG_DOUBLE_DEFENSE))) >> Multiplier) + @@ -1155,21 +1205,21 @@ namespace Rando { bool Logic::CanBuildRainbowBridge(){ return ctx->GetOption(RSK_RAINBOW_BRIDGE).Is(RO_BRIDGE_ALWAYS_OPEN) || (ctx->GetOption(RSK_RAINBOW_BRIDGE).Is(RO_BRIDGE_VANILLA) && HasItem(RG_SHADOW_MEDALLION) && HasItem(RG_SPIRIT_MEDALLION) && CanUse(RG_LIGHT_ARROWS)) || - (ctx->GetOption(RSK_RAINBOW_BRIDGE).Is(RO_BRIDGE_STONES) && StoneCount() + (HasItem(RG_GREG_RUPEE) && ctx->GetOption(RSK_BRIDGE_OPTIONS).Is(RO_BRIDGE_GREG_REWARD)) >= ctx->GetOption(RSK_RAINBOW_BRIDGE_STONE_COUNT).GetContextOptionIndex()) || - (ctx->GetOption(RSK_RAINBOW_BRIDGE).Is(RO_BRIDGE_MEDALLIONS) && MedallionCount() + (HasItem(RG_GREG_RUPEE) && ctx->GetOption(RSK_BRIDGE_OPTIONS).Is(RO_BRIDGE_GREG_REWARD)) >= ctx->GetOption(RSK_RAINBOW_BRIDGE_MEDALLION_COUNT).GetContextOptionIndex()) || - (ctx->GetOption(RSK_RAINBOW_BRIDGE).Is(RO_BRIDGE_DUNGEON_REWARDS) && StoneCount() + MedallionCount() + (HasItem(RG_GREG_RUPEE) && ctx->GetOption(RSK_BRIDGE_OPTIONS).Is(RO_BRIDGE_GREG_REWARD)) >= ctx->GetOption(RSK_RAINBOW_BRIDGE_REWARD_COUNT).GetContextOptionIndex()) || - (ctx->GetOption(RSK_RAINBOW_BRIDGE).Is(RO_BRIDGE_DUNGEONS) && DungeonCount() + (HasItem(RG_GREG_RUPEE) && ctx->GetOption(RSK_BRIDGE_OPTIONS).Is(RO_BRIDGE_GREG_REWARD)) >= ctx->GetOption(RSK_RAINBOW_BRIDGE_DUNGEON_COUNT).GetContextOptionIndex()) || - (ctx->GetOption(RSK_RAINBOW_BRIDGE).Is(RO_BRIDGE_TOKENS) && GetGSCount() >= ctx->GetOption(RSK_RAINBOW_BRIDGE_TOKEN_COUNT).GetContextOptionIndex()) || + (ctx->GetOption(RSK_RAINBOW_BRIDGE).Is(RO_BRIDGE_STONES) && StoneCount() + (HasItem(RG_GREG_RUPEE) && ctx->GetOption(RSK_BRIDGE_OPTIONS).Is(RO_BRIDGE_GREG_REWARD)) >= ctx->GetOption(RSK_RAINBOW_BRIDGE_STONE_COUNT).Get()) || + (ctx->GetOption(RSK_RAINBOW_BRIDGE).Is(RO_BRIDGE_MEDALLIONS) && MedallionCount() + (HasItem(RG_GREG_RUPEE) && ctx->GetOption(RSK_BRIDGE_OPTIONS).Is(RO_BRIDGE_GREG_REWARD)) >= ctx->GetOption(RSK_RAINBOW_BRIDGE_MEDALLION_COUNT).Get()) || + (ctx->GetOption(RSK_RAINBOW_BRIDGE).Is(RO_BRIDGE_DUNGEON_REWARDS) && StoneCount() + MedallionCount() + (HasItem(RG_GREG_RUPEE) && ctx->GetOption(RSK_BRIDGE_OPTIONS).Is(RO_BRIDGE_GREG_REWARD)) >= ctx->GetOption(RSK_RAINBOW_BRIDGE_REWARD_COUNT).Get()) || + (ctx->GetOption(RSK_RAINBOW_BRIDGE).Is(RO_BRIDGE_DUNGEONS) && DungeonCount() + (HasItem(RG_GREG_RUPEE) && ctx->GetOption(RSK_BRIDGE_OPTIONS).Is(RO_BRIDGE_GREG_REWARD)) >= ctx->GetOption(RSK_RAINBOW_BRIDGE_DUNGEON_COUNT).Get()) || + (ctx->GetOption(RSK_RAINBOW_BRIDGE).Is(RO_BRIDGE_TOKENS) && GetGSCount() >= ctx->GetOption(RSK_RAINBOW_BRIDGE_TOKEN_COUNT).Get()) || (ctx->GetOption(RSK_RAINBOW_BRIDGE).Is(RO_BRIDGE_GREG) && HasItem(RG_GREG_RUPEE)); } bool Logic::CanTriggerLACS(){ - return (ctx->GetSettings()->LACSCondition() == RO_LACS_VANILLA && HasItem(RG_SHADOW_MEDALLION) && HasItem(RG_SPIRIT_MEDALLION)) || - (ctx->GetSettings()->LACSCondition() == RO_LACS_STONES && StoneCount() + (HasItem(RG_GREG_RUPEE) && ctx->GetOption(RSK_LACS_OPTIONS).Is(RO_LACS_GREG_REWARD)) >= ctx->GetOption(RSK_LACS_STONE_COUNT).GetContextOptionIndex()) || - (ctx->GetSettings()->LACSCondition() == RO_LACS_MEDALLIONS && MedallionCount() + (HasItem(RG_GREG_RUPEE) && ctx->GetOption(RSK_LACS_OPTIONS).Is(RO_LACS_GREG_REWARD)) >= ctx->GetOption(RSK_LACS_MEDALLION_COUNT).GetContextOptionIndex()) || - (ctx->GetSettings()->LACSCondition() == RO_LACS_REWARDS && StoneCount() + MedallionCount() + (HasItem(RG_GREG_RUPEE) && ctx->GetOption(RSK_LACS_OPTIONS).Is(RO_LACS_GREG_REWARD)) >= ctx->GetOption(RSK_LACS_REWARD_COUNT).GetContextOptionIndex()) || - (ctx->GetSettings()->LACSCondition() == RO_LACS_DUNGEONS && DungeonCount() + (HasItem(RG_GREG_RUPEE) && ctx->GetOption(RSK_LACS_OPTIONS).Is(RO_LACS_GREG_REWARD)) >= ctx->GetOption(RSK_LACS_DUNGEON_COUNT).GetContextOptionIndex()) || - (ctx->GetSettings()->LACSCondition() == RO_LACS_TOKENS && GetGSCount() >= ctx->GetOption(RSK_LACS_TOKEN_COUNT).GetContextOptionIndex()); + return (ctx->LACSCondition() == RO_LACS_VANILLA && HasItem(RG_SHADOW_MEDALLION) && HasItem(RG_SPIRIT_MEDALLION)) || + (ctx->LACSCondition() == RO_LACS_STONES && StoneCount() + (HasItem(RG_GREG_RUPEE) && ctx->GetOption(RSK_LACS_OPTIONS).Is(RO_LACS_GREG_REWARD)) >= ctx->GetOption(RSK_LACS_STONE_COUNT).Get()) || + (ctx->LACSCondition() == RO_LACS_MEDALLIONS && MedallionCount() + (HasItem(RG_GREG_RUPEE) && ctx->GetOption(RSK_LACS_OPTIONS).Is(RO_LACS_GREG_REWARD)) >= ctx->GetOption(RSK_LACS_MEDALLION_COUNT).Get()) || + (ctx->LACSCondition() == RO_LACS_REWARDS && StoneCount() + MedallionCount() + (HasItem(RG_GREG_RUPEE) && ctx->GetOption(RSK_LACS_OPTIONS).Is(RO_LACS_GREG_REWARD)) >= ctx->GetOption(RSK_LACS_REWARD_COUNT).Get()) || + (ctx->LACSCondition() == RO_LACS_DUNGEONS && DungeonCount() + (HasItem(RG_GREG_RUPEE) && ctx->GetOption(RSK_LACS_OPTIONS).Is(RO_LACS_GREG_REWARD)) >= ctx->GetOption(RSK_LACS_DUNGEON_COUNT).Get()) || + (ctx->LACSCondition() == RO_LACS_TOKENS && GetGSCount() >= ctx->GetOption(RSK_LACS_TOKEN_COUNT).Get()); } bool Logic::SmallKeys(RandomizerRegion dungeon, uint8_t requiredAmount) { @@ -1280,7 +1330,31 @@ namespace Rando { { RG_OCARINA_C_RIGHT_BUTTON, RAND_INF_HAS_OCARINA_C_RIGHT }, { RG_SKELETON_KEY, RAND_INF_HAS_SKELETON_KEY }, { RG_GREG_RUPEE, RAND_INF_GREG_FOUND }, - { RG_FISHING_POLE, RAND_INF_FISHING_POLE_FOUND } + { RG_FISHING_POLE, RAND_INF_FISHING_POLE_FOUND }, + { RG_GUARD_HOUSE_KEY, RAND_INF_GUARD_HOUSE_KEY_OBTAINED }, + { RG_MARKET_BAZAAR_KEY, RAND_INF_MARKET_BAZAAR_KEY_OBTAINED }, + { RG_MARKET_POTION_SHOP_KEY, RAND_INF_MARKET_POTION_SHOP_KEY_OBTAINED }, + { RG_MASK_SHOP_KEY, RAND_INF_MASK_SHOP_KEY_OBTAINED }, + { RG_MARKET_SHOOTING_GALLERY_KEY, RAND_INF_MARKET_SHOOTING_GALLERY_KEY_OBTAINED }, + { RG_BOMBCHU_BOWLING_KEY, RAND_INF_BOMBCHU_BOWLING_KEY_OBTAINED }, + { RG_TREASURE_CHEST_GAME_BUILDING_KEY, RAND_INF_TREASURE_CHEST_GAME_BUILDING_KEY_OBTAINED }, + { RG_BOMBCHU_SHOP_KEY, RAND_INF_BOMBCHU_SHOP_KEY_OBTAINED }, + { RG_RICHARDS_HOUSE_KEY, RAND_INF_RICHARDS_HOUSE_KEY_OBTAINED }, + { RG_ALLEY_HOUSE_KEY, RAND_INF_ALLEY_HOUSE_KEY_OBTAINED }, + { RG_KAK_BAZAAR_KEY, RAND_INF_KAK_BAZAAR_KEY_OBTAINED }, + { RG_KAK_POTION_SHOP_KEY, RAND_INF_KAK_POTION_SHOP_KEY_OBTAINED }, + { RG_BOSS_HOUSE_KEY, RAND_INF_BOSS_HOUSE_KEY_OBTAINED }, + { RG_GRANNYS_POTION_SHOP_KEY, RAND_INF_GRANNYS_POTION_SHOP_KEY_OBTAINED }, + { RG_SKULLTULA_HOUSE_KEY, RAND_INF_SKULLTULA_HOUSE_KEY_OBTAINED }, + { RG_IMPAS_HOUSE_KEY, RAND_INF_IMPAS_HOUSE_KEY_OBTAINED }, + { RG_WINDMILL_KEY, RAND_INF_WINDMILL_KEY_OBTAINED }, + { RG_KAK_SHOOTING_GALLERY_KEY, RAND_INF_KAK_SHOOTING_GALLERY_KEY_OBTAINED }, + { RG_DAMPES_HUT_KEY, RAND_INF_DAMPES_HUT_KEY_OBTAINED }, + { RG_TALONS_HOUSE_KEY, RAND_INF_TALONS_HOUSE_KEY_OBTAINED }, + { RG_STABLES_KEY, RAND_INF_STABLES_KEY_OBTAINED }, + { RG_BACK_TOWER_KEY, RAND_INF_BACK_TOWER_KEY_OBTAINED }, + { RG_HYLIA_LAB_KEY, RAND_INF_HYLIA_LAB_KEY_OBTAINED }, + { RG_FISHING_HOLE_KEY, RAND_INF_FISHING_HOLE_KEY_OBTAINED }, }; std::map Logic::RandoGetToDungeonScene = { @@ -1357,6 +1431,18 @@ namespace Rando { { RG_GERUDO_MEMBERSHIP_CARD, QUEST_GERUDO_CARD }, }; + std::map BottleRandomizerGetToItemID = { + { RG_BOTTLE_WITH_RED_POTION, ITEM_POTION_RED }, + { RG_BOTTLE_WITH_GREEN_POTION, ITEM_POTION_GREEN }, + { RG_BOTTLE_WITH_BLUE_POTION, ITEM_POTION_BLUE }, + { RG_BOTTLE_WITH_FAIRY, ITEM_FAIRY }, + { RG_BOTTLE_WITH_FISH, ITEM_FISH }, + { RG_BOTTLE_WITH_BLUE_FIRE, ITEM_BLUE_FIRE }, + { RG_BOTTLE_WITH_BUGS, ITEM_BUG }, + { RG_BOTTLE_WITH_POE, ITEM_POE }, + { RG_BOTTLE_WITH_BIG_POE, ITEM_BIG_POE }, + }; + uint32_t HookshotLookup[3] = { ITEM_NONE, ITEM_HOOKSHOT, ITEM_LONGSHOT }; uint32_t OcarinaLookup[3] = { ITEM_NONE, ITEM_OCARINA_FAIRY, ITEM_OCARINA_TIME }; @@ -1601,7 +1687,11 @@ namespace Rando { } slot++; } - mSaveContext->inventory.items[slot] = item.GetGIEntry()->itemId; + uint16_t itemId = item.GetGIEntry()->itemId; + if (BottleRandomizerGetToItemID.contains(randoGet)) { + itemId = BottleRandomizerGetToItemID[randoGet]; + } + mSaveContext->inventory.items[slot] = itemId; } break; case RG_RUTOS_LETTER: SetEventChkInf(EVENTCHKINF_OBTAINED_RUTOS_LETTER, state); @@ -1622,10 +1712,34 @@ namespace Rando { case RG_OCARINA_C_RIGHT_BUTTON: case RG_GREG_RUPEE: case RG_FISHING_POLE: + case RG_GUARD_HOUSE_KEY: + case RG_MARKET_BAZAAR_KEY: + case RG_MARKET_POTION_SHOP_KEY: + case RG_MASK_SHOP_KEY: + case RG_MARKET_SHOOTING_GALLERY_KEY: + case RG_BOMBCHU_BOWLING_KEY: + case RG_TREASURE_CHEST_GAME_BUILDING_KEY: + case RG_BOMBCHU_SHOP_KEY: + case RG_RICHARDS_HOUSE_KEY: + case RG_ALLEY_HOUSE_KEY: + case RG_KAK_BAZAAR_KEY: + case RG_KAK_POTION_SHOP_KEY: + case RG_BOSS_HOUSE_KEY: + case RG_GRANNYS_POTION_SHOP_KEY: + case RG_SKULLTULA_HOUSE_KEY: + case RG_IMPAS_HOUSE_KEY: + case RG_WINDMILL_KEY: + case RG_KAK_SHOOTING_GALLERY_KEY: + case RG_DAMPES_HUT_KEY: + case RG_TALONS_HOUSE_KEY: + case RG_STABLES_KEY: + case RG_BACK_TOWER_KEY: + case RG_HYLIA_LAB_KEY: + case RG_FISHING_HOLE_KEY: SetRandoInf(RandoGetToRandInf.at(randoGet), state); break; case RG_TRIFORCE_PIECE: - mSaveContext->triforcePiecesCollected += (!state ? -1 : 1); + mSaveContext->ship.quest.data.randomizer.triforcePiecesCollected += (!state ? -1 : 1); break; case RG_BOMBCHU_5: case RG_BOMBCHU_10: @@ -1881,14 +1995,13 @@ namespace Rando { mSaveContext->sceneFlags[5].swch = 0x40000000; // SoH specific - mSaveContext->backupFW = mSaveContext->fw; - mSaveContext->pendingSale = ITEM_NONE; - mSaveContext->pendingSaleMod = MOD_NONE; - mSaveContext->isBossRushPaused = 0; - mSaveContext->pendingIceTrapCount = 0; + mSaveContext->ship.backupFW = mSaveContext->fw; + mSaveContext->ship.pendingSale = ITEM_NONE; + mSaveContext->ship.pendingSaleMod = MOD_NONE; + mSaveContext->ship.pendingIceTrapCount = 0; // Init with normal quest unless only an MQ rom is provided - mSaveContext->questId = OTRGlobals::Instance->HasOriginal() ? QUEST_NORMAL : QUEST_MASTER; + mSaveContext->ship.quest.id = OTRGlobals::Instance->HasOriginal() ? QUEST_NORMAL : QUEST_MASTER; //RANDOTODO (ADD ITEMLOCATIONS TO GSAVECONTEXT) } @@ -1937,16 +2050,16 @@ namespace Rando { bool Logic::HasAdultTrade(uint32_t itemID) { int tradeIndex = itemID - ITEM_POCKET_EGG; - return mSaveContext->adultTradeItems & (1 << tradeIndex); + return mSaveContext->ship.quest.data.randomizer.adultTradeItems & (1 << tradeIndex); } void Logic::SetAdultTrade(uint32_t itemID, bool state) { int tradeIndex = itemID - ITEM_POCKET_EGG; if (!state) { - mSaveContext->adultTradeItems &= ~(1 << tradeIndex); + mSaveContext->ship.quest.data.randomizer.adultTradeItems &= ~(1 << tradeIndex); } else { - mSaveContext->adultTradeItems |= (1 << tradeIndex); + mSaveContext->ship.quest.data.randomizer.adultTradeItems |= (1 << tradeIndex); } } @@ -1981,15 +2094,15 @@ namespace Rando { } bool Logic::CheckRandoInf(uint32_t flag) { - return mSaveContext->randomizerInf[flag >> 4] & (1 << (flag & 0xF)); + return mSaveContext->ship.randomizerInf[flag >> 4] & (1 << (flag & 0xF)); } void Logic::SetRandoInf(uint32_t flag, bool state) { if (!state) { - mSaveContext->randomizerInf[flag >> 4] &= ~(1 << (flag & 0xF)); + mSaveContext->ship.randomizerInf[flag >> 4] &= ~(1 << (flag & 0xF)); } else { - mSaveContext->randomizerInf[flag >> 4] |= (1 << (flag & 0xF)); + mSaveContext->ship.randomizerInf[flag >> 4] |= (1 << (flag & 0xF)); } } @@ -2104,7 +2217,7 @@ namespace Rando { //Bottle Count Bottles = 0; NumBottles = 0; - CanEmptyBigPoes = true; + CanEmptyBigPoes = false; //Drops and Bottle Contents Access NutPot = false; @@ -2141,7 +2254,7 @@ namespace Rando { //CanPlantBean = false; BigPoeKill = false; - BaseHearts = ctx->GetOption(RSK_STARTING_HEARTS).GetContextOptionIndex() + 1; + BaseHearts = ctx->GetOption(RSK_STARTING_HEARTS).Get() + 1; //Bridge Requirements @@ -2150,7 +2263,7 @@ namespace Rando { //Other AtDay = false; AtNight = false; - GetSaveContext()->linkAge = !ctx->GetSettings()->ResolvedStartingAge(); + GetSaveContext()->linkAge = !ctx->GetOption(RSK_SELECTED_STARTING_AGE).Get(); //Events ShowedMidoSwordAndShield = false; diff --git a/soh/soh/Enhancements/randomizer/logic.h b/soh/soh/Enhancements/randomizer/logic.h index ec4b29899..ea9d51801 100644 --- a/soh/soh/Enhancements/randomizer/logic.h +++ b/soh/soh/Enhancements/randomizer/logic.h @@ -65,7 +65,10 @@ class Logic { // Bottle Count uint8_t Bottles = 0; uint8_t NumBottles = 0; - bool CanEmptyBigPoes = true; + //this event covers if the player can currently empty big poes in logic + bool CanEmptyBigPoes = false; + //this check covers if the generation has confirmed that it's possible to empty big poes if needed as adult + bool CouldEmptyBigPoes = true; // Drops and Bottle Contents Access bool NutPot = false; @@ -183,6 +186,7 @@ class Logic { bool HasProjectile(HasProjectileAge age); bool HasItem(RandomizerGet itemName); bool HasBossSoul(RandomizerGet itemName); + bool CanOpenOverworldDoor(RandomizerGet itemName); bool SmallKeys(RandomizerRegion dungeon, uint8_t requiredAmount); bool SmallKeys(RandomizerRegion dungeon, uint8_t requiredAmountGlitchless, uint8_t requiredAmountGlitched); bool CanDoGlitch(GlitchType glitch); diff --git a/soh/soh/Enhancements/randomizer/option.cpp b/soh/soh/Enhancements/randomizer/option.cpp index d7ff94121..5cf16ac26 100644 --- a/soh/soh/Enhancements/randomizer/option.cpp +++ b/soh/soh/Enhancements/randomizer/option.cpp @@ -2,42 +2,56 @@ #include "libultraship/bridge.h" #include #include -#include "soh/UIWidgets.hpp" +#include "soh/SohGui/UIWidgets.hpp" namespace Rando { -Option Option::Bool(std::string name_, std::vector options_, const OptionCategory category_, - std::string cvarName_, std::string description_, WidgetType widgetType_, const uint8_t defaultOption_, - const bool defaultHidden_, int imFlags_) { - return {false, std::move(name_), std::move(options_), category_, std::move(cvarName_), std::move(description_), - widgetType_, defaultOption_, defaultHidden_, imFlags_}; +Option Option::Bool(RandomizerSettingKey key_, std::string name_, std::vector options_, + const OptionCategory category_, std::string cvarName_, std::string description_, + WidgetType widgetType_, const uint8_t defaultOption_, const bool defaultHidden_, int imFlags_) { + return {static_cast(key_), std::move(name_), std::move(options_), category_, + std::move(cvarName_), std::move(description_), widgetType_, defaultOption_, defaultHidden_, imFlags_}; } -Option Option::Bool(std::string name_, std::string cvarName_, std::string description_, const int imFlags_, - const WidgetType widgetType_, const bool defaultOption_) { - return Option(false, std::move(name_), {"Off", "On"}, OptionCategory::Setting, std::move(cvarName_), +Option Option::Bool(RandomizerSettingKey key_, std::string name_, std::string cvarName_, std::string description_, + const int imFlags_, const WidgetType widgetType_, const bool defaultOption_) { + return Option(key_, std::move(name_), {"Off", "On"}, OptionCategory::Setting, std::move(cvarName_), std::move(description_), widgetType_, defaultOption_, false, imFlags_); } -Option Option::U8(std::string name_, std::vector options_, const OptionCategory category_, - std::string cvarName_, std::string description_, WidgetType widgetType_, const uint8_t defaultOption_, - const bool defaultHidden_, int imFlags_) { - return {static_cast(0), std::move(name_), std::move(options_), category_, std::move(cvarName_), +Option Option::U8(RandomizerSettingKey key_, std::string name_, std::vector options_, + const OptionCategory category_, std::string cvarName_, std::string description_, + WidgetType widgetType_, const uint8_t defaultOption_, const bool defaultHidden_, int imFlags_) { + return {static_cast(key_), std::move(name_), std::move(options_), category_, std::move(cvarName_), std::move(description_), widgetType_, defaultOption_, defaultHidden_, imFlags_}; } -Option Option::LogicTrick(std::string name_) { - return Option(false, std::move(name_), { "Disabled", "Enabled" }, OptionCategory::Setting, "", +Option Option::LogicTrick(RandomizerTrick rt_, std::string name_) { + return Option(rt_, std::move(name_), { "Disabled", "Enabled" }, OptionCategory::Setting, "", "", WidgetType::Checkbox, 0, false, IMFLAG_NONE); } -Option::operator bool() const { - return contextSelection != 0; +OptionValue::OptionValue(uint8_t val) : mVal(val) {} + +uint8_t OptionValue::Get() { + return mVal; +} + +void OptionValue::Set(uint8_t val) { + mVal = val; +} + +OptionValue::operator bool() const { + return mVal != 0; } size_t Option::GetOptionCount() const { return options.size(); } +const RandomizerSettingKey Option::GetKey() const { + return static_cast(key); +} + const std::string& Option::GetName() const { return name; } @@ -50,26 +64,14 @@ uint8_t Option::GetMenuOptionIndex() const { return menuSelection; } -uint8_t Option::GetContextOptionIndex() const { - return contextSelection; -} - -const std::string& Option::GetSelectedOptionText() const { - return options[contextSelection]; +const std::string& Option::GetOptionText(size_t index) const { + return options[index]; } const std::string& Option::GetCVarName() const { return cvarName; } -void Option::SetVariable() { - if (std::holds_alternative(var)) { - var.emplace(menuSelection != 0); - } else { - var.emplace(menuSelection); - } -} - void Option::SaveCVar() const { if (!cvarName.empty()) { CVarSetInteger(cvarName.c_str(), GetMenuOptionIndex()); @@ -95,10 +97,10 @@ void Option::SetMenuIndex(size_t idx) { if (menuSelection > options.size() - 1) { menuSelection = options.size() - 1; } - SetVariable(); } void Option::SetContextIndex(size_t idx) { + // TODO: Set to Context's OptionValue array. contextSelection = idx; if (contextSelection > options.size() - 1) { contextSelection = options.size() - 1; @@ -178,6 +180,16 @@ void Option::RemoveFlag(const int imFlag_) { imFlags &= ~imFlag_; } +uint8_t Option::GetValueFromText(const std::string text) { + if (optionsTextToVar.contains(text)) { + return optionsTextToVar[text]; + } else { + SPDLOG_ERROR("Option {} does not have a var named {}.", name, text); + assert(false); + } + return defaultOption; +} + void Option::SetContextIndexFromText(const std::string text) { if (optionsTextToVar.contains(text)){ SetContextIndex(optionsTextToVar[text]); @@ -187,21 +199,10 @@ void Option::SetContextIndexFromText(const std::string text) { } } -Option::Option(uint8_t var_, std::string name_, std::vector options_, OptionCategory category_, +Option::Option(size_t key_, std::string name_, std::vector options_, OptionCategory category_, std::string cvarName_, std::string description_, WidgetType widgetType_, uint8_t defaultOption_, bool defaultHidden_, int imFlags_) - : var(var_), name(std::move(name_)), options(std::move(options_)), category(category_), - cvarName(std::move(cvarName_)), description(std::move(description_)), widgetType(widgetType_), - defaultOption(defaultOption_), defaultHidden(defaultHidden_), imFlags(imFlags_) { - menuSelection = contextSelection = defaultOption; - hidden = defaultHidden; - PopulateTextToNum(); - SetFromCVar(); -} -Option::Option(bool var_, std::string name_, std::vector options_, const OptionCategory category_, - std::string cvarName_, std::string description_, WidgetType widgetType_, const uint8_t defaultOption_, - const bool defaultHidden_, int imFlags_) - : var(var_), name(std::move(name_)), options(std::move(options_)), category(category_), + : key(key_), name(std::move(name_)), options(std::move(options_)), category(category_), cvarName(std::move(cvarName_)), description(std::move(description_)), widgetType(widgetType_), defaultOption(defaultOption_), defaultHidden(defaultHidden_), imFlags(imFlags_) { menuSelection = contextSelection = defaultOption; @@ -350,13 +351,25 @@ void Option::PopulateTextToNum(){ } } -TrickOption::TrickOption(const RandomizerCheckQuest quest_, const RandomizerArea area_, std::set tags_, const std::string& name_, std::string description_) : - Option(false, name_, {"Disabled", "Enabled"}, OptionCategory::Setting, "", +LocationOption::LocationOption(RandomizerCheck key_, const std::string& name_) : + Option(key_, name_, {"Included", "Excluded"}, OptionCategory::Setting, "", "", WidgetType::Checkbox, + RO_LOCATION_INCLUDE, false, IMFLAG_NONE) {} + +const RandomizerCheck LocationOption::GetKey() const { + return static_cast(key); +} + +TrickOption::TrickOption(RandomizerTrick key_, const RandomizerCheckQuest quest_, const RandomizerArea area_, std::set tags_, const std::string& name_, std::string description_) : + Option(key_, name_, {"Disabled", "Enabled"}, OptionCategory::Setting, "", std::move(description_), WidgetType::Checkbox, 0, false, IMFLAG_NONE), mQuest(quest_), mArea(area_), mTags(std::move(tags_)) {} -TrickOption TrickOption::LogicTrick(RandomizerCheckQuest quest_, RandomizerArea area_, std::set tags_, const std::string& name_, std::string description_) { - return {quest_, area_, std::move(tags_), name_, std::move(description_)}; +TrickOption TrickOption::LogicTrick(RandomizerTrick key_, RandomizerCheckQuest quest_, RandomizerArea area_, std::set tags_, const std::string& name_, std::string description_) { + return {key_, quest_, area_, std::move(tags_), name_, std::move(description_)}; +} + +const RandomizerTrick TrickOption::GetKey() const { + return static_cast(key); } RandomizerCheckQuest TrickOption::GetQuest() const { diff --git a/soh/soh/Enhancements/randomizer/option.h b/soh/soh/Enhancements/randomizer/option.h index e1e5a3a78..1ff68c852 100644 --- a/soh/soh/Enhancements/randomizer/option.h +++ b/soh/soh/Enhancements/randomizer/option.h @@ -1,6 +1,6 @@ #pragma once -#include "soh/UIWidgets.hpp" +#include "soh/SohGui/UIWidgets.hpp" #include #include @@ -40,6 +40,59 @@ enum class WidgetType { Slider, /** Compatible with U8s. If constructed with NumOpts, consider using this. Technically can be used for Bool or non-NumOpts options but it would be a bit weird semantically. */ }; +class OptionValue { + public: + OptionValue() = default; + OptionValue(uint8_t value_); + + /** + * @brief Returns the value of the OptionValue's mVal + * + * @return uint8_t + */ + uint8_t Get(); + + /** + * @brief Set the OptionValue's mVal to the provided val. + * + * @param val + */ + void Set(uint8_t val); + + /** + * @brief Determines if the value/selected index of this Option matches the provided value. + * + * @param other The value to compare. + * @return true + * @return false + */ + bool Is(uint32_t other) const { + return mVal == other; + } + + /** + * @brief Determines if the value/selected index of this Option does not match the provided value. + * + * @param other The value to compare. + * @return true + * @return false + */ + bool IsNot(uint32_t other) const { + return !Is(other); + } + + /** + * @brief Allows the option to be used as a boolean value directly. + * + * @return true + * @return false + */ + explicit operator bool() const; + + private: + uint8_t mVal; +}; + /** * @brief A class describing the state of a single option/setting, such as its name, * options, current value, whether or not it is interactable in the menu, or the CVar, @@ -68,7 +121,8 @@ class Option { * @param imFlags_ (see ImGuiMenuFlags type) flags that can modify how this option is rendered. * @return Option */ - static Option Bool(std::string name_, std::vector options_ = { "Off", "On" }, + static Option Bool(RandomizerSettingKey key_, std::string name_, + std::vector options_ = { "Off", "On" }, OptionCategory category_ = OptionCategory::Setting, std::string cvarName_ = "", std::string description_ = "", WidgetType widgetType_ = WidgetType::Checkbox, uint8_t defaultOption_ = 0, bool defaultHidden_ = false, int imFlags_ = IMFLAG_SEPARATOR_BOTTOM); @@ -79,6 +133,7 @@ class Option { * existing calls to the other overload of this function. The options vector will be { "Off", "On" } * when using this overload. If you want your option to have different value names, use the other overload. * + * @param key_ The RandomizerSettingKey of this option. * @param name_ The name of the option. Appears in the spoiler/patch file. * @param cvarName_ The name of the CVar this option should correspond with. Set as an empty string to not * link to any CVar. @@ -90,13 +145,14 @@ class Option { * @param defaultOption_ The defaulted selected index for this Option. * @return Option */ - static Option Bool(std::string name_, std::string cvarName_, std::string description_ = "", - int imFlags_ = IMFLAG_SEPARATOR_BOTTOM, WidgetType widgetType_ = WidgetType::Checkbox, - bool defaultOption_ = false); + static Option Bool(RandomizerSettingKey key_, std::string name_, std::string cvarName_, + std::string description_ = "", int imFlags_ = IMFLAG_SEPARATOR_BOTTOM, + WidgetType widgetType_ = WidgetType::Checkbox, bool defaultOption_ = false); /** * @brief Constructs a U8 Option. * + * @param key_ The RandomizerSettingKey for this option. * @param name_ The name of this Option. Appears in the spoiler/patch file. * @param options_ A vector of value names for this Option. The name corresponding to the selected * index for this option will be printed to the spoiler/patch file. @@ -114,7 +170,7 @@ class Option { * @param imFlags_ (see ImGuiMenuFlags type) flags that can modify how this option is rendered. * @return Option */ - static Option U8(std::string name_, std::vector options_, + static Option U8(RandomizerSettingKey key_, std::string name_, std::vector options_, OptionCategory category_ = OptionCategory::Setting, std::string cvarName_ = "", std::string description_ = "", WidgetType widgetType_ = WidgetType::Combobox, uint8_t defaultOption_ = 0, bool defaultHidden_ = false, int imFlags_ = IMFLAG_SEPARATOR_BOTTOM); @@ -125,37 +181,7 @@ class Option { * @param name_ The name of the trick. Appears in the spoiler/patch file. * @return Option */ - static Option LogicTrick(std::string name_); - - /** - * @brief Determines if the value/selected index of this Option matches the provided value. - * - * @param other The value to compare. - * @return true - * @return false - */ - bool Is(uint32_t other) const { - return contextSelection == other; - } - - /** - * @brief Determines if the value/selected index of this Option does not match the provided value. - * - * @param other The value to compare. - * @return true - * @return false - */ - bool IsNot(uint32_t other) const { - return !Is(other); - } - - /** - * @brief Allows the option to be used as a boolean value directly. - * - * @return true - * @return false - */ - explicit operator bool() const; + static Option LogicTrick(RandomizerTrick rt_, std::string name_); /** * @brief Get the size of the options array. @@ -164,6 +190,13 @@ class Option { */ size_t GetOptionCount() const; + /** + * @brief Get the Key Option + * + * @return const RandomizerSettingKey + */ + const RandomizerSettingKey GetKey() const; + /** * @brief Get the name of the Option. * @@ -173,11 +206,12 @@ class Option { const std::string& GetDescription() const; /** - * @brief Get the value name corresponding to the selected index. - * - * @return const std::string& + * @brief Get the text of the Option value of the selected index. + * + * @param index + * @return const std::string& */ - const std::string& GetSelectedOptionText() const; + const std::string& GetOptionText(size_t index) const; /** * @brief Get the CVar name for this Option. @@ -193,18 +227,6 @@ class Option { */ uint8_t GetMenuOptionIndex() const; - /** - * @brief Get the rando context index for this Option. - * - * @return uint8_t - */ - uint8_t GetContextOptionIndex() const; - - /** - * @brief Sets the variable to the currently selected index for this Option. - */ - void SetVariable(); - /** * @brief Sets the CVar corresponding to the property `cvarName` equal to the value * of the property `selectedValue`. @@ -306,15 +328,14 @@ class Option { void SetFlag(int imFlag_); void RemoveFlag(int imFlag_); + uint8_t GetValueFromText(std::string text); void SetContextIndexFromText(std::string text); protected: - Option(uint8_t var_, std::string name_, std::vector options_, OptionCategory category_, - std::string cvarName_, std::string description_, WidgetType widgetType_, uint8_t defaultOption_, - bool defaultHidden_, int imFlags_); - Option(bool var_, std::string name_, std::vector options_, OptionCategory category_, + Option(size_t key_, std::string name_, std::vector options_, OptionCategory category_, std::string cvarName_, std::string description_, WidgetType widgetType_, uint8_t defaultOption_, bool defaultHidden_, int imFlags_); + size_t key; private: bool RenderCheckbox(); @@ -322,7 +343,6 @@ protected: bool RenderCombobox(); bool RenderSlider(); void PopulateTextToNum(); - std::variant var; std::string name; std::vector options; uint8_t menuSelection = 0; @@ -342,12 +362,20 @@ protected: std::unordered_map optionsTextToVar = {}; }; +class LocationOption : public Option { +public: + LocationOption() = default; + LocationOption(RandomizerCheck key_, const std::string& name_); + const RandomizerCheck GetKey() const; +}; + class TrickOption : public Option { public: TrickOption() = default; /** * @brief A convenience function for constructing the Option for a trick. * + * @param key_ A RandomizerTrick key for this option. * @param quest_ MQ, Vanilla, or Both. * @param area_ The area the trick is relevant for. * @param tags_ The set of RandomizerTrickTags for this trick. @@ -355,7 +383,9 @@ public: * @param description_ A brief description of the trick. * @return Option */ - static TrickOption LogicTrick(RandomizerCheckQuest quest_, RandomizerArea area_, std::set tags_, const std::string& name_, std::string description_); + static TrickOption LogicTrick(RandomizerTrick key_, RandomizerCheckQuest quest_, RandomizerArea area_, std::set tags_, const std::string& name_, std::string description_); + + const RandomizerTrick GetKey() const; /** * @brief Retrieve the quest type this trick is relevant for. @@ -382,7 +412,7 @@ public: const std::set& GetTags() const; private: - TrickOption(RandomizerCheckQuest quest_, RandomizerArea area_, std::set tags_, const std::string& name_, std::string description_); + TrickOption(RandomizerTrick key_, RandomizerCheckQuest quest_, RandomizerArea area_, std::set tags_, const std::string& name_, std::string description_); RandomizerCheckQuest mQuest; RandomizerArea mArea; std::set mTags; diff --git a/soh/soh/Enhancements/randomizer/option_descriptions.cpp b/soh/soh/Enhancements/randomizer/option_descriptions.cpp index f95f817e7..8abdd2634 100644 --- a/soh/soh/Enhancements/randomizer/option_descriptions.cpp +++ b/soh/soh/Enhancements/randomizer/option_descriptions.cpp @@ -41,6 +41,7 @@ void Settings::CreateOptionDescriptions() { "\n" "Open - Sleeping Waterfall is always open. " "Link may always enter Zora's Domain."; + mOptionDescriptions[RSK_LOCK_OVERWORLD_DOORS] = "Add locks to all wooden overworld doors, requiring specific small keys to open them"; mOptionDescriptions[RSK_STARTING_AGE] = "Choose which age Link will start as.\n\n" "Starting as adult means you start with the Master Sword in your inventory.\n" @@ -384,7 +385,7 @@ void Settings::CreateOptionDescriptions() { "to the item pool.\n" "All But Beans - Medigoron, Granny and the Carpet Salesman will have checks, " "A Giant's Knife and a pack of Bombchus will be added to the item pool, and " - "one of the bottles will contain a Blue Potion.\n\n" + "one of the bottles will contain a Blue Potion.\n" "All - Apply both effects.\n" "\n" "Granny's item will only be offered after you have traded in the Odd Mushroom when Shuffle Adult Trade is on. " @@ -663,20 +664,19 @@ void Settings::CreateOptionDescriptions() { mOptionDescriptions[RSK_KAK_100_SKULLS_HINT] = "Talking to the Cursed Resident in the Skulltula House who is saved after 100 tokens will tell you the reward."; mOptionDescriptions[RSK_MASK_SHOP_HINT] = "Reading the mask shop sign will tell you rewards from showing masks at the Deku Theatre."; mOptionDescriptions[RSK_FULL_WALLETS] = "Start with a full wallet. All wallet upgrades come filled with rupees."; - mOptionDescriptions[RSK_BOMBCHUS_IN_LOGIC] = - "Bombchus are properly considered in logic. Without this setting, any Bombchu requirement " + mOptionDescriptions[RSK_BOMBCHU_BAG] = + "Bombchus require their own bag to be found before use. Without this setting, any Bombchu requirement " "is filled by Bomb Bag + a renewable source of Bombchus.\n" "\n" - "The first Bombchu pack will always be 20, and subsequent packs will be " - "5 or 10 based on how many you have.\n" - "Once found, they can be replenished at the Bombchu shop.\n" + "The first Bombchu you find be a Bag containing 20 chus, and subsequent packs will have 10." + "Once found, they can be replenished at shops selling refills, Bombchu Bowling and the carpet merchant.\n" "\n" - "Bombchu Bowling is opened by obtaining Bombchus."; - mOptionDescriptions[RSK_ENABLE_BOMBCHU_DROPS] = "Once you obtain Bombchus for the first time, refills can be found " - "in bushes and other places where bomb drops can normally spawn." + "Bombchu Bowling is opened by obtaining the Bombchu Bag."; + mOptionDescriptions[RSK_ENABLE_BOMBCHU_DROPS] = "Once you obtain a Bombchu Bag, refills will sometimes replace " + "Bomb drops that would spawn." "\n" - "If you have Bombchus in Logic disabled, you will also need a " - "Bomb Bag for Bombchus to drop."; + "If you have Bombchu Bag disabled, you will need a Bomb Bag " + "and existing Bombchus for Bombchus to drop."; mOptionDescriptions[RSK_BLUE_FIRE_ARROWS] = "Ice Arrows act like Blue Fire, making them able to melt red ice. " "Item placement logic will respect this option, so it might be required to use this to progress."; @@ -698,9 +698,6 @@ void Settings::CreateOptionDescriptions() { "location is reachable. When disabled, only " "required items and locations to beat the game " "will be guaranteed reachable."; - mOptionDescriptions[RSK_ENABLE_GLITCH_CUTSCENES] = - "The cutscenes of the Poes in Forest Temple and Darunia in Fire Temple will not be skipped. " - "These cutscenes are only useful for glitched gameplay and can be safely skipped otherwise."; mOptionDescriptions[RSK_SHUFFLE_BOSS_SOULS] = "Shuffles 8 boss souls (one for each blue warp dungeon). A boss will not appear until you collect its respective soul." "\n\"On + Ganon\" will also hide Ganon and Ganondorf behind a boss soul."; } diff --git a/soh/soh/Enhancements/randomizer/randomizer.cpp b/soh/soh/Enhancements/randomizer/randomizer.cpp index b6c520ceb..d1ca49162 100644 --- a/soh/soh/Enhancements/randomizer/randomizer.cpp +++ b/soh/soh/Enhancements/randomizer/randomizer.cpp @@ -11,9 +11,9 @@ #include "3drando/rando_main.hpp" #include "3drando/random.hpp" #include "soh/ResourceManagerHelpers.h" -#include "soh/UIWidgets.hpp" +#include "soh/SohGui/UIWidgets.hpp" #include "3drando/custom_messages.hpp" -#include "../../UIWidgets.hpp" +#include "soh/SohGui/UIWidgets.hpp" #include #include #include "../custom-message/CustomMessageTypes.h" @@ -475,7 +475,7 @@ ItemObtainability Randomizer::GetItemObtainabilityFromRandomizerGet(RandomizerGe (CUR_UPG_VALUE(UPG_STICKS) < 3 ? CAN_OBTAIN : CANT_OBTAIN_ALREADY_HAVE); case RG_DEKU_STICK_1: case RG_BUY_DEKU_STICK_1: - return CUR_UPG_VALUE(UPG_STICKS) || !OTRGlobals::Instance->gRandoContext->GetOption(RSK_SHUFFLE_DEKU_STICK_BAG).GetContextOptionIndex() + return CUR_UPG_VALUE(UPG_STICKS) || !OTRGlobals::Instance->gRandoContext->GetOption(RSK_SHUFFLE_DEKU_STICK_BAG).Get() ? CAN_OBTAIN : CANT_OBTAIN_NEED_UPGRADE; case RG_PROGRESSIVE_NUT_UPGRADE: return infiniteUpgrades != RO_INF_UPGRADES_OFF ? @@ -485,7 +485,7 @@ ItemObtainability Randomizer::GetItemObtainabilityFromRandomizerGet(RandomizerGe case RG_DEKU_NUTS_10: case RG_BUY_DEKU_NUTS_5: case RG_BUY_DEKU_NUTS_10: - return CUR_UPG_VALUE(UPG_NUTS) || !OTRGlobals::Instance->gRandoContext->GetOption(RSK_SHUFFLE_DEKU_NUT_BAG).GetContextOptionIndex() + return CUR_UPG_VALUE(UPG_NUTS) || !OTRGlobals::Instance->gRandoContext->GetOption(RSK_SHUFFLE_DEKU_NUT_BAG).Get() ? CAN_OBTAIN : CANT_OBTAIN_NEED_UPGRADE; case RG_PROGRESSIVE_BOMB_BAG: return infiniteUpgrades != RO_INF_UPGRADES_OFF ? @@ -1837,7 +1837,7 @@ FishIdentity Randomizer::IdentifyFish(s32 sceneNum, s32 actorParams) { } u8 Randomizer::GetRandoSettingValue(RandomizerSettingKey randoSettingKey) { - return Rando::Context::GetInstance()->GetOption(randoSettingKey).GetContextOptionIndex(); + return Rando::Context::GetInstance()->GetOption(randoSettingKey).Get(); } GetItemEntry Randomizer::GetItemFromKnownCheck(RandomizerCheck randomizerCheck, GetItemID ogItemId, bool checkObtainability) { @@ -1871,7 +1871,8 @@ void GenerateRandomizerImgui(std::string seed = "") { CVarSave(); auto ctx = Rando::Context::GetInstance(); //RANDOTODO proper UI for selecting if a spoiler loaded should be used for settings - ctx->GetSettings()->SetAllFromCVar(); + Rando::Settings::GetInstance()->SetAllFromCVar(); + Rando::Settings::GetInstance()->SetAllToContext(); // todo: this efficently when we build out cvar array support std::set excludedLocations; @@ -2182,13 +2183,6 @@ void RandomizerSettingsWindow::DrawElement() { ImGui::SameLine(); ImGui::TextColored(ImVec4(1.0f, 0.0f, 0.0f, 1.0f), "Heads up! This will disable all rando settings except for entrance shuffle and starter items"); } - - UIWidgets::PaddedSeparator(); - - // Enable Glitch-Useful Cutscenes - if (mSettings->GetOption(RSK_ENABLE_GLITCH_CUTSCENES).RenderImGui()) { - mNeedsUpdate = true; - } ImGui::PopItemWidth(); ImGui::EndTable(); } @@ -2787,7 +2781,7 @@ void CreateTriforcePieceMessages() { CustomMessage Randomizer::GetTriforcePieceMessage() { // Item is only given after the textbox, so reflect that inside the textbox. - uint8_t current = gSaveContext.triforcePiecesCollected + 1; + uint8_t current = gSaveContext.ship.quest.data.randomizer.triforcePiecesCollected + 1; uint8_t required = OTRGlobals::Instance->gRandomizer->GetRandoSettingValue(RSK_TRIFORCE_HUNT_PIECES_REQUIRED) + 1; uint8_t remaining = required - current; float percentageCollected = (float)current / (float)required; @@ -3330,7 +3324,7 @@ void CreateFireTempleGoronMessages() { CustomMessage Randomizer::GetGoronMessage(u16 index) { CustomMessage messageEntry = CustomMessageManager::Instance->RetrieveMessage(customMessageTableID, goronIDs[index]); messageEntry.Replace("[[days]]", std::to_string(gSaveContext.totalDays)); - messageEntry.Replace("[[a_btn]]", std::to_string(gSaveContext.sohStats.count[COUNT_BUTTON_PRESSES_A])); + messageEntry.Replace("[[a_btn]]", std::to_string(gSaveContext.ship.stats.count[COUNT_BUTTON_PRESSES_A])); messageEntry.Format(); return messageEntry; } @@ -3338,16 +3332,16 @@ CustomMessage Randomizer::GetGoronMessage(u16 index) { void Randomizer::CreateCustomMessages() { // RANDTODO: Translate into french and german and replace GIMESSAGE_UNTRANSLATED // with GIMESSAGE(getItemID, itemID, english, german, french). - const std::array getItemMessages = {{ - GIMESSAGE(RG_GREG_RUPEE, ITEM_MASK_GORON, + const std::array getItemMessages = {{ + GIMESSAGE(RG_GREG_RUPEE, ITEM_MASK_GORON, "You found %gGreg%w!", "%gGreg%w! Du hast ihn wirklich gefunden!", "Félicitation! Vous avez trouvé %gGreg%w!"), - GIMESSAGE(RG_MASTER_SWORD, ITEM_SWORD_MASTER, + GIMESSAGE(RG_MASTER_SWORD, ITEM_SWORD_MASTER, "You found the %gMaster Sword%w!", "Du erhältst das %gMaster-Schwert%w!", "Vous obtenez %gl'Épée de Légende%w!"), - GIMESSAGE(RG_BOTTLE_WITH_BLUE_FIRE, ITEM_BLUE_FIRE, + GIMESSAGE(RG_BOTTLE_WITH_BLUE_FIRE, ITEM_BLUE_FIRE, "You got a %rBottle with Blue &Fire%w! Use it to melt Red Ice!", "Du erhältst eine %rFlasche mit&blauem Feuer%w! Nutze es um&%rRotes Eis%w zu schmelzen!", "Vous obtenez une %rBouteille avec&une Flamme Bleue%w! Utilisez-la&pour faire fondre la %rGlace&Rouge%w!"), @@ -3386,40 +3380,140 @@ void Randomizer::CreateCustomMessages() { GIMESSAGE(RG_GERUDO_FORTRESS_SMALL_KEY, ITEM_KEY_SMALL, "You found a %yThieves Hideout &%wSmall Key!", - "Du erhältst einen %rKleinen&Schlüssel%w für das %yDiebesversteck%w!", + "Du erhältst einen %rkleinen&Schlüssel%w für das %yDiebesversteck%w!", "Vous obtenez une %rPetite Clé %w&du %yRepaire des Voleurs%w!"), GIMESSAGE(RG_FOREST_TEMPLE_SMALL_KEY, ITEM_KEY_SMALL, "You found a %gForest Temple &%wSmall Key!", - "Du erhältst einen %rKleinen&Schlüssel%w für den %gWaldtempel%w!", + "Du erhältst einen %rkleinen&Schlüssel%w für den %gWaldtempel%w!", "Vous obtenez une %rPetite Clé %w&du %gTemple de la Forêt%w!"), GIMESSAGE(RG_FIRE_TEMPLE_SMALL_KEY, ITEM_KEY_SMALL, "You found a %rFire Temple &%wSmall Key!", - "Du erhältst einen %rKleinen&Schlüssel%w für den %rFeuertempel%w!", + "Du erhältst einen %rkleinen&Schlüssel%w für den %rFeuertempel%w!", "Vous obtenez une %rPetite Clé %w&du %rTemple du Feu%w!"), GIMESSAGE(RG_WATER_TEMPLE_SMALL_KEY, ITEM_KEY_SMALL, "You found a %bWater Temple &%wSmall Key!", - "Du erhältst einen %rKleinen&Schlüssel%w für den %bWassertempel%w!", + "Du erhältst einen %rkleinen&Schlüssel%w für den %bWassertempel%w!", "Vous obtenez une %rPetite Clé %w&du %bTemple de l'Eau%w!"), GIMESSAGE(RG_SPIRIT_TEMPLE_SMALL_KEY, ITEM_KEY_SMALL, "You found a %ySpirit Temple &%wSmall Key!", - "Du erhältst einen %rKleinen&Schlüssel%w für den %yGeistertempel%w!", + "Du erhältst einen %rkleinen&Schlüssel%w für den %yGeistertempel%w!", "Vous obtenez une %rPetite Clé %w&du %yTemple de l'Esprit%w!"), GIMESSAGE(RG_SHADOW_TEMPLE_SMALL_KEY, ITEM_KEY_SMALL, "You found a %pShadow Temple &%wSmall Key!", - "Du erhältst einen %rKleinen&Schlüssel%w für den %pSchattentempel%w!", + "Du erhältst einen %rkleinen&Schlüssel%w für den %pSchattentempel%w!", "Vous obtenez une %rPetite Clé %w&du %pTemple de l'Ombre%w!"), GIMESSAGE(RG_BOTTOM_OF_THE_WELL_SMALL_KEY, ITEM_KEY_SMALL, "You found a %pBottom of the &Well %wSmall Key!", - "Du erhältst einen %rKleinen&Schlüssel%w für den %pGrund des Brunnens%w!", + "Du erhältst einen %rkleinen&Schlüssel%w für den %pGrund des Brunnens%w!", "Vous obtenez une %rPetite Clé %w&du %pPuits%w!"), GIMESSAGE(RG_GERUDO_TRAINING_GROUND_SMALL_KEY, ITEM_KEY_SMALL, "You found a %yGerudo Training &Grounds %wSmall Key!", - "Du erhältst einen %rKleinen&Schlüssel%w für die %yGerudo-Trainingsarena%w!", + "Du erhältst einen %rkleinen&Schlüssel%w für die %yGerudo-Trainingsarena%w!", "Vous obtenez une %rPetite Clé %w&du %yGymnase Gerudo%w!"), GIMESSAGE(RG_GANONS_CASTLE_SMALL_KEY, ITEM_KEY_SMALL, "You found a %rGanon's Castle &%wSmall Key!", - "Du erhältst einen %rKleinen&Schlüssel%w für %rGanons Schloß%w!", + "Du erhältst einen %rkleinen&Schlüssel%w für %rGanons Schloß%w!", "Vous obtenez une %rPetite Clé %w&du %rChâteau de Ganon%w!"), + GIMESSAGE(RG_GUARD_HOUSE_KEY, ITEM_KEY_SMALL, + "You found the key to the&%gGuard House%w!", + "Du erhältst einen %rkleinen&Schlüssel%w für das %gHaus der Wachen%w!", + "Vous obtenez une %rPetite Clé %w&de la %gMaison des Gardes%w!"), + GIMESSAGE(RG_MARKET_BAZAAR_KEY, ITEM_KEY_SMALL, + "You found the key to the&%gMarket Bazaar%w!", + "Du erhältst einen %rkleinen&Schlüssel%w für den %gBasar des Marktes%w!", + "Vous obtenez une %rPetite Clé %w&du %gMarché%w!"), + GIMESSAGE(RG_MARKET_POTION_SHOP_KEY, ITEM_KEY_SMALL, + "You found the key to the&%gMarket Potion Shop%w!", + "Du erhältst einen %rkleinen&Schlüssel%w für den %gMagie-Laden des Marktes%w!", + "Vous obtenez une %rPetite Clé %w&du %gMarché%w!"), + GIMESSAGE(RG_MASK_SHOP_KEY, ITEM_KEY_SMALL, + "You found the key to the&%gMask Shop%w!", + "Du erhältst einen %rkleinen&Schlüssel%w für den %gMaskenladen%w!", + "Vous obtenez une %rPetite Clé %w&du %gMagasin de Masques%w!"), + GIMESSAGE(RG_MARKET_SHOOTING_GALLERY_KEY, ITEM_KEY_SMALL, + "You found the key to the&%gMarket Shooting Gallery%w!", + "Du erhältst einen %rkleinen&Schlüssel%w für die %gSchießbude des Marktes%w!", + "Vous obtenez une %rPetite Clé %w&du %gStand de Tir%w!"), + GIMESSAGE(RG_BOMBCHU_BOWLING_KEY, ITEM_KEY_SMALL, + "You found the key to the&%gBombchu Bowling Alley%w!", + "Du erhältst einen %rkleinen&Schlüssel%w für die %gMinenbowlingbahn%w!", + "Vous obtenez une %rPetite Clé %w&du %gBowling Bombchu%w!"), + GIMESSAGE(RG_TREASURE_CHEST_GAME_BUILDING_KEY, ITEM_KEY_SMALL, + "You found the key to the&%gTreasure Chest Game Building%w!", + "Du erhältst einen %rkleinen&Schlüssel%w für das %gHaus des Schatzkisten-Pokers%w!", + "Vous obtenez une %rPetite Clé %w&du %gJeu de la Chasse au Trésor%w!"), + GIMESSAGE(RG_BOMBCHU_SHOP_KEY, ITEM_KEY_SMALL, + "You found the key to the&%gBombchu Shop%w!", + "Du erhältst einen %rkleinen&Schlüssel%w für den %gKrabbelminenladen%w!", + "Vous obtenez une %rPetite Clé %w&du %gMagasin de Bombchu%w!"), + GIMESSAGE(RG_RICHARDS_HOUSE_KEY, ITEM_KEY_SMALL, + "You found the key to&%gRichard's House%w!", + "Du erhältst einen %rkleinen&Schlüssel%w für das %gHaus von Richard%w!", + "Vous obtenez une %rPetite Clé %w&de la %gMaison de Richard%w!"), + GIMESSAGE(RG_RICHARDS_HOUSE_KEY, ITEM_KEY_SMALL, + "You found the key to&%gRichard's House%w!", + "Du erhältst einen %rkleinen&Schlüssel%w für das %gHaus von Richard%w!", + "Vous obtenez une %rPetite Clé %w&de la %gMaison de Richard%w!"), + GIMESSAGE(RG_ALLEY_HOUSE_KEY, ITEM_KEY_SMALL, + "You found the key to&the %gAlley House%w!", + "Du erhältst einen %rkleinen&Schlüssel%w für das %gHaus in der Gasse%w!", + "Vous obtenez une %rPetite Clé %w&de la %gMaison de la Ruelle%w!"), + GIMESSAGE(RG_KAK_BAZAAR_KEY, ITEM_KEY_SMALL, + "You found the key to the&%gKakariko Bazaar%w!", + "Du erhältst einen %rkleinen&Schlüssel%w für den %gBasar von Kakariko%w!", + "Vous obtenez une %rPetite Clé %w&du %gMarché de Cocorico%w!"), + GIMESSAGE(RG_KAK_POTION_SHOP_KEY, ITEM_KEY_SMALL, + "You found the key to the&%gKakariko Potion Shop%w!", + "Du erhältst einen %rkleinen&Schlüssel%w für den %gMagie-Laden von Kakariko%w!", + "Vous obtenez une %rPetite Clé %w&du %gMagasin de Potions de Cocorico%w!"), + GIMESSAGE(RG_BOSS_HOUSE_KEY, ITEM_KEY_SMALL, + "You found the key to the&%gBoss's House%w!", + "Du erhältst einen %rkleinen&Schlüssel%w für das %gHaus des Chefs%w!", + "Vous obtenez une %rPetite Clé %w&de la %gMaison du Boss%w!"), + GIMESSAGE(RG_GRANNYS_POTION_SHOP_KEY, ITEM_KEY_SMALL, + "You found the key to&%gGranny's Potion Shop%w!", + "Du erhältst einen %rkleinen&Schlüssel%w für %gAsas Hexenladen%w!", + "Vous obtenez une %rPetite Clé %w&du %gMagasin de Potions de Grand-mère%w!"), + GIMESSAGE(RG_SKULLTULA_HOUSE_KEY, ITEM_KEY_SMALL, + "You found the key to the&%gSkulltula House%w!", + "Du erhältst einen %rkleinen&Schlüssel%w für das %gSkulltula-Haus%w!", + "Vous obtenez une %rPetite Clé %w&de la %gMaison des Skulltulas%w!"), + GIMESSAGE(RG_IMPAS_HOUSE_KEY, ITEM_KEY_SMALL, + "You found the key to&%gImpa's House%w!", + "Du erhältst einen %rkleinen&Schlüssel%w für das %gHaus von Impa%w!", + "Vous obtenez une %rPetite Clé %w&de la %gMaison d'Impa%w!"), + GIMESSAGE(RG_WINDMILL_KEY, ITEM_KEY_SMALL, + "You found the key to the&%gWindmill%w!", + "Du erhältst einen %rkleinen&Schlüssel%w für die %gWindmühle%w!", + "Vous obtenez une %rPetite Clé %w&du %gMoulin à Vent%w!"), + GIMESSAGE(RG_KAK_SHOOTING_GALLERY_KEY, ITEM_KEY_SMALL, + "You found the key to the&%gKakariko Shooting Gallery%w!", + "Du erhältst einen %rkleinen&Schlüssel%w für die %gSchießbude von Kakariko%w!", + "Vous obtenez une %rPetite Clé %w&du %gStand de Tir de Cocorico%w!"), + GIMESSAGE(RG_DAMPES_HUT_KEY, ITEM_KEY_SMALL, + "You found the key to&%gDampe's Hut%w!", + "Du erhältst einen %rkleinen&Schlüssel%w für die %gHütte von Boris%w!", + "Vous obtenez une %rPetite Clé %w&du %gChalet de Dampe%w!"), + GIMESSAGE(RG_TALONS_HOUSE_KEY, ITEM_KEY_SMALL, + "You found the key to&%gTalon's House%w!", + "Du erhältst einen %rkleinen&Schlüssel%w für das %gHaus von Talon%w!", + "Vous obtenez une %rPetite Clé %w&de la %gMaison de Talon%w!"), + GIMESSAGE(RG_STABLES_KEY, ITEM_KEY_SMALL, + "You found the key to the&%gStables%w!", + "Du erhältst einen %rkleinen&Schlüssel%w für die %gStälle%w!", + "Vous obtenez une %rPetite Clé %w&des %gÉcuries%w!"), + GIMESSAGE(RG_BACK_TOWER_KEY, ITEM_KEY_SMALL, + "You found the key to the&%gBack Tower%w!", + "Du erhältst einen %rkleinen&Schlüssel%w für den %ghinteren Turm%w!", + "Vous obtenez une %rPetite Clé %w&du %gTour Arrière%w!"), + GIMESSAGE(RG_HYLIA_LAB_KEY, ITEM_KEY_SMALL, + "You found the key to the&%gHylia Laboratory%w!", + "Du erhältst einen %rkleinen&Schlüssel%w für das %gHylia-Labor%w!", + "Vous obtenez une %rPetite Clé %w&du %gLaboratoire d'Hylia%w!"), + GIMESSAGE(RG_FISHING_HOLE_KEY, ITEM_KEY_SMALL, + "You found the key to the&%gFishing Hole%w!", + "Du erhältst einen %rkleinen&Schlüssel%w für den %gFischweiher%w!", + "Vous obtenez une %rPetite Clé %w&du %gTrou de Pêche%w!"), GIMESSAGE(RG_GERUDO_FORTRESS_KEY_RING, ITEM_KEY_SMALL, "You found a %yThieves Hideout &%wKeyring!", @@ -3453,10 +3547,14 @@ void Randomizer::CreateCustomMessages() { "You found a %yGerudo Training &Grounds %wKeyring!", "Du erhältst ein %rSchlüsselbund%w&für die %yGerudo-Trainingsarena%w!", "Vous obtenez un trousseau de&clés du %yGymnase Gerudo%w!"), - GIMESSAGE(RG_GANONS_CASTLE_KEY_RING, ITEM_KEY_SMALL, + GIMESSAGE(RG_GANONS_CASTLE_KEY_RING, ITEM_KEY_SMALL, "You found a %rGanon's Castle &%wKeyring!", "Du erhältst ein %rSchlüsselbund%w&für %rGanons Schloß%w!", "Vous obtenez un trousseau de&clés du %rChâteau de Ganon%w!"), + GIMESSAGE(RG_TREASURE_GAME_KEY_RING, ITEM_KEY_SMALL, + "You found a %rTreasure Chest Game &%wKeyring!", + "!!!", + "!!!"), GIMESSAGE(RG_FOREST_TEMPLE_BOSS_KEY, ITEM_KEY_BOSS, "You found the %gForest Temple &%wBoss Key!", @@ -3633,6 +3731,9 @@ void Randomizer::CreateCustomMessages() { GIMESSAGE_NO_GERMAN(RG_FISHING_POLE, ITEM_FISHING_POLE, "You found a lost %rFishing Pole%w!&Time to hit the pond!", "Vous avez trouvé une %rCanne à pêche%w perdue!&Il est temps d'aller à l'étang!"), + GIMESSAGE_NO_GERMAN(RG_BOMBCHU_BAG, ITEM_BOMBCHU, + "You found the %rBombchu Bag%w!", + "!!!"), GIMESSAGE_NO_GERMAN(RG_BOMB_BAG_INF, ITEM_BOMB_BAG_40, "You got an %rInfinite Bomb Bag%w!&Now you have %yinfinite bombs%w!", "Vous avez obtenu un %rSac à bombes à l'infini%w!&Vous avez maintenant des %ybombes à l'infini%w!"), @@ -3687,10 +3788,10 @@ class ExtendedVanillaTableInvalidItemIdException: public std::exception { }; void RandomizerSettingsWindow::InitElement() { - mSettings = Rando::Context::GetInstance()->GetSettings(); + mSettings = Rando::Settings::GetInstance(); Randomizer::CreateCustomMessages(); seedString = (char*)calloc(MAX_SEED_STRING_SIZE, sizeof(char)); - Rando::Context::GetInstance()->GetSettings()->UpdateOptionProperties(); + mSettings->UpdateOptionProperties(); } // Gameplay stat tracking: Update time the item was acquired @@ -3706,28 +3807,28 @@ void Randomizer_GameplayStats_SetTimestamp(uint16_t item) { // Use ITEM_KEY_BOSS to timestamp Ganon's boss key if (item == RG_GANONS_CASTLE_BOSS_KEY) { - gSaveContext.sohStats.itemTimestamp[ITEM_KEY_BOSS] = time; + gSaveContext.ship.stats.itemTimestamp[ITEM_KEY_BOSS] = time; } // Count any bottled item as a bottle if (item >= RG_EMPTY_BOTTLE && item <= RG_BOTTLE_WITH_BIG_POE) { - if (gSaveContext.sohStats.itemTimestamp[ITEM_BOTTLE] == 0) { - gSaveContext.sohStats.itemTimestamp[ITEM_BOTTLE] = time; + if (gSaveContext.ship.stats.itemTimestamp[ITEM_BOTTLE] == 0) { + gSaveContext.ship.stats.itemTimestamp[ITEM_BOTTLE] = time; } return; } // Count any bombchu pack as bombchus if ((item >= RG_BOMBCHU_5 && item <= RG_BOMBCHU_20) || item == RG_PROGRESSIVE_BOMBCHUS) { - if (gSaveContext.sohStats.itemTimestamp[ITEM_BOMBCHU] = 0) { - gSaveContext.sohStats.itemTimestamp[ITEM_BOMBCHU] = time; + if (gSaveContext.ship.stats.itemTimestamp[ITEM_BOMBCHU] = 0) { + gSaveContext.ship.stats.itemTimestamp[ITEM_BOMBCHU] = time; } return; } if (item == RG_MAGIC_SINGLE) { - gSaveContext.sohStats.itemTimestamp[ITEM_SINGLE_MAGIC] = time; + gSaveContext.ship.stats.itemTimestamp[ITEM_SINGLE_MAGIC] = time; } if (item == RG_DOUBLE_DEFENSE) { - gSaveContext.sohStats.itemTimestamp[ITEM_DOUBLE_DEFENSE] = time; + gSaveContext.ship.stats.itemTimestamp[ITEM_DOUBLE_DEFENSE] = time; } } @@ -3920,7 +4021,7 @@ extern "C" u16 Randomizer_Item_Give(PlayState* play, GetItemEntry giEntry) { } if ((item >= RG_FOREST_TEMPLE_SMALL_KEY) && (item <= RG_GANONS_CASTLE_SMALL_KEY)) { - gSaveContext.sohStats.dungeonKeys[mapIndex]++; + gSaveContext.ship.stats.dungeonKeys[mapIndex]++; if (gSaveContext.inventory.dungeonKeys[mapIndex] < 0) { gSaveContext.inventory.dungeonKeys[mapIndex] = 1; } else { @@ -3930,7 +4031,7 @@ extern "C" u16 Randomizer_Item_Give(PlayState* play, GetItemEntry giEntry) { } if ((item >= RG_FOREST_TEMPLE_KEY_RING) && (item <= RG_GANONS_CASTLE_KEY_RING)) { - gSaveContext.sohStats.dungeonKeys[mapIndex] = numOfKeysOnKeyring; + gSaveContext.ship.stats.dungeonKeys[mapIndex] = numOfKeysOnKeyring; gSaveContext.inventory.dungeonKeys[mapIndex] = numOfKeysOnKeyring; return Return_Item_Entry(giEntry, RG_NONE); } @@ -3946,6 +4047,9 @@ extern "C" u16 Randomizer_Item_Give(PlayState* play, GetItemEntry giEntry) { gSaveContext.inventory.dungeonItems[mapIndex] |= bitmask; return Return_Item_Entry(giEntry, RG_NONE); + } else if (item >= RG_GUARD_HOUSE_KEY && item <= RG_FISHING_HOLE_KEY) { + Flags_SetRandomizerInf((RandomizerInf)((int)RAND_INF_GUARD_HOUSE_UNLOCKED + ((item - RG_GUARD_HOUSE_KEY) * 2) + 1)); + return Return_Item_Entry(giEntry, RG_NONE); } switch (item) { @@ -3989,16 +4093,16 @@ extern "C" u16 Randomizer_Item_Give(PlayState* play, GetItemEntry giEntry) { case RG_GREG_RUPEE: Rupees_ChangeBy(1); Flags_SetRandomizerInf(RAND_INF_GREG_FOUND); - gSaveContext.sohStats.itemTimestamp[TIMESTAMP_FOUND_GREG] = GAMEPLAYSTAT_TOTAL_TIME; + gSaveContext.ship.stats.itemTimestamp[TIMESTAMP_FOUND_GREG] = GAMEPLAYSTAT_TOTAL_TIME; break; case RG_TRIFORCE_PIECE: - gSaveContext.triforcePiecesCollected++; + gSaveContext.ship.quest.data.randomizer.triforcePiecesCollected++; GameInteractor_SetTriforceHuntPieceGiven(true); // Teleport to credits when goal is reached. - if (gSaveContext.triforcePiecesCollected == (OTRGlobals::Instance->gRandomizer->GetRandoSettingValue(RSK_TRIFORCE_HUNT_PIECES_REQUIRED) + 1)) { - gSaveContext.sohStats.itemTimestamp[TIMESTAMP_TRIFORCE_COMPLETED] = GAMEPLAYSTAT_TOTAL_TIME; - gSaveContext.sohStats.gameComplete = 1; + if (gSaveContext.ship.quest.data.randomizer.triforcePiecesCollected == (OTRGlobals::Instance->gRandomizer->GetRandoSettingValue(RSK_TRIFORCE_HUNT_PIECES_REQUIRED) + 1)) { + gSaveContext.ship.stats.itemTimestamp[TIMESTAMP_TRIFORCE_COMPLETED] = GAMEPLAYSTAT_TOTAL_TIME; + gSaveContext.ship.stats.gameComplete = 1; Flags_SetRandomizerInf(RAND_INF_GRANT_GANONS_BOSSKEY); Play_PerformSave(play); GameInteractor_SetTriforceHuntCreditsWarpActive(true); @@ -4006,13 +4110,14 @@ extern "C" u16 Randomizer_Item_Give(PlayState* play, GetItemEntry giEntry) { break; case RG_PROGRESSIVE_BOMBCHUS: + case RG_BOMBCHU_BAG: if (INV_CONTENT(ITEM_BOMBCHU) == ITEM_NONE) { INV_CONTENT(ITEM_BOMBCHU) = ITEM_BOMBCHU; AMMO(ITEM_BOMBCHU) = 20; } else if (OTRGlobals::Instance->gRandomizer->GetRandoSettingValue(RSK_INFINITE_UPGRADES)) { Flags_SetRandomizerInf(RAND_INF_HAS_INFINITE_BOMBCHUS); } else { - AMMO(ITEM_BOMBCHU) += AMMO(ITEM_BOMBCHU) < 5 ? 10 : 5; + AMMO(ITEM_BOMBCHU) += 10; if (AMMO(ITEM_BOMBCHU) > 50) { AMMO(ITEM_BOMBCHU) = 50; } diff --git a/soh/soh/Enhancements/randomizer/randomizerTypes.h b/soh/soh/Enhancements/randomizer/randomizerTypes.h index 87ba34adf..66128d50f 100644 --- a/soh/soh/Enhancements/randomizer/randomizerTypes.h +++ b/soh/soh/Enhancements/randomizer/randomizerTypes.h @@ -148,6 +148,30 @@ typedef enum { LOGIC_GANONS_CASTLE_KEYS, LOGIC_TREASURE_GAME_KEYS, LOGIC_SKELETON_KEY, + LOGIC_GUARD_HOUSE_KEY, + LOGIC_MARKET_BAZAAR_KEY, + LOGIC_MARKET_POTION_SHOP_KEY, + LOGIC_MASK_SHOP_KEY, + LOGIC_MARKET_SHOOTING_GALLERY_KEY, + LOGIC_BOMBCHU_BOWLING_KEY, + LOGIC_TREASURE_CHEST_GAME_BUILDING_KEY, + LOGIC_BOMBCHU_SHOP_KEY, + LOGIC_RICHARDS_HOUSE_KEY, + LOGIC_ALLEY_HOUSE_KEY, + LOGIC_KAK_BAZAAR_KEY, + LOGIC_KAK_POTION_SHOP_KEY, + LOGIC_BOSS_HOUSE_KEY, + LOGIC_GRANNYS_POTION_SHOP_KEY, + LOGIC_SKULLTULA_HOUSE_KEY, + LOGIC_IMPAS_HOUSE_KEY, + LOGIC_WINDMILL_KEY, + LOGIC_KAK_SHOOTING_GALLERY_KEY, + LOGIC_DAMPES_HUT_KEY, + LOGIC_TALONS_HOUSE_KEY, + LOGIC_STABLES_KEY, + LOGIC_BACK_TOWER_KEY, + LOGIC_HYLIA_LAB_KEY, + LOGIC_FISHING_HOLE_KEY, LOGIC_KOKIRI_EMERALD, LOGIC_GORON_RUBY, LOGIC_ZORA_SAPPHIRE, @@ -2799,8 +2823,11 @@ typedef enum { RC_HF_POND_STORMS_FAIRY, RC_HF_FENCE_GROTTO_STORMS_FAIRY, RC_DMT_FLAG_SUN_FAIRY, + RC_DMT_COW_GROTTO_STORMS_FAIRY, RC_LW_SHORTCUT_STORMS_FAIRY, RC_GF_KITCHEN_SUN_FAIRY, + RC_LW_DEKU_SCRUB_GROTTO_SUN_FAIRY, + RC_GRAVEYARD_ROYAL_FAMILYS_TOMB_SUN_FAIRY, RC_SPIRIT_TEMPLE_BOULDER_ROOM_SUN_FAIRY, RC_SPIRIT_TEMPLE_ARMOS_ROOM_SUN_FAIRY, RC_SHADOW_TEMPLE_BEAMOS_STORM_FAIRY, @@ -3213,6 +3240,7 @@ typedef enum { RG_GERUDO_TRAINING_GROUND_KEY_RING, RG_GERUDO_FORTRESS_KEY_RING, RG_GANONS_CASTLE_KEY_RING, + RG_TREASURE_GAME_KEY_RING, RG_KOKIRI_EMERALD, RG_GORON_RUBY, RG_ZORA_SAPPHIRE, @@ -3306,6 +3334,7 @@ typedef enum { RG_TYCOON_WALLET, RG_BRONZE_SCALE, RG_CHILD_WALLET, + RG_BOMBCHU_BAG, RG_QUIVER_INF, RG_BOMB_BAG_INF, RG_BULLET_BAG_INF, @@ -3339,6 +3368,30 @@ typedef enum { RG_HOOKSHOT, RG_LONGSHOT, RG_SCARECROW, + RG_GUARD_HOUSE_KEY, + RG_MARKET_BAZAAR_KEY, + RG_MARKET_POTION_SHOP_KEY, + RG_MASK_SHOP_KEY, + RG_MARKET_SHOOTING_GALLERY_KEY, + RG_BOMBCHU_BOWLING_KEY, + RG_TREASURE_CHEST_GAME_BUILDING_KEY, + RG_BOMBCHU_SHOP_KEY, + RG_RICHARDS_HOUSE_KEY, + RG_ALLEY_HOUSE_KEY, + RG_KAK_BAZAAR_KEY, + RG_KAK_POTION_SHOP_KEY, + RG_BOSS_HOUSE_KEY, + RG_GRANNYS_POTION_SHOP_KEY, + RG_SKULLTULA_HOUSE_KEY, + RG_IMPAS_HOUSE_KEY, + RG_WINDMILL_KEY, + RG_KAK_SHOOTING_GALLERY_KEY, + RG_DAMPES_HUT_KEY, + RG_TALONS_HOUSE_KEY, + RG_STABLES_KEY, + RG_BACK_TOWER_KEY, + RG_HYLIA_LAB_KEY, + RG_FISHING_HOLE_KEY, // Logic Only RG_DISTANT_SCARECROW, RG_STICKS, @@ -3429,6 +3482,7 @@ typedef enum { RHT_CAN_BE_FOUND_AT, RHT_HOARDS, // Junk + RHT_JUNK01, RHT_JUNK02, RHT_JUNK03, RHT_JUNK04, @@ -3499,141 +3553,6 @@ typedef enum { RHT_JUNK69, RHT_JUNK70, RHT_JUNK71, - RHT_JUNK72, - RHT_JUNK73, - RHT_JUNK74, - RHT_JUNK75, - RHT_JUNK76, - RHT_JUNK77, - RHT_JUNK78, - RHT_JUNK79, - RHT_JUNK80, - RHT_JUNK81, - RHT_JUNK_WTC_1, - RHT_JUNK_WTC_2, - RHT_JUNK_WTC_3, - RHT_JUNK_WTC_4, - RHT_JUNK_WTC_5, - RHT_JUNK_WTC_6, - RHT_JUNK_WTC_7, - RHT_JUNK_WTC_8, - RHT_JUNK_WTC_9, - RHT_JUNK_WTC_10, - RHT_JUNK_WTC_11, - RHT_JUNK_WTC_12, - RHT_JUNK_SEI_1, - RHT_JUNK_SEI_2, - RHT_JUNK_SEI_3, - RHT_JUNK_SEI_4, - RHT_JUNK_SEI_5, - RHT_JUNK_SEI_6, - RHT_JUNK_SEI_7, - RHT_JUNK_SEI_8, - RHT_JUNK_SEI_9, - RHT_JUNK_SEI_10, - RHT_JUNK_SEI_11, - RHT_JUNK_SEI_12, - RHT_JUNK_SEI_13, - RHT_JUNK_SEI_14, - RHT_JUNK_SEI_15, - RHT_JUNK_SEI_16, - RHT_JUNK_SEI_17, - RHT_JUNK_SEI_18, - RHT_JUNK_SEI_19, - RHT_JUNK_SEI_20, - RHT_JUNK_SEI_21, - RHT_JUNK_SEI_22, - RHT_JUNK_SEI_23, - RHT_JUNK_SEI_24, - RHT_JUNK_SEI_25, - RHT_JUNK_SEI_26, - RHT_JUNK_SEI_27, - RHT_JUNK_SEI_28, - RHT_JUNK_SEI_29, - RHT_JUNK_OTR_MEANS_1, - RHT_JUNK_OTR_MEANS_2, - RHT_JUNK_OTR_MEANS_3, - RHT_JUNK_OTR_MEANS_4, - RHT_JUNK_OTR_MEANS_5, - RHT_JUNK_OTR_MEANS_6, - RHT_JUNK_OTR_MEANS_7, - RHT_JUNK_OTR_MEANS_8, - RHT_JUNK_OTR_MEANS_9, - RHT_JUNK_OTR_MEANS_10, - RHT_JUNK_OTR_MEANS_11, - RHT_JUNK_OTR_MEANS_12, - RHT_JUNK_OTR_MEANS_13, - RHT_JUNK_OTR_MEANS_14, - RHT_JUNK_OTR_MEANS_15, - RHT_JUNK_OTR_MEANS_16, - RHT_JUNK_OTR_MEANS_17, - RHT_JUNK_OTR_MEANS_18, - RHT_JUNK_OTR_MEANS_19, - RHT_JUNK_OTR_MEANS_20, - RHT_JUNK_OTR_MEANS_21, - RHT_JUNK_OTR_MEANS_22, - RHT_JUNK_OTR_MEANS_23, - RHT_JUNK_OTR_MEANS_24, - RHT_JUNK_OTR_MEANS_25, - RHT_JUNK_OTR_MEANS_26, - RHT_JUNK_OTR_MEANS_27, - RHT_JUNK_OTR_MEANS_28, - RHT_JUNK_OTR_MEANS_29, - RHT_JUNK_OTR_MEANS_30, - RHT_JUNK_MISC_1, - RHT_JUNK_MISC_2, - RHT_JUNK_MISC_3, - RHT_JUNK_MISC_4, - RHT_JUNK_MISC_5, - RHT_JUNK_MISC_6, - RHT_JUNK_MISC_7, - RHT_JUNK_MISC_8, - RHT_JUNK_MISC_9, - RHT_JUNK_MISC_10, - RHT_JUNK_MISC_11, - RHT_JUNK_MISC_12, - RHT_JUNK_MISC_13, - RHT_JUNK_MISC_14, - RHT_JUNK_MISC_15, - RHT_JUNK_MISC_16, - RHT_JUNK_MISC_17, - RHT_JUNK_SG_1, - RHT_JUNK_SG_2, - RHT_JUNK_SG_3, - RHT_JUNK_SG_4, - RHT_JUNK_SG_5, - RHT_JUNK_SG_6, - RHT_JUNK_SG_7, - RHT_JUNK_SG_8, - RHT_JUNK_CREW_1, - RHT_JUNK_CREW_2, - RHT_JUNK_CREW_3, - RHT_JUNK_CREW_4, - RHT_JUNK_CREW_5, - RHT_JUNK_CREW_6, - RHT_JUNK_CREW_7, - RHT_JUNK_CREW_8, - RHT_JUNK_CREW_9, - RHT_JUNK_CREW_10, - RHT_JUNK_CREW_11, - RHT_JUNK_CREW_12, - RHT_JUNK_CREW_13, - RHT_JUNK_CREW_14, - RHT_JUNK_CREW_15, - RHT_JUNK_CREW_16, - RHT_JUNK_CREW_17, - RHT_JUNK_CREW_18, - RHT_JUNK_CREW_19, - RHT_JUNK_CREW_20, - RHT_JUNK_CREW_21, - RHT_JUNK_CREW_22, - RHT_JUNK_CREW_23, - RHT_JUNK_CREW_24, - RHT_JUNK_CREW_25, - RHT_JUNK_CREW_26, - RHT_JUNK_CREW_27, - RHT_JUNK_CREW_28, - RHT_JUNK_CREW_29, // Locations RHT_LINKS_POCKET, RHT_QUEEN_GOHMA, @@ -4487,6 +4406,7 @@ typedef enum { RHT_GERUDO_TRAINING_GROUND_KEY_RING, RHT_GERUDO_FORTRESS_KEY_RING, RHT_GANONS_CASTLE_KEY_RING, + RHT_TREASURE_GAME_KEY_RING, RHT_KOKIRI_EMERALD, RHT_GORON_RUBY, RHT_ZORA_SAPPHIRE, @@ -4556,6 +4476,7 @@ typedef enum { RHT_BUY_RED_POTION_40, RHT_BUY_RED_POTION_50, RHT_TRIFORCE, + RHT_BOMBCHU_BAG, RHT_QUIVER_INF, RHT_BOMB_BAG_INF, RHT_BULLET_BAG_INF, @@ -4610,6 +4531,7 @@ typedef enum { RHT_FISHING_POLE, RHT_SKELETON_KEY, RHT_EPONA, + RHT_OVERWORLD_KEY, RHT_HINT_MYSTERIOUS, RHT_MYSTERIOUS_ITEM, RHT_MYSTERIOUS_ITEM_CAPITAL, @@ -4985,8 +4907,11 @@ typedef enum { RHT_HF_POND_STORMS_FAIRY, RHT_HF_FENCE_GROTTO_STORMS_FAIRY, RHT_DMT_FLAG_SUN_FAIRY, + RHT_DMT_COW_GROTTO_STORMS_FAIRY, RHT_LW_SHORTCUT_STORMS_FAIRY, RHT_GF_KITCHEN_SUN_FAIRY, + RHT_LW_DEKU_SCRUB_GROTTO_SUN_FAIRY, + RHT_GRAVEYARD_ROYAL_FAMILYS_TOMB_SUN_FAIRY, RHT_SPIRIT_TEMPLE_BOULDER_ROOM_SUN_FAIRY, RHT_SPIRIT_TEMPLE_ARMOS_ROOM_SUN_FAIRY, RHT_SHADOW_TEMPLE_BEAMOS_STORM_FAIRY, @@ -5098,6 +5023,7 @@ typedef enum { RSK_ZORAS_FOUNTAIN, RSK_SLEEPING_WATERFALL, RSK_STARTING_AGE, + RSK_SELECTED_STARTING_AGE, RSK_GERUDO_FORTRESS, RSK_RAINBOW_BRIDGE, RSK_RAINBOW_BRIDGE_STONE_COUNT, @@ -5209,7 +5135,6 @@ typedef enum { RSK_SKIP_EPONA_RACE, RSK_COMPLETE_MASK_QUEST, RSK_SKIP_SCARECROWS_SONG, - RSK_ENABLE_GLITCH_CUTSCENES, RSK_SKULLS_SUNS_SONG, RSK_SHUFFLE_ADULT_TRADE, RSK_SHUFFLE_MERCHANTS, @@ -5226,7 +5151,7 @@ typedef enum { RSK_BLUE_FIRE_ARROWS, RSK_SUNLIGHT_ARROWS, RSK_ENABLE_BOMBCHU_DROPS, - RSK_BOMBCHUS_IN_LOGIC, + RSK_BOMBCHU_BAG, RSK_LINKS_POCKET, RSK_MQ_DUNGEON_RANDOM, RSK_MQ_DUNGEON_COUNT, @@ -5295,6 +5220,7 @@ typedef enum { RSK_SHUFFLE_DEKU_NUT_BAG, RSK_SHUFFLE_FREESTANDING, RSK_SHUFFLE_FAIRIES, + RSK_LOCK_OVERWORLD_DOORS, RSK_MAX } RandomizerSettingKey; @@ -5652,7 +5578,6 @@ typedef enum { // Logic (glitchless/no logic) typedef enum { RO_LOGIC_GLITCHLESS, - RO_LOGIC_GLITCHED, RO_LOGIC_NO_LOGIC, RO_LOGIC_VANILLA, } RandoOptionLogic; diff --git a/soh/soh/Enhancements/randomizer/randomizer_check_tracker.cpp b/soh/soh/Enhancements/randomizer/randomizer_check_tracker.cpp index 0af0b0128..51abc0db1 100644 --- a/soh/soh/Enhancements/randomizer/randomizer_check_tracker.cpp +++ b/soh/soh/Enhancements/randomizer/randomizer_check_tracker.cpp @@ -6,7 +6,7 @@ #include "soh/cvar_prefixes.h" #include "soh/SaveManager.h" #include "soh/ResourceManagerHelpers.h" -#include "soh/UIWidgets.hpp" +#include "soh/SohGui/UIWidgets.hpp" #include "dungeon.h" #include "location_access.h" @@ -490,7 +490,7 @@ void CheckTrackerLoadGame(int32_t fileNum) { } } if (OTRGlobals::Instance->gRandomizer->GetRandoSettingValue(RSK_LINKS_POCKET) != RO_LINKS_POCKET_NOTHING && IS_RANDO) { - s8 startingAge = OTRGlobals::Instance->gRandomizer->GetRandoSettingValue(RSK_STARTING_AGE); + uint8_t startingAge = OTRGlobals::Instance->gRandoContext->GetOption(RSK_SELECTED_STARTING_AGE).Get(); RandomizerCheckArea startingArea; switch (startingAge) { case RO_AGE_CHILD: @@ -699,10 +699,10 @@ void CheckTrackerFlagSet(int16_t flagType, int32_t flag) { return; } if (!IS_RANDO) { - if (flag == INFTABLE_192) { + if (flag == INFTABLE_BOUGHT_STICK_UPGRADE) { SetCheckCollected(RC_LW_DEKU_SCRUB_NEAR_BRIDGE); return; - } else if (flag == INFTABLE_193) { + } else if (flag == INFTABLE_BOUGHT_NUT_UPGRADE) { SetCheckCollected(RC_LW_DEKU_SCRUB_GROTTO_FRONT); return; } @@ -716,7 +716,7 @@ void CheckTrackerFlagSet(int16_t flagType, int32_t flag) { } else if (flag == ITEMGETINF_OBTAINED_NUT_UPGRADE_FROM_STAGE) { SetCheckCollected(RC_DEKU_THEATER_MASK_OF_TRUTH); return; - } else if (flag == ITEMGETINF_0B) { + } else if (flag == ITEMGETINF_DEKU_SCRUB_HEART_PIECE) { SetCheckCollected(RC_HF_DEKU_SCRUB_GROTTO); return; } @@ -1360,7 +1360,7 @@ bool IsVisibleInCheckTracker(RandomizerCheck rc) { OTRGlobals::Instance->gRandoContext->IsQuestOfLocationActive(rc) ) || (loc->GetRCType() == RCTYPE_SHOP && showShops && !hideShopUnshuffledChecks); } else { - return loc->IsVanillaCompletion() && (!loc->IsDungeon() || (loc->IsDungeon() && loc->GetQuest() == gSaveContext.questId)); + return loc->IsVanillaCompletion() && (!loc->IsDungeon() || (loc->IsDungeon() && loc->GetQuest() == gSaveContext.ship.quest.id)); } } @@ -1546,7 +1546,7 @@ void DrawLocation(RandomizerCheck rc) { SaveManager::Instance->SaveSection(gSaveContext.fileNum, sectionId, true); } } else { - ImGui::InvisibleButton("", ImVec2(20.0f, 10.0f)); + ImGui::Dummy(ImVec2(20.0f, 10.0f)); } ImGui::SameLine(); @@ -1757,7 +1757,7 @@ void CheckTrackerSettingsWindow::DrawElement() { } UIWidgets::EnhancementCheckbox("Vanilla/MQ Dungeon Spoilers", CVAR_TRACKER_CHECK("MQSpoilers")); UIWidgets::Tooltip("If enabled, Vanilla/MQ dungeons will show on the tracker immediately. Otherwise, Vanilla/MQ dungeon locations must be unlocked."); - if (UIWidgets::EnhancementCheckbox("Hide unshuffled shop item checks", CVAR_TRACKER_CHECK("HideUnshuffledShopChecks"), false, "", UIWidgets::CheckboxGraphics::Cross, true)) { + if (UIWidgets::EnhancementCheckbox("Hide unshuffled shop item checks", CVAR_TRACKER_CHECK("HideUnshuffledShopChecks"), false, "", UIWidgets::CheckboxGraphics::Cross, false)) { hideShopUnshuffledChecks = !hideShopUnshuffledChecks; UpdateFilters(); } diff --git a/soh/soh/Enhancements/randomizer/randomizer_entrance.c b/soh/soh/Enhancements/randomizer/randomizer_entrance.c index 7a492fe9c..14d630005 100644 --- a/soh/soh/Enhancements/randomizer/randomizer_entrance.c +++ b/soh/soh/Enhancements/randomizer/randomizer_entrance.c @@ -740,7 +740,7 @@ u8 Entrance_GetIsSceneDiscovered(u8 sceneNum) { u32 idx = sceneNum / bitsPerIndex; if (idx < SAVEFILE_SCENES_DISCOVERED_IDX_COUNT) { u32 sceneBit = 1 << (sceneNum - (idx * bitsPerIndex)); - return (gSaveContext.sohStats.scenesDiscovered[idx] & sceneBit) != 0; + return (gSaveContext.ship.stats.scenesDiscovered[idx] & sceneBit) != 0; } return 0; } @@ -754,7 +754,7 @@ void Entrance_SetSceneDiscovered(u8 sceneNum) { u32 idx = sceneNum / bitsPerIndex; if (idx < SAVEFILE_SCENES_DISCOVERED_IDX_COUNT) { u32 sceneBit = 1 << (sceneNum - (idx * bitsPerIndex)); - gSaveContext.sohStats.scenesDiscovered[idx] |= sceneBit; + gSaveContext.ship.stats.scenesDiscovered[idx] |= sceneBit; } // Save scenesDiscovered Save_SaveSection(SECTION_ID_SCENES); @@ -765,7 +765,7 @@ u8 Entrance_GetIsEntranceDiscovered(u16 entranceIndex) { u32 idx = entranceIndex / bitsPerIndex; if (idx < SAVEFILE_ENTRANCES_DISCOVERED_IDX_COUNT) { u32 entranceBit = 1 << (entranceIndex - (idx * bitsPerIndex)); - return (gSaveContext.sohStats.entrancesDiscovered[idx] & entranceBit) != 0; + return (gSaveContext.ship.stats.entrancesDiscovered[idx] & entranceBit) != 0; } return 0; } @@ -782,7 +782,7 @@ void Entrance_SetEntranceDiscovered(u16 entranceIndex, u8 isReversedEntrance) { u32 idx = entranceIndex / bitsPerIndex; if (idx < SAVEFILE_ENTRANCES_DISCOVERED_IDX_COUNT) { u32 entranceBit = 1 << (entranceIndex - (idx * bitsPerIndex)); - gSaveContext.sohStats.entrancesDiscovered[idx] |= entranceBit; + gSaveContext.ship.stats.entrancesDiscovered[idx] |= entranceBit; // Set reverse entrance when not decoupled if (!Randomizer_GetSettingValue(RSK_DECOUPLED_ENTRANCES) && !isReversedEntrance) { diff --git a/soh/soh/Enhancements/randomizer/randomizer_entrance_tracker.cpp b/soh/soh/Enhancements/randomizer/randomizer_entrance_tracker.cpp index 8d951dfdc..78de199d7 100644 --- a/soh/soh/Enhancements/randomizer/randomizer_entrance_tracker.cpp +++ b/soh/soh/Enhancements/randomizer/randomizer_entrance_tracker.cpp @@ -1,7 +1,7 @@ #include "randomizer_entrance_tracker.h" #include "soh/OTRGlobals.h" #include "soh/cvar_prefixes.h" -#include "soh/UIWidgets.hpp" +#include "soh/SohGui/UIWidgets.hpp" #include #include @@ -87,297 +87,297 @@ const EntranceData entranceData[] = { { ENTR_HYRULE_FIELD_OWL_DROP, -1, SINGLE_SCENE_INFO(SCENE_LAKE_HYLIA), "LH Owl Flight", "Hyrule Field Owl Drop", ENTRANCE_GROUP_ONE_WAY, ENTRANCE_GROUP_ONE_WAY, ENTRANCE_TYPE_ONE_WAY}, // Kokiri Forest - { ENTR_LOST_WOODS_BRIDGE_EAST_EXIT, ENTR_KOKIRI_FOREST_LOWER_EXIT, SINGLE_SCENE_INFO(SCENE_KOKIRI_FOREST), "Kokiri Forest Lower Exit", "Lost Woods Bridge East Exit", ENTRANCE_GROUP_KOKIRI_FOREST, ENTRANCE_GROUP_LOST_WOODS, ENTRANCE_TYPE_OVERWORLD, "lw"}, - { ENTR_LOST_WOODS_SOUTH_EXIT, ENTR_KOKIRI_FOREST_UPPER_EXIT, SINGLE_SCENE_INFO(SCENE_KOKIRI_FOREST), "Kokiri Forest Upper Exit", "Lost Woods Sout Exit", ENTRANCE_GROUP_KOKIRI_FOREST, ENTRANCE_GROUP_LOST_WOODS, ENTRANCE_TYPE_OVERWORLD, "lw"}, - { ENTR_LINKS_HOUSE_1, ENTR_KOKIRI_FOREST_OUTSIDE_LINKS_HOUSE, SINGLE_SCENE_INFO(SCENE_KOKIRI_FOREST), "KF Outside Link's House", "Link's House", ENTRANCE_GROUP_KOKIRI_FOREST, ENTRANCE_GROUP_KOKIRI_FOREST, ENTRANCE_TYPE_INTERIOR, "", 1}, - { ENTR_MIDOS_HOUSE_0, ENTR_KOKIRI_FOREST_OUTSIDE_MIDOS_HOUSE, SINGLE_SCENE_INFO(SCENE_KOKIRI_FOREST), "KF Outside Mido's House", "Mido's House", ENTRANCE_GROUP_KOKIRI_FOREST, ENTRANCE_GROUP_KOKIRI_FOREST, ENTRANCE_TYPE_INTERIOR, "", 1}, - { ENTR_SARIAS_HOUSE_0, ENTR_KOKIRI_FOREST_OUTSIDE_SARIAS_HOUSE, SINGLE_SCENE_INFO(SCENE_KOKIRI_FOREST), "KF Outside Saria's House", "Saria's House", ENTRANCE_GROUP_KOKIRI_FOREST, ENTRANCE_GROUP_KOKIRI_FOREST, ENTRANCE_TYPE_INTERIOR, "", 1}, - { ENTR_TWINS_HOUSE_0, ENTR_KOKIRI_FOREST_OUTSIDE_TWINS_HOUSE, SINGLE_SCENE_INFO(SCENE_KOKIRI_FOREST), "KF Outside House of Twins", "House of Twins", ENTRANCE_GROUP_KOKIRI_FOREST, ENTRANCE_GROUP_KOKIRI_FOREST, ENTRANCE_TYPE_INTERIOR, "", 1}, - { ENTR_KNOW_IT_ALL_BROS_HOUSE_0, ENTR_KOKIRI_FOREST_OUTSIDE_KNOW_IT_ALL_HOUSE, SINGLE_SCENE_INFO(SCENE_KOKIRI_FOREST), "KF Outside Know-It-All House", "Know-It-All House", ENTRANCE_GROUP_KOKIRI_FOREST, ENTRANCE_GROUP_KOKIRI_FOREST, ENTRANCE_TYPE_INTERIOR, "", 1}, - { ENTR_KOKIRI_SHOP_0, ENTR_KOKIRI_FOREST_OUTSIDE_SHOP, SINGLE_SCENE_INFO(SCENE_KOKIRI_FOREST), "KF Oustide Shop", "KF Shop", ENTRANCE_GROUP_KOKIRI_FOREST, ENTRANCE_GROUP_KOKIRI_FOREST, ENTRANCE_TYPE_INTERIOR, "", 1}, - { ENTRANCE_GROTTO_LOAD(GROTTO_KF_STORMS_OFFSET), ENTRANCE_GROTTO_EXIT(GROTTO_KF_STORMS_OFFSET), SINGLE_SCENE_INFO(SCENE_KOKIRI_FOREST), "KF Storms Grotto Exit", "KF Storms Grotto", ENTRANCE_GROUP_KOKIRI_FOREST, ENTRANCE_GROUP_KOKIRI_FOREST, ENTRANCE_TYPE_GROTTO, "chest", 1}, - { ENTR_DEKU_TREE_ENTRANCE, ENTR_KOKIRI_FOREST_OUTSIDE_DEKU_TREE, SINGLE_SCENE_INFO(SCENE_KOKIRI_FOREST), "KF Oustide Deku Tree", "Deku Tree Entrance", ENTRANCE_GROUP_KOKIRI_FOREST, ENTRANCE_GROUP_KOKIRI_FOREST, ENTRANCE_TYPE_DUNGEON, "", 1}, - { ENTR_KOKIRI_FOREST_OUTSIDE_LINKS_HOUSE, ENTR_LINKS_HOUSE_1, SINGLE_SCENE_INFO(SCENE_LINKS_HOUSE), "Link's House", "KF Outside Link's House", ENTRANCE_GROUP_KOKIRI_FOREST, ENTRANCE_GROUP_KOKIRI_FOREST, ENTRANCE_TYPE_INTERIOR, ""}, - { ENTR_KOKIRI_FOREST_OUTSIDE_MIDOS_HOUSE, ENTR_MIDOS_HOUSE_0, SINGLE_SCENE_INFO(SCENE_MIDOS_HOUSE), "Mido's House", "KF Outside Mido's House", ENTRANCE_GROUP_KOKIRI_FOREST, ENTRANCE_GROUP_KOKIRI_FOREST, ENTRANCE_TYPE_INTERIOR, ""}, - { ENTR_KOKIRI_FOREST_OUTSIDE_SARIAS_HOUSE, ENTR_SARIAS_HOUSE_0, SINGLE_SCENE_INFO(SCENE_SARIAS_HOUSE), "Saria's House", "KF Outside Saria's House", ENTRANCE_GROUP_KOKIRI_FOREST, ENTRANCE_GROUP_KOKIRI_FOREST, ENTRANCE_TYPE_INTERIOR, ""}, - { ENTR_KOKIRI_FOREST_OUTSIDE_TWINS_HOUSE, ENTR_TWINS_HOUSE_0, SINGLE_SCENE_INFO(SCENE_TWINS_HOUSE), "House of Twins", "KF Outside House of Twins", ENTRANCE_GROUP_KOKIRI_FOREST, ENTRANCE_GROUP_KOKIRI_FOREST, ENTRANCE_TYPE_INTERIOR, ""}, - { ENTR_KOKIRI_FOREST_OUTSIDE_KNOW_IT_ALL_HOUSE, ENTR_KNOW_IT_ALL_BROS_HOUSE_0, SINGLE_SCENE_INFO(SCENE_KNOW_IT_ALL_BROS_HOUSE), "Know-It-All House", "KF Outside Know-It-All House", ENTRANCE_GROUP_KOKIRI_FOREST, ENTRANCE_GROUP_KOKIRI_FOREST, ENTRANCE_TYPE_INTERIOR, ""}, - { ENTR_KOKIRI_FOREST_OUTSIDE_SHOP, ENTR_KOKIRI_SHOP_0, SINGLE_SCENE_INFO(SCENE_KOKIRI_SHOP), "KF Shop", "KF Oustide Shop", ENTRANCE_GROUP_KOKIRI_FOREST, ENTRANCE_GROUP_KOKIRI_FOREST, ENTRANCE_TYPE_INTERIOR, ""}, - { ENTRANCE_GROTTO_EXIT(GROTTO_KF_STORMS_OFFSET), ENTRANCE_GROTTO_LOAD(GROTTO_KF_STORMS_OFFSET), {{ SCENE_GROTTOS, 0x00 }}, "KF Storms Grotto", "KF Storms Grotto Exit", ENTRANCE_GROUP_KOKIRI_FOREST, ENTRANCE_GROUP_KOKIRI_FOREST, ENTRANCE_TYPE_GROTTO, "chest"}, - { ENTR_KOKIRI_FOREST_OUTSIDE_DEKU_TREE, ENTR_DEKU_TREE_ENTRANCE, SINGLE_SCENE_INFO(SCENE_DEKU_TREE), "Deku Tree Entrance", "KF Oustide Deku Tree", ENTRANCE_GROUP_KOKIRI_FOREST, ENTRANCE_GROUP_KOKIRI_FOREST, ENTRANCE_TYPE_DUNGEON, ""}, - { ENTR_DEKU_TREE_BOSS_ENTRANCE, ENTR_DEKU_TREE_BOSS_DOOR, SINGLE_SCENE_INFO(SCENE_DEKU_TREE), "Deku Tree Boss Door", "Gohma", ENTRANCE_GROUP_KOKIRI_FOREST, ENTRANCE_GROUP_KOKIRI_FOREST, ENTRANCE_TYPE_DUNGEON, "", 1}, - { ENTR_DEKU_TREE_BOSS_DOOR, ENTR_DEKU_TREE_BOSS_ENTRANCE, SINGLE_SCENE_INFO(SCENE_DEKU_TREE_BOSS), "Gohma", "Deku Tree Boss Door", ENTRANCE_GROUP_KOKIRI_FOREST, ENTRANCE_GROUP_KOKIRI_FOREST, ENTRANCE_TYPE_DUNGEON, "", 1}, - { ENTR_KOKIRI_FOREST_DEKU_TREE_BLUE_WARP, -1, SINGLE_SCENE_INFO(SCENE_DEKU_TREE_BOSS), "Gohma", "Deku Tree Blue Warp", ENTRANCE_GROUP_KOKIRI_FOREST, ENTRANCE_GROUP_KOKIRI_FOREST, ENTRANCE_TYPE_ONE_WAY, "bw", 1}, + { ENTR_LOST_WOODS_BRIDGE_EAST_EXIT, ENTR_KOKIRI_FOREST_LOWER_EXIT, SINGLE_SCENE_INFO(SCENE_KOKIRI_FOREST), "Kokiri Forest Lower Exit", "Lost Woods Bridge East Exit", ENTRANCE_GROUP_KOKIRI_FOREST, ENTRANCE_GROUP_LOST_WOODS, ENTRANCE_TYPE_OVERWORLD, "lw"}, + { ENTR_LOST_WOODS_SOUTH_EXIT, ENTR_KOKIRI_FOREST_UPPER_EXIT, SINGLE_SCENE_INFO(SCENE_KOKIRI_FOREST), "Kokiri Forest Upper Exit", "Lost Woods South Exit", ENTRANCE_GROUP_KOKIRI_FOREST, ENTRANCE_GROUP_LOST_WOODS, ENTRANCE_TYPE_OVERWORLD, "lw"}, + { ENTR_LINKS_HOUSE_1, ENTR_KOKIRI_FOREST_OUTSIDE_LINKS_HOUSE, SINGLE_SCENE_INFO(SCENE_KOKIRI_FOREST), "KF Link's House Entry", "Link's House", ENTRANCE_GROUP_KOKIRI_FOREST, ENTRANCE_GROUP_KOKIRI_FOREST, ENTRANCE_TYPE_INTERIOR, "", 1}, + { ENTR_MIDOS_HOUSE_0, ENTR_KOKIRI_FOREST_OUTSIDE_MIDOS_HOUSE, SINGLE_SCENE_INFO(SCENE_KOKIRI_FOREST), "KF Mido's House Entry", "Mido's House", ENTRANCE_GROUP_KOKIRI_FOREST, ENTRANCE_GROUP_KOKIRI_FOREST, ENTRANCE_TYPE_INTERIOR, "", 1}, + { ENTR_SARIAS_HOUSE_0, ENTR_KOKIRI_FOREST_OUTSIDE_SARIAS_HOUSE, SINGLE_SCENE_INFO(SCENE_KOKIRI_FOREST), "KF Saria's House Entry", "Saria's House", ENTRANCE_GROUP_KOKIRI_FOREST, ENTRANCE_GROUP_KOKIRI_FOREST, ENTRANCE_TYPE_INTERIOR, "", 1}, + { ENTR_TWINS_HOUSE_0, ENTR_KOKIRI_FOREST_OUTSIDE_TWINS_HOUSE, SINGLE_SCENE_INFO(SCENE_KOKIRI_FOREST), "KF House of Twins Entry", "House of Twins", ENTRANCE_GROUP_KOKIRI_FOREST, ENTRANCE_GROUP_KOKIRI_FOREST, ENTRANCE_TYPE_INTERIOR, "", 1}, + { ENTR_KNOW_IT_ALL_BROS_HOUSE_0, ENTR_KOKIRI_FOREST_OUTSIDE_KNOW_IT_ALL_HOUSE, SINGLE_SCENE_INFO(SCENE_KOKIRI_FOREST), "KF Know-It-All House Entry", "Know-It-All House", ENTRANCE_GROUP_KOKIRI_FOREST, ENTRANCE_GROUP_KOKIRI_FOREST, ENTRANCE_TYPE_INTERIOR, "", 1}, + { ENTR_KOKIRI_SHOP_0, ENTR_KOKIRI_FOREST_OUTSIDE_SHOP, SINGLE_SCENE_INFO(SCENE_KOKIRI_FOREST), "KF Shop Entry", "Kokiri Shop", ENTRANCE_GROUP_KOKIRI_FOREST, ENTRANCE_GROUP_KOKIRI_FOREST, ENTRANCE_TYPE_INTERIOR, "", 1}, + { ENTRANCE_GROTTO_LOAD(GROTTO_KF_STORMS_OFFSET), ENTRANCE_GROTTO_EXIT(GROTTO_KF_STORMS_OFFSET), SINGLE_SCENE_INFO(SCENE_KOKIRI_FOREST), "KF Storms Grotto Entry", "KF Storms Grotto", ENTRANCE_GROUP_KOKIRI_FOREST, ENTRANCE_GROUP_KOKIRI_FOREST, ENTRANCE_TYPE_GROTTO, "chest", 1}, + { ENTR_DEKU_TREE_ENTRANCE, ENTR_KOKIRI_FOREST_OUTSIDE_DEKU_TREE, SINGLE_SCENE_INFO(SCENE_KOKIRI_FOREST), "KF Outside Deku Tree", "Deku Tree Entrance", ENTRANCE_GROUP_KOKIRI_FOREST, ENTRANCE_GROUP_KOKIRI_FOREST, ENTRANCE_TYPE_DUNGEON, "", 1}, + { ENTR_KOKIRI_FOREST_OUTSIDE_LINKS_HOUSE, ENTR_LINKS_HOUSE_1, SINGLE_SCENE_INFO(SCENE_LINKS_HOUSE), "Link's House", "KF Link's House Entry", ENTRANCE_GROUP_KOKIRI_FOREST, ENTRANCE_GROUP_KOKIRI_FOREST, ENTRANCE_TYPE_INTERIOR, ""}, + { ENTR_KOKIRI_FOREST_OUTSIDE_MIDOS_HOUSE, ENTR_MIDOS_HOUSE_0, SINGLE_SCENE_INFO(SCENE_MIDOS_HOUSE), "Mido's House", "KF Mido's House Entry", ENTRANCE_GROUP_KOKIRI_FOREST, ENTRANCE_GROUP_KOKIRI_FOREST, ENTRANCE_TYPE_INTERIOR, ""}, + { ENTR_KOKIRI_FOREST_OUTSIDE_SARIAS_HOUSE, ENTR_SARIAS_HOUSE_0, SINGLE_SCENE_INFO(SCENE_SARIAS_HOUSE), "Saria's House", "KF Saria's House Entry", ENTRANCE_GROUP_KOKIRI_FOREST, ENTRANCE_GROUP_KOKIRI_FOREST, ENTRANCE_TYPE_INTERIOR, ""}, + { ENTR_KOKIRI_FOREST_OUTSIDE_TWINS_HOUSE, ENTR_TWINS_HOUSE_0, SINGLE_SCENE_INFO(SCENE_TWINS_HOUSE), "House of Twins", "KF House of Twins Entry", ENTRANCE_GROUP_KOKIRI_FOREST, ENTRANCE_GROUP_KOKIRI_FOREST, ENTRANCE_TYPE_INTERIOR, ""}, + { ENTR_KOKIRI_FOREST_OUTSIDE_KNOW_IT_ALL_HOUSE, ENTR_KNOW_IT_ALL_BROS_HOUSE_0, SINGLE_SCENE_INFO(SCENE_KNOW_IT_ALL_BROS_HOUSE), "Know-It-All House", "KF Know-It-All House Entry", ENTRANCE_GROUP_KOKIRI_FOREST, ENTRANCE_GROUP_KOKIRI_FOREST, ENTRANCE_TYPE_INTERIOR, ""}, + { ENTR_KOKIRI_FOREST_OUTSIDE_SHOP, ENTR_KOKIRI_SHOP_0, SINGLE_SCENE_INFO(SCENE_KOKIRI_SHOP), "Kokiri Shop", "KF Shop Entry", ENTRANCE_GROUP_KOKIRI_FOREST, ENTRANCE_GROUP_KOKIRI_FOREST, ENTRANCE_TYPE_INTERIOR, ""}, + { ENTRANCE_GROTTO_EXIT(GROTTO_KF_STORMS_OFFSET), ENTRANCE_GROTTO_LOAD(GROTTO_KF_STORMS_OFFSET), {{ SCENE_GROTTOS, 0x00 }}, "KF Storms Grotto", "KF Storms Grotto Entry", ENTRANCE_GROUP_KOKIRI_FOREST, ENTRANCE_GROUP_KOKIRI_FOREST, ENTRANCE_TYPE_GROTTO, "chest"}, + { ENTR_KOKIRI_FOREST_OUTSIDE_DEKU_TREE, ENTR_DEKU_TREE_ENTRANCE, SINGLE_SCENE_INFO(SCENE_DEKU_TREE), "Deku Tree Entrance", "KF Outside Deku Tree", ENTRANCE_GROUP_KOKIRI_FOREST, ENTRANCE_GROUP_KOKIRI_FOREST, ENTRANCE_TYPE_DUNGEON, ""}, + { ENTR_DEKU_TREE_BOSS_ENTRANCE, ENTR_DEKU_TREE_BOSS_DOOR, SINGLE_SCENE_INFO(SCENE_DEKU_TREE), "Deku Tree Boss Door", "Gohma", ENTRANCE_GROUP_KOKIRI_FOREST, ENTRANCE_GROUP_KOKIRI_FOREST, ENTRANCE_TYPE_DUNGEON, "", 1}, + { ENTR_DEKU_TREE_BOSS_DOOR, ENTR_DEKU_TREE_BOSS_ENTRANCE, SINGLE_SCENE_INFO(SCENE_DEKU_TREE_BOSS), "Gohma", "Deku Tree Boss Door", ENTRANCE_GROUP_KOKIRI_FOREST, ENTRANCE_GROUP_KOKIRI_FOREST, ENTRANCE_TYPE_DUNGEON, "", 1}, + { ENTR_KOKIRI_FOREST_DEKU_TREE_BLUE_WARP, -1, SINGLE_SCENE_INFO(SCENE_DEKU_TREE_BOSS), "Gohma Blue Warp", "Deku Tree Blue Warp", ENTRANCE_GROUP_KOKIRI_FOREST, ENTRANCE_GROUP_KOKIRI_FOREST, ENTRANCE_TYPE_ONE_WAY, "bw", 1}, // Lost Woods - { ENTR_KOKIRI_FOREST_LOWER_EXIT, ENTR_LOST_WOODS_BRIDGE_EAST_EXIT, SINGLE_SCENE_INFO(SCENE_LOST_WOODS), "Lost Woods Bridge East Exit", "Kokiri Forest Lower Exit", ENTRANCE_GROUP_LOST_WOODS, ENTRANCE_GROUP_KOKIRI_FOREST, ENTRANCE_TYPE_OVERWORLD, "lw"}, - { ENTR_HYRULE_FIELD_WOODED_EXIT, ENTR_LOST_WOODS_BRIDGE_WEST_EXIT, SINGLE_SCENE_INFO(SCENE_LOST_WOODS), "Lost Woods Bridge West Exit", "Hyrule Field Wooded Path", ENTRANCE_GROUP_LOST_WOODS, ENTRANCE_GROUP_HYRULE_FIELD, ENTRANCE_TYPE_OVERWORLD, "lw,hf"}, - { ENTR_KOKIRI_FOREST_UPPER_EXIT, ENTR_LOST_WOODS_SOUTH_EXIT, SINGLE_SCENE_INFO(SCENE_LOST_WOODS), "LW South Exit", "KF Upper Exit", ENTRANCE_GROUP_LOST_WOODS, ENTRANCE_GROUP_KOKIRI_FOREST, ENTRANCE_TYPE_OVERWORLD, "lw"}, - { ENTR_GORON_CITY_TUNNEL_SHORTCUT, ENTR_LOST_WOODS_TUNNEL_SHORTCUT, SINGLE_SCENE_INFO(SCENE_LOST_WOODS), "LW Tunnel Shortcut", "GC Tunnel Shortcut", ENTRANCE_GROUP_LOST_WOODS, ENTRANCE_GROUP_GORON_CITY, ENTRANCE_TYPE_OVERWORLD, "lw,gc"}, - { ENTR_ZORAS_RIVER_UNDERWATER_SHORTCUT, ENTR_LOST_WOODS_UNDERWATER_SHORTCUT, SINGLE_SCENE_INFO(SCENE_LOST_WOODS), "LW Underwater Shortcut", "ZR Underwater Shortcut", ENTRANCE_GROUP_LOST_WOODS, ENTRANCE_GROUP_ZORAS_RIVER, ENTRANCE_TYPE_OVERWORLD, "lw"}, - { ENTR_SACRED_FOREST_MEADOW_SOUTH_EXIT, ENTR_LOST_WOODS_NORTH_EXIT, SINGLE_SCENE_INFO(SCENE_LOST_WOODS), "LW North Exit", "SFM South Exit", ENTRANCE_GROUP_LOST_WOODS, ENTRANCE_GROUP_SFM, ENTRANCE_TYPE_OVERWORLD, "lw"}, - { ENTRANCE_GROTTO_LOAD(GROTTO_LW_NEAR_SHORTCUTS_OFFSET), ENTRANCE_GROTTO_EXIT(GROTTO_LW_NEAR_SHORTCUTS_OFFSET), SINGLE_SCENE_INFO(SCENE_LOST_WOODS), "LW Tunnel Grotto", "LW Near Shortcuts Grotto", ENTRANCE_GROUP_LOST_WOODS, ENTRANCE_GROUP_LOST_WOODS, ENTRANCE_TYPE_GROTTO, "lw,chest", 1}, - { ENTRANCE_GROTTO_LOAD(GROTTO_LW_SCRUBS_OFFSET), ENTRANCE_GROTTO_EXIT(GROTTO_LW_SCRUBS_OFFSET), SINGLE_SCENE_INFO(SCENE_LOST_WOODS), "LW North Exit Grotto", "LW Scrubs Grotto", ENTRANCE_GROUP_LOST_WOODS, ENTRANCE_GROUP_LOST_WOODS, ENTRANCE_TYPE_GROTTO, "lw", 1}, - { ENTRANCE_GROTTO_LOAD(GROTTO_LW_DEKU_THEATRE_OFFSET), ENTRANCE_GROTTO_EXIT(GROTTO_LW_DEKU_THEATRE_OFFSET), SINGLE_SCENE_INFO(SCENE_LOST_WOODS), "LW Meadow Grotto", "Deku Theater", ENTRANCE_GROUP_LOST_WOODS, ENTRANCE_GROUP_LOST_WOODS, ENTRANCE_TYPE_GROTTO, "lw,mask,stage", 1}, - { ENTRANCE_GROTTO_EXIT(GROTTO_LW_NEAR_SHORTCUTS_OFFSET), ENTRANCE_GROTTO_LOAD(GROTTO_LW_NEAR_SHORTCUTS_OFFSET), {{ SCENE_GROTTOS, 0x00 }}, "LW Near Shortcuts Grotto", "LW Tunnel Grotto Exit", ENTRANCE_GROUP_LOST_WOODS, ENTRANCE_GROUP_LOST_WOODS, ENTRANCE_TYPE_GROTTO, "lw,chest"}, - { ENTRANCE_GROTTO_EXIT(GROTTO_LW_SCRUBS_OFFSET), ENTRANCE_GROTTO_LOAD(GROTTO_LW_SCRUBS_OFFSET), {{ SCENE_GROTTOS, 0x07 }}, "LW Scrubs Grotto", "LW North Grotto Exit", ENTRANCE_GROUP_LOST_WOODS, ENTRANCE_GROUP_LOST_WOODS, ENTRANCE_TYPE_GROTTO, "lw"}, - { ENTRANCE_GROTTO_EXIT(GROTTO_LW_DEKU_THEATRE_OFFSET), ENTRANCE_GROTTO_LOAD(GROTTO_LW_DEKU_THEATRE_OFFSET), {{ SCENE_GROTTOS, 0x0C }}, "Deku Theater", "LW Meadow Grotto", ENTRANCE_GROUP_LOST_WOODS, ENTRANCE_GROUP_LOST_WOODS, ENTRANCE_TYPE_GROTTO, "lw,mask,stage"}, + { ENTR_KOKIRI_FOREST_LOWER_EXIT, ENTR_LOST_WOODS_BRIDGE_EAST_EXIT, SINGLE_SCENE_INFO(SCENE_LOST_WOODS), "Lost Woods Bridge East Exit", "Kokiri Forest Lower Exit", ENTRANCE_GROUP_LOST_WOODS, ENTRANCE_GROUP_KOKIRI_FOREST, ENTRANCE_TYPE_OVERWORLD, "lw"}, + { ENTR_HYRULE_FIELD_WOODED_EXIT, ENTR_LOST_WOODS_BRIDGE_WEST_EXIT, SINGLE_SCENE_INFO(SCENE_LOST_WOODS), "Lost Woods Bridge West Exit", "Hyrule Field Wooded Exit", ENTRANCE_GROUP_LOST_WOODS, ENTRANCE_GROUP_HYRULE_FIELD, ENTRANCE_TYPE_OVERWORLD, "lw,hf"}, + { ENTR_KOKIRI_FOREST_UPPER_EXIT, ENTR_LOST_WOODS_SOUTH_EXIT, SINGLE_SCENE_INFO(SCENE_LOST_WOODS), "Lost Woods South Exit", "Kokiri Forest Upper Exit", ENTRANCE_GROUP_LOST_WOODS, ENTRANCE_GROUP_KOKIRI_FOREST, ENTRANCE_TYPE_OVERWORLD, "lw"}, + { ENTR_GORON_CITY_TUNNEL_SHORTCUT, ENTR_LOST_WOODS_TUNNEL_SHORTCUT, SINGLE_SCENE_INFO(SCENE_LOST_WOODS), "Lost Woods Tunnel Shortcut", "Goron City Tunnel Shortcut", ENTRANCE_GROUP_LOST_WOODS, ENTRANCE_GROUP_GORON_CITY, ENTRANCE_TYPE_OVERWORLD, "lw,gc"}, + { ENTR_ZORAS_RIVER_UNDERWATER_SHORTCUT, ENTR_LOST_WOODS_UNDERWATER_SHORTCUT, SINGLE_SCENE_INFO(SCENE_LOST_WOODS), "Lost Woods Underwater Shortcut", "Zora's River Underwater Shortcut", ENTRANCE_GROUP_LOST_WOODS, ENTRANCE_GROUP_ZORAS_RIVER, ENTRANCE_TYPE_OVERWORLD, "lw"}, + { ENTR_SACRED_FOREST_MEADOW_SOUTH_EXIT, ENTR_LOST_WOODS_NORTH_EXIT, SINGLE_SCENE_INFO(SCENE_LOST_WOODS), "Lost Woods North Exit", "Sacred Forest Meadow South Exit", ENTRANCE_GROUP_LOST_WOODS, ENTRANCE_GROUP_SFM, ENTRANCE_TYPE_OVERWORLD, "lw"}, + { ENTRANCE_GROTTO_LOAD(GROTTO_LW_NEAR_SHORTCUTS_OFFSET), ENTRANCE_GROTTO_EXIT(GROTTO_LW_NEAR_SHORTCUTS_OFFSET), SINGLE_SCENE_INFO(SCENE_LOST_WOODS), "LW Shortcuts Grotto Entry", "LW Tunnel Grotto", ENTRANCE_GROUP_LOST_WOODS, ENTRANCE_GROUP_LOST_WOODS, ENTRANCE_TYPE_GROTTO, "lw,chest", 1}, + { ENTRANCE_GROTTO_LOAD(GROTTO_LW_SCRUBS_OFFSET), ENTRANCE_GROTTO_EXIT(GROTTO_LW_SCRUBS_OFFSET), SINGLE_SCENE_INFO(SCENE_LOST_WOODS), "LW North Grotto Entry", "LW Scrubs Grotto", ENTRANCE_GROUP_LOST_WOODS, ENTRANCE_GROUP_LOST_WOODS, ENTRANCE_TYPE_GROTTO, "lw", 1}, + { ENTRANCE_GROTTO_LOAD(GROTTO_LW_DEKU_THEATRE_OFFSET), ENTRANCE_GROTTO_EXIT(GROTTO_LW_DEKU_THEATRE_OFFSET), SINGLE_SCENE_INFO(SCENE_LOST_WOODS), "LW Meadow Grotto Entry", "Deku Theater", ENTRANCE_GROUP_LOST_WOODS, ENTRANCE_GROUP_LOST_WOODS, ENTRANCE_TYPE_GROTTO, "lw,mask,stage", 1}, + { ENTRANCE_GROTTO_EXIT(GROTTO_LW_NEAR_SHORTCUTS_OFFSET), ENTRANCE_GROTTO_LOAD(GROTTO_LW_NEAR_SHORTCUTS_OFFSET), {{ SCENE_GROTTOS, 0x00 }}, "LW Tunnel Grotto", "LW Shortcuts Grotto Entry", ENTRANCE_GROUP_LOST_WOODS, ENTRANCE_GROUP_LOST_WOODS, ENTRANCE_TYPE_GROTTO, "lw,chest"}, + { ENTRANCE_GROTTO_EXIT(GROTTO_LW_SCRUBS_OFFSET), ENTRANCE_GROTTO_LOAD(GROTTO_LW_SCRUBS_OFFSET), {{ SCENE_GROTTOS, 0x07 }}, "LW Scrubs Grotto", "LW North Grotto Entry", ENTRANCE_GROUP_LOST_WOODS, ENTRANCE_GROUP_LOST_WOODS, ENTRANCE_TYPE_GROTTO, "lw"}, + { ENTRANCE_GROTTO_EXIT(GROTTO_LW_DEKU_THEATRE_OFFSET), ENTRANCE_GROTTO_LOAD(GROTTO_LW_DEKU_THEATRE_OFFSET), {{ SCENE_GROTTOS, 0x0C }}, "Deku Theater", "LW Meadow Grotto Entry", ENTRANCE_GROUP_LOST_WOODS, ENTRANCE_GROUP_LOST_WOODS, ENTRANCE_TYPE_GROTTO, "lw,mask,stage"}, // Sacred Forest Meadow - { ENTR_LOST_WOODS_NORTH_EXIT, ENTR_SACRED_FOREST_MEADOW_SOUTH_EXIT, SINGLE_SCENE_INFO(SCENE_SACRED_FOREST_MEADOW), "SFM South Exit", "LW North Exit", ENTRANCE_GROUP_SFM, ENTRANCE_GROUP_LOST_WOODS, ENTRANCE_TYPE_OVERWORLD, "lw"}, - { ENTRANCE_GROTTO_LOAD(GROTTO_SFM_WOLFOS_OFFSET), ENTRANCE_GROTTO_EXIT(GROTTO_SFM_WOLFOS_OFFSET), SINGLE_SCENE_INFO(SCENE_SACRED_FOREST_MEADOW), "SFM Outside Wolfos Grotto", "SFM Wolfos Grotto", ENTRANCE_GROUP_SFM, ENTRANCE_GROUP_SFM, ENTRANCE_TYPE_GROTTO, "chest", 1}, - { ENTRANCE_GROTTO_LOAD(GROTTO_SFM_FAIRY_OFFSET), ENTRANCE_GROTTO_EXIT(GROTTO_SFM_FAIRY_OFFSET), SINGLE_SCENE_INFO(SCENE_SACRED_FOREST_MEADOW), "SFM Outside Fairy Grotto", "SFM Fairy Grotto", ENTRANCE_GROUP_SFM, ENTRANCE_GROUP_SFM, ENTRANCE_TYPE_GROTTO, "", 1}, - { ENTRANCE_GROTTO_LOAD(GROTTO_SFM_STORMS_OFFSET), ENTRANCE_GROTTO_EXIT(GROTTO_SFM_STORMS_OFFSET), SINGLE_SCENE_INFO(SCENE_SACRED_FOREST_MEADOW), "SFM Outside Storms Grotto", "SFM Storms Grotto", ENTRANCE_GROUP_SFM, ENTRANCE_GROUP_SFM, ENTRANCE_TYPE_GROTTO, "scrubs", 1}, - { ENTR_FOREST_TEMPLE_ENTRANCE, ENTR_SACRED_FOREST_MEADOW_OUTSIDE_TEMPLE, SINGLE_SCENE_INFO(SCENE_SACRED_FOREST_MEADOW), "SFM Outside Forest Temple", "Forest Temple Entrance", ENTRANCE_GROUP_SFM, ENTRANCE_GROUP_SFM, ENTRANCE_TYPE_DUNGEON, "", 1}, - { ENTRANCE_GROTTO_EXIT(GROTTO_SFM_WOLFOS_OFFSET), ENTRANCE_GROTTO_LOAD(GROTTO_SFM_WOLFOS_OFFSET), {{ SCENE_GROTTOS, 0x08 }}, "SFM Wolfos Grotto", "SFM Outside Wolfos Grotto", ENTRANCE_GROUP_SFM, ENTRANCE_GROUP_SFM, ENTRANCE_TYPE_GROTTO}, - { ENTRANCE_GROTTO_EXIT(GROTTO_SFM_FAIRY_OFFSET), ENTRANCE_GROTTO_LOAD(GROTTO_SFM_FAIRY_OFFSET), {{ SCENE_FAIRYS_FOUNTAIN, 0x00 }}, "SFM Fairy Grotto", "SFM Outside Fairy Grotto", ENTRANCE_GROUP_SFM, ENTRANCE_GROUP_SFM, ENTRANCE_TYPE_GROTTO}, - { ENTRANCE_GROTTO_EXIT(GROTTO_SFM_STORMS_OFFSET), ENTRANCE_GROTTO_LOAD(GROTTO_SFM_STORMS_OFFSET), {{ SCENE_GROTTOS, 0x0A }}, "SFM Storms Grotto", "SFM Outside Storms Grotto", ENTRANCE_GROUP_SFM, ENTRANCE_GROUP_SFM, ENTRANCE_TYPE_GROTTO, "scrubs"}, - { ENTR_SACRED_FOREST_MEADOW_OUTSIDE_TEMPLE, ENTR_FOREST_TEMPLE_ENTRANCE, SINGLE_SCENE_INFO(SCENE_FOREST_TEMPLE), "Forest Temple Entrance", "SFM Outside Forest Temple", ENTRANCE_GROUP_SFM, ENTRANCE_GROUP_SFM, ENTRANCE_TYPE_DUNGEON}, - { ENTR_FOREST_TEMPLE_BOSS_ENTRANCE, ENTR_FOREST_TEMPLE_BOSS_DOOR, SINGLE_SCENE_INFO(SCENE_FOREST_TEMPLE), "Forest Temple Boss Door", "Phantom Ganon", ENTRANCE_GROUP_SFM, ENTRANCE_GROUP_SFM, ENTRANCE_TYPE_DUNGEON, "", 1}, - { ENTR_FOREST_TEMPLE_BOSS_DOOR, ENTR_FOREST_TEMPLE_BOSS_ENTRANCE, SINGLE_SCENE_INFO(SCENE_FOREST_TEMPLE_BOSS), "Phantom Ganon", "Forest Temple Boss Door", ENTRANCE_GROUP_SFM, ENTRANCE_GROUP_SFM, ENTRANCE_TYPE_DUNGEON, "", 1}, - { ENTR_SACRED_FOREST_MEADOW_FOREST_TEMPLE_BLUE_WARP, -1, SINGLE_SCENE_INFO(SCENE_FOREST_TEMPLE_BOSS), "Phantom Ganon", "Forest Temple Blue Warp", ENTRANCE_GROUP_SFM, ENTRANCE_GROUP_SFM, ENTRANCE_TYPE_ONE_WAY, "bw", 1}, + { ENTR_LOST_WOODS_NORTH_EXIT, ENTR_SACRED_FOREST_MEADOW_SOUTH_EXIT, SINGLE_SCENE_INFO(SCENE_SACRED_FOREST_MEADOW), "Sacred Forest Meadow South Exit", "Lost Woods North Exit", ENTRANCE_GROUP_SFM, ENTRANCE_GROUP_LOST_WOODS, ENTRANCE_TYPE_OVERWORLD, "lw"}, + { ENTRANCE_GROTTO_LOAD(GROTTO_SFM_WOLFOS_OFFSET), ENTRANCE_GROTTO_EXIT(GROTTO_SFM_WOLFOS_OFFSET), SINGLE_SCENE_INFO(SCENE_SACRED_FOREST_MEADOW), "SFM Wolfos Grotto Entry", "SFM Wolfos Grotto", ENTRANCE_GROUP_SFM, ENTRANCE_GROUP_SFM, ENTRANCE_TYPE_GROTTO, "chest", 1}, + { ENTRANCE_GROTTO_LOAD(GROTTO_SFM_FAIRY_OFFSET), ENTRANCE_GROTTO_EXIT(GROTTO_SFM_FAIRY_OFFSET), SINGLE_SCENE_INFO(SCENE_SACRED_FOREST_MEADOW), "SFM Fairy Grotto Entry", "SFM Fairy Grotto", ENTRANCE_GROUP_SFM, ENTRANCE_GROUP_SFM, ENTRANCE_TYPE_GROTTO, "", 1}, + { ENTRANCE_GROTTO_LOAD(GROTTO_SFM_STORMS_OFFSET), ENTRANCE_GROTTO_EXIT(GROTTO_SFM_STORMS_OFFSET), SINGLE_SCENE_INFO(SCENE_SACRED_FOREST_MEADOW), "SFM Storms Grotto Entry", "SFM Storms Grotto", ENTRANCE_GROUP_SFM, ENTRANCE_GROUP_SFM, ENTRANCE_TYPE_GROTTO, "scrubs", 1}, + { ENTR_FOREST_TEMPLE_ENTRANCE, ENTR_SACRED_FOREST_MEADOW_OUTSIDE_TEMPLE, SINGLE_SCENE_INFO(SCENE_SACRED_FOREST_MEADOW), "Sacred Forest Meadow Outside Forest Temple", "Forest Temple Entrance", ENTRANCE_GROUP_SFM, ENTRANCE_GROUP_SFM, ENTRANCE_TYPE_DUNGEON, "", 1}, + { ENTRANCE_GROTTO_EXIT(GROTTO_SFM_WOLFOS_OFFSET), ENTRANCE_GROTTO_LOAD(GROTTO_SFM_WOLFOS_OFFSET), {{ SCENE_GROTTOS, 0x08 }}, "SFM Wolfos Grotto", "SFM Wolfos Grotto Entry", ENTRANCE_GROUP_SFM, ENTRANCE_GROUP_SFM, ENTRANCE_TYPE_GROTTO}, + { ENTRANCE_GROTTO_EXIT(GROTTO_SFM_FAIRY_OFFSET), ENTRANCE_GROTTO_LOAD(GROTTO_SFM_FAIRY_OFFSET), {{ SCENE_FAIRYS_FOUNTAIN, 0x00 }}, "SFM Fairy Grotto", "SFM Fairy Grotto Entry", ENTRANCE_GROUP_SFM, ENTRANCE_GROUP_SFM, ENTRANCE_TYPE_GROTTO}, + { ENTRANCE_GROTTO_EXIT(GROTTO_SFM_STORMS_OFFSET), ENTRANCE_GROTTO_LOAD(GROTTO_SFM_STORMS_OFFSET), {{ SCENE_GROTTOS, 0x0A }}, "SFM Storms Grotto", "SFM Storms Grotto Entry", ENTRANCE_GROUP_SFM, ENTRANCE_GROUP_SFM, ENTRANCE_TYPE_GROTTO, "scrubs"}, + { ENTR_SACRED_FOREST_MEADOW_OUTSIDE_TEMPLE, ENTR_FOREST_TEMPLE_ENTRANCE, SINGLE_SCENE_INFO(SCENE_FOREST_TEMPLE), "Forest Temple Entrance", "Sacred Forest Meadow Outside Forest Temple", ENTRANCE_GROUP_SFM, ENTRANCE_GROUP_SFM, ENTRANCE_TYPE_DUNGEON}, + { ENTR_FOREST_TEMPLE_BOSS_ENTRANCE, ENTR_FOREST_TEMPLE_BOSS_DOOR, SINGLE_SCENE_INFO(SCENE_FOREST_TEMPLE), "Forest Temple Boss Door", "Phantom Ganon", ENTRANCE_GROUP_SFM, ENTRANCE_GROUP_SFM, ENTRANCE_TYPE_DUNGEON, "", 1}, + { ENTR_FOREST_TEMPLE_BOSS_DOOR, ENTR_FOREST_TEMPLE_BOSS_ENTRANCE, SINGLE_SCENE_INFO(SCENE_FOREST_TEMPLE_BOSS), "Phantom Ganon", "Forest Temple Boss Door", ENTRANCE_GROUP_SFM, ENTRANCE_GROUP_SFM, ENTRANCE_TYPE_DUNGEON, "", 1}, + { ENTR_SACRED_FOREST_MEADOW_FOREST_TEMPLE_BLUE_WARP, -1, SINGLE_SCENE_INFO(SCENE_FOREST_TEMPLE_BOSS), "Phantom Ganon Blue Warp", "Forest Temple Blue Warp", ENTRANCE_GROUP_SFM, ENTRANCE_GROUP_SFM, ENTRANCE_TYPE_ONE_WAY, "bw", 1}, // Kakariko Village - { ENTR_HYRULE_FIELD_STAIRS_EXIT, ENTR_KAKARIKO_VILLAGE_FRONT_GATE, SINGLE_SCENE_INFO(SCENE_KAKARIKO_VILLAGE), "Kakariko Front Gate", "Hyrule Field Stairs Exit", ENTRANCE_GROUP_KAKARIKO, ENTRANCE_GROUP_HYRULE_FIELD, ENTRANCE_TYPE_OVERWORLD, "hf"}, - { ENTR_GRAVEYARD_ENTRANCE, ENTR_KAKARIKO_VILLAGE_SOUTHEAST_EXIT, SINGLE_SCENE_INFO(SCENE_KAKARIKO_VILLAGE), "Kakariko Southeast Exit", "Graveyard Entrance", ENTRANCE_GROUP_KAKARIKO, ENTRANCE_GROUP_GRAVEYARD, ENTRANCE_TYPE_OVERWORLD}, - { ENTR_DEATH_MOUNTAIN_TRAIL_BOTTOM_EXIT, ENTR_KAKARIKO_VILLAGE_GUARD_GATE, SINGLE_SCENE_INFO(SCENE_KAKARIKO_VILLAGE), "Kakariko Guard Gate Exit", "Death Mountain Trail Bottom Exit", ENTRANCE_GROUP_KAKARIKO, ENTRANCE_GROUP_DEATH_MOUNTAIN_TRAIL, ENTRANCE_TYPE_OVERWORLD}, - { ENTR_KAKARIKO_CENTER_GUEST_HOUSE_0, ENTR_KAKARIKO_VILLAGE_OUTSIDE_CENTER_GUEST_HOUSE, SINGLE_SCENE_INFO(SCENE_KAKARIKO_VILLAGE), "Kak Outside Boss House", "Carpenter Boss House", ENTRANCE_GROUP_KAKARIKO, ENTRANCE_GROUP_KAKARIKO, ENTRANCE_TYPE_INTERIOR, "", 1}, - { ENTR_HOUSE_OF_SKULLTULA_0, ENTR_KAKARIKO_VILLAGE_OUTSIDE_SKULKLTULA_HOUSE, SINGLE_SCENE_INFO(SCENE_KAKARIKO_VILLAGE), "Kak Outside Skulltula House", "House of Skulltula", ENTRANCE_GROUP_KAKARIKO, ENTRANCE_GROUP_KAKARIKO, ENTRANCE_TYPE_INTERIOR, "", 1}, - { ENTR_IMPAS_HOUSE_FRONT, ENTR_KAKARIKO_VILLAGE_OUTSIDE_IMPAS_HOUSE_FRONT, SINGLE_SCENE_INFO(SCENE_KAKARIKO_VILLAGE), "Kak Outside Impa's House Front", "Impa's House Front", ENTRANCE_GROUP_KAKARIKO, ENTRANCE_GROUP_KAKARIKO, ENTRANCE_TYPE_INTERIOR, "", 1}, - { ENTR_IMPAS_HOUSE_BACK, ENTR_KAKARIKO_VILLAGE_OUTSIDE_IMPAS_HOUSE_BACK, SINGLE_SCENE_INFO(SCENE_KAKARIKO_VILLAGE), "Kak Outside Impa's House Back", "Impa's House Back", ENTRANCE_GROUP_KAKARIKO, ENTRANCE_GROUP_KAKARIKO, ENTRANCE_TYPE_INTERIOR, "cow", 1}, - { ENTR_WINDMILL_AND_DAMPES_GRAVE_WINDMILL, ENTR_KAKARIKO_VILLAGE_OUTSIDE_WINDMILL, SINGLE_SCENE_INFO(SCENE_KAKARIKO_VILLAGE), "Kak Outside Windmill", "Windmill", ENTRANCE_GROUP_KAKARIKO, ENTRANCE_GROUP_KAKARIKO, ENTRANCE_TYPE_INTERIOR, "", 1}, - { ENTR_SHOOTING_GALLERY_0, ENTR_KAKARIKO_VILLAGE_OUTSIDE_SHOOTING_GALLERY, SINGLE_SCENE_INFO(SCENE_KAKARIKO_VILLAGE), "Kak Outside Shooting Gallery", "Kak Shooting Gallery", ENTRANCE_GROUP_KAKARIKO, ENTRANCE_GROUP_KAKARIKO, ENTRANCE_TYPE_INTERIOR, "adult", 1}, - { ENTR_POTION_SHOP_GRANNY_0, ENTR_KAKARIKO_VILLAGE_OUTSIDE_SHOP_GRANNY, SINGLE_SCENE_INFO(SCENE_KAKARIKO_VILLAGE), "Kak Outside Granny's Potion Shop", "Granny's Potion Shop", ENTRANCE_GROUP_KAKARIKO, ENTRANCE_GROUP_KAKARIKO, ENTRANCE_TYPE_INTERIOR, "", 1}, - { ENTR_BAZAAR_0, ENTR_KAKARIKO_VILLAGE_OUTSIDE_BAZAAR, SINGLE_SCENE_INFO(SCENE_KAKARIKO_VILLAGE), "Kak Outside Bazaar", "Kak Bazaar", ENTRANCE_GROUP_KAKARIKO, ENTRANCE_GROUP_KAKARIKO, ENTRANCE_TYPE_INTERIOR, "shop", 1}, - { ENTR_POTION_SHOP_KAKARIKO_FRONT, ENTR_KAKARIKO_VILLAGE_OUTSIDE_POTION_SHOP_FRONT, SINGLE_SCENE_INFO(SCENE_KAKARIKO_VILLAGE), "Kak Outside Potion Shop Front", "Kak Potion Shop Front", ENTRANCE_GROUP_KAKARIKO, ENTRANCE_GROUP_KAKARIKO, ENTRANCE_TYPE_INTERIOR, "", 1}, - { ENTR_POTION_SHOP_KAKARIKO_BACK, ENTR_KAKARIKO_VILLAGE_OUTSIDE_POTION_SHOP_BACK, SINGLE_SCENE_INFO(SCENE_KAKARIKO_VILLAGE), "Kak Outside Potion Shop Back", "Kak Potion Shop Back", ENTRANCE_GROUP_KAKARIKO, ENTRANCE_GROUP_KAKARIKO, ENTRANCE_TYPE_INTERIOR, "", 1}, - { ENTRANCE_GROTTO_LOAD(GROTTO_KAK_OPEN_OFFSET), ENTRANCE_GROTTO_EXIT(GROTTO_KAK_OPEN_OFFSET), SINGLE_SCENE_INFO(SCENE_KAKARIKO_VILLAGE), "Kak Open Grotto Exit", "Kak Open Grotto", ENTRANCE_GROUP_KAKARIKO, ENTRANCE_GROUP_KAKARIKO, ENTRANCE_TYPE_GROTTO, "chest", 1}, - { ENTRANCE_GROTTO_LOAD(GROTTO_KAK_REDEAD_OFFSET), ENTRANCE_GROTTO_EXIT(GROTTO_KAK_REDEAD_OFFSET), SINGLE_SCENE_INFO(SCENE_KAKARIKO_VILLAGE), "Kak Redead Grotto Exit", "Kak Redead Grotto", ENTRANCE_GROUP_KAKARIKO, ENTRANCE_GROUP_KAKARIKO, ENTRANCE_TYPE_GROTTO, "chest", 1}, - { ENTR_BOTTOM_OF_THE_WELL_ENTRANCE, ENTR_KAKARIKO_VILLAGE_OUTSIDE_BOTTOM_OF_THE_WELL, SINGLE_SCENE_INFO(SCENE_KAKARIKO_VILLAGE), "Kak Outside BotW", "Bottom of the Well Entrance", ENTRANCE_GROUP_KAKARIKO, ENTRANCE_GROUP_KAKARIKO, ENTRANCE_TYPE_DUNGEON, "botw", 1}, - { ENTR_KAKARIKO_VILLAGE_OUTSIDE_CENTER_GUEST_HOUSE, ENTR_KAKARIKO_CENTER_GUEST_HOUSE_0, SINGLE_SCENE_INFO(SCENE_KAKARIKO_CENTER_GUEST_HOUSE), "Carpenter Boss House", "Kak Outside Boss House", ENTRANCE_GROUP_KAKARIKO, ENTRANCE_GROUP_KAKARIKO, ENTRANCE_TYPE_INTERIOR}, - { ENTR_KAKARIKO_VILLAGE_OUTSIDE_SKULKLTULA_HOUSE, ENTR_HOUSE_OF_SKULLTULA_0, SINGLE_SCENE_INFO(SCENE_HOUSE_OF_SKULLTULA), "House of Skulltula", "Kak Outside Skulltula House", ENTRANCE_GROUP_KAKARIKO, ENTRANCE_GROUP_KAKARIKO, ENTRANCE_TYPE_INTERIOR}, - { ENTR_KAKARIKO_VILLAGE_OUTSIDE_IMPAS_HOUSE_FRONT, ENTR_IMPAS_HOUSE_FRONT, SINGLE_SCENE_INFO(SCENE_IMPAS_HOUSE), "Impa's House Front", "Kak Outside Impa's House Front", ENTRANCE_GROUP_KAKARIKO, ENTRANCE_GROUP_KAKARIKO, ENTRANCE_TYPE_INTERIOR}, - { ENTR_KAKARIKO_VILLAGE_OUTSIDE_IMPAS_HOUSE_BACK, ENTR_IMPAS_HOUSE_BACK, SINGLE_SCENE_INFO(SCENE_IMPAS_HOUSE), "Impa's House Back", "Kak Outside Impa's House Back", ENTRANCE_GROUP_KAKARIKO, ENTRANCE_GROUP_KAKARIKO, ENTRANCE_TYPE_INTERIOR, "cow"}, - { ENTR_KAKARIKO_VILLAGE_OUTSIDE_WINDMILL, ENTR_WINDMILL_AND_DAMPES_GRAVE_WINDMILL, SINGLE_SCENE_INFO(SCENE_WINDMILL_AND_DAMPES_GRAVE), "Windmill", "Kak Outside Windmill", ENTRANCE_GROUP_KAKARIKO, ENTRANCE_GROUP_KAKARIKO, ENTRANCE_TYPE_INTERIOR}, - { ENTR_KAKARIKO_VILLAGE_OUTSIDE_SHOOTING_GALLERY, ENTR_SHOOTING_GALLERY_0, {{ SCENE_SHOOTING_GALLERY, 0x00 }}, "Kak Shooting Gallery", "Kak Outside Shooting Gallery", ENTRANCE_GROUP_KAKARIKO, ENTRANCE_GROUP_KAKARIKO, ENTRANCE_TYPE_INTERIOR}, - { ENTR_KAKARIKO_VILLAGE_OUTSIDE_SHOP_GRANNY, ENTR_POTION_SHOP_GRANNY_0, SINGLE_SCENE_INFO(SCENE_POTION_SHOP_GRANNY), "Granny's Potion Shop", "Kak Outside Granny's Potion Shop", ENTRANCE_GROUP_KAKARIKO, ENTRANCE_GROUP_KAKARIKO, ENTRANCE_TYPE_INTERIOR}, - { ENTR_KAKARIKO_VILLAGE_OUTSIDE_BAZAAR, ENTR_BAZAAR_0, {{ SCENE_BAZAAR, 0x00 }}, "Kak Bazaar", "Kak Outside Bazaar", ENTRANCE_GROUP_KAKARIKO, ENTRANCE_GROUP_KAKARIKO, ENTRANCE_TYPE_INTERIOR, "shop"}, - { ENTR_KAKARIKO_VILLAGE_OUTSIDE_POTION_SHOP_FRONT, ENTR_POTION_SHOP_KAKARIKO_FRONT, SINGLE_SCENE_INFO(SCENE_POTION_SHOP_KAKARIKO), "Kak Potion Shop Front", "Kak Outside Potion Shop Front", ENTRANCE_GROUP_KAKARIKO, ENTRANCE_GROUP_KAKARIKO, ENTRANCE_TYPE_INTERIOR}, - { ENTR_KAKARIKO_VILLAGE_OUTSIDE_POTION_SHOP_BACK, ENTR_POTION_SHOP_KAKARIKO_BACK, SINGLE_SCENE_INFO(SCENE_POTION_SHOP_KAKARIKO), "Kak Potion Shop Back", "Kak Outside Potion Shop Back", ENTRANCE_GROUP_KAKARIKO, ENTRANCE_GROUP_KAKARIKO, ENTRANCE_TYPE_INTERIOR}, - { ENTRANCE_GROTTO_EXIT(GROTTO_KAK_OPEN_OFFSET), ENTRANCE_GROTTO_LOAD(GROTTO_KAK_OPEN_OFFSET), {{ SCENE_GROTTOS, 0x00 }}, "Kak Open Grotto", "Kak Open Grotto Exit", ENTRANCE_GROUP_KAKARIKO, ENTRANCE_GROUP_KAKARIKO, ENTRANCE_TYPE_GROTTO, "chest"}, - { ENTRANCE_GROTTO_EXIT(GROTTO_KAK_REDEAD_OFFSET), ENTRANCE_GROTTO_LOAD(GROTTO_KAK_REDEAD_OFFSET), {{ SCENE_GROTTOS, 0x03 }}, "Kak Redead Grotto", "Kak Redead Grotto Exit", ENTRANCE_GROUP_KAKARIKO, ENTRANCE_GROUP_KAKARIKO, ENTRANCE_TYPE_GROTTO, "chest"}, - { ENTR_KAKARIKO_VILLAGE_OUTSIDE_BOTTOM_OF_THE_WELL, ENTR_BOTTOM_OF_THE_WELL_ENTRANCE, SINGLE_SCENE_INFO(SCENE_BOTTOM_OF_THE_WELL), "Bottom of the Well Entrance", "Kak Outside BotW", ENTRANCE_GROUP_KAKARIKO, ENTRANCE_GROUP_KAKARIKO, ENTRANCE_TYPE_DUNGEON, "botw"}, + { ENTR_HYRULE_FIELD_STAIRS_EXIT, ENTR_KAKARIKO_VILLAGE_FRONT_GATE, SINGLE_SCENE_INFO(SCENE_KAKARIKO_VILLAGE), "Kakariko Front Gate", "Hyrule Field Stairs Exit", ENTRANCE_GROUP_KAKARIKO, ENTRANCE_GROUP_HYRULE_FIELD, ENTRANCE_TYPE_OVERWORLD, "hf"}, + { ENTR_GRAVEYARD_ENTRANCE, ENTR_KAKARIKO_VILLAGE_SOUTHEAST_EXIT, SINGLE_SCENE_INFO(SCENE_KAKARIKO_VILLAGE), "Kakariko Southeast Exit", "Graveyard Entrance", ENTRANCE_GROUP_KAKARIKO, ENTRANCE_GROUP_GRAVEYARD, ENTRANCE_TYPE_OVERWORLD}, + { ENTR_DEATH_MOUNTAIN_TRAIL_BOTTOM_EXIT, ENTR_KAKARIKO_VILLAGE_GUARD_GATE, SINGLE_SCENE_INFO(SCENE_KAKARIKO_VILLAGE), "Kakariko Guard Gate Exit", "Death Mountain Trail Bottom Exit", ENTRANCE_GROUP_KAKARIKO, ENTRANCE_GROUP_DEATH_MOUNTAIN_TRAIL, ENTRANCE_TYPE_OVERWORLD}, + { ENTR_KAKARIKO_CENTER_GUEST_HOUSE_0, ENTR_KAKARIKO_VILLAGE_OUTSIDE_CENTER_GUEST_HOUSE, SINGLE_SCENE_INFO(SCENE_KAKARIKO_VILLAGE), "Kak Boss House Entry", "Carpenter Boss House", ENTRANCE_GROUP_KAKARIKO, ENTRANCE_GROUP_KAKARIKO, ENTRANCE_TYPE_INTERIOR, "", 1}, + { ENTR_HOUSE_OF_SKULLTULA_0, ENTR_KAKARIKO_VILLAGE_OUTSIDE_SKULKLTULA_HOUSE, SINGLE_SCENE_INFO(SCENE_KAKARIKO_VILLAGE), "Kak Skulltula House Entry", "House of Skulltula", ENTRANCE_GROUP_KAKARIKO, ENTRANCE_GROUP_KAKARIKO, ENTRANCE_TYPE_INTERIOR, "", 1}, + { ENTR_IMPAS_HOUSE_FRONT, ENTR_KAKARIKO_VILLAGE_OUTSIDE_IMPAS_HOUSE_FRONT, SINGLE_SCENE_INFO(SCENE_KAKARIKO_VILLAGE), "Kak Impa's House Front Entry", "Impa's House Front", ENTRANCE_GROUP_KAKARIKO, ENTRANCE_GROUP_KAKARIKO, ENTRANCE_TYPE_INTERIOR, "", 1}, + { ENTR_IMPAS_HOUSE_BACK, ENTR_KAKARIKO_VILLAGE_OUTSIDE_IMPAS_HOUSE_BACK, SINGLE_SCENE_INFO(SCENE_KAKARIKO_VILLAGE), "Kak Impa's House Back Entry", "Impa's House Back", ENTRANCE_GROUP_KAKARIKO, ENTRANCE_GROUP_KAKARIKO, ENTRANCE_TYPE_INTERIOR, "cow", 1}, + { ENTR_WINDMILL_AND_DAMPES_GRAVE_WINDMILL, ENTR_KAKARIKO_VILLAGE_OUTSIDE_WINDMILL, SINGLE_SCENE_INFO(SCENE_KAKARIKO_VILLAGE), "Kak Windmill Entry", "Windmill", ENTRANCE_GROUP_KAKARIKO, ENTRANCE_GROUP_KAKARIKO, ENTRANCE_TYPE_INTERIOR, "", 1}, + { ENTR_SHOOTING_GALLERY_0, ENTR_KAKARIKO_VILLAGE_OUTSIDE_SHOOTING_GALLERY, SINGLE_SCENE_INFO(SCENE_KAKARIKO_VILLAGE), "Kak Shooting Gallery Entry", "Kak Shooting Gallery", ENTRANCE_GROUP_KAKARIKO, ENTRANCE_GROUP_KAKARIKO, ENTRANCE_TYPE_INTERIOR, "adult", 1}, + { ENTR_POTION_SHOP_GRANNY_0, ENTR_KAKARIKO_VILLAGE_OUTSIDE_SHOP_GRANNY, SINGLE_SCENE_INFO(SCENE_KAKARIKO_VILLAGE), "Kak Granny's Potion Shop Entry", "Granny's Potion Shop", ENTRANCE_GROUP_KAKARIKO, ENTRANCE_GROUP_KAKARIKO, ENTRANCE_TYPE_INTERIOR, "", 1}, + { ENTR_BAZAAR_0, ENTR_KAKARIKO_VILLAGE_OUTSIDE_BAZAAR, SINGLE_SCENE_INFO(SCENE_KAKARIKO_VILLAGE), "Kak Bazaar Entry", "Kak Bazaar", ENTRANCE_GROUP_KAKARIKO, ENTRANCE_GROUP_KAKARIKO, ENTRANCE_TYPE_INTERIOR, "shop", 1}, + { ENTR_POTION_SHOP_KAKARIKO_FRONT, ENTR_KAKARIKO_VILLAGE_OUTSIDE_POTION_SHOP_FRONT, SINGLE_SCENE_INFO(SCENE_KAKARIKO_VILLAGE), "Kak Potion Shop Front Entry", "Kak Potion Shop Front", ENTRANCE_GROUP_KAKARIKO, ENTRANCE_GROUP_KAKARIKO, ENTRANCE_TYPE_INTERIOR, "", 1}, + { ENTR_POTION_SHOP_KAKARIKO_BACK, ENTR_KAKARIKO_VILLAGE_OUTSIDE_POTION_SHOP_BACK, SINGLE_SCENE_INFO(SCENE_KAKARIKO_VILLAGE), "Kak Potion Shop Back Entry", "Kak Potion Shop Back", ENTRANCE_GROUP_KAKARIKO, ENTRANCE_GROUP_KAKARIKO, ENTRANCE_TYPE_INTERIOR, "", 1}, + { ENTRANCE_GROTTO_LOAD(GROTTO_KAK_OPEN_OFFSET), ENTRANCE_GROTTO_EXIT(GROTTO_KAK_OPEN_OFFSET), SINGLE_SCENE_INFO(SCENE_KAKARIKO_VILLAGE), "Kak Open Grotto Entry", "Kak Open Grotto", ENTRANCE_GROUP_KAKARIKO, ENTRANCE_GROUP_KAKARIKO, ENTRANCE_TYPE_GROTTO, "chest", 1}, + { ENTRANCE_GROTTO_LOAD(GROTTO_KAK_REDEAD_OFFSET), ENTRANCE_GROTTO_EXIT(GROTTO_KAK_REDEAD_OFFSET), SINGLE_SCENE_INFO(SCENE_KAKARIKO_VILLAGE), "Kak Center Grotto Entry", "Kak Redead Grotto", ENTRANCE_GROUP_KAKARIKO, ENTRANCE_GROUP_KAKARIKO, ENTRANCE_TYPE_GROTTO, "chest", 1}, + { ENTR_BOTTOM_OF_THE_WELL_ENTRANCE, ENTR_KAKARIKO_VILLAGE_OUTSIDE_BOTTOM_OF_THE_WELL, SINGLE_SCENE_INFO(SCENE_KAKARIKO_VILLAGE), "Kakariko Outside the Well", "Bottom of the Well Entrance", ENTRANCE_GROUP_KAKARIKO, ENTRANCE_GROUP_KAKARIKO, ENTRANCE_TYPE_DUNGEON, "botw", 1}, + { ENTR_KAKARIKO_VILLAGE_OUTSIDE_CENTER_GUEST_HOUSE, ENTR_KAKARIKO_CENTER_GUEST_HOUSE_0, SINGLE_SCENE_INFO(SCENE_KAKARIKO_CENTER_GUEST_HOUSE), "Carpenter Boss House", "Kak Boss House Entry", ENTRANCE_GROUP_KAKARIKO, ENTRANCE_GROUP_KAKARIKO, ENTRANCE_TYPE_INTERIOR}, + { ENTR_KAKARIKO_VILLAGE_OUTSIDE_SKULKLTULA_HOUSE, ENTR_HOUSE_OF_SKULLTULA_0, SINGLE_SCENE_INFO(SCENE_HOUSE_OF_SKULLTULA), "House of Skulltula", "Kak Skulltula House Entry", ENTRANCE_GROUP_KAKARIKO, ENTRANCE_GROUP_KAKARIKO, ENTRANCE_TYPE_INTERIOR}, + { ENTR_KAKARIKO_VILLAGE_OUTSIDE_IMPAS_HOUSE_FRONT, ENTR_IMPAS_HOUSE_FRONT, SINGLE_SCENE_INFO(SCENE_IMPAS_HOUSE), "Impa's House Front", "Kak Impa's House Front Entry", ENTRANCE_GROUP_KAKARIKO, ENTRANCE_GROUP_KAKARIKO, ENTRANCE_TYPE_INTERIOR}, + { ENTR_KAKARIKO_VILLAGE_OUTSIDE_IMPAS_HOUSE_BACK, ENTR_IMPAS_HOUSE_BACK, SINGLE_SCENE_INFO(SCENE_IMPAS_HOUSE), "Impa's House Back", "Kak Impa's House Back Entry", ENTRANCE_GROUP_KAKARIKO, ENTRANCE_GROUP_KAKARIKO, ENTRANCE_TYPE_INTERIOR, "cow"}, + { ENTR_KAKARIKO_VILLAGE_OUTSIDE_WINDMILL, ENTR_WINDMILL_AND_DAMPES_GRAVE_WINDMILL, SINGLE_SCENE_INFO(SCENE_WINDMILL_AND_DAMPES_GRAVE), "Windmill", "Kak Windmill Entry", ENTRANCE_GROUP_KAKARIKO, ENTRANCE_GROUP_KAKARIKO, ENTRANCE_TYPE_INTERIOR}, + { ENTR_KAKARIKO_VILLAGE_OUTSIDE_SHOOTING_GALLERY, ENTR_SHOOTING_GALLERY_0, {{ SCENE_SHOOTING_GALLERY, 0x00 }}, "Kak Shooting Gallery", "Kak Shooting Gallery Entry", ENTRANCE_GROUP_KAKARIKO, ENTRANCE_GROUP_KAKARIKO, ENTRANCE_TYPE_INTERIOR}, + { ENTR_KAKARIKO_VILLAGE_OUTSIDE_SHOP_GRANNY, ENTR_POTION_SHOP_GRANNY_0, SINGLE_SCENE_INFO(SCENE_POTION_SHOP_GRANNY), "Granny's Potion Shop", "Kak Granny's Potion Shop Entry", ENTRANCE_GROUP_KAKARIKO, ENTRANCE_GROUP_KAKARIKO, ENTRANCE_TYPE_INTERIOR}, + { ENTR_KAKARIKO_VILLAGE_OUTSIDE_BAZAAR, ENTR_BAZAAR_0, {{ SCENE_BAZAAR, 0x00 }}, "Kak Bazaar", "Kak Bazaar Entry", ENTRANCE_GROUP_KAKARIKO, ENTRANCE_GROUP_KAKARIKO, ENTRANCE_TYPE_INTERIOR, "shop"}, + { ENTR_KAKARIKO_VILLAGE_OUTSIDE_POTION_SHOP_FRONT, ENTR_POTION_SHOP_KAKARIKO_FRONT, SINGLE_SCENE_INFO(SCENE_POTION_SHOP_KAKARIKO), "Kak Potion Shop Front", "Kak Potion Shop Front Entry", ENTRANCE_GROUP_KAKARIKO, ENTRANCE_GROUP_KAKARIKO, ENTRANCE_TYPE_INTERIOR}, + { ENTR_KAKARIKO_VILLAGE_OUTSIDE_POTION_SHOP_BACK, ENTR_POTION_SHOP_KAKARIKO_BACK, SINGLE_SCENE_INFO(SCENE_POTION_SHOP_KAKARIKO), "Kak Potion Shop Back", "Kak Potion Shop Back Entry", ENTRANCE_GROUP_KAKARIKO, ENTRANCE_GROUP_KAKARIKO, ENTRANCE_TYPE_INTERIOR}, + { ENTRANCE_GROTTO_EXIT(GROTTO_KAK_OPEN_OFFSET), ENTRANCE_GROTTO_LOAD(GROTTO_KAK_OPEN_OFFSET), {{ SCENE_GROTTOS, 0x00 }}, "Kak Open Grotto", "Kak Open Grotto Entry", ENTRANCE_GROUP_KAKARIKO, ENTRANCE_GROUP_KAKARIKO, ENTRANCE_TYPE_GROTTO, "chest"}, + { ENTRANCE_GROTTO_EXIT(GROTTO_KAK_REDEAD_OFFSET), ENTRANCE_GROTTO_LOAD(GROTTO_KAK_REDEAD_OFFSET), {{ SCENE_GROTTOS, 0x03 }}, "Kak Redead Grotto", "Kak Center Grotto Entry", ENTRANCE_GROUP_KAKARIKO, ENTRANCE_GROUP_KAKARIKO, ENTRANCE_TYPE_GROTTO, "chest"}, + { ENTR_KAKARIKO_VILLAGE_OUTSIDE_BOTTOM_OF_THE_WELL, ENTR_BOTTOM_OF_THE_WELL_ENTRANCE, SINGLE_SCENE_INFO(SCENE_BOTTOM_OF_THE_WELL), "Bottom of the Well Entrance", "Kakariko Outside the Well", ENTRANCE_GROUP_KAKARIKO, ENTRANCE_GROUP_KAKARIKO, ENTRANCE_TYPE_DUNGEON, "botw"}, // The Graveyard - { ENTR_KAKARIKO_VILLAGE_SOUTHEAST_EXIT, ENTR_GRAVEYARD_ENTRANCE, SINGLE_SCENE_INFO(SCENE_GRAVEYARD), "Graveyard Entrance", "Kakariko Southeast Exit", ENTRANCE_GROUP_GRAVEYARD, ENTRANCE_GROUP_KAKARIKO, ENTRANCE_TYPE_OVERWORLD}, - { ENTR_GRAVEKEEPERS_HUT_0, ENTR_GRAVEYARD_OUTSIDE_DAMPES_HUT, SINGLE_SCENE_INFO(SCENE_GRAVEYARD), "GY Outside Dampe's Hut", "Dampe's Hut", ENTRANCE_GROUP_GRAVEYARD, ENTRANCE_GROUP_GRAVEYARD, ENTRANCE_TYPE_INTERIOR, "", 1}, - { ENTR_GRAVE_WITH_FAIRYS_FOUNTAIN_0, ENTR_GRAVEYARD_SHIELD_GRAVE_EXIT, SINGLE_SCENE_INFO(SCENE_GRAVEYARD), "GY Near-Hut Grave Exit", "Shield Grave", ENTRANCE_GROUP_GRAVEYARD, ENTRANCE_GROUP_GRAVEYARD, ENTRANCE_TYPE_GROTTO, "", 1}, - { ENTR_REDEAD_GRAVE_0, ENTR_GRAVEYARD_HEART_PIECE_GRAVE_EXIT, SINGLE_SCENE_INFO(SCENE_GRAVEYARD), "GY Near-Tomb Grave Exit", "Heart Piece Grave", ENTRANCE_GROUP_GRAVEYARD, ENTRANCE_GROUP_GRAVEYARD, ENTRANCE_TYPE_GROTTO, "", 1}, - { ENTR_ROYAL_FAMILYS_TOMB_0, ENTR_GRAVEYARD_ROYAL_TOMB_EXIT, SINGLE_SCENE_INFO(SCENE_GRAVEYARD), "GY Royal Family's Tomb Exit", "Royal Family's Tomb", ENTRANCE_GROUP_GRAVEYARD, ENTRANCE_GROUP_GRAVEYARD, ENTRANCE_TYPE_GROTTO, "", 1}, - { ENTR_WINDMILL_AND_DAMPES_GRAVE_GRAVE, ENTR_GRAVEYARD_DAMPES_GRAVE_EXIT, SINGLE_SCENE_INFO(SCENE_GRAVEYARD), "GY Near-Ledge Grave Exit", "Dampe's Grave", ENTRANCE_GROUP_GRAVEYARD, ENTRANCE_GROUP_GRAVEYARD, ENTRANCE_TYPE_GROTTO, "race", 1}, - { ENTR_SHADOW_TEMPLE_ENTRANCE, ENTR_GRAVEYARD_OUTSIDE_TEMPLE, SINGLE_SCENE_INFO(SCENE_GRAVEYARD), "Graveyard Outside Temple", "Shadow Temple Entrance", ENTRANCE_GROUP_GRAVEYARD, ENTRANCE_GROUP_GRAVEYARD, ENTRANCE_TYPE_DUNGEON, "", 1}, - { ENTR_GRAVEYARD_OUTSIDE_DAMPES_HUT, ENTR_GRAVEKEEPERS_HUT_0, SINGLE_SCENE_INFO(SCENE_GRAVEKEEPERS_HUT), "Dampe's Hut", "GY Outside Dampe's Hut", ENTRANCE_GROUP_GRAVEYARD, ENTRANCE_GROUP_GRAVEYARD, ENTRANCE_TYPE_INTERIOR}, - { ENTR_GRAVEYARD_SHIELD_GRAVE_EXIT, ENTR_GRAVE_WITH_FAIRYS_FOUNTAIN_0, SINGLE_SCENE_INFO(SCENE_GRAVE_WITH_FAIRYS_FOUNTAIN), "Shield Grave", "GY Near-Hut Grave Exit", ENTRANCE_GROUP_GRAVEYARD, ENTRANCE_GROUP_GRAVEYARD, ENTRANCE_TYPE_GROTTO}, - { ENTR_GRAVEYARD_HEART_PIECE_GRAVE_EXIT, ENTR_REDEAD_GRAVE_0, SINGLE_SCENE_INFO(SCENE_REDEAD_GRAVE), "Heart Piece Grave", "GY Near-Tomb Grave Exit", ENTRANCE_GROUP_GRAVEYARD, ENTRANCE_GROUP_GRAVEYARD, ENTRANCE_TYPE_GROTTO}, - { ENTR_GRAVEYARD_ROYAL_TOMB_EXIT, ENTR_ROYAL_FAMILYS_TOMB_0, SINGLE_SCENE_INFO(SCENE_ROYAL_FAMILYS_TOMB), "Royal Family's Tomb", "GY Royal Family's Tomb Exit", ENTRANCE_GROUP_GRAVEYARD, ENTRANCE_GROUP_GRAVEYARD, ENTRANCE_TYPE_GROTTO}, - { ENTR_GRAVEYARD_DAMPES_GRAVE_EXIT, ENTR_WINDMILL_AND_DAMPES_GRAVE_GRAVE, SINGLE_SCENE_INFO(SCENE_WINDMILL_AND_DAMPES_GRAVE), "Dampe's Grave", "GY Near-Ledge Grave Exit", ENTRANCE_GROUP_GRAVEYARD, ENTRANCE_GROUP_GRAVEYARD, ENTRANCE_TYPE_GROTTO, "race"}, - { ENTR_GRAVEYARD_OUTSIDE_TEMPLE, ENTR_SHADOW_TEMPLE_ENTRANCE, SINGLE_SCENE_INFO(SCENE_SHADOW_TEMPLE), "Shadow Temple Entrance", "Graveyard Outside Temple", ENTRANCE_GROUP_GRAVEYARD, ENTRANCE_GROUP_GRAVEYARD, ENTRANCE_TYPE_DUNGEON}, - { ENTR_SHADOW_TEMPLE_BOSS_ENTRANCE, ENTR_SHADOW_TEMPLE_BOSS_DOOR, SINGLE_SCENE_INFO(SCENE_SHADOW_TEMPLE), "Shadow Temple Boss Door", "Bongo-Bongo", ENTRANCE_GROUP_GRAVEYARD, ENTRANCE_GROUP_GRAVEYARD, ENTRANCE_TYPE_DUNGEON, "", 1}, - { ENTR_SHADOW_TEMPLE_BOSS_DOOR, ENTR_SHADOW_TEMPLE_BOSS_ENTRANCE, SINGLE_SCENE_INFO(SCENE_SHADOW_TEMPLE_BOSS), "Bongo-Bongo", "Shadow Temple Boss Door", ENTRANCE_GROUP_GRAVEYARD, ENTRANCE_GROUP_GRAVEYARD, ENTRANCE_TYPE_DUNGEON, "", 1}, - { ENTR_GRAVEYARD_SHADOW_TEMPLE_BLUE_WARP, -1, SINGLE_SCENE_INFO(SCENE_SHADOW_TEMPLE_BOSS), "Bongo-Bongo", "Shadow Temple Blue Warp", ENTRANCE_GROUP_GRAVEYARD, ENTRANCE_GROUP_GRAVEYARD, ENTRANCE_TYPE_ONE_WAY, "bw", 1}, + { ENTR_KAKARIKO_VILLAGE_SOUTHEAST_EXIT, ENTR_GRAVEYARD_ENTRANCE, SINGLE_SCENE_INFO(SCENE_GRAVEYARD), "Graveyard Entrance", "Kakariko Southeast Exit", ENTRANCE_GROUP_GRAVEYARD, ENTRANCE_GROUP_KAKARIKO, ENTRANCE_TYPE_OVERWORLD}, + { ENTR_GRAVEKEEPERS_HUT_0, ENTR_GRAVEYARD_OUTSIDE_DAMPES_HUT, SINGLE_SCENE_INFO(SCENE_GRAVEYARD), "GY Dampe's Hut Entry", "Dampe's Hut", ENTRANCE_GROUP_GRAVEYARD, ENTRANCE_GROUP_GRAVEYARD, ENTRANCE_TYPE_INTERIOR, "", 1}, + { ENTR_GRAVE_WITH_FAIRYS_FOUNTAIN_0, ENTR_GRAVEYARD_SHIELD_GRAVE_EXIT, SINGLE_SCENE_INFO(SCENE_GRAVEYARD), "GY Near-Hut Grave Entry", "Shield Grave", ENTRANCE_GROUP_GRAVEYARD, ENTRANCE_GROUP_GRAVEYARD, ENTRANCE_TYPE_GROTTO, "", 1}, + { ENTR_REDEAD_GRAVE_0, ENTR_GRAVEYARD_HEART_PIECE_GRAVE_EXIT, SINGLE_SCENE_INFO(SCENE_GRAVEYARD), "GY Near-Tomb Grave Entry", "Heart Piece Grave", ENTRANCE_GROUP_GRAVEYARD, ENTRANCE_GROUP_GRAVEYARD, ENTRANCE_TYPE_GROTTO, "", 1}, + { ENTR_ROYAL_FAMILYS_TOMB_0, ENTR_GRAVEYARD_ROYAL_TOMB_EXIT, SINGLE_SCENE_INFO(SCENE_GRAVEYARD), "GY Royal Family's Tomb Entry", "Royal Family's Tomb", ENTRANCE_GROUP_GRAVEYARD, ENTRANCE_GROUP_GRAVEYARD, ENTRANCE_TYPE_GROTTO, "", 1}, + { ENTR_WINDMILL_AND_DAMPES_GRAVE_GRAVE, ENTR_GRAVEYARD_DAMPES_GRAVE_EXIT, SINGLE_SCENE_INFO(SCENE_GRAVEYARD), "GY Near-Ledge Grave Entry", "Dampe's Grave", ENTRANCE_GROUP_GRAVEYARD, ENTRANCE_GROUP_GRAVEYARD, ENTRANCE_TYPE_GROTTO, "race", 1}, + { ENTR_SHADOW_TEMPLE_ENTRANCE, ENTR_GRAVEYARD_OUTSIDE_TEMPLE, SINGLE_SCENE_INFO(SCENE_GRAVEYARD), "Graveyard Outside Temple", "Shadow Temple Entrance", ENTRANCE_GROUP_GRAVEYARD, ENTRANCE_GROUP_GRAVEYARD, ENTRANCE_TYPE_DUNGEON, "", 1}, + { ENTR_GRAVEYARD_OUTSIDE_DAMPES_HUT, ENTR_GRAVEKEEPERS_HUT_0, SINGLE_SCENE_INFO(SCENE_GRAVEKEEPERS_HUT), "Dampe's Hut", "GY Dampe's Hut Entry", ENTRANCE_GROUP_GRAVEYARD, ENTRANCE_GROUP_GRAVEYARD, ENTRANCE_TYPE_INTERIOR}, + { ENTR_GRAVEYARD_SHIELD_GRAVE_EXIT, ENTR_GRAVE_WITH_FAIRYS_FOUNTAIN_0, SINGLE_SCENE_INFO(SCENE_GRAVE_WITH_FAIRYS_FOUNTAIN), "Shield Grave", "GY Near-Hut Grave Entry", ENTRANCE_GROUP_GRAVEYARD, ENTRANCE_GROUP_GRAVEYARD, ENTRANCE_TYPE_GROTTO}, + { ENTR_GRAVEYARD_HEART_PIECE_GRAVE_EXIT, ENTR_REDEAD_GRAVE_0, SINGLE_SCENE_INFO(SCENE_REDEAD_GRAVE), "Heart Piece Grave", "GY Near-Tomb Grave Entry", ENTRANCE_GROUP_GRAVEYARD, ENTRANCE_GROUP_GRAVEYARD, ENTRANCE_TYPE_GROTTO}, + { ENTR_GRAVEYARD_ROYAL_TOMB_EXIT, ENTR_ROYAL_FAMILYS_TOMB_0, SINGLE_SCENE_INFO(SCENE_ROYAL_FAMILYS_TOMB), "Royal Family's Tomb", "GY Royal Family's Tomb Entry", ENTRANCE_GROUP_GRAVEYARD, ENTRANCE_GROUP_GRAVEYARD, ENTRANCE_TYPE_GROTTO}, + { ENTR_GRAVEYARD_DAMPES_GRAVE_EXIT, ENTR_WINDMILL_AND_DAMPES_GRAVE_GRAVE, SINGLE_SCENE_INFO(SCENE_WINDMILL_AND_DAMPES_GRAVE), "Dampe's Grave", "GY Near-Ledge Grave Entry", ENTRANCE_GROUP_GRAVEYARD, ENTRANCE_GROUP_GRAVEYARD, ENTRANCE_TYPE_GROTTO, "race"}, + { ENTR_GRAVEYARD_OUTSIDE_TEMPLE, ENTR_SHADOW_TEMPLE_ENTRANCE, SINGLE_SCENE_INFO(SCENE_SHADOW_TEMPLE), "Shadow Temple Entrance", "Graveyard Outside Temple", ENTRANCE_GROUP_GRAVEYARD, ENTRANCE_GROUP_GRAVEYARD, ENTRANCE_TYPE_DUNGEON}, + { ENTR_SHADOW_TEMPLE_BOSS_ENTRANCE, ENTR_SHADOW_TEMPLE_BOSS_DOOR, SINGLE_SCENE_INFO(SCENE_SHADOW_TEMPLE), "Shadow Temple Boss Door", "Bongo-Bongo", ENTRANCE_GROUP_GRAVEYARD, ENTRANCE_GROUP_GRAVEYARD, ENTRANCE_TYPE_DUNGEON, "", 1}, + { ENTR_SHADOW_TEMPLE_BOSS_DOOR, ENTR_SHADOW_TEMPLE_BOSS_ENTRANCE, SINGLE_SCENE_INFO(SCENE_SHADOW_TEMPLE_BOSS), "Bongo-Bongo", "Shadow Temple Boss Door", ENTRANCE_GROUP_GRAVEYARD, ENTRANCE_GROUP_GRAVEYARD, ENTRANCE_TYPE_DUNGEON, "", 1}, + { ENTR_GRAVEYARD_SHADOW_TEMPLE_BLUE_WARP, -1, SINGLE_SCENE_INFO(SCENE_SHADOW_TEMPLE_BOSS), "Bongo-Bongo Blue Warp", "Shadow Temple Blue Warp", ENTRANCE_GROUP_GRAVEYARD, ENTRANCE_GROUP_GRAVEYARD, ENTRANCE_TYPE_ONE_WAY, "bw", 1}, // Death Mountain Trail - { ENTR_GORON_CITY_UPPER_EXIT, ENTR_DEATH_MOUNTAIN_TRAIL_GC_EXIT, SINGLE_SCENE_INFO(SCENE_DEATH_MOUNTAIN_TRAIL), "Death Mountain Trail Middle Exit", "Goron City Upper Exit", ENTRANCE_GROUP_DEATH_MOUNTAIN_TRAIL, ENTRANCE_GROUP_GORON_CITY, ENTRANCE_TYPE_OVERWORLD, "gc"}, - { ENTR_KAKARIKO_VILLAGE_GUARD_GATE, ENTR_DEATH_MOUNTAIN_TRAIL_BOTTOM_EXIT, SINGLE_SCENE_INFO(SCENE_DEATH_MOUNTAIN_TRAIL), "Death Mountain Trail Bottom Exit", "Kakariko Guard Gate Exit", ENTRANCE_GROUP_DEATH_MOUNTAIN_TRAIL, ENTRANCE_GROUP_KAKARIKO, ENTRANCE_TYPE_OVERWORLD}, - { ENTR_DEATH_MOUNTAIN_CRATER_UPPER_EXIT, ENTR_DEATH_MOUNTAIN_TRAIL_SUMMIT_EXIT, SINGLE_SCENE_INFO(SCENE_DEATH_MOUNTAIN_TRAIL), "Death Mountain Trail Top Exit", "Death Mountain Crater Upper Exit", ENTRANCE_GROUP_DEATH_MOUNTAIN_TRAIL, ENTRANCE_GROUP_DEATH_MOUNTAIN_CRATER, ENTRANCE_TYPE_OVERWORLD}, - { ENTR_GREAT_FAIRYS_FOUNTAIN_MAGIC_DMT, ENTR_DEATH_MOUNTAIN_TRAIL_GREAT_FAIRY_EXIT, SINGLE_SCENE_INFO(SCENE_DEATH_MOUNTAIN_TRAIL), "DMT Great Fairy Exit", "DMT Great Fairy Fountain", ENTRANCE_GROUP_DEATH_MOUNTAIN_TRAIL, ENTRANCE_GROUP_DEATH_MOUNTAIN_TRAIL, ENTRANCE_TYPE_INTERIOR, "", 1}, - { ENTRANCE_GROTTO_LOAD(GROTTO_DMT_STORMS_OFFSET), ENTRANCE_GROTTO_EXIT(GROTTO_DMT_STORMS_OFFSET), SINGLE_SCENE_INFO(SCENE_DEATH_MOUNTAIN_TRAIL), "DMT Rock Circle Grotto Exit", "DMT Storms Grotto", ENTRANCE_GROUP_DEATH_MOUNTAIN_TRAIL, ENTRANCE_GROUP_DEATH_MOUNTAIN_TRAIL, ENTRANCE_TYPE_GROTTO, "chest", 1}, - { ENTRANCE_GROTTO_LOAD(GROTTO_DMT_COW_OFFSET), ENTRANCE_GROTTO_EXIT(GROTTO_DMT_COW_OFFSET), SINGLE_SCENE_INFO(SCENE_DEATH_MOUNTAIN_TRAIL), "DMT Boulder Grotto Exit", "DMT Cow Grotto", ENTRANCE_GROUP_DEATH_MOUNTAIN_TRAIL, ENTRANCE_GROUP_DEATH_MOUNTAIN_TRAIL, ENTRANCE_TYPE_GROTTO, "", 1}, - { ENTR_DODONGOS_CAVERN_ENTRANCE, ENTR_DEATH_MOUNTAIN_TRAIL_OUTSIDE_DODONGOS_CAVERN, SINGLE_SCENE_INFO(SCENE_DEATH_MOUNTAIN_TRAIL), "DMT Outside Dodongo's Cavern", "Dodongo's Cavern Entrance", ENTRANCE_GROUP_DEATH_MOUNTAIN_TRAIL, ENTRANCE_GROUP_DEATH_MOUNTAIN_TRAIL, ENTRANCE_TYPE_DUNGEON, "dc", 1}, - { ENTR_DEATH_MOUNTAIN_TRAIL_GREAT_FAIRY_EXIT, ENTR_GREAT_FAIRYS_FOUNTAIN_MAGIC_DMT, {{ SCENE_GREAT_FAIRYS_FOUNTAIN_MAGIC, 0x00 }}, "DMT Great Fairy Fountain", "DMT Great Fairy Exit", ENTRANCE_GROUP_DEATH_MOUNTAIN_TRAIL, ENTRANCE_GROUP_DEATH_MOUNTAIN_TRAIL, ENTRANCE_TYPE_INTERIOR}, - { ENTRANCE_GROTTO_EXIT(GROTTO_DMT_STORMS_OFFSET), ENTRANCE_GROTTO_LOAD(GROTTO_DMT_STORMS_OFFSET), {{ SCENE_GROTTOS, 0x00 }}, "DMT Storms Grotto", "DMT Rock Circle Grotto Exit", ENTRANCE_GROUP_DEATH_MOUNTAIN_TRAIL, ENTRANCE_GROUP_DEATH_MOUNTAIN_TRAIL, ENTRANCE_TYPE_GROTTO, "chest"}, - { ENTRANCE_GROTTO_EXIT(GROTTO_DMT_COW_OFFSET), ENTRANCE_GROTTO_LOAD(GROTTO_DMT_COW_OFFSET), {{ SCENE_GROTTOS, 0x0D }}, "DMT Cow Grotto", "DMT Boulder Grotto Exit", ENTRANCE_GROUP_DEATH_MOUNTAIN_TRAIL, ENTRANCE_GROUP_DEATH_MOUNTAIN_TRAIL, ENTRANCE_TYPE_GROTTO}, - { ENTR_DEATH_MOUNTAIN_TRAIL_OUTSIDE_DODONGOS_CAVERN, ENTR_DODONGOS_CAVERN_ENTRANCE, SINGLE_SCENE_INFO(SCENE_DODONGOS_CAVERN), "Dodongo's Cavern Entrance", "DMT Outside Dodongo's Cavern", ENTRANCE_GROUP_DEATH_MOUNTAIN_TRAIL, ENTRANCE_GROUP_DEATH_MOUNTAIN_TRAIL, ENTRANCE_TYPE_DUNGEON, "dc"}, - { ENTR_DODONGOS_CAVERN_BOSS_ENTRANCE, ENTR_DODONGOS_CAVERN_BOSS_DOOR, SINGLE_SCENE_INFO(SCENE_DODONGOS_CAVERN), "Dodongo's Cavern Boss Door", "King Dodongo", ENTRANCE_GROUP_DEATH_MOUNTAIN_TRAIL, ENTRANCE_GROUP_DEATH_MOUNTAIN_TRAIL, ENTRANCE_TYPE_DUNGEON, "dc", 1}, - { ENTR_DODONGOS_CAVERN_BOSS_DOOR, ENTR_DODONGOS_CAVERN_BOSS_ENTRANCE, SINGLE_SCENE_INFO(SCENE_DODONGOS_CAVERN_BOSS), "King Dodongo", "Dodongo's Cavern Boss Door", ENTRANCE_GROUP_DEATH_MOUNTAIN_TRAIL, ENTRANCE_GROUP_DEATH_MOUNTAIN_TRAIL, ENTRANCE_TYPE_DUNGEON, "dc", 1}, - { ENTR_DEATH_MOUNTAIN_TRAIL_DODONGO_BLUE_WARP, -1, SINGLE_SCENE_INFO(SCENE_DODONGOS_CAVERN_BOSS), "King Dodongo", "Dodongo's Cavern Blue Warp", ENTRANCE_GROUP_DEATH_MOUNTAIN_TRAIL, ENTRANCE_GROUP_DEATH_MOUNTAIN_TRAIL, ENTRANCE_TYPE_ONE_WAY, "dc,bw", 1}, + { ENTR_GORON_CITY_UPPER_EXIT, ENTR_DEATH_MOUNTAIN_TRAIL_GC_EXIT, SINGLE_SCENE_INFO(SCENE_DEATH_MOUNTAIN_TRAIL), "Death Mountain Trail Middle Exit", "Goron City Upper Exit", ENTRANCE_GROUP_DEATH_MOUNTAIN_TRAIL, ENTRANCE_GROUP_GORON_CITY, ENTRANCE_TYPE_OVERWORLD, "gc"}, + { ENTR_KAKARIKO_VILLAGE_GUARD_GATE, ENTR_DEATH_MOUNTAIN_TRAIL_BOTTOM_EXIT, SINGLE_SCENE_INFO(SCENE_DEATH_MOUNTAIN_TRAIL), "Death Mountain Trail Bottom Exit", "Kakariko Guard Gate Exit", ENTRANCE_GROUP_DEATH_MOUNTAIN_TRAIL, ENTRANCE_GROUP_KAKARIKO, ENTRANCE_TYPE_OVERWORLD}, + { ENTR_DEATH_MOUNTAIN_CRATER_UPPER_EXIT, ENTR_DEATH_MOUNTAIN_TRAIL_SUMMIT_EXIT, SINGLE_SCENE_INFO(SCENE_DEATH_MOUNTAIN_TRAIL), "Death Mountain Trail Top Exit", "Death Mountain Crater Upper Exit", ENTRANCE_GROUP_DEATH_MOUNTAIN_TRAIL, ENTRANCE_GROUP_DEATH_MOUNTAIN_CRATER, ENTRANCE_TYPE_OVERWORLD}, + { ENTR_GREAT_FAIRYS_FOUNTAIN_MAGIC_DMT, ENTR_DEATH_MOUNTAIN_TRAIL_GREAT_FAIRY_EXIT, SINGLE_SCENE_INFO(SCENE_DEATH_MOUNTAIN_TRAIL), "DMT Great Fairy Entry", "DMT Great Fairy Fountain", ENTRANCE_GROUP_DEATH_MOUNTAIN_TRAIL, ENTRANCE_GROUP_DEATH_MOUNTAIN_TRAIL, ENTRANCE_TYPE_INTERIOR, "", 1}, + { ENTRANCE_GROTTO_LOAD(GROTTO_DMT_STORMS_OFFSET), ENTRANCE_GROTTO_EXIT(GROTTO_DMT_STORMS_OFFSET), SINGLE_SCENE_INFO(SCENE_DEATH_MOUNTAIN_TRAIL), "DMT Rock Circle Grotto Entry", "DMT Storms Grotto", ENTRANCE_GROUP_DEATH_MOUNTAIN_TRAIL, ENTRANCE_GROUP_DEATH_MOUNTAIN_TRAIL, ENTRANCE_TYPE_GROTTO, "chest", 1}, + { ENTRANCE_GROTTO_LOAD(GROTTO_DMT_COW_OFFSET), ENTRANCE_GROTTO_EXIT(GROTTO_DMT_COW_OFFSET), SINGLE_SCENE_INFO(SCENE_DEATH_MOUNTAIN_TRAIL), "DMT Boulder Grotto Entry", "DMT Cow Grotto", ENTRANCE_GROUP_DEATH_MOUNTAIN_TRAIL, ENTRANCE_GROUP_DEATH_MOUNTAIN_TRAIL, ENTRANCE_TYPE_GROTTO, "", 1}, + { ENTR_DODONGOS_CAVERN_ENTRANCE, ENTR_DEATH_MOUNTAIN_TRAIL_OUTSIDE_DODONGOS_CAVERN, SINGLE_SCENE_INFO(SCENE_DEATH_MOUNTAIN_TRAIL), "Death Mountain Trail Outside Dodongo's Cavern", "Dodongo's Cavern Entrance", ENTRANCE_GROUP_DEATH_MOUNTAIN_TRAIL, ENTRANCE_GROUP_DEATH_MOUNTAIN_TRAIL, ENTRANCE_TYPE_DUNGEON, "dc", 1}, + { ENTR_DEATH_MOUNTAIN_TRAIL_GREAT_FAIRY_EXIT, ENTR_GREAT_FAIRYS_FOUNTAIN_MAGIC_DMT, {{ SCENE_GREAT_FAIRYS_FOUNTAIN_MAGIC, 0x00 }}, "DMT Great Fairy Fountain", "DMT Great Fairy Entry", ENTRANCE_GROUP_DEATH_MOUNTAIN_TRAIL, ENTRANCE_GROUP_DEATH_MOUNTAIN_TRAIL, ENTRANCE_TYPE_INTERIOR}, + { ENTRANCE_GROTTO_EXIT(GROTTO_DMT_STORMS_OFFSET), ENTRANCE_GROTTO_LOAD(GROTTO_DMT_STORMS_OFFSET), {{ SCENE_GROTTOS, 0x00 }}, "DMT Storms Grotto", "DMT Rock Circle Grotto Entry", ENTRANCE_GROUP_DEATH_MOUNTAIN_TRAIL, ENTRANCE_GROUP_DEATH_MOUNTAIN_TRAIL, ENTRANCE_TYPE_GROTTO, "chest"}, + { ENTRANCE_GROTTO_EXIT(GROTTO_DMT_COW_OFFSET), ENTRANCE_GROTTO_LOAD(GROTTO_DMT_COW_OFFSET), {{ SCENE_GROTTOS, 0x0D }}, "DMT Cow Grotto", "DMT Boulder Grotto Entry", ENTRANCE_GROUP_DEATH_MOUNTAIN_TRAIL, ENTRANCE_GROUP_DEATH_MOUNTAIN_TRAIL, ENTRANCE_TYPE_GROTTO}, + { ENTR_DEATH_MOUNTAIN_TRAIL_OUTSIDE_DODONGOS_CAVERN, ENTR_DODONGOS_CAVERN_ENTRANCE, SINGLE_SCENE_INFO(SCENE_DODONGOS_CAVERN), "Dodongo's Cavern Entrance", "Death Mountain Trail Outside Dodongo's Cavern", ENTRANCE_GROUP_DEATH_MOUNTAIN_TRAIL, ENTRANCE_GROUP_DEATH_MOUNTAIN_TRAIL, ENTRANCE_TYPE_DUNGEON, "dc"}, + { ENTR_DODONGOS_CAVERN_BOSS_ENTRANCE, ENTR_DODONGOS_CAVERN_BOSS_DOOR, SINGLE_SCENE_INFO(SCENE_DODONGOS_CAVERN), "Dodongo's Cavern Boss Door", "King Dodongo", ENTRANCE_GROUP_DEATH_MOUNTAIN_TRAIL, ENTRANCE_GROUP_DEATH_MOUNTAIN_TRAIL, ENTRANCE_TYPE_DUNGEON, "dc", 1}, + { ENTR_DODONGOS_CAVERN_BOSS_DOOR, ENTR_DODONGOS_CAVERN_BOSS_ENTRANCE, SINGLE_SCENE_INFO(SCENE_DODONGOS_CAVERN_BOSS), "King Dodongo", "Dodongo's Cavern Boss Door", ENTRANCE_GROUP_DEATH_MOUNTAIN_TRAIL, ENTRANCE_GROUP_DEATH_MOUNTAIN_TRAIL, ENTRANCE_TYPE_DUNGEON, "dc", 1}, + { ENTR_DEATH_MOUNTAIN_TRAIL_DODONGO_BLUE_WARP, -1, SINGLE_SCENE_INFO(SCENE_DODONGOS_CAVERN_BOSS), "King Dodongo Blue Warp", "Dodongo's Cavern Blue Warp", ENTRANCE_GROUP_DEATH_MOUNTAIN_TRAIL, ENTRANCE_GROUP_DEATH_MOUNTAIN_TRAIL, ENTRANCE_TYPE_ONE_WAY, "dc,bw", 1}, // Death Mountain Crater - { ENTR_GORON_CITY_DARUNIA_ROOM_EXIT, ENTR_DEATH_MOUNTAIN_CRATER_GC_EXIT, SINGLE_SCENE_INFO(SCENE_DEATH_MOUNTAIN_CRATER), "Death Mountain Crater Bridge Exit", "Goron City Darunia's Room Exit", ENTRANCE_GROUP_DEATH_MOUNTAIN_CRATER, ENTRANCE_GROUP_GORON_CITY, ENTRANCE_TYPE_OVERWORLD, "gc"}, + { ENTR_GORON_CITY_DARUNIA_ROOM_EXIT, ENTR_DEATH_MOUNTAIN_CRATER_GC_EXIT, SINGLE_SCENE_INFO(SCENE_DEATH_MOUNTAIN_CRATER), "Death Mountain Crater Bridge Exit", "Goron City Darunia's Room Backdoor", ENTRANCE_GROUP_DEATH_MOUNTAIN_CRATER, ENTRANCE_GROUP_GORON_CITY, ENTRANCE_TYPE_OVERWORLD, "gc"}, { ENTR_DEATH_MOUNTAIN_TRAIL_SUMMIT_EXIT, ENTR_DEATH_MOUNTAIN_CRATER_UPPER_EXIT, SINGLE_SCENE_INFO(SCENE_DEATH_MOUNTAIN_CRATER), "Death Mountain Crater Upper Exit", "Death Mountain Trail Top Exit", ENTRANCE_GROUP_DEATH_MOUNTAIN_CRATER, ENTRANCE_GROUP_DEATH_MOUNTAIN_TRAIL, ENTRANCE_TYPE_OVERWORLD}, - { ENTR_GREAT_FAIRYS_FOUNTAIN_MAGIC_DMC, ENTR_DEATH_MOUNTAIN_CRATER_GREAT_FAIRY_EXIT, SINGLE_SCENE_INFO(SCENE_DEATH_MOUNTAIN_CRATER), "DMC Great Fairy Exit", "DMC Great Fairy Fountain", ENTRANCE_GROUP_DEATH_MOUNTAIN_CRATER, ENTRANCE_GROUP_DEATH_MOUNTAIN_CRATER, ENTRANCE_TYPE_INTERIOR, "", 1}, - { ENTRANCE_GROTTO_LOAD(GROTTO_DMC_UPPER_OFFSET), ENTRANCE_GROTTO_EXIT(GROTTO_DMC_UPPER_OFFSET), SINGLE_SCENE_INFO(SCENE_DEATH_MOUNTAIN_CRATER), "DMC Upper Grotto Exit", "DMC Upper Grotto", ENTRANCE_GROUP_DEATH_MOUNTAIN_CRATER, ENTRANCE_GROUP_DEATH_MOUNTAIN_CRATER, ENTRANCE_TYPE_GROTTO, "chest", 1}, - { ENTRANCE_GROTTO_LOAD(GROTTO_DMC_HAMMER_OFFSET), ENTRANCE_GROTTO_EXIT(GROTTO_DMC_HAMMER_OFFSET), SINGLE_SCENE_INFO(SCENE_DEATH_MOUNTAIN_CRATER), "DMC Hammer Grotto Exit", "DMC Hammer Scrubs Grotto", ENTRANCE_GROUP_DEATH_MOUNTAIN_CRATER, ENTRANCE_GROUP_DEATH_MOUNTAIN_CRATER, ENTRANCE_TYPE_GROTTO, "scrubs", 1}, + { ENTR_GREAT_FAIRYS_FOUNTAIN_MAGIC_DMC, ENTR_DEATH_MOUNTAIN_CRATER_GREAT_FAIRY_EXIT, SINGLE_SCENE_INFO(SCENE_DEATH_MOUNTAIN_CRATER), "DMC Great Fairy Entry", "DMC Great Fairy Fountain", ENTRANCE_GROUP_DEATH_MOUNTAIN_CRATER, ENTRANCE_GROUP_DEATH_MOUNTAIN_CRATER, ENTRANCE_TYPE_INTERIOR, "", 1}, + { ENTRANCE_GROTTO_LOAD(GROTTO_DMC_UPPER_OFFSET), ENTRANCE_GROTTO_EXIT(GROTTO_DMC_UPPER_OFFSET), SINGLE_SCENE_INFO(SCENE_DEATH_MOUNTAIN_CRATER), "DMC Upper Grotto Entry", "DMC Upper Grotto", ENTRANCE_GROUP_DEATH_MOUNTAIN_CRATER, ENTRANCE_GROUP_DEATH_MOUNTAIN_CRATER, ENTRANCE_TYPE_GROTTO, "chest", 1}, + { ENTRANCE_GROTTO_LOAD(GROTTO_DMC_HAMMER_OFFSET), ENTRANCE_GROTTO_EXIT(GROTTO_DMC_HAMMER_OFFSET), SINGLE_SCENE_INFO(SCENE_DEATH_MOUNTAIN_CRATER), "DMC Hammer Grotto Entry", "DMC Scrubs Grotto", ENTRANCE_GROUP_DEATH_MOUNTAIN_CRATER, ENTRANCE_GROUP_DEATH_MOUNTAIN_CRATER, ENTRANCE_TYPE_GROTTO, "scrubs", 1}, { ENTR_FIRE_TEMPLE_ENTRANCE, ENTR_DEATH_MOUNTAIN_CRATER_OUTSIDE_TEMPLE, SINGLE_SCENE_INFO(SCENE_DEATH_MOUNTAIN_CRATER), "Death Mountain Crater Outside Temple", "Fire Temple Entrance", ENTRANCE_GROUP_DEATH_MOUNTAIN_CRATER, ENTRANCE_GROUP_DEATH_MOUNTAIN_CRATER, ENTRANCE_TYPE_DUNGEON, "", 1}, - { ENTR_DEATH_MOUNTAIN_CRATER_GREAT_FAIRY_EXIT, ENTR_GREAT_FAIRYS_FOUNTAIN_MAGIC_DMC, {{ SCENE_GREAT_FAIRYS_FOUNTAIN_MAGIC, 0x01 }}, "DMC Great Fairy Fountain", "DMC Great Fairy Exit", ENTRANCE_GROUP_DEATH_MOUNTAIN_CRATER, ENTRANCE_GROUP_DEATH_MOUNTAIN_CRATER, ENTRANCE_TYPE_INTERIOR}, - { ENTRANCE_GROTTO_EXIT(GROTTO_DMC_UPPER_OFFSET), ENTRANCE_GROTTO_LOAD(GROTTO_DMC_UPPER_OFFSET), {{ SCENE_GROTTOS, 0x00 }}, "DMC Upper Grotto", "DMC Upper Grotto Exit", ENTRANCE_GROUP_DEATH_MOUNTAIN_CRATER, ENTRANCE_GROUP_DEATH_MOUNTAIN_CRATER, ENTRANCE_TYPE_GROTTO, "chest"}, - { ENTRANCE_GROTTO_EXIT(GROTTO_DMC_HAMMER_OFFSET), ENTRANCE_GROTTO_LOAD(GROTTO_DMC_HAMMER_OFFSET), {{ SCENE_GROTTOS, 0x04 }}, "DMC Hammer Grotto", "DMC Hammer Grotto Exit", ENTRANCE_GROUP_DEATH_MOUNTAIN_CRATER, ENTRANCE_GROUP_DEATH_MOUNTAIN_CRATER, ENTRANCE_TYPE_GROTTO, "scrubs"}, + { ENTR_DEATH_MOUNTAIN_CRATER_GREAT_FAIRY_EXIT, ENTR_GREAT_FAIRYS_FOUNTAIN_MAGIC_DMC, {{ SCENE_GREAT_FAIRYS_FOUNTAIN_MAGIC, 0x01 }}, "DMC Great Fairy Fountain", "DMC Great Fairy Entry", ENTRANCE_GROUP_DEATH_MOUNTAIN_CRATER, ENTRANCE_GROUP_DEATH_MOUNTAIN_CRATER, ENTRANCE_TYPE_INTERIOR}, + { ENTRANCE_GROTTO_EXIT(GROTTO_DMC_UPPER_OFFSET), ENTRANCE_GROTTO_LOAD(GROTTO_DMC_UPPER_OFFSET), {{ SCENE_GROTTOS, 0x00 }}, "DMC Upper Grotto", "DMC Upper Grotto Entry", ENTRANCE_GROUP_DEATH_MOUNTAIN_CRATER, ENTRANCE_GROUP_DEATH_MOUNTAIN_CRATER, ENTRANCE_TYPE_GROTTO, "chest"}, + { ENTRANCE_GROTTO_EXIT(GROTTO_DMC_HAMMER_OFFSET), ENTRANCE_GROTTO_LOAD(GROTTO_DMC_HAMMER_OFFSET), {{ SCENE_GROTTOS, 0x04 }}, "DMC Scrubs Grotto", "DMC Hammer Grotto Entry", ENTRANCE_GROUP_DEATH_MOUNTAIN_CRATER, ENTRANCE_GROUP_DEATH_MOUNTAIN_CRATER, ENTRANCE_TYPE_GROTTO, "scrubs"}, { ENTR_DEATH_MOUNTAIN_CRATER_OUTSIDE_TEMPLE, ENTR_FIRE_TEMPLE_ENTRANCE, SINGLE_SCENE_INFO(SCENE_FIRE_TEMPLE), "Fire Temple Entrance", "Death Mountain Crater Outside Temple", ENTRANCE_GROUP_DEATH_MOUNTAIN_CRATER, ENTRANCE_GROUP_DEATH_MOUNTAIN_CRATER, ENTRANCE_TYPE_DUNGEON}, { ENTR_FIRE_TEMPLE_BOSS_ENTRANCE, ENTR_FIRE_TEMPLE_BOSS_DOOR, SINGLE_SCENE_INFO(SCENE_FIRE_TEMPLE), "Fire Temple Boss Door", "Volvagia", ENTRANCE_GROUP_DEATH_MOUNTAIN_CRATER, ENTRANCE_GROUP_DEATH_MOUNTAIN_CRATER, ENTRANCE_TYPE_DUNGEON, "", 1}, { ENTR_FIRE_TEMPLE_BOSS_DOOR, ENTR_FIRE_TEMPLE_BOSS_ENTRANCE, SINGLE_SCENE_INFO(SCENE_FIRE_TEMPLE_BOSS), "Volvagia", "Fire Temple Boss Door", ENTRANCE_GROUP_DEATH_MOUNTAIN_CRATER, ENTRANCE_GROUP_DEATH_MOUNTAIN_CRATER, ENTRANCE_TYPE_DUNGEON, "", 1}, - { ENTR_DEATH_MOUNTAIN_CRATER_FIRE_TEMPLE_BLUE_WARP, -1, SINGLE_SCENE_INFO(SCENE_FIRE_TEMPLE_BOSS), "Volvagia", "Fire Temple Blue Warp", ENTRANCE_GROUP_DEATH_MOUNTAIN_CRATER, ENTRANCE_GROUP_DEATH_MOUNTAIN_CRATER, ENTRANCE_TYPE_ONE_WAY, "bw", 1}, + { ENTR_DEATH_MOUNTAIN_CRATER_FIRE_TEMPLE_BLUE_WARP, -1, SINGLE_SCENE_INFO(SCENE_FIRE_TEMPLE_BOSS), "Volvagia Blue Warp", "Fire Temple Blue Warp", ENTRANCE_GROUP_DEATH_MOUNTAIN_CRATER, ENTRANCE_GROUP_DEATH_MOUNTAIN_CRATER, ENTRANCE_TYPE_ONE_WAY, "bw", 1}, // Goron City - { ENTR_DEATH_MOUNTAIN_TRAIL_GC_EXIT, ENTR_GORON_CITY_UPPER_EXIT, SINGLE_SCENE_INFO(SCENE_GORON_CITY), "Goron City Upper Exit", "Death Mountain Trail Middle Exit", ENTRANCE_GROUP_GORON_CITY, ENTRANCE_GROUP_DEATH_MOUNTAIN_TRAIL, ENTRANCE_TYPE_OVERWORLD, "gc"}, - { ENTR_DEATH_MOUNTAIN_CRATER_GC_EXIT, ENTR_GORON_CITY_DARUNIA_ROOM_EXIT, SINGLE_SCENE_INFO(SCENE_GORON_CITY), "Goron City Darunia's Room Exit", "Death Mountain Crater Bridge Exit", ENTRANCE_GROUP_GORON_CITY, ENTRANCE_GROUP_DEATH_MOUNTAIN_CRATER, ENTRANCE_TYPE_OVERWORLD, "gc"}, - { ENTR_LOST_WOODS_TUNNEL_SHORTCUT, ENTR_GORON_CITY_TUNNEL_SHORTCUT, SINGLE_SCENE_INFO(SCENE_GORON_CITY), "GC Tunnel Shortcut", "LW Tunnel Shortcut", ENTRANCE_GROUP_GORON_CITY, ENTRANCE_GROUP_LOST_WOODS, ENTRANCE_TYPE_OVERWORLD, "gc,lw"}, - { ENTR_GORON_SHOP_0, ENTR_GORON_CITY_OUTSIDE_SHOP, SINGLE_SCENE_INFO(SCENE_GORON_CITY), "GC Outside Shop", "Goron Shop", ENTRANCE_GROUP_GORON_CITY, ENTRANCE_GROUP_GORON_CITY, ENTRANCE_TYPE_INTERIOR, "gc", 1}, - { ENTRANCE_GROTTO_LOAD(GROTTO_GORON_CITY_OFFSET), ENTRANCE_GROTTO_EXIT(GROTTO_GORON_CITY_OFFSET), SINGLE_SCENE_INFO(SCENE_GORON_CITY), "GC Lava Grotto Exit", "Goron City Grotto", ENTRANCE_GROUP_GORON_CITY, ENTRANCE_GROUP_GORON_CITY, ENTRANCE_TYPE_GROTTO, "gc,scrubs", 1}, - { ENTR_GORON_CITY_OUTSIDE_SHOP, ENTR_GORON_SHOP_0, SINGLE_SCENE_INFO(SCENE_GORON_SHOP), "Goron Shop", "GC Outside Shop", ENTRANCE_GROUP_GORON_CITY, ENTRANCE_GROUP_GORON_CITY, ENTRANCE_TYPE_INTERIOR, "gc"}, - { ENTRANCE_GROTTO_EXIT(GROTTO_GORON_CITY_OFFSET), ENTRANCE_GROTTO_LOAD(GROTTO_GORON_CITY_OFFSET), {{ SCENE_GROTTOS, 0x04 }}, "Goron City Grotto", "GC Lava Grotto Exit", ENTRANCE_GROUP_GORON_CITY, ENTRANCE_GROUP_GORON_CITY, ENTRANCE_TYPE_GROTTO, "gc,scrubs"}, + { ENTR_DEATH_MOUNTAIN_TRAIL_GC_EXIT, ENTR_GORON_CITY_UPPER_EXIT, SINGLE_SCENE_INFO(SCENE_GORON_CITY), "Goron City Upper Exit", "Death Mountain Trail Middle Exit", ENTRANCE_GROUP_GORON_CITY, ENTRANCE_GROUP_DEATH_MOUNTAIN_TRAIL, ENTRANCE_TYPE_OVERWORLD, "gc"}, + { ENTR_DEATH_MOUNTAIN_CRATER_GC_EXIT, ENTR_GORON_CITY_DARUNIA_ROOM_EXIT, SINGLE_SCENE_INFO(SCENE_GORON_CITY), "Goron City Darunia's Room Backdoor", "Death Mountain Crater Bridge Exit", ENTRANCE_GROUP_GORON_CITY, ENTRANCE_GROUP_DEATH_MOUNTAIN_CRATER, ENTRANCE_TYPE_OVERWORLD, "gc"}, + { ENTR_LOST_WOODS_TUNNEL_SHORTCUT, ENTR_GORON_CITY_TUNNEL_SHORTCUT, SINGLE_SCENE_INFO(SCENE_GORON_CITY), "Goron City Tunnel Shortcut", "Lost Woods Tunnel Shortcut", ENTRANCE_GROUP_GORON_CITY, ENTRANCE_GROUP_LOST_WOODS, ENTRANCE_TYPE_OVERWORLD, "gc,lw"}, + { ENTR_GORON_SHOP_0, ENTR_GORON_CITY_OUTSIDE_SHOP, SINGLE_SCENE_INFO(SCENE_GORON_CITY), "GC Shop Entry", "Goron Shop", ENTRANCE_GROUP_GORON_CITY, ENTRANCE_GROUP_GORON_CITY, ENTRANCE_TYPE_INTERIOR, "gc", 1}, + { ENTRANCE_GROTTO_LOAD(GROTTO_GORON_CITY_OFFSET), ENTRANCE_GROTTO_EXIT(GROTTO_GORON_CITY_OFFSET), SINGLE_SCENE_INFO(SCENE_GORON_CITY), "GC Lava Grotto Entry", "GC Scrubs Grotto", ENTRANCE_GROUP_GORON_CITY, ENTRANCE_GROUP_GORON_CITY, ENTRANCE_TYPE_GROTTO, "gc,scrubs", 1}, + { ENTR_GORON_CITY_OUTSIDE_SHOP, ENTR_GORON_SHOP_0, SINGLE_SCENE_INFO(SCENE_GORON_SHOP), "Goron Shop", "GC Shop Entry", ENTRANCE_GROUP_GORON_CITY, ENTRANCE_GROUP_GORON_CITY, ENTRANCE_TYPE_INTERIOR, "gc"}, + { ENTRANCE_GROTTO_EXIT(GROTTO_GORON_CITY_OFFSET), ENTRANCE_GROTTO_LOAD(GROTTO_GORON_CITY_OFFSET), {{ SCENE_GROTTOS, 0x04 }}, "GC Scrubs Grotto", "GC Lava Grotto Entry", ENTRANCE_GROUP_GORON_CITY, ENTRANCE_GROUP_GORON_CITY, ENTRANCE_TYPE_GROTTO, "gc,scrubs"}, // Zora's River - { ENTR_HYRULE_FIELD_RIVER_EXIT, ENTR_ZORAS_RIVER_WEST_EXIT, SINGLE_SCENE_INFO(SCENE_ZORAS_RIVER), "Zora's River West Exit", "Hyrule Field River Exit", ENTRANCE_GROUP_ZORAS_RIVER, ENTRANCE_GROUP_HYRULE_FIELD, ENTRANCE_TYPE_OVERWORLD, "hf"}, - { ENTR_LOST_WOODS_UNDERWATER_SHORTCUT, ENTR_ZORAS_RIVER_UNDERWATER_SHORTCUT, SINGLE_SCENE_INFO(SCENE_ZORAS_RIVER), "ZR Underwater Shortcut", "LW Underwater Shortcut", ENTRANCE_GROUP_ZORAS_RIVER, ENTRANCE_GROUP_LOST_WOODS, ENTRANCE_TYPE_OVERWORLD, "lw"}, - { ENTR_ZORAS_DOMAIN_ENTRANCE, ENTR_ZORAS_RIVER_WATERFALL_EXIT, SINGLE_SCENE_INFO(SCENE_ZORAS_RIVER), "Zora's River Waterfall Exit", "Zora's Domain Entrance", ENTRANCE_GROUP_ZORAS_RIVER, ENTRANCE_GROUP_ZORAS_DOMAIN, ENTRANCE_TYPE_OVERWORLD}, - { ENTRANCE_GROTTO_LOAD(GROTTO_ZR_STORMS_OFFSET), ENTRANCE_GROTTO_EXIT(GROTTO_ZR_STORMS_OFFSET), SINGLE_SCENE_INFO(SCENE_ZORAS_RIVER), "ZR Rock Circle Grotto Exit", "ZR Storms Grotto", ENTRANCE_GROUP_ZORAS_RIVER, ENTRANCE_GROUP_ZORAS_RIVER, ENTRANCE_TYPE_GROTTO, "scrubs", 1}, - { ENTRANCE_GROTTO_LOAD(GROTTO_ZR_FAIRY_OFFSET), ENTRANCE_GROTTO_EXIT(GROTTO_ZR_FAIRY_OFFSET), SINGLE_SCENE_INFO(SCENE_ZORAS_RIVER), "ZR Raised Boulder Grotto Exit", "ZR Fairy Grotto", ENTRANCE_GROUP_ZORAS_RIVER, ENTRANCE_GROUP_ZORAS_RIVER, ENTRANCE_TYPE_GROTTO, "", 1}, - { ENTRANCE_GROTTO_LOAD(GROTTO_ZR_OPEN_OFFSET), ENTRANCE_GROTTO_EXIT(GROTTO_ZR_OPEN_OFFSET), SINGLE_SCENE_INFO(SCENE_ZORAS_RIVER), "ZR Raised Open Grotto Exit", "ZR Open Grotto", ENTRANCE_GROUP_ZORAS_RIVER, ENTRANCE_GROUP_ZORAS_RIVER, ENTRANCE_TYPE_GROTTO, "chest", 1}, - { ENTRANCE_GROTTO_EXIT(GROTTO_ZR_STORMS_OFFSET), ENTRANCE_GROTTO_LOAD(GROTTO_ZR_STORMS_OFFSET), {{ SCENE_GROTTOS, 0x0A }}, "ZR Storms Grotto", "ZR Rock Circle Grotto Exit", ENTRANCE_GROUP_ZORAS_RIVER, ENTRANCE_GROUP_ZORAS_RIVER, ENTRANCE_TYPE_GROTTO, "scrubs"}, - { ENTRANCE_GROTTO_EXIT(GROTTO_ZR_FAIRY_OFFSET), ENTRANCE_GROTTO_LOAD(GROTTO_ZR_FAIRY_OFFSET), {{ SCENE_FAIRYS_FOUNTAIN, 0x00 }}, "ZR Fairy Grotto", "ZR Raised Boulder Grotto Exit", ENTRANCE_GROUP_ZORAS_RIVER, ENTRANCE_GROUP_ZORAS_RIVER, ENTRANCE_TYPE_GROTTO}, - { ENTRANCE_GROTTO_EXIT(GROTTO_ZR_OPEN_OFFSET), ENTRANCE_GROTTO_LOAD(GROTTO_ZR_OPEN_OFFSET), {{ SCENE_GROTTOS, 0x00 }}, "ZR Open Grotto", "ZR Raised Open Grotto Exit", ENTRANCE_GROUP_ZORAS_RIVER, ENTRANCE_GROUP_ZORAS_RIVER, ENTRANCE_TYPE_GROTTO, "chest"}, + { ENTR_HYRULE_FIELD_RIVER_EXIT, ENTR_ZORAS_RIVER_WEST_EXIT, SINGLE_SCENE_INFO(SCENE_ZORAS_RIVER), "Zora's River Lower Exit", "Hyrule Field River Exit", ENTRANCE_GROUP_ZORAS_RIVER, ENTRANCE_GROUP_HYRULE_FIELD, ENTRANCE_TYPE_OVERWORLD, "hf"}, + { ENTR_LOST_WOODS_UNDERWATER_SHORTCUT, ENTR_ZORAS_RIVER_UNDERWATER_SHORTCUT, SINGLE_SCENE_INFO(SCENE_ZORAS_RIVER), "Zora's River Underwater Shortcut", "Lost Woods Underwater Shortcut", ENTRANCE_GROUP_ZORAS_RIVER, ENTRANCE_GROUP_LOST_WOODS, ENTRANCE_TYPE_OVERWORLD, "lw"}, + { ENTR_ZORAS_DOMAIN_ENTRANCE, ENTR_ZORAS_RIVER_WATERFALL_EXIT, SINGLE_SCENE_INFO(SCENE_ZORAS_RIVER), "Zora's River Waterfall Exit", "Zora's Domain Entrance", ENTRANCE_GROUP_ZORAS_RIVER, ENTRANCE_GROUP_ZORAS_DOMAIN, ENTRANCE_TYPE_OVERWORLD}, + { ENTRANCE_GROTTO_LOAD(GROTTO_ZR_STORMS_OFFSET), ENTRANCE_GROTTO_EXIT(GROTTO_ZR_STORMS_OFFSET), SINGLE_SCENE_INFO(SCENE_ZORAS_RIVER), "ZR Rock Circle Grotto Entry", "ZR Storms Grotto", ENTRANCE_GROUP_ZORAS_RIVER, ENTRANCE_GROUP_ZORAS_RIVER, ENTRANCE_TYPE_GROTTO, "scrubs", 1}, + { ENTRANCE_GROTTO_LOAD(GROTTO_ZR_FAIRY_OFFSET), ENTRANCE_GROTTO_EXIT(GROTTO_ZR_FAIRY_OFFSET), SINGLE_SCENE_INFO(SCENE_ZORAS_RIVER), "ZR Raised Boulder Grotto Entry", "ZR Fairy Grotto", ENTRANCE_GROUP_ZORAS_RIVER, ENTRANCE_GROUP_ZORAS_RIVER, ENTRANCE_TYPE_GROTTO, "", 1}, + { ENTRANCE_GROTTO_LOAD(GROTTO_ZR_OPEN_OFFSET), ENTRANCE_GROTTO_EXIT(GROTTO_ZR_OPEN_OFFSET), SINGLE_SCENE_INFO(SCENE_ZORAS_RIVER), "ZR Raised Open Grotto Entry", "ZR Open Grotto", ENTRANCE_GROUP_ZORAS_RIVER, ENTRANCE_GROUP_ZORAS_RIVER, ENTRANCE_TYPE_GROTTO, "chest", 1}, + { ENTRANCE_GROTTO_EXIT(GROTTO_ZR_STORMS_OFFSET), ENTRANCE_GROTTO_LOAD(GROTTO_ZR_STORMS_OFFSET), {{ SCENE_GROTTOS, 0x0A }}, "ZR Storms Grotto", "ZR Rock Circle Grotto Entry", ENTRANCE_GROUP_ZORAS_RIVER, ENTRANCE_GROUP_ZORAS_RIVER, ENTRANCE_TYPE_GROTTO, "scrubs"}, + { ENTRANCE_GROTTO_EXIT(GROTTO_ZR_FAIRY_OFFSET), ENTRANCE_GROTTO_LOAD(GROTTO_ZR_FAIRY_OFFSET), {{ SCENE_FAIRYS_FOUNTAIN, 0x00 }}, "ZR Fairy Grotto", "ZR Raised Boulder Grotto Entry", ENTRANCE_GROUP_ZORAS_RIVER, ENTRANCE_GROUP_ZORAS_RIVER, ENTRANCE_TYPE_GROTTO}, + { ENTRANCE_GROTTO_EXIT(GROTTO_ZR_OPEN_OFFSET), ENTRANCE_GROTTO_LOAD(GROTTO_ZR_OPEN_OFFSET), {{ SCENE_GROTTOS, 0x00 }}, "ZR Open Grotto", "ZR Raised Open Grotto Entry", ENTRANCE_GROUP_ZORAS_RIVER, ENTRANCE_GROUP_ZORAS_RIVER, ENTRANCE_TYPE_GROTTO, "chest"}, // Zora's Domain - { ENTR_ZORAS_RIVER_WATERFALL_EXIT, ENTR_ZORAS_DOMAIN_ENTRANCE, SINGLE_SCENE_INFO(SCENE_ZORAS_DOMAIN), "Zora's Domain Entrance", "Zora's River Waterfall Exit", ENTRANCE_GROUP_ZORAS_DOMAIN, ENTRANCE_GROUP_ZORAS_RIVER, ENTRANCE_TYPE_OVERWORLD}, - { ENTR_LAKE_HYLIA_UNDERWATER_SHORTCUT, ENTR_ZORAS_DOMAIN_UNDERWATER_SHORTCUT, SINGLE_SCENE_INFO(SCENE_ZORAS_DOMAIN), "ZD Underwater Shortcut", "LH Underwater Shortcut", ENTRANCE_GROUP_ZORAS_DOMAIN, ENTRANCE_GROUP_LAKE_HYLIA, ENTRANCE_TYPE_OVERWORLD, "lh"}, - { ENTR_ZORAS_FOUNTAIN_TUNNEL_EXIT, ENTR_ZORAS_DOMAIN_KING_ZORA_EXIT, SINGLE_SCENE_INFO(SCENE_ZORAS_DOMAIN), "Zora's Domain King Zora Exit", "Zora's Fountain Tunnel Exit", ENTRANCE_GROUP_ZORAS_DOMAIN, ENTRANCE_GROUP_ZORAS_FOUNTAIN, ENTRANCE_TYPE_OVERWORLD}, - { ENTR_ZORA_SHOP_0, ENTR_ZORAS_DOMAIN_OUTSIDE_SHOP, SINGLE_SCENE_INFO(SCENE_ZORAS_DOMAIN), "ZD Outside Shop", "Zora Shop", ENTRANCE_GROUP_ZORAS_DOMAIN, ENTRANCE_GROUP_ZORAS_DOMAIN, ENTRANCE_TYPE_INTERIOR, "", 1}, - { ENTRANCE_GROTTO_LOAD(GROTTO_ZD_STORMS_OFFSET), ENTRANCE_GROTTO_EXIT(GROTTO_ZD_STORMS_OFFSET), SINGLE_SCENE_INFO(SCENE_ZORAS_DOMAIN), "ZD Island Grotto Exit", "ZD Storms Grotto", ENTRANCE_GROUP_ZORAS_DOMAIN, ENTRANCE_GROUP_ZORAS_DOMAIN, ENTRANCE_TYPE_GROTTO, "fairy", 1}, - { ENTR_ZORAS_DOMAIN_OUTSIDE_SHOP, ENTR_ZORA_SHOP_0, SINGLE_SCENE_INFO(SCENE_ZORA_SHOP), "Zora Shop", "ZD Outside Shop", ENTRANCE_GROUP_ZORAS_DOMAIN, ENTRANCE_GROUP_ZORAS_DOMAIN, ENTRANCE_TYPE_INTERIOR}, - { ENTRANCE_GROTTO_EXIT(GROTTO_ZD_STORMS_OFFSET), ENTRANCE_GROTTO_LOAD(GROTTO_ZD_STORMS_OFFSET), {{ SCENE_FAIRYS_FOUNTAIN, 0x00 }}, "ZD Storms Grotto", "ZD Island Grotto Exit", ENTRANCE_GROUP_ZORAS_DOMAIN, ENTRANCE_GROUP_ZORAS_DOMAIN, ENTRANCE_TYPE_GROTTO, "fairy"}, + { ENTR_ZORAS_RIVER_WATERFALL_EXIT, ENTR_ZORAS_DOMAIN_ENTRANCE, SINGLE_SCENE_INFO(SCENE_ZORAS_DOMAIN), "Zora's Domain Entrance", "Zora's River Waterfall Exit", ENTRANCE_GROUP_ZORAS_DOMAIN, ENTRANCE_GROUP_ZORAS_RIVER, ENTRANCE_TYPE_OVERWORLD}, + { ENTR_LAKE_HYLIA_UNDERWATER_SHORTCUT, ENTR_ZORAS_DOMAIN_UNDERWATER_SHORTCUT, SINGLE_SCENE_INFO(SCENE_ZORAS_DOMAIN), "Zora's Domain Underwater Shortcut", "Lake Hylia Underwater Shortcut", ENTRANCE_GROUP_ZORAS_DOMAIN, ENTRANCE_GROUP_LAKE_HYLIA, ENTRANCE_TYPE_OVERWORLD, "lh"}, + { ENTR_ZORAS_FOUNTAIN_TUNNEL_EXIT, ENTR_ZORAS_DOMAIN_KING_ZORA_EXIT, SINGLE_SCENE_INFO(SCENE_ZORAS_DOMAIN), "Zora's Domain Behind King Zora", "Zora's Fountain Tunnel Exit", ENTRANCE_GROUP_ZORAS_DOMAIN, ENTRANCE_GROUP_ZORAS_FOUNTAIN, ENTRANCE_TYPE_OVERWORLD}, + { ENTR_ZORA_SHOP_0, ENTR_ZORAS_DOMAIN_OUTSIDE_SHOP, SINGLE_SCENE_INFO(SCENE_ZORAS_DOMAIN), "ZD Shop Entry", "Zora Shop", ENTRANCE_GROUP_ZORAS_DOMAIN, ENTRANCE_GROUP_ZORAS_DOMAIN, ENTRANCE_TYPE_INTERIOR, "", 1}, + { ENTRANCE_GROTTO_LOAD(GROTTO_ZD_STORMS_OFFSET), ENTRANCE_GROTTO_EXIT(GROTTO_ZD_STORMS_OFFSET), SINGLE_SCENE_INFO(SCENE_ZORAS_DOMAIN), "ZD Island Grotto Entry", "ZD Storms Grotto", ENTRANCE_GROUP_ZORAS_DOMAIN, ENTRANCE_GROUP_ZORAS_DOMAIN, ENTRANCE_TYPE_GROTTO, "fairy", 1}, + { ENTR_ZORAS_DOMAIN_OUTSIDE_SHOP, ENTR_ZORA_SHOP_0, SINGLE_SCENE_INFO(SCENE_ZORA_SHOP), "Zora Shop", "ZD Shop Entry", ENTRANCE_GROUP_ZORAS_DOMAIN, ENTRANCE_GROUP_ZORAS_DOMAIN, ENTRANCE_TYPE_INTERIOR}, + { ENTRANCE_GROTTO_EXIT(GROTTO_ZD_STORMS_OFFSET), ENTRANCE_GROTTO_LOAD(GROTTO_ZD_STORMS_OFFSET), {{ SCENE_FAIRYS_FOUNTAIN, 0x00 }}, "ZD Storms Grotto", "ZD Island Grotto Entry", ENTRANCE_GROUP_ZORAS_DOMAIN, ENTRANCE_GROUP_ZORAS_DOMAIN, ENTRANCE_TYPE_GROTTO, "fairy"}, // Zora's Fountain - { ENTR_ZORAS_DOMAIN_KING_ZORA_EXIT, ENTR_ZORAS_FOUNTAIN_TUNNEL_EXIT, SINGLE_SCENE_INFO(SCENE_ZORAS_FOUNTAIN), "Zora's Fountain Tunnel Exit", "Zora's Domain King Zora Exit", ENTRANCE_GROUP_ZORAS_FOUNTAIN, ENTRANCE_GROUP_ZORAS_DOMAIN, ENTRANCE_TYPE_OVERWORLD}, - { ENTR_GREAT_FAIRYS_FOUNTAIN_SPELLS_FARORES_ZF, ENTR_ZORAS_FOUNTAIN_OUTSIDE_GREAT_FAIRY, SINGLE_SCENE_INFO(SCENE_ZORAS_FOUNTAIN), "ZF Outside Great Fairy", "ZF Great Fairy Fountain", ENTRANCE_GROUP_ZORAS_FOUNTAIN, ENTRANCE_GROUP_ZORAS_FOUNTAIN, ENTRANCE_TYPE_INTERIOR, "", 1}, - { ENTR_JABU_JABU_ENTRANCE, ENTR_ZORAS_FOUNTAIN_OUTSIDE_JABU_JABU, SINGLE_SCENE_INFO(SCENE_ZORAS_FOUNTAIN), "ZF Outside Jabu Jabu", "Jabu Jabu's Belly Entrance", ENTRANCE_GROUP_ZORAS_FOUNTAIN, ENTRANCE_GROUP_ZORAS_FOUNTAIN, ENTRANCE_TYPE_DUNGEON, "", 1}, - { ENTR_ICE_CAVERN_ENTRANCE, ENTR_ZORAS_FOUNTAIN_OUTSIDE_ICE_CAVERN, SINGLE_SCENE_INFO(SCENE_ZORAS_FOUNTAIN), "ZF Outside Ice Cavern", "Ice Cavern Entrance", ENTRANCE_GROUP_ZORAS_FOUNTAIN, ENTRANCE_GROUP_ZORAS_FOUNTAIN, ENTRANCE_TYPE_DUNGEON, "", 1}, - { ENTR_ZORAS_FOUNTAIN_OUTSIDE_GREAT_FAIRY, ENTR_GREAT_FAIRYS_FOUNTAIN_SPELLS_FARORES_ZF, {{ SCENE_GREAT_FAIRYS_FOUNTAIN_SPELLS, 0x00 }}, "ZF Great Fairy Fountain", "ZF Outside Great Fairy", ENTRANCE_GROUP_ZORAS_FOUNTAIN, ENTRANCE_GROUP_ZORAS_FOUNTAIN, ENTRANCE_TYPE_INTERIOR}, - { ENTR_ZORAS_FOUNTAIN_OUTSIDE_JABU_JABU, ENTR_JABU_JABU_ENTRANCE, SINGLE_SCENE_INFO(SCENE_JABU_JABU), "Jabu Jabu's Belly Entrance", "ZF Outside Jabu Jabu", ENTRANCE_GROUP_ZORAS_FOUNTAIN, ENTRANCE_GROUP_ZORAS_FOUNTAIN, ENTRANCE_TYPE_DUNGEON}, - { ENTR_JABU_JABU_BOSS_ENTRANCE, ENTR_JABU_JABU_BOSS_DOOR, SINGLE_SCENE_INFO(SCENE_JABU_JABU), "Jabu Jabu's Belly Boss Door", "Barinade", ENTRANCE_GROUP_ZORAS_FOUNTAIN, ENTRANCE_GROUP_ZORAS_FOUNTAIN, ENTRANCE_TYPE_DUNGEON, "", 1}, - { ENTR_JABU_JABU_BOSS_DOOR, ENTR_JABU_JABU_BOSS_ENTRANCE, SINGLE_SCENE_INFO(SCENE_JABU_JABU_BOSS), "Barinade", "Jabu Jabu's Belly Boss Door", ENTRANCE_GROUP_ZORAS_FOUNTAIN, ENTRANCE_GROUP_ZORAS_FOUNTAIN, ENTRANCE_TYPE_DUNGEON, "", 1}, - { ENTR_ZORAS_FOUNTAIN_JABU_JABU_BLUE_WARP, -1, SINGLE_SCENE_INFO(SCENE_JABU_JABU_BOSS), "Barinade", "Jabu Jabu's Belly Blue Warp", ENTRANCE_GROUP_ZORAS_FOUNTAIN, ENTRANCE_GROUP_ZORAS_FOUNTAIN, ENTRANCE_TYPE_ONE_WAY, "bw", 1}, - { ENTR_ZORAS_FOUNTAIN_OUTSIDE_ICE_CAVERN, ENTR_ICE_CAVERN_ENTRANCE, SINGLE_SCENE_INFO(SCENE_ICE_CAVERN), "Ice Cavern Entrance", "ZF Outside Ice Cavern", ENTRANCE_GROUP_ZORAS_FOUNTAIN, ENTRANCE_GROUP_ZORAS_FOUNTAIN, ENTRANCE_TYPE_DUNGEON}, + { ENTR_ZORAS_DOMAIN_KING_ZORA_EXIT, ENTR_ZORAS_FOUNTAIN_TUNNEL_EXIT, SINGLE_SCENE_INFO(SCENE_ZORAS_FOUNTAIN), "Zora's Fountain Tunnel Exit", "Zora's Domain Behind King Zora", ENTRANCE_GROUP_ZORAS_FOUNTAIN, ENTRANCE_GROUP_ZORAS_DOMAIN, ENTRANCE_TYPE_OVERWORLD}, + { ENTR_GREAT_FAIRYS_FOUNTAIN_SPELLS_FARORES_ZF, ENTR_ZORAS_FOUNTAIN_OUTSIDE_GREAT_FAIRY, SINGLE_SCENE_INFO(SCENE_ZORAS_FOUNTAIN), "ZF Great Fairy Entry", "ZF Great Fairy Fountain", ENTRANCE_GROUP_ZORAS_FOUNTAIN, ENTRANCE_GROUP_ZORAS_FOUNTAIN, ENTRANCE_TYPE_INTERIOR, "", 1}, + { ENTR_JABU_JABU_ENTRANCE, ENTR_ZORAS_FOUNTAIN_OUTSIDE_JABU_JABU, SINGLE_SCENE_INFO(SCENE_ZORAS_FOUNTAIN), "Zora's Fountain Outside Jabu Jabu", "Jabu Jabu's Belly Entrance", ENTRANCE_GROUP_ZORAS_FOUNTAIN, ENTRANCE_GROUP_ZORAS_FOUNTAIN, ENTRANCE_TYPE_DUNGEON, "", 1}, + { ENTR_ICE_CAVERN_ENTRANCE, ENTR_ZORAS_FOUNTAIN_OUTSIDE_ICE_CAVERN, SINGLE_SCENE_INFO(SCENE_ZORAS_FOUNTAIN), "Zora's Fountain Outside Ice Cavern", "Ice Cavern Entrance", ENTRANCE_GROUP_ZORAS_FOUNTAIN, ENTRANCE_GROUP_ZORAS_FOUNTAIN, ENTRANCE_TYPE_DUNGEON, "", 1}, + { ENTR_ZORAS_FOUNTAIN_OUTSIDE_GREAT_FAIRY, ENTR_GREAT_FAIRYS_FOUNTAIN_SPELLS_FARORES_ZF, {{ SCENE_GREAT_FAIRYS_FOUNTAIN_SPELLS, 0x00 }}, "ZF Great Fairy Fountain", "ZF Great Fairy Entry", ENTRANCE_GROUP_ZORAS_FOUNTAIN, ENTRANCE_GROUP_ZORAS_FOUNTAIN, ENTRANCE_TYPE_INTERIOR}, + { ENTR_ZORAS_FOUNTAIN_OUTSIDE_JABU_JABU, ENTR_JABU_JABU_ENTRANCE, SINGLE_SCENE_INFO(SCENE_JABU_JABU), "Jabu Jabu's Belly Entrance", "Zora's Fountain Outside Jabu Jabu", ENTRANCE_GROUP_ZORAS_FOUNTAIN, ENTRANCE_GROUP_ZORAS_FOUNTAIN, ENTRANCE_TYPE_DUNGEON}, + { ENTR_JABU_JABU_BOSS_ENTRANCE, ENTR_JABU_JABU_BOSS_DOOR, SINGLE_SCENE_INFO(SCENE_JABU_JABU), "Jabu Jabu's Belly Boss Door", "Barinade", ENTRANCE_GROUP_ZORAS_FOUNTAIN, ENTRANCE_GROUP_ZORAS_FOUNTAIN, ENTRANCE_TYPE_DUNGEON, "", 1}, + { ENTR_JABU_JABU_BOSS_DOOR, ENTR_JABU_JABU_BOSS_ENTRANCE, SINGLE_SCENE_INFO(SCENE_JABU_JABU_BOSS), "Barinade", "Jabu Jabu's Belly Boss Door", ENTRANCE_GROUP_ZORAS_FOUNTAIN, ENTRANCE_GROUP_ZORAS_FOUNTAIN, ENTRANCE_TYPE_DUNGEON, "", 1}, + { ENTR_ZORAS_FOUNTAIN_JABU_JABU_BLUE_WARP, -1, SINGLE_SCENE_INFO(SCENE_JABU_JABU_BOSS), "Barinade Blue Warp", "Jabu Jabu's Belly Blue Warp", ENTRANCE_GROUP_ZORAS_FOUNTAIN, ENTRANCE_GROUP_ZORAS_FOUNTAIN, ENTRANCE_TYPE_ONE_WAY, "bw", 1}, + { ENTR_ZORAS_FOUNTAIN_OUTSIDE_ICE_CAVERN, ENTR_ICE_CAVERN_ENTRANCE, SINGLE_SCENE_INFO(SCENE_ICE_CAVERN), "Ice Cavern Entrance", "Zora's Fountain Outside Ice Cavern", ENTRANCE_GROUP_ZORAS_FOUNTAIN, ENTRANCE_GROUP_ZORAS_FOUNTAIN, ENTRANCE_TYPE_DUNGEON}, // Hyrule Field - { ENTR_LOST_WOODS_BRIDGE_WEST_EXIT, ENTR_HYRULE_FIELD_WOODED_EXIT, SINGLE_SCENE_INFO(SCENE_HYRULE_FIELD), "Hyrule Field Wooded Exit", "Lost Woods Bridge West Exit", ENTRANCE_GROUP_HYRULE_FIELD, ENTRANCE_GROUP_LOST_WOODS, ENTRANCE_TYPE_OVERWORLD, "hf,lw"}, - { ENTR_MARKET_ENTRANCE_NEAR_GUARD_EXIT, ENTR_HYRULE_FIELD_ON_BRIDGE_SPAWN, SINGLE_SCENE_INFO(SCENE_HYRULE_FIELD), "Hyrule Field Drawbridge Exit", "Market Entrance South Exit", ENTRANCE_GROUP_HYRULE_FIELD, ENTRANCE_GROUP_MARKET, ENTRANCE_TYPE_OVERWORLD, "hf"}, - { ENTR_LON_LON_RANCH_ENTRANCE, ENTR_HYRULE_FIELD_CENTER_EXIT, SINGLE_SCENE_INFO(SCENE_HYRULE_FIELD), "Hyrule Field Center Exit", "Lon Lon Ranch Entrance", ENTRANCE_GROUP_HYRULE_FIELD, ENTRANCE_GROUP_LON_LON_RANCH, ENTRANCE_TYPE_OVERWORLD, "hf,llr"}, - { ENTR_KAKARIKO_VILLAGE_FRONT_GATE, ENTR_HYRULE_FIELD_STAIRS_EXIT, SINGLE_SCENE_INFO(SCENE_HYRULE_FIELD), "Hyrule Field Stairs Exit", "Kakariko Front Gate", ENTRANCE_GROUP_HYRULE_FIELD, ENTRANCE_GROUP_KAKARIKO, ENTRANCE_TYPE_OVERWORLD, "hf"}, - { ENTR_ZORAS_RIVER_WEST_EXIT, ENTR_HYRULE_FIELD_RIVER_EXIT, SINGLE_SCENE_INFO(SCENE_HYRULE_FIELD), "Hyrule Field River Exit", "Zora's River West Exit", ENTRANCE_GROUP_HYRULE_FIELD, ENTRANCE_GROUP_ZORAS_RIVER, ENTRANCE_TYPE_OVERWORLD, "hf"}, - { ENTR_LAKE_HYLIA_NORTH_EXIT, ENTR_HYRULE_FIELD_FENCE_EXIT, SINGLE_SCENE_INFO(SCENE_HYRULE_FIELD), "Hyrule Field Fence Exit", "Lake Hylia North Exit", ENTRANCE_GROUP_HYRULE_FIELD, ENTRANCE_GROUP_LAKE_HYLIA, ENTRANCE_TYPE_OVERWORLD, "hf,lh"}, - { ENTR_GERUDO_VALLEY_EAST_EXIT, ENTR_HYRULE_FIELD_ROCKY_PATH, SINGLE_SCENE_INFO(SCENE_HYRULE_FIELD), "Hyrule Field Rocky Path", "Gerudo Valley East Exit", ENTRANCE_GROUP_HYRULE_FIELD, ENTRANCE_GROUP_GERUDO_VALLEY, ENTRANCE_TYPE_OVERWORLD, "hf"}, - { ENTRANCE_GROTTO_LOAD(GROTTO_HF_NEAR_MARKET_OFFSET), ENTRANCE_GROTTO_EXIT(GROTTO_HF_NEAR_MARKET_OFFSET), SINGLE_SCENE_INFO(SCENE_HYRULE_FIELD), "HF Near Market Boulder Grotto Exit", "HF Near Market Boulder Grotto", ENTRANCE_GROUP_HYRULE_FIELD, ENTRANCE_GROUP_HYRULE_FIELD, ENTRANCE_TYPE_GROTTO, "chest", 1}, - { ENTRANCE_GROTTO_LOAD(GROTTO_HF_NEAR_KAK_OFFSET), ENTRANCE_GROTTO_EXIT(GROTTO_HF_NEAR_KAK_OFFSET), SINGLE_SCENE_INFO(SCENE_HYRULE_FIELD), "HF Near Stairs Tree Grotto Exit", "HF Near Stairs Tree Grotto", ENTRANCE_GROUP_HYRULE_FIELD, ENTRANCE_GROUP_HYRULE_FIELD, ENTRANCE_TYPE_GROTTO, "spider", 1}, - { ENTRANCE_GROTTO_LOAD(GROTTO_HF_TEKTITE_OFFSET), ENTRANCE_GROTTO_EXIT(GROTTO_HF_TEKTITE_OFFSET), SINGLE_SCENE_INFO(SCENE_HYRULE_FIELD), "HF Northwest Tree Grotto Exit", "HF Tektite Grotto", ENTRANCE_GROUP_HYRULE_FIELD, ENTRANCE_GROUP_HYRULE_FIELD, ENTRANCE_TYPE_GROTTO, "water", 1}, - { ENTRANCE_GROTTO_LOAD(GROTTO_HF_FAIRY_OFFSET), ENTRANCE_GROTTO_EXIT(GROTTO_HF_FAIRY_OFFSET), SINGLE_SCENE_INFO(SCENE_HYRULE_FIELD), "HF Northwest Boulder Grotto Exit", "HF Fairy Grotto", ENTRANCE_GROUP_HYRULE_FIELD, ENTRANCE_GROUP_HYRULE_FIELD, ENTRANCE_TYPE_GROTTO, "", 1}, - { ENTRANCE_GROTTO_LOAD(GROTTO_HF_COW_OFFSET), ENTRANCE_GROTTO_EXIT(GROTTO_HF_COW_OFFSET), SINGLE_SCENE_INFO(SCENE_HYRULE_FIELD), "HF West Rock Circle Grotto Exit", "HF Cow Grotto", ENTRANCE_GROUP_HYRULE_FIELD, ENTRANCE_GROUP_HYRULE_FIELD, ENTRANCE_TYPE_GROTTO, "webbed", 1}, - { ENTRANCE_GROTTO_LOAD(GROTTO_HF_OPEN_OFFSET), ENTRANCE_GROTTO_EXIT(GROTTO_HF_OPEN_OFFSET), SINGLE_SCENE_INFO(SCENE_HYRULE_FIELD), "HF South Open Grotto Exit", "HF Open Grotto", ENTRANCE_GROUP_HYRULE_FIELD, ENTRANCE_GROUP_HYRULE_FIELD, ENTRANCE_TYPE_GROTTO, "chest", 1}, - { ENTRANCE_GROTTO_LOAD(GROTTO_HF_INSIDE_FENCE_OFFSET), ENTRANCE_GROTTO_EXIT(GROTTO_HF_INSIDE_FENCE_OFFSET), SINGLE_SCENE_INFO(SCENE_HYRULE_FIELD), "HF Fenced Grotto Exit", "HF Fenced Scrub Grotto", ENTRANCE_GROUP_HYRULE_FIELD, ENTRANCE_GROUP_HYRULE_FIELD, ENTRANCE_TYPE_GROTTO, "scrubs", 1}, - { ENTRANCE_GROTTO_LOAD(GROTTO_HF_SOUTHEAST_OFFSET), ENTRANCE_GROTTO_EXIT(GROTTO_HF_SOUTHEAST_OFFSET), SINGLE_SCENE_INFO(SCENE_HYRULE_FIELD), "HF Southeast Boulder Grotto Exit", "HF Southeast Grotto", ENTRANCE_GROUP_HYRULE_FIELD, ENTRANCE_GROUP_HYRULE_FIELD, ENTRANCE_TYPE_GROTTO, "chest", 1}, - { ENTRANCE_GROTTO_EXIT(GROTTO_HF_NEAR_MARKET_OFFSET), ENTRANCE_GROTTO_LOAD(GROTTO_HF_NEAR_MARKET_OFFSET), {{ SCENE_GROTTOS, 0x00 }}, "HF Near Market Boulder Grotto", "HF Near Market Boulder Grotto Exit", ENTRANCE_GROUP_HYRULE_FIELD, ENTRANCE_GROUP_HYRULE_FIELD, ENTRANCE_TYPE_GROTTO}, - { ENTRANCE_GROTTO_EXIT(GROTTO_HF_NEAR_KAK_OFFSET), ENTRANCE_GROTTO_LOAD(GROTTO_HF_NEAR_KAK_OFFSET), {{ SCENE_GROTTOS, 0x01 }}, "HF Near Kak Grotto", "Hyrule Field", ENTRANCE_GROUP_HYRULE_FIELD, ENTRANCE_GROUP_HYRULE_FIELD, ENTRANCE_TYPE_GROTTO, "spider"}, - { ENTRANCE_GROTTO_EXIT(GROTTO_HF_TEKTITE_OFFSET), ENTRANCE_GROTTO_LOAD(GROTTO_HF_TEKTITE_OFFSET), {{ SCENE_GROTTOS, 0x0B }}, "HF Tektite Grotto", "HF Northwest Tree Grotto Exit", ENTRANCE_GROUP_HYRULE_FIELD, ENTRANCE_GROUP_HYRULE_FIELD, ENTRANCE_TYPE_GROTTO, "water"}, - { ENTRANCE_GROTTO_EXIT(GROTTO_HF_FAIRY_OFFSET), ENTRANCE_GROTTO_LOAD(GROTTO_HF_FAIRY_OFFSET), {{ SCENE_FAIRYS_FOUNTAIN, 0x00 }}, "HF Fairy Grotto", "HF Northwest Boulder Grotto Exit", ENTRANCE_GROUP_HYRULE_FIELD, ENTRANCE_GROUP_HYRULE_FIELD, ENTRANCE_TYPE_GROTTO}, - { ENTRANCE_GROTTO_EXIT(GROTTO_HF_COW_OFFSET), ENTRANCE_GROTTO_LOAD(GROTTO_HF_COW_OFFSET), {{ SCENE_GROTTOS, 0x05 }}, "HF Cow Grotto", "Hyrule Field", ENTRANCE_GROUP_HYRULE_FIELD, ENTRANCE_GROUP_HYRULE_FIELD, ENTRANCE_TYPE_GROTTO, "webbed"}, - { ENTRANCE_GROTTO_EXIT(GROTTO_HF_OPEN_OFFSET), ENTRANCE_GROTTO_LOAD(GROTTO_HF_OPEN_OFFSET), {{ SCENE_GROTTOS, 0x00 }}, "HF Open Grotto", "HF South Open Grotto Exit", ENTRANCE_GROUP_HYRULE_FIELD, ENTRANCE_GROUP_HYRULE_FIELD, ENTRANCE_TYPE_GROTTO, "chest"}, - { ENTRANCE_GROTTO_EXIT(GROTTO_HF_INSIDE_FENCE_OFFSET), ENTRANCE_GROTTO_LOAD(GROTTO_HF_INSIDE_FENCE_OFFSET), {{ SCENE_GROTTOS, 0x02 }}, "HF Fenced Scrub Grotto", "HF Fenced Grotto Exit", ENTRANCE_GROUP_HYRULE_FIELD, ENTRANCE_GROUP_HYRULE_FIELD, ENTRANCE_TYPE_GROTTO, "srubs"}, - { ENTRANCE_GROTTO_EXIT(GROTTO_HF_SOUTHEAST_OFFSET), ENTRANCE_GROTTO_LOAD(GROTTO_HF_SOUTHEAST_OFFSET), {{ SCENE_GROTTOS, 0x00 }}, "HF Southeast Grotto", "HF Southeast Boulder Grotto Exit", ENTRANCE_GROUP_HYRULE_FIELD, ENTRANCE_GROUP_HYRULE_FIELD, ENTRANCE_TYPE_GROTTO, "chest"}, + { ENTR_LOST_WOODS_BRIDGE_WEST_EXIT, ENTR_HYRULE_FIELD_WOODED_EXIT, SINGLE_SCENE_INFO(SCENE_HYRULE_FIELD), "Hyrule Field Wooded Exit", "Lost Woods Bridge West Exit", ENTRANCE_GROUP_HYRULE_FIELD, ENTRANCE_GROUP_LOST_WOODS, ENTRANCE_TYPE_OVERWORLD, "hf,lw"}, + { ENTR_MARKET_ENTRANCE_NEAR_GUARD_EXIT, ENTR_HYRULE_FIELD_ON_BRIDGE_SPAWN, SINGLE_SCENE_INFO(SCENE_HYRULE_FIELD), "Hyrule Field Drawbridge Exit", "Market Entrance South Exit", ENTRANCE_GROUP_HYRULE_FIELD, ENTRANCE_GROUP_MARKET, ENTRANCE_TYPE_OVERWORLD, "hf"}, + { ENTR_LON_LON_RANCH_ENTRANCE, ENTR_HYRULE_FIELD_CENTER_EXIT, SINGLE_SCENE_INFO(SCENE_HYRULE_FIELD), "Hyrule Field Center Exit", "Lon Lon Ranch Entrance", ENTRANCE_GROUP_HYRULE_FIELD, ENTRANCE_GROUP_LON_LON_RANCH, ENTRANCE_TYPE_OVERWORLD, "hf,llr"}, + { ENTR_KAKARIKO_VILLAGE_FRONT_GATE, ENTR_HYRULE_FIELD_STAIRS_EXIT, SINGLE_SCENE_INFO(SCENE_HYRULE_FIELD), "Hyrule Field Stairs Exit", "Kakariko Front Gate", ENTRANCE_GROUP_HYRULE_FIELD, ENTRANCE_GROUP_KAKARIKO, ENTRANCE_TYPE_OVERWORLD, "hf"}, + { ENTR_ZORAS_RIVER_WEST_EXIT, ENTR_HYRULE_FIELD_RIVER_EXIT, SINGLE_SCENE_INFO(SCENE_HYRULE_FIELD), "Hyrule Field River Exit", "Zora's River Lower Exit", ENTRANCE_GROUP_HYRULE_FIELD, ENTRANCE_GROUP_ZORAS_RIVER, ENTRANCE_TYPE_OVERWORLD, "hf"}, + { ENTR_LAKE_HYLIA_NORTH_EXIT, ENTR_HYRULE_FIELD_FENCE_EXIT, SINGLE_SCENE_INFO(SCENE_HYRULE_FIELD), "Hyrule Field Fence Exit", "Lake Hylia North Exit", ENTRANCE_GROUP_HYRULE_FIELD, ENTRANCE_GROUP_LAKE_HYLIA, ENTRANCE_TYPE_OVERWORLD, "hf,lh"}, + { ENTR_GERUDO_VALLEY_EAST_EXIT, ENTR_HYRULE_FIELD_ROCKY_PATH, SINGLE_SCENE_INFO(SCENE_HYRULE_FIELD), "Hyrule Field Rocky Path", "Gerudo Valley East Exit", ENTRANCE_GROUP_HYRULE_FIELD, ENTRANCE_GROUP_GERUDO_VALLEY, ENTRANCE_TYPE_OVERWORLD, "hf"}, + { ENTRANCE_GROTTO_LOAD(GROTTO_HF_NEAR_MARKET_OFFSET), ENTRANCE_GROTTO_EXIT(GROTTO_HF_NEAR_MARKET_OFFSET), SINGLE_SCENE_INFO(SCENE_HYRULE_FIELD), "HF Near Market Boulder Grotto Entry", "HF Near Market Boulder Grotto", ENTRANCE_GROUP_HYRULE_FIELD, ENTRANCE_GROUP_HYRULE_FIELD, ENTRANCE_TYPE_GROTTO, "chest", 1}, + { ENTRANCE_GROTTO_LOAD(GROTTO_HF_NEAR_KAK_OFFSET), ENTRANCE_GROTTO_EXIT(GROTTO_HF_NEAR_KAK_OFFSET), SINGLE_SCENE_INFO(SCENE_HYRULE_FIELD), "HF Near Stairs Tree Grotto Entry", "HF Near Stairs Tree Grotto", ENTRANCE_GROUP_HYRULE_FIELD, ENTRANCE_GROUP_HYRULE_FIELD, ENTRANCE_TYPE_GROTTO, "spider", 1}, + { ENTRANCE_GROTTO_LOAD(GROTTO_HF_TEKTITE_OFFSET), ENTRANCE_GROTTO_EXIT(GROTTO_HF_TEKTITE_OFFSET), SINGLE_SCENE_INFO(SCENE_HYRULE_FIELD), "HF Northwest Tree Grotto Entry", "HF Tektite Grotto", ENTRANCE_GROUP_HYRULE_FIELD, ENTRANCE_GROUP_HYRULE_FIELD, ENTRANCE_TYPE_GROTTO, "water", 1}, + { ENTRANCE_GROTTO_LOAD(GROTTO_HF_FAIRY_OFFSET), ENTRANCE_GROTTO_EXIT(GROTTO_HF_FAIRY_OFFSET), SINGLE_SCENE_INFO(SCENE_HYRULE_FIELD), "HF Northwest Boulder Grotto Entry", "HF Fairy Grotto", ENTRANCE_GROUP_HYRULE_FIELD, ENTRANCE_GROUP_HYRULE_FIELD, ENTRANCE_TYPE_GROTTO, "", 1}, + { ENTRANCE_GROTTO_LOAD(GROTTO_HF_COW_OFFSET), ENTRANCE_GROTTO_EXIT(GROTTO_HF_COW_OFFSET), SINGLE_SCENE_INFO(SCENE_HYRULE_FIELD), "HF West Rock Circle Grotto Entry", "HF Cow Grotto", ENTRANCE_GROUP_HYRULE_FIELD, ENTRANCE_GROUP_HYRULE_FIELD, ENTRANCE_TYPE_GROTTO, "webbed", 1}, + { ENTRANCE_GROTTO_LOAD(GROTTO_HF_OPEN_OFFSET), ENTRANCE_GROTTO_EXIT(GROTTO_HF_OPEN_OFFSET), SINGLE_SCENE_INFO(SCENE_HYRULE_FIELD), "HF South Open Grotto Entry", "HF Open Grotto", ENTRANCE_GROUP_HYRULE_FIELD, ENTRANCE_GROUP_HYRULE_FIELD, ENTRANCE_TYPE_GROTTO, "chest", 1}, + { ENTRANCE_GROTTO_LOAD(GROTTO_HF_INSIDE_FENCE_OFFSET), ENTRANCE_GROTTO_EXIT(GROTTO_HF_INSIDE_FENCE_OFFSET), SINGLE_SCENE_INFO(SCENE_HYRULE_FIELD), "HF Fenced Grotto Entry", "HF Fenced Scrub Grotto", ENTRANCE_GROUP_HYRULE_FIELD, ENTRANCE_GROUP_HYRULE_FIELD, ENTRANCE_TYPE_GROTTO, "scrubs", 1}, + { ENTRANCE_GROTTO_LOAD(GROTTO_HF_SOUTHEAST_OFFSET), ENTRANCE_GROTTO_EXIT(GROTTO_HF_SOUTHEAST_OFFSET), SINGLE_SCENE_INFO(SCENE_HYRULE_FIELD), "HF Southeast Boulder Grotto Entry", "HF Southeast Grotto", ENTRANCE_GROUP_HYRULE_FIELD, ENTRANCE_GROUP_HYRULE_FIELD, ENTRANCE_TYPE_GROTTO, "chest", 1}, + { ENTRANCE_GROTTO_EXIT(GROTTO_HF_NEAR_MARKET_OFFSET), ENTRANCE_GROTTO_LOAD(GROTTO_HF_NEAR_MARKET_OFFSET), {{ SCENE_GROTTOS, 0x00 }}, "HF Near Market Boulder Grotto", "HF Near Market Boulder Grotto Entry", ENTRANCE_GROUP_HYRULE_FIELD, ENTRANCE_GROUP_HYRULE_FIELD, ENTRANCE_TYPE_GROTTO}, + { ENTRANCE_GROTTO_EXIT(GROTTO_HF_NEAR_KAK_OFFSET), ENTRANCE_GROTTO_LOAD(GROTTO_HF_NEAR_KAK_OFFSET), {{ SCENE_GROTTOS, 0x01 }}, "HF Near Stairs Tree Grotto", "HF Near Stairs Tree Grotto Entry", ENTRANCE_GROUP_HYRULE_FIELD, ENTRANCE_GROUP_HYRULE_FIELD, ENTRANCE_TYPE_GROTTO, "spider"}, + { ENTRANCE_GROTTO_EXIT(GROTTO_HF_TEKTITE_OFFSET), ENTRANCE_GROTTO_LOAD(GROTTO_HF_TEKTITE_OFFSET), {{ SCENE_GROTTOS, 0x0B }}, "HF Tektite Grotto", "HF Northwest Tree Grotto Entry", ENTRANCE_GROUP_HYRULE_FIELD, ENTRANCE_GROUP_HYRULE_FIELD, ENTRANCE_TYPE_GROTTO, "water"}, + { ENTRANCE_GROTTO_EXIT(GROTTO_HF_FAIRY_OFFSET), ENTRANCE_GROTTO_LOAD(GROTTO_HF_FAIRY_OFFSET), {{ SCENE_FAIRYS_FOUNTAIN, 0x00 }}, "HF Fairy Grotto", "HF Northwest Boulder Grotto Entry", ENTRANCE_GROUP_HYRULE_FIELD, ENTRANCE_GROUP_HYRULE_FIELD, ENTRANCE_TYPE_GROTTO}, + { ENTRANCE_GROTTO_EXIT(GROTTO_HF_COW_OFFSET), ENTRANCE_GROTTO_LOAD(GROTTO_HF_COW_OFFSET), {{ SCENE_GROTTOS, 0x05 }}, "HF Cow Grotto", "HF West Rock Circle Grotto Entry", ENTRANCE_GROUP_HYRULE_FIELD, ENTRANCE_GROUP_HYRULE_FIELD, ENTRANCE_TYPE_GROTTO, "webbed"}, + { ENTRANCE_GROTTO_EXIT(GROTTO_HF_OPEN_OFFSET), ENTRANCE_GROTTO_LOAD(GROTTO_HF_OPEN_OFFSET), {{ SCENE_GROTTOS, 0x00 }}, "HF Open Grotto", "HF South Open Grotto Entry", ENTRANCE_GROUP_HYRULE_FIELD, ENTRANCE_GROUP_HYRULE_FIELD, ENTRANCE_TYPE_GROTTO, "chest"}, + { ENTRANCE_GROTTO_EXIT(GROTTO_HF_INSIDE_FENCE_OFFSET), ENTRANCE_GROTTO_LOAD(GROTTO_HF_INSIDE_FENCE_OFFSET), {{ SCENE_GROTTOS, 0x02 }}, "HF Fenced Scrub Grotto", "HF Fenced Grotto Entry", ENTRANCE_GROUP_HYRULE_FIELD, ENTRANCE_GROUP_HYRULE_FIELD, ENTRANCE_TYPE_GROTTO, "srubs"}, + { ENTRANCE_GROTTO_EXIT(GROTTO_HF_SOUTHEAST_OFFSET), ENTRANCE_GROTTO_LOAD(GROTTO_HF_SOUTHEAST_OFFSET), {{ SCENE_GROTTOS, 0x00 }}, "HF Southeast Grotto", "HF Southeast Boulder Grotto Entry", ENTRANCE_GROUP_HYRULE_FIELD, ENTRANCE_GROUP_HYRULE_FIELD, ENTRANCE_TYPE_GROTTO, "chest"}, // Lon Lon Ranch - { ENTR_HYRULE_FIELD_CENTER_EXIT, ENTR_LON_LON_RANCH_ENTRANCE, SINGLE_SCENE_INFO(SCENE_LON_LON_RANCH), "Lon Lon Ranch Entrance", "Hyrule Field Center Exit", ENTRANCE_GROUP_LON_LON_RANCH, ENTRANCE_GROUP_HYRULE_FIELD, ENTRANCE_TYPE_OVERWORLD, "hf"}, - { ENTR_LON_LON_BUILDINGS_TALONS_HOUSE, ENTR_LON_LON_RANCH_OUTSIDE_TALONS_HOUSE, SINGLE_SCENE_INFO(SCENE_LON_LON_RANCH), "LLR Outside Talon's House", "Talon's House", ENTRANCE_GROUP_LON_LON_RANCH, ENTRANCE_GROUP_LON_LON_RANCH, ENTRANCE_TYPE_INTERIOR, "llr", 1}, - { ENTR_STABLE_0, ENTR_LON_LON_RANCH_OUTSIDE_STABLES, SINGLE_SCENE_INFO(SCENE_LON_LON_RANCH), "LLR Outside Stables", "LLR Stables", ENTRANCE_GROUP_LON_LON_RANCH, ENTRANCE_GROUP_LON_LON_RANCH, ENTRANCE_TYPE_INTERIOR, "cow", 1}, - { ENTR_LON_LON_BUILDINGS_TOWER, ENTR_LON_LON_RANCH_OUTSIDE_TOWER, SINGLE_SCENE_INFO(SCENE_LON_LON_RANCH), "LLR Outside Tower", "LLR Tower", ENTRANCE_GROUP_LON_LON_RANCH, ENTRANCE_GROUP_LON_LON_RANCH, ENTRANCE_TYPE_INTERIOR, "cow", 1}, - { ENTRANCE_GROTTO_LOAD(GROTTO_LLR_OFFSET), ENTRANCE_GROTTO_EXIT(GROTTO_LLR_OFFSET), SINGLE_SCENE_INFO(SCENE_LON_LON_RANCH), "LLR Grotto Exit", "LLR Scrubs Grotto", ENTRANCE_GROUP_LON_LON_RANCH, ENTRANCE_GROUP_LON_LON_RANCH, ENTRANCE_TYPE_GROTTO, "scrubs", 1}, - { ENTR_LON_LON_RANCH_OUTSIDE_TALONS_HOUSE, ENTR_LON_LON_BUILDINGS_TALONS_HOUSE, {{ SCENE_LON_LON_BUILDINGS, 0x00 }}, "Talon's House", "LLR Outside Talon's House", ENTRANCE_GROUP_LON_LON_RANCH, ENTRANCE_GROUP_LON_LON_RANCH, ENTRANCE_TYPE_INTERIOR, "llr"}, - { ENTR_LON_LON_RANCH_OUTSIDE_STABLES, ENTR_STABLE_0, SINGLE_SCENE_INFO(SCENE_STABLE), "LLR Stables", "LLR Outside Stables", ENTRANCE_GROUP_LON_LON_RANCH, ENTRANCE_GROUP_LON_LON_RANCH, ENTRANCE_TYPE_INTERIOR, "cow"}, - { ENTR_LON_LON_RANCH_OUTSIDE_TOWER, ENTR_LON_LON_BUILDINGS_TOWER, {{ SCENE_LON_LON_BUILDINGS, 0x01 }}, "LLR Tower", "Lon Lon Ranch", ENTRANCE_GROUP_LON_LON_RANCH, ENTRANCE_GROUP_LON_LON_RANCH, ENTRANCE_TYPE_INTERIOR, "cow"}, - { ENTRANCE_GROTTO_EXIT(GROTTO_LLR_OFFSET), ENTRANCE_GROTTO_LOAD(GROTTO_LLR_OFFSET), {{ SCENE_GROTTOS, 0x04 }}, "LLR Scrubs Grotto", "LLR Grotto Exit", ENTRANCE_GROUP_LON_LON_RANCH, ENTRANCE_GROUP_LON_LON_RANCH, ENTRANCE_TYPE_GROTTO, "scrubs"}, + { ENTR_HYRULE_FIELD_CENTER_EXIT, ENTR_LON_LON_RANCH_ENTRANCE, SINGLE_SCENE_INFO(SCENE_LON_LON_RANCH), "Lon Lon Ranch Entrance", "Hyrule Field Center Exit", ENTRANCE_GROUP_LON_LON_RANCH, ENTRANCE_GROUP_HYRULE_FIELD, ENTRANCE_TYPE_OVERWORLD, "hf"}, + { ENTR_LON_LON_BUILDINGS_TALONS_HOUSE, ENTR_LON_LON_RANCH_OUTSIDE_TALONS_HOUSE, SINGLE_SCENE_INFO(SCENE_LON_LON_RANCH), "LLR Talon's House Entry", "Talon's House", ENTRANCE_GROUP_LON_LON_RANCH, ENTRANCE_GROUP_LON_LON_RANCH, ENTRANCE_TYPE_INTERIOR, "llr", 1}, + { ENTR_STABLE_0, ENTR_LON_LON_RANCH_OUTSIDE_STABLES, SINGLE_SCENE_INFO(SCENE_LON_LON_RANCH), "LLR Stables Entry", "LLR Stables", ENTRANCE_GROUP_LON_LON_RANCH, ENTRANCE_GROUP_LON_LON_RANCH, ENTRANCE_TYPE_INTERIOR, "cow", 1}, + { ENTR_LON_LON_BUILDINGS_TOWER, ENTR_LON_LON_RANCH_OUTSIDE_TOWER, SINGLE_SCENE_INFO(SCENE_LON_LON_RANCH), "LLR Tower Entry", "LLR Tower", ENTRANCE_GROUP_LON_LON_RANCH, ENTRANCE_GROUP_LON_LON_RANCH, ENTRANCE_TYPE_INTERIOR, "cow", 1}, + { ENTRANCE_GROTTO_LOAD(GROTTO_LLR_OFFSET), ENTRANCE_GROTTO_EXIT(GROTTO_LLR_OFFSET), SINGLE_SCENE_INFO(SCENE_LON_LON_RANCH), "LLR Grotto Entry", "LLR Scrubs Grotto", ENTRANCE_GROUP_LON_LON_RANCH, ENTRANCE_GROUP_LON_LON_RANCH, ENTRANCE_TYPE_GROTTO, "scrubs", 1}, + { ENTR_LON_LON_RANCH_OUTSIDE_TALONS_HOUSE, ENTR_LON_LON_BUILDINGS_TALONS_HOUSE, {{ SCENE_LON_LON_BUILDINGS, 0x00 }}, "Talon's House", "LLR Talon's House Entry", ENTRANCE_GROUP_LON_LON_RANCH, ENTRANCE_GROUP_LON_LON_RANCH, ENTRANCE_TYPE_INTERIOR, "llr"}, + { ENTR_LON_LON_RANCH_OUTSIDE_STABLES, ENTR_STABLE_0, SINGLE_SCENE_INFO(SCENE_STABLE), "LLR Stables", "LLR Stables Entry", ENTRANCE_GROUP_LON_LON_RANCH, ENTRANCE_GROUP_LON_LON_RANCH, ENTRANCE_TYPE_INTERIOR, "cow"}, + { ENTR_LON_LON_RANCH_OUTSIDE_TOWER, ENTR_LON_LON_BUILDINGS_TOWER, {{ SCENE_LON_LON_BUILDINGS, 0x01 }}, "LLR Tower", "LLR Tower Entry", ENTRANCE_GROUP_LON_LON_RANCH, ENTRANCE_GROUP_LON_LON_RANCH, ENTRANCE_TYPE_INTERIOR, "cow"}, + { ENTRANCE_GROTTO_EXIT(GROTTO_LLR_OFFSET), ENTRANCE_GROTTO_LOAD(GROTTO_LLR_OFFSET), {{ SCENE_GROTTOS, 0x04 }}, "LLR Scrubs Grotto", "LLR Grotto Entry", ENTRANCE_GROUP_LON_LON_RANCH, ENTRANCE_GROUP_LON_LON_RANCH, ENTRANCE_TYPE_GROTTO, "scrubs"}, // Lake Hylia - { ENTR_HYRULE_FIELD_FENCE_EXIT, ENTR_LAKE_HYLIA_NORTH_EXIT, SINGLE_SCENE_INFO(SCENE_LAKE_HYLIA), "Lake Hylia North Exit", "Hyrule Field Fenced Exit", ENTRANCE_GROUP_LAKE_HYLIA, ENTRANCE_GROUP_HYRULE_FIELD, ENTRANCE_TYPE_OVERWORLD, "lh"}, - { ENTR_ZORAS_DOMAIN_UNDERWATER_SHORTCUT, ENTR_LAKE_HYLIA_UNDERWATER_SHORTCUT, SINGLE_SCENE_INFO(SCENE_LAKE_HYLIA), "LH Underwater Shortcut", "ZD Underwater Shortcut", ENTRANCE_GROUP_LAKE_HYLIA, ENTRANCE_GROUP_ZORAS_DOMAIN, ENTRANCE_TYPE_OVERWORLD, "lh"}, - { ENTR_LAKESIDE_LABORATORY_0, ENTR_LAKE_HYLIA_OUTSIDE_LAB, SINGLE_SCENE_INFO(SCENE_LAKE_HYLIA), "LH Outside Lab", "LH Lab", ENTRANCE_GROUP_LAKE_HYLIA, ENTRANCE_GROUP_LAKE_HYLIA, ENTRANCE_TYPE_INTERIOR, "lh", 1}, - { ENTR_FISHING_POND_0, ENTR_LAKE_HYLIA_OUTSIDE_FISHING_POND, SINGLE_SCENE_INFO(SCENE_LAKE_HYLIA), "LH Outside Fishing Pond", "Fishing Pond", ENTRANCE_GROUP_LAKE_HYLIA, ENTRANCE_GROUP_LAKE_HYLIA, ENTRANCE_TYPE_INTERIOR, "lh", 1}, - { ENTRANCE_GROTTO_LOAD(GROTTO_LH_OFFSET), ENTRANCE_GROTTO_EXIT(GROTTO_LH_OFFSET), SINGLE_SCENE_INFO(SCENE_LAKE_HYLIA), "LH Grave Grotto Exit", "LH Grotto", ENTRANCE_GROUP_LAKE_HYLIA, ENTRANCE_GROUP_LAKE_HYLIA, ENTRANCE_TYPE_GROTTO, "scrubs", 1}, - { ENTR_WATER_TEMPLE_ENTRANCE, ENTR_LAKE_HYLIA_OUTSIDE_TEMPLE, SINGLE_SCENE_INFO(SCENE_LAKE_HYLIA), "Lake Hylia Outside Temple", "Water Temple Entrance", ENTRANCE_GROUP_LAKE_HYLIA, ENTRANCE_GROUP_LAKE_HYLIA, ENTRANCE_TYPE_DUNGEON, "lh", 1}, - { ENTR_LAKE_HYLIA_OUTSIDE_LAB, ENTR_LAKESIDE_LABORATORY_0, SINGLE_SCENE_INFO(SCENE_LAKESIDE_LABORATORY), "LH Lab", "LH Outside Lab", ENTRANCE_GROUP_LAKE_HYLIA, ENTRANCE_GROUP_LAKE_HYLIA, ENTRANCE_TYPE_INTERIOR, "lh"}, - { ENTR_LAKE_HYLIA_OUTSIDE_FISHING_POND, ENTR_FISHING_POND_0, SINGLE_SCENE_INFO(SCENE_FISHING_POND), "Fishing Pond", "LH Outside Fishing Pond", ENTRANCE_GROUP_LAKE_HYLIA, ENTRANCE_GROUP_LAKE_HYLIA, ENTRANCE_TYPE_INTERIOR, "lh"}, - { ENTRANCE_GROTTO_EXIT(GROTTO_LH_OFFSET), ENTRANCE_GROTTO_LOAD(GROTTO_LH_OFFSET), {{ SCENE_GROTTOS, 0x04 }}, "LH Grotto", "Lake Hylia", ENTRANCE_GROUP_LAKE_HYLIA, ENTRANCE_GROUP_LAKE_HYLIA, ENTRANCE_TYPE_GROTTO, "lh,scrubs"}, - { ENTR_LAKE_HYLIA_OUTSIDE_TEMPLE, ENTR_WATER_TEMPLE_ENTRANCE, SINGLE_SCENE_INFO(SCENE_WATER_TEMPLE), "Water Temple Entrance", "Lake Hylia Outside Temple", ENTRANCE_GROUP_LAKE_HYLIA, ENTRANCE_GROUP_LAKE_HYLIA, ENTRANCE_TYPE_DUNGEON, "lh"}, - { ENTR_WATER_TEMPLE_BOSS_ENTRANCE, ENTR_WATER_TEMPLE_BOSS_DOOR, SINGLE_SCENE_INFO(SCENE_WATER_TEMPLE), "Water Temple Boss Door", "Morpha", ENTRANCE_GROUP_LAKE_HYLIA, ENTRANCE_GROUP_LAKE_HYLIA, ENTRANCE_TYPE_DUNGEON, "lh", 1}, - { ENTR_WATER_TEMPLE_BOSS_DOOR, ENTR_WATER_TEMPLE_BOSS_ENTRANCE, SINGLE_SCENE_INFO(SCENE_WATER_TEMPLE_BOSS), "Morpha", "Water Temple Boss Door", ENTRANCE_GROUP_LAKE_HYLIA, ENTRANCE_GROUP_LAKE_HYLIA, ENTRANCE_TYPE_DUNGEON, "lh", 1}, - { ENTR_LAKE_HYLIA_WATER_TEMPLE_BLUE_WARP, -1, SINGLE_SCENE_INFO(SCENE_WATER_TEMPLE_BOSS), "Morpha", "Water Temple Blue Warp", ENTRANCE_GROUP_LAKE_HYLIA, ENTRANCE_GROUP_LAKE_HYLIA, ENTRANCE_TYPE_ONE_WAY, "lh,bw", 1}, + { ENTR_HYRULE_FIELD_FENCE_EXIT, ENTR_LAKE_HYLIA_NORTH_EXIT, SINGLE_SCENE_INFO(SCENE_LAKE_HYLIA), "Lake Hylia North Exit", "Hyrule Field Fence Exit", ENTRANCE_GROUP_LAKE_HYLIA, ENTRANCE_GROUP_HYRULE_FIELD, ENTRANCE_TYPE_OVERWORLD, "lh"}, + { ENTR_ZORAS_DOMAIN_UNDERWATER_SHORTCUT, ENTR_LAKE_HYLIA_UNDERWATER_SHORTCUT, SINGLE_SCENE_INFO(SCENE_LAKE_HYLIA), "Lake Hylia Underwater Shortcut", "Zora's Domain Underwater Shortcut", ENTRANCE_GROUP_LAKE_HYLIA, ENTRANCE_GROUP_ZORAS_DOMAIN, ENTRANCE_TYPE_OVERWORLD, "lh"}, + { ENTR_LAKESIDE_LABORATORY_0, ENTR_LAKE_HYLIA_OUTSIDE_LAB, SINGLE_SCENE_INFO(SCENE_LAKE_HYLIA), "LH Lab Entry", "LH Lab", ENTRANCE_GROUP_LAKE_HYLIA, ENTRANCE_GROUP_LAKE_HYLIA, ENTRANCE_TYPE_INTERIOR, "lh", 1}, + { ENTR_FISHING_POND_0, ENTR_LAKE_HYLIA_OUTSIDE_FISHING_POND, SINGLE_SCENE_INFO(SCENE_LAKE_HYLIA), "LH Fishing Pond Entry", "Fishing Pond", ENTRANCE_GROUP_LAKE_HYLIA, ENTRANCE_GROUP_LAKE_HYLIA, ENTRANCE_TYPE_INTERIOR, "lh", 1}, + { ENTRANCE_GROTTO_LOAD(GROTTO_LH_OFFSET), ENTRANCE_GROTTO_EXIT(GROTTO_LH_OFFSET), SINGLE_SCENE_INFO(SCENE_LAKE_HYLIA), "LH Grave Grotto Entry", "LH Grotto", ENTRANCE_GROUP_LAKE_HYLIA, ENTRANCE_GROUP_LAKE_HYLIA, ENTRANCE_TYPE_GROTTO, "scrubs", 1}, + { ENTR_WATER_TEMPLE_ENTRANCE, ENTR_LAKE_HYLIA_OUTSIDE_TEMPLE, SINGLE_SCENE_INFO(SCENE_LAKE_HYLIA), "Lake Hylia Outside Temple", "Water Temple Entrance", ENTRANCE_GROUP_LAKE_HYLIA, ENTRANCE_GROUP_LAKE_HYLIA, ENTRANCE_TYPE_DUNGEON, "lh", 1}, + { ENTR_LAKE_HYLIA_OUTSIDE_LAB, ENTR_LAKESIDE_LABORATORY_0, SINGLE_SCENE_INFO(SCENE_LAKESIDE_LABORATORY), "LH Lab", "LH Lab Entry", ENTRANCE_GROUP_LAKE_HYLIA, ENTRANCE_GROUP_LAKE_HYLIA, ENTRANCE_TYPE_INTERIOR, "lh"}, + { ENTR_LAKE_HYLIA_OUTSIDE_FISHING_POND, ENTR_FISHING_POND_0, SINGLE_SCENE_INFO(SCENE_FISHING_POND), "Fishing Pond", "LH Fishing Pond Entry", ENTRANCE_GROUP_LAKE_HYLIA, ENTRANCE_GROUP_LAKE_HYLIA, ENTRANCE_TYPE_INTERIOR, "lh"}, + { ENTRANCE_GROTTO_EXIT(GROTTO_LH_OFFSET), ENTRANCE_GROTTO_LOAD(GROTTO_LH_OFFSET), {{ SCENE_GROTTOS, 0x04 }}, "LH Grotto", "LH Grave Grotto Entry", ENTRANCE_GROUP_LAKE_HYLIA, ENTRANCE_GROUP_LAKE_HYLIA, ENTRANCE_TYPE_GROTTO, "lh,scrubs"}, + { ENTR_LAKE_HYLIA_OUTSIDE_TEMPLE, ENTR_WATER_TEMPLE_ENTRANCE, SINGLE_SCENE_INFO(SCENE_WATER_TEMPLE), "Water Temple Entrance", "Lake Hylia Outside Temple", ENTRANCE_GROUP_LAKE_HYLIA, ENTRANCE_GROUP_LAKE_HYLIA, ENTRANCE_TYPE_DUNGEON, "lh"}, + { ENTR_WATER_TEMPLE_BOSS_ENTRANCE, ENTR_WATER_TEMPLE_BOSS_DOOR, SINGLE_SCENE_INFO(SCENE_WATER_TEMPLE), "Water Temple Boss Door", "Morpha", ENTRANCE_GROUP_LAKE_HYLIA, ENTRANCE_GROUP_LAKE_HYLIA, ENTRANCE_TYPE_DUNGEON, "lh", 1}, + { ENTR_WATER_TEMPLE_BOSS_DOOR, ENTR_WATER_TEMPLE_BOSS_ENTRANCE, SINGLE_SCENE_INFO(SCENE_WATER_TEMPLE_BOSS), "Morpha", "Water Temple Boss Door", ENTRANCE_GROUP_LAKE_HYLIA, ENTRANCE_GROUP_LAKE_HYLIA, ENTRANCE_TYPE_DUNGEON, "lh", 1}, + { ENTR_LAKE_HYLIA_WATER_TEMPLE_BLUE_WARP, -1, SINGLE_SCENE_INFO(SCENE_WATER_TEMPLE_BOSS), "Morpha Blue Warp", "Water Temple Blue Warp", ENTRANCE_GROUP_LAKE_HYLIA, ENTRANCE_GROUP_LAKE_HYLIA, ENTRANCE_TYPE_ONE_WAY, "lh,bw", 1}, // Gerudo Area { ENTR_HYRULE_FIELD_ROCKY_PATH, ENTR_GERUDO_VALLEY_EAST_EXIT, SINGLE_SCENE_INFO(SCENE_GERUDO_VALLEY), "Gerudo Valley East Exit", "Hyrule Field Rocky Path", ENTRANCE_GROUP_GERUDO_VALLEY, ENTRANCE_GROUP_HYRULE_FIELD, ENTRANCE_TYPE_OVERWORLD, "hf"}, { ENTR_GERUDOS_FORTRESS_EAST_EXIT, ENTR_GERUDO_VALLEY_WEST_EXIT, SINGLE_SCENE_INFO(SCENE_GERUDO_VALLEY), "Gerudo Valley West Exit", "Gerudo Fortress East Exit", ENTRANCE_GROUP_GERUDO_VALLEY, ENTRANCE_GROUP_GERUDO_VALLEY, ENTRANCE_TYPE_OVERWORLD, "gerudo fortress"}, { ENTR_LAKE_HYLIA_RIVER_EXIT, -1, SINGLE_SCENE_INFO(SCENE_GERUDO_VALLEY), "Gerudo Valley River Exit", "Lake Hylia River Exit", ENTRANCE_GROUP_GERUDO_VALLEY, ENTRANCE_GROUP_LAKE_HYLIA, ENTRANCE_TYPE_OVERWORLD, "lh"}, - { ENTR_CARPENTERS_TENT_0, ENTR_GERUDO_VALLEY_OUTSIDE_TENT, SINGLE_SCENE_INFO(SCENE_GERUDO_VALLEY), "GV Outside Carpenters' Tent", "Carpenters' Tent", ENTRANCE_GROUP_GERUDO_VALLEY, ENTRANCE_GROUP_GERUDO_VALLEY, ENTRANCE_TYPE_INTERIOR, "", 1}, - { ENTRANCE_GROTTO_LOAD(GROTTO_GV_OCTOROK_OFFSET), ENTRANCE_GROTTO_EXIT(GROTTO_GV_OCTOROK_OFFSET), SINGLE_SCENE_INFO(SCENE_GERUDO_VALLEY), "GV Silver Rock Grotto Exit", "GV Octorok Grotto", ENTRANCE_GROUP_GERUDO_VALLEY, ENTRANCE_GROUP_GERUDO_VALLEY, ENTRANCE_TYPE_GROTTO, "", 1}, - { ENTRANCE_GROTTO_LOAD(GROTTO_GV_STORMS_OFFSET), ENTRANCE_GROTTO_EXIT(GROTTO_GV_STORMS_OFFSET), SINGLE_SCENE_INFO(SCENE_GERUDO_VALLEY), "GV Behind Tent Grotto Exit", "GV Storms Grotto", ENTRANCE_GROUP_GERUDO_VALLEY, ENTRANCE_GROUP_GERUDO_VALLEY, ENTRANCE_TYPE_GROTTO, "scrubs", 1}, + { ENTR_CARPENTERS_TENT_0, ENTR_GERUDO_VALLEY_OUTSIDE_TENT, SINGLE_SCENE_INFO(SCENE_GERUDO_VALLEY), "GV Carpenters' Tent Entry", "Carpenters' Tent", ENTRANCE_GROUP_GERUDO_VALLEY, ENTRANCE_GROUP_GERUDO_VALLEY, ENTRANCE_TYPE_INTERIOR, "", 1}, + { ENTRANCE_GROTTO_LOAD(GROTTO_GV_OCTOROK_OFFSET), ENTRANCE_GROTTO_EXIT(GROTTO_GV_OCTOROK_OFFSET), SINGLE_SCENE_INFO(SCENE_GERUDO_VALLEY), "GV Silver Rock Grotto Entry", "GV Octorok Grotto", ENTRANCE_GROUP_GERUDO_VALLEY, ENTRANCE_GROUP_GERUDO_VALLEY, ENTRANCE_TYPE_GROTTO, "", 1}, + { ENTRANCE_GROTTO_LOAD(GROTTO_GV_STORMS_OFFSET), ENTRANCE_GROTTO_EXIT(GROTTO_GV_STORMS_OFFSET), SINGLE_SCENE_INFO(SCENE_GERUDO_VALLEY), "GV Behind Tent Grotto Entry", "GV Storms Grotto", ENTRANCE_GROUP_GERUDO_VALLEY, ENTRANCE_GROUP_GERUDO_VALLEY, ENTRANCE_TYPE_GROTTO, "scrubs", 1}, { ENTR_GERUDO_VALLEY_WEST_EXIT, ENTR_GERUDOS_FORTRESS_EAST_EXIT, SINGLE_SCENE_INFO(SCENE_GERUDOS_FORTRESS), "Gerudo Fortress East Exit", "Gerudo Valley West Exit", ENTRANCE_GROUP_GERUDO_VALLEY, ENTRANCE_GROUP_GERUDO_VALLEY, ENTRANCE_TYPE_OVERWORLD, "gerudo fortress"}, - { ENTR_HAUNTED_WASTELAND_EAST_EXIT, ENTR_GERUDOS_FORTRESS_GATE_EXIT, SINGLE_SCENE_INFO(SCENE_GERUDOS_FORTRESS), "Gerudo Fortress Gate Exit", "Haunted Wasteland", ENTRANCE_GROUP_GERUDO_VALLEY, ENTRANCE_GROUP_HAUNTED_WASTELAND, ENTRANCE_TYPE_OVERWORLD, "gerudo fortress"}, - { ENTRANCE_GROTTO_LOAD(GROTTO_GF_STORMS_OFFSET), ENTRANCE_GROTTO_EXIT(GROTTO_GF_STORMS_OFFSET), SINGLE_SCENE_INFO(SCENE_GERUDOS_FORTRESS), "GF Outside Storms Grotto", "GF Storms Grotto", ENTRANCE_GROUP_GERUDO_VALLEY, ENTRANCE_GROUP_GERUDO_VALLEY, ENTRANCE_TYPE_GROTTO, "gerudo fortress", 1}, + { ENTR_HAUNTED_WASTELAND_EAST_EXIT, ENTR_GERUDOS_FORTRESS_GATE_EXIT, SINGLE_SCENE_INFO(SCENE_GERUDOS_FORTRESS), "Gerudo Fortress Gate Exit", "Haunted Wasteland East Exit", ENTRANCE_GROUP_GERUDO_VALLEY, ENTRANCE_GROUP_HAUNTED_WASTELAND, ENTRANCE_TYPE_OVERWORLD, "gerudo fortress"}, + { ENTRANCE_GROTTO_LOAD(GROTTO_GF_STORMS_OFFSET), ENTRANCE_GROTTO_EXIT(GROTTO_GF_STORMS_OFFSET), SINGLE_SCENE_INFO(SCENE_GERUDOS_FORTRESS), "GF Storms Grotto Entry", "GF Storms Grotto", ENTRANCE_GROUP_GERUDO_VALLEY, ENTRANCE_GROUP_GERUDO_VALLEY, ENTRANCE_TYPE_GROTTO, "gerudo fortress", 1}, { ENTR_GERUDO_TRAINING_GROUND_ENTRANCE, ENTR_GERUDOS_FORTRESS_OUTSIDE_GERUDO_TRAINING_GROUND, SINGLE_SCENE_INFO(SCENE_GERUDOS_FORTRESS), "GF Outside Training Ground", "Gerudo Training Ground Entrance", ENTRANCE_GROUP_GERUDO_VALLEY, ENTRANCE_GROUP_GERUDO_VALLEY, ENTRANCE_TYPE_DUNGEON, "gerudo fortress,gtg", 1}, - { ENTR_GERUDO_VALLEY_OUTSIDE_TENT, ENTR_CARPENTERS_TENT_0, SINGLE_SCENE_INFO(SCENE_CARPENTERS_TENT), "Carpenters' Tent", "GV Outside Carpenters' Tent", ENTRANCE_GROUP_GERUDO_VALLEY, ENTRANCE_GROUP_GERUDO_VALLEY, ENTRANCE_TYPE_INTERIOR}, - { ENTRANCE_GROTTO_EXIT(GROTTO_GV_OCTOROK_OFFSET), ENTRANCE_GROTTO_LOAD(GROTTO_GV_OCTOROK_OFFSET), {{ SCENE_GROTTOS, 0x06 }}, "GV Octorok Grotto", "GV Silver Rock Grotto Exit", ENTRANCE_GROUP_GERUDO_VALLEY, ENTRANCE_GROUP_GERUDO_VALLEY, ENTRANCE_TYPE_GROTTO}, - { ENTRANCE_GROTTO_EXIT(GROTTO_GV_STORMS_OFFSET), ENTRANCE_GROTTO_LOAD(GROTTO_GV_STORMS_OFFSET), {{ SCENE_GROTTOS, 0x0A }}, "GV Storms Grotto", "GV Behind Tent Grotto Exit", ENTRANCE_GROUP_GERUDO_VALLEY, ENTRANCE_GROUP_GERUDO_VALLEY, ENTRANCE_TYPE_GROTTO, "scrubs"}, - { ENTRANCE_GROTTO_EXIT(GROTTO_GF_STORMS_OFFSET), ENTRANCE_GROTTO_LOAD(GROTTO_GF_STORMS_OFFSET), {{ SCENE_FAIRYS_FOUNTAIN, 0x00 }}, "GF Storms Grotto", "GF Storms Grotto Exit", ENTRANCE_GROUP_GERUDO_VALLEY, ENTRANCE_GROUP_GERUDO_VALLEY, ENTRANCE_TYPE_GROTTO, "gerudo fortress"}, + { ENTR_GERUDO_VALLEY_OUTSIDE_TENT, ENTR_CARPENTERS_TENT_0, SINGLE_SCENE_INFO(SCENE_CARPENTERS_TENT), "Carpenters' Tent", "GV Carpenters' Tent Entry", ENTRANCE_GROUP_GERUDO_VALLEY, ENTRANCE_GROUP_GERUDO_VALLEY, ENTRANCE_TYPE_INTERIOR}, + { ENTRANCE_GROTTO_EXIT(GROTTO_GV_OCTOROK_OFFSET), ENTRANCE_GROTTO_LOAD(GROTTO_GV_OCTOROK_OFFSET), {{ SCENE_GROTTOS, 0x06 }}, "GV Octorok Grotto", "GV Silver Rock Grotto Entry", ENTRANCE_GROUP_GERUDO_VALLEY, ENTRANCE_GROUP_GERUDO_VALLEY, ENTRANCE_TYPE_GROTTO}, + { ENTRANCE_GROTTO_EXIT(GROTTO_GV_STORMS_OFFSET), ENTRANCE_GROTTO_LOAD(GROTTO_GV_STORMS_OFFSET), {{ SCENE_GROTTOS, 0x0A }}, "GV Storms Grotto", "GV Behind Tent Grotto Entry", ENTRANCE_GROUP_GERUDO_VALLEY, ENTRANCE_GROUP_GERUDO_VALLEY, ENTRANCE_TYPE_GROTTO, "scrubs"}, + { ENTRANCE_GROTTO_EXIT(GROTTO_GF_STORMS_OFFSET), ENTRANCE_GROTTO_LOAD(GROTTO_GF_STORMS_OFFSET), {{ SCENE_FAIRYS_FOUNTAIN, 0x00 }}, "GF Storms Grotto", "GF Storms Grotto Entry", ENTRANCE_GROUP_GERUDO_VALLEY, ENTRANCE_GROUP_GERUDO_VALLEY, ENTRANCE_TYPE_GROTTO, "gerudo fortress"}, { ENTR_GERUDOS_FORTRESS_OUTSIDE_GERUDO_TRAINING_GROUND, ENTR_GERUDO_TRAINING_GROUND_ENTRANCE, SINGLE_SCENE_INFO(SCENE_GERUDO_TRAINING_GROUND), "Gerudo Training Ground Entrance", "GF Outside Training Ground", ENTRANCE_GROUP_GERUDO_VALLEY, ENTRANCE_GROUP_GERUDO_VALLEY, ENTRANCE_TYPE_DUNGEON, "gerudo fortress,gtg"}, // The Wasteland - { ENTR_GERUDOS_FORTRESS_GATE_EXIT, ENTR_HAUNTED_WASTELAND_EAST_EXIT, SINGLE_SCENE_INFO(SCENE_HAUNTED_WASTELAND), "Haunted Wasteland East Exit", "GF Gate Exit", ENTRANCE_GROUP_HAUNTED_WASTELAND, ENTRANCE_GROUP_GERUDO_VALLEY, ENTRANCE_TYPE_OVERWORLD, "hw,gerudo fortress"}, + { ENTR_GERUDOS_FORTRESS_GATE_EXIT, ENTR_HAUNTED_WASTELAND_EAST_EXIT, SINGLE_SCENE_INFO(SCENE_HAUNTED_WASTELAND), "Haunted Wasteland East Exit", "Gerudo Fortress Gate Exit", ENTRANCE_GROUP_HAUNTED_WASTELAND, ENTRANCE_GROUP_GERUDO_VALLEY, ENTRANCE_TYPE_OVERWORLD, "hw,gerudo fortress"}, { ENTR_DESERT_COLOSSUS_EAST_EXIT, ENTR_HAUNTED_WASTELAND_WEST_EXIT, SINGLE_SCENE_INFO(SCENE_HAUNTED_WASTELAND), "Haunted Wasteland West Exit", "Desert Colossus East Exit", ENTRANCE_GROUP_HAUNTED_WASTELAND, ENTRANCE_GROUP_HAUNTED_WASTELAND, ENTRANCE_TYPE_OVERWORLD, "dc,hw"}, { ENTR_HAUNTED_WASTELAND_WEST_EXIT, ENTR_DESERT_COLOSSUS_EAST_EXIT, SINGLE_SCENE_INFO(SCENE_DESERT_COLOSSUS), "Desert Colossus East Exit", "Haunted Wasteland West Exit", ENTRANCE_GROUP_HAUNTED_WASTELAND, ENTRANCE_GROUP_HAUNTED_WASTELAND, ENTRANCE_TYPE_OVERWORLD, "dc,hw"}, - { ENTR_GREAT_FAIRYS_FOUNTAIN_SPELLS_NAYRUS_COLOSSUS, ENTR_DESERT_COLOSSUS_GREAT_FAIRY_EXIT, SINGLE_SCENE_INFO(SCENE_DESERT_COLOSSUS), "Colossus Great Fairy Exit", "Colossus Great Fairy Fountain", ENTRANCE_GROUP_HAUNTED_WASTELAND, ENTRANCE_GROUP_HAUNTED_WASTELAND, ENTRANCE_TYPE_INTERIOR, "dc", 1}, - { ENTRANCE_GROTTO_LOAD(GROTTO_COLOSSUS_OFFSET), ENTRANCE_GROTTO_EXIT(GROTTO_COLOSSUS_OFFSET), SINGLE_SCENE_INFO(SCENE_DESERT_COLOSSUS), "Colossus Grotto Exit", "Colossus Grotto", ENTRANCE_GROUP_HAUNTED_WASTELAND, ENTRANCE_GROUP_HAUNTED_WASTELAND, ENTRANCE_TYPE_GROTTO, "dc,scrubs", 1}, + { ENTR_GREAT_FAIRYS_FOUNTAIN_SPELLS_NAYRUS_COLOSSUS, ENTR_DESERT_COLOSSUS_GREAT_FAIRY_EXIT, SINGLE_SCENE_INFO(SCENE_DESERT_COLOSSUS), "Colossus Great Fairy Entry", "Colossus Great Fairy Fountain", ENTRANCE_GROUP_HAUNTED_WASTELAND, ENTRANCE_GROUP_HAUNTED_WASTELAND, ENTRANCE_TYPE_INTERIOR, "dc", 1}, + { ENTRANCE_GROTTO_LOAD(GROTTO_COLOSSUS_OFFSET), ENTRANCE_GROTTO_EXIT(GROTTO_COLOSSUS_OFFSET), SINGLE_SCENE_INFO(SCENE_DESERT_COLOSSUS), "Colossus Grotto Entry", "Colossus Grotto", ENTRANCE_GROUP_HAUNTED_WASTELAND, ENTRANCE_GROUP_HAUNTED_WASTELAND, ENTRANCE_TYPE_GROTTO, "dc,scrubs", 1}, { ENTR_SPIRIT_TEMPLE_ENTRANCE, ENTR_DESERT_COLOSSUS_OUTSIDE_TEMPLE, SINGLE_SCENE_INFO(SCENE_DESERT_COLOSSUS), "Colossus Outside Temple", "Spirit Temple Entrance", ENTRANCE_GROUP_HAUNTED_WASTELAND, ENTRANCE_GROUP_HAUNTED_WASTELAND, ENTRANCE_TYPE_DUNGEON, "dc", 1}, - { ENTR_DESERT_COLOSSUS_GREAT_FAIRY_EXIT, ENTR_GREAT_FAIRYS_FOUNTAIN_SPELLS_NAYRUS_COLOSSUS, {{ SCENE_GREAT_FAIRYS_FOUNTAIN_SPELLS, 0x02 }}, "Colossus Great Fairy Fountain", "Colossus Great Fairy Exit", ENTRANCE_GROUP_HAUNTED_WASTELAND, ENTRANCE_GROUP_HAUNTED_WASTELAND, ENTRANCE_TYPE_INTERIOR, "dc"}, - { ENTRANCE_GROTTO_EXIT(GROTTO_COLOSSUS_OFFSET), ENTRANCE_GROTTO_LOAD(GROTTO_COLOSSUS_OFFSET), {{ SCENE_GROTTOS, 0x0A }}, "Colossus Grotto", "Colossus Grotto Exit", ENTRANCE_GROUP_HAUNTED_WASTELAND, ENTRANCE_GROUP_HAUNTED_WASTELAND, ENTRANCE_TYPE_GROTTO, "dc,scrubs"}, + { ENTR_DESERT_COLOSSUS_GREAT_FAIRY_EXIT, ENTR_GREAT_FAIRYS_FOUNTAIN_SPELLS_NAYRUS_COLOSSUS, {{ SCENE_GREAT_FAIRYS_FOUNTAIN_SPELLS, 0x02 }}, "Colossus Great Fairy Fountain", "Colossus Great Fairy Entry", ENTRANCE_GROUP_HAUNTED_WASTELAND, ENTRANCE_GROUP_HAUNTED_WASTELAND, ENTRANCE_TYPE_INTERIOR, "dc"}, + { ENTRANCE_GROTTO_EXIT(GROTTO_COLOSSUS_OFFSET), ENTRANCE_GROTTO_LOAD(GROTTO_COLOSSUS_OFFSET), {{ SCENE_GROTTOS, 0x0A }}, "Colossus Grotto", "Colossus Grotto Entry", ENTRANCE_GROUP_HAUNTED_WASTELAND, ENTRANCE_GROUP_HAUNTED_WASTELAND, ENTRANCE_TYPE_GROTTO, "dc,scrubs"}, { ENTR_DESERT_COLOSSUS_OUTSIDE_TEMPLE, ENTR_SPIRIT_TEMPLE_ENTRANCE, SINGLE_SCENE_INFO(SCENE_SPIRIT_TEMPLE), "Spirit Temple Entrance", "Colossus Outside Temple", ENTRANCE_GROUP_HAUNTED_WASTELAND, ENTRANCE_GROUP_HAUNTED_WASTELAND, ENTRANCE_TYPE_DUNGEON, "dc"}, { ENTR_SPIRIT_TEMPLE_BOSS_ENTRANCE, ENTR_SPIRIT_TEMPLE_BOSS_DOOR, SINGLE_SCENE_INFO(SCENE_SPIRIT_TEMPLE), "Spirit Temple Boss Door", "Twinrova", ENTRANCE_GROUP_HAUNTED_WASTELAND, ENTRANCE_GROUP_HAUNTED_WASTELAND, ENTRANCE_TYPE_DUNGEON, "", 1}, { ENTR_SPIRIT_TEMPLE_BOSS_DOOR, ENTR_SPIRIT_TEMPLE_BOSS_ENTRANCE, SINGLE_SCENE_INFO(SCENE_SPIRIT_TEMPLE_BOSS), "Twinrova", "Spirit Temple Boss Door", ENTRANCE_GROUP_HAUNTED_WASTELAND, ENTRANCE_GROUP_HAUNTED_WASTELAND, ENTRANCE_TYPE_DUNGEON, "", 1}, - { ENTR_DESERT_COLOSSUS_SPIRIT_TEMPLE_BLUE_WARP, -1, SINGLE_SCENE_INFO(SCENE_SPIRIT_TEMPLE_BOSS), "Twinrova", "Spirit Temple Blue Warp", ENTRANCE_GROUP_HAUNTED_WASTELAND, ENTRANCE_GROUP_HAUNTED_WASTELAND, ENTRANCE_TYPE_ONE_WAY, "bw", 1}, + { ENTR_DESERT_COLOSSUS_SPIRIT_TEMPLE_BLUE_WARP, -1, SINGLE_SCENE_INFO(SCENE_SPIRIT_TEMPLE_BOSS), "Twinrova Blue Warp", "Spirit Temple Blue Warp", ENTRANCE_GROUP_HAUNTED_WASTELAND, ENTRANCE_GROUP_HAUNTED_WASTELAND, ENTRANCE_TYPE_ONE_WAY, "bw", 1}, // Market - { ENTR_HYRULE_FIELD_ON_BRIDGE_SPAWN, ENTR_MARKET_ENTRANCE_NEAR_GUARD_EXIT, {SCENE_NO_SPAWN(SCENE_MARKET_ENTRANCE_DAY), SCENE_NO_SPAWN(SCENE_MARKET_ENTRANCE_NIGHT), SCENE_NO_SPAWN(SCENE_MARKET_ENTRANCE_RUINS)}, "Market Entrance South Exit", "Hyrule Field Drawbridge Exit", ENTRANCE_GROUP_MARKET, ENTRANCE_GROUP_HYRULE_FIELD, ENTRANCE_TYPE_OVERWORLD, "hf"}, - { ENTR_MARKET_SOUTH_EXIT, ENTR_MARKET_ENTRANCE_NORTH_EXIT, {SCENE_NO_SPAWN(SCENE_MARKET_ENTRANCE_DAY), SCENE_NO_SPAWN(SCENE_MARKET_ENTRANCE_NIGHT), SCENE_NO_SPAWN(SCENE_MARKET_ENTRANCE_RUINS)}, "Market Entrance North Exit", "Market South Exit", ENTRANCE_GROUP_MARKET, ENTRANCE_GROUP_MARKET, ENTRANCE_TYPE_OVERWORLD}, - { ENTR_MARKET_GUARD_HOUSE_0, ENTR_MARKET_ENTRANCE_OUTSIDE_GUARD_HOUSE, {SCENE_NO_SPAWN(SCENE_MARKET_ENTRANCE_DAY), SCENE_NO_SPAWN(SCENE_MARKET_ENTRANCE_NIGHT), SCENE_NO_SPAWN(SCENE_MARKET_ENTRANCE_RUINS)}, "Market Entrance Outside Guard House", "Guard House", ENTRANCE_GROUP_MARKET, ENTRANCE_GROUP_MARKET, ENTRANCE_TYPE_INTERIOR, "pots,poe", 1}, - { ENTR_MARKET_ENTRANCE_NORTH_EXIT, ENTR_MARKET_SOUTH_EXIT, {SCENE_NO_SPAWN(SCENE_MARKET_DAY), SCENE_NO_SPAWN(SCENE_MARKET_NIGHT), SCENE_NO_SPAWN(SCENE_MARKET_RUINS), SCENE_NO_SPAWN(SCENE_BACK_ALLEY_DAY), SCENE_NO_SPAWN(SCENE_BACK_ALLEY_NIGHT)}, "Market South Exit", "Market Entrance North Exit", ENTRANCE_GROUP_MARKET, ENTRANCE_GROUP_MARKET, ENTRANCE_TYPE_OVERWORLD}, - { ENTR_CASTLE_GROUNDS_SOUTH_EXIT, ENTR_MARKET_DAY_CASTLE_EXIT, {SCENE_NO_SPAWN(SCENE_MARKET_DAY), SCENE_NO_SPAWN(SCENE_MARKET_NIGHT), SCENE_NO_SPAWN(SCENE_MARKET_RUINS), SCENE_NO_SPAWN(SCENE_BACK_ALLEY_DAY), SCENE_NO_SPAWN(SCENE_BACK_ALLEY_NIGHT)}, "Market Castle Exit", "Castle Grounds South Exit", ENTRANCE_GROUP_MARKET, ENTRANCE_GROUP_HYRULE_CASTLE, ENTRANCE_TYPE_OVERWORLD, "outside ganon's castle"}, - { ENTR_TEMPLE_OF_TIME_EXTERIOR_DAY_GOSSIP_STONE_EXIT, ENTR_MARKET_DAY_TEMPLE_EXIT, {SCENE_NO_SPAWN(SCENE_MARKET_DAY), SCENE_NO_SPAWN(SCENE_MARKET_NIGHT), SCENE_NO_SPAWN(SCENE_MARKET_RUINS), SCENE_NO_SPAWN(SCENE_BACK_ALLEY_DAY), SCENE_NO_SPAWN(SCENE_BACK_ALLEY_NIGHT)}, "Market Temple Exit", "Outside Temple of Time", ENTRANCE_GROUP_MARKET, ENTRANCE_GROUP_MARKET, ENTRANCE_TYPE_OVERWORLD}, - { ENTR_SHOOTING_GALLERY_1, ENTR_MARKET_DAY_OUTSIDE_SHOOTING_GALLERY, {SCENE_NO_SPAWN(SCENE_MARKET_DAY), SCENE_NO_SPAWN(SCENE_MARKET_NIGHT), SCENE_NO_SPAWN(SCENE_MARKET_RUINS), SCENE_NO_SPAWN(SCENE_BACK_ALLEY_DAY), SCENE_NO_SPAWN(SCENE_BACK_ALLEY_NIGHT)}, "MK Outside Shooting Gallery", "MK Shooting Gallery", ENTRANCE_GROUP_MARKET, ENTRANCE_GROUP_MARKET, ENTRANCE_TYPE_INTERIOR, "child", 1}, - { ENTR_BOMBCHU_BOWLING_ALLEY_0, ENTR_MARKET_DAY_OUTSIDE_BOMBCHU_BOWLING, {SCENE_NO_SPAWN(SCENE_MARKET_DAY), SCENE_NO_SPAWN(SCENE_MARKET_NIGHT), SCENE_NO_SPAWN(SCENE_MARKET_RUINS), SCENE_NO_SPAWN(SCENE_BACK_ALLEY_DAY), SCENE_NO_SPAWN(SCENE_BACK_ALLEY_NIGHT)}, "MK Outside Bombchu Bowling", "Bombchu Bowling", ENTRANCE_GROUP_MARKET, ENTRANCE_GROUP_MARKET, ENTRANCE_TYPE_INTERIOR, "", 1}, - { ENTR_TREASURE_BOX_SHOP_0, ENTR_MARKET_DAY_OUTSIDE_TREASURE_BOX_SHOP, {SCENE_NO_SPAWN(SCENE_MARKET_DAY), SCENE_NO_SPAWN(SCENE_MARKET_NIGHT), SCENE_NO_SPAWN(SCENE_MARKET_RUINS), SCENE_NO_SPAWN(SCENE_BACK_ALLEY_DAY), SCENE_NO_SPAWN(SCENE_BACK_ALLEY_NIGHT)}, "MK Outside Treasure Chest Game", "Treasure Chest Game", ENTRANCE_GROUP_MARKET, ENTRANCE_GROUP_MARKET, ENTRANCE_TYPE_INTERIOR, "", 1}, - { ENTR_BACK_ALLEY_MAN_IN_GREEN_HOUSE, ENTR_BACK_ALLEY_DAY_OUTSIDE_MAN_IN_GREEN_HOUSE, {SCENE_NO_SPAWN(SCENE_MARKET_DAY), SCENE_NO_SPAWN(SCENE_MARKET_NIGHT), SCENE_NO_SPAWN(SCENE_MARKET_RUINS), SCENE_NO_SPAWN(SCENE_BACK_ALLEY_DAY), SCENE_NO_SPAWN(SCENE_BACK_ALLEY_NIGHT)}, "MK Outside Main-in-Green House", "Man-in-Green's House", ENTRANCE_GROUP_MARKET, ENTRANCE_GROUP_MARKET, ENTRANCE_TYPE_INTERIOR, "", 1}, - { ENTR_HAPPY_MASK_SHOP_0, ENTR_MARKET_DAY_OUTSIDE_HAPPY_MASK_SHOP, {SCENE_NO_SPAWN(SCENE_MARKET_DAY), SCENE_NO_SPAWN(SCENE_MARKET_NIGHT), SCENE_NO_SPAWN(SCENE_MARKET_RUINS), SCENE_NO_SPAWN(SCENE_BACK_ALLEY_DAY), SCENE_NO_SPAWN(SCENE_BACK_ALLEY_NIGHT)}, "MK Outside Mask Shop", "Mask Shop", ENTRANCE_GROUP_MARKET, ENTRANCE_GROUP_MARKET, ENTRANCE_TYPE_INTERIOR, "", 1}, - { ENTR_BAZAAR_1, ENTR_MARKET_DAY_OUTSIDE_BAZAAR, {SCENE_NO_SPAWN(SCENE_MARKET_DAY), SCENE_NO_SPAWN(SCENE_MARKET_NIGHT), SCENE_NO_SPAWN(SCENE_MARKET_RUINS), SCENE_NO_SPAWN(SCENE_BACK_ALLEY_DAY), SCENE_NO_SPAWN(SCENE_BACK_ALLEY_NIGHT)}, "MK Outside Bazaar", "MK Bazaar", ENTRANCE_GROUP_MARKET, ENTRANCE_GROUP_MARKET, ENTRANCE_TYPE_INTERIOR, "shop", 1}, - { ENTR_POTION_SHOP_MARKET_0, ENTR_MARKET_DAY_OUTSIDE_POTION_SHOP, {SCENE_NO_SPAWN(SCENE_MARKET_DAY), SCENE_NO_SPAWN(SCENE_MARKET_NIGHT), SCENE_NO_SPAWN(SCENE_MARKET_RUINS), SCENE_NO_SPAWN(SCENE_BACK_ALLEY_DAY), SCENE_NO_SPAWN(SCENE_BACK_ALLEY_NIGHT)}, "MK Outside Potion Shop", "MK Potion Shop", ENTRANCE_GROUP_MARKET, ENTRANCE_GROUP_MARKET, ENTRANCE_TYPE_INTERIOR, "", 1}, - { ENTR_BOMBCHU_SHOP_1, ENTR_BACK_ALLEY_DAY_OUTSIDE_BOMBCHU_SHOP, {SCENE_NO_SPAWN(SCENE_MARKET_DAY), SCENE_NO_SPAWN(SCENE_MARKET_NIGHT), SCENE_NO_SPAWN(SCENE_MARKET_RUINS), SCENE_NO_SPAWN(SCENE_BACK_ALLEY_DAY), SCENE_NO_SPAWN(SCENE_BACK_ALLEY_NIGHT)}, "MK Outside Bombchu Shop", "Bombchu Shop", ENTRANCE_GROUP_MARKET, ENTRANCE_GROUP_MARKET, ENTRANCE_TYPE_INTERIOR, "", 1}, - { ENTR_MARKET_ENTRANCE_OUTSIDE_GUARD_HOUSE, ENTR_MARKET_GUARD_HOUSE_0, {{ SCENE_MARKET_GUARD_HOUSE }}, "Guard House", "MK Entrance Outside Guard House", ENTRANCE_GROUP_MARKET, ENTRANCE_GROUP_MARKET, ENTRANCE_TYPE_INTERIOR, "pots,poe"}, - { ENTR_MARKET_DAY_OUTSIDE_SHOOTING_GALLERY, ENTR_SHOOTING_GALLERY_1, {{ SCENE_SHOOTING_GALLERY, 0x01 }}, "MK Shooting Gallery", "MK Outside Shooting Gallery", ENTRANCE_GROUP_MARKET, ENTRANCE_GROUP_MARKET, ENTRANCE_TYPE_INTERIOR}, - { ENTR_MARKET_DAY_OUTSIDE_BOMBCHU_BOWLING, ENTR_BOMBCHU_BOWLING_ALLEY_0, SINGLE_SCENE_INFO(SCENE_BOMBCHU_BOWLING_ALLEY), "Bombchu Bowling", "MK Outside Bombchu Bowling", ENTRANCE_GROUP_MARKET, ENTRANCE_GROUP_MARKET, ENTRANCE_TYPE_INTERIOR}, - { ENTR_MARKET_DAY_OUTSIDE_TREASURE_BOX_SHOP, ENTR_TREASURE_BOX_SHOP_0, SINGLE_SCENE_INFO(SCENE_TREASURE_BOX_SHOP), "Treasure Chest Game", "MK Outside Treasure Chest Game", ENTRANCE_GROUP_MARKET, ENTRANCE_GROUP_MARKET, ENTRANCE_TYPE_INTERIOR}, - { ENTR_BACK_ALLEY_DAY_OUTSIDE_MAN_IN_GREEN_HOUSE, ENTR_BACK_ALLEY_MAN_IN_GREEN_HOUSE, SINGLE_SCENE_INFO(SCENE_BACK_ALLEY_HOUSE), "Man-in-Green's House", "MK Outside Main-in-Green House", ENTRANCE_GROUP_MARKET, ENTRANCE_GROUP_MARKET, ENTRANCE_TYPE_INTERIOR}, - { ENTR_MARKET_DAY_OUTSIDE_HAPPY_MASK_SHOP, ENTR_HAPPY_MASK_SHOP_0, SINGLE_SCENE_INFO(SCENE_HAPPY_MASK_SHOP), "Mask Shop", "MK Outside Mask Shop", ENTRANCE_GROUP_MARKET, ENTRANCE_GROUP_MARKET, ENTRANCE_TYPE_INTERIOR}, - { ENTR_MARKET_DAY_OUTSIDE_BAZAAR, ENTR_BAZAAR_1, {{ SCENE_BAZAAR, 0x01 }}, "MK Bazaar", "MK Outside Bazaar", ENTRANCE_GROUP_MARKET, ENTRANCE_GROUP_MARKET, ENTRANCE_TYPE_INTERIOR, "shop"}, - { ENTR_MARKET_DAY_OUTSIDE_POTION_SHOP, ENTR_POTION_SHOP_MARKET_0, SINGLE_SCENE_INFO(SCENE_POTION_SHOP_MARKET), "MK Potion Shop", "MK Outside Potion Shop", ENTRANCE_GROUP_MARKET, ENTRANCE_GROUP_MARKET, ENTRANCE_TYPE_INTERIOR}, - { ENTR_BACK_ALLEY_DAY_OUTSIDE_BOMBCHU_SHOP, ENTR_BOMBCHU_SHOP_1, SINGLE_SCENE_INFO(SCENE_BOMBCHU_SHOP), "Bombchu Shop", "MK Outside Bombchu Shop", ENTRANCE_GROUP_MARKET, ENTRANCE_GROUP_MARKET, ENTRANCE_TYPE_INTERIOR}, - { ENTR_MARKET_DAY_TEMPLE_EXIT, ENTR_TEMPLE_OF_TIME_EXTERIOR_DAY_GOSSIP_STONE_EXIT, {SCENE_NO_SPAWN(SCENE_TEMPLE_OF_TIME_EXTERIOR_DAY), SCENE_NO_SPAWN(SCENE_TEMPLE_OF_TIME_EXTERIOR_NIGHT), SCENE_NO_SPAWN(SCENE_TEMPLE_OF_TIME_EXTERIOR_RUINS)}, "Outside Temple of Time", "MK Temple Exit", ENTRANCE_GROUP_MARKET, ENTRANCE_GROUP_MARKET, ENTRANCE_TYPE_OVERWORLD, "tot"}, - { ENTR_TEMPLE_OF_TIME_ENTRANCE, ENTR_TEMPLE_OF_TIME_EXTERIOR_DAY_OUTSIDE_TEMPLE, {SCENE_NO_SPAWN(SCENE_TEMPLE_OF_TIME_EXTERIOR_DAY), SCENE_NO_SPAWN(SCENE_TEMPLE_OF_TIME_EXTERIOR_NIGHT), SCENE_NO_SPAWN(SCENE_TEMPLE_OF_TIME_EXTERIOR_RUINS)}, "Outside Temple of Time", "Temple of Time Entrance", ENTRANCE_GROUP_MARKET, ENTRANCE_GROUP_MARKET, ENTRANCE_TYPE_INTERIOR, "tot", 1}, - { ENTR_TEMPLE_OF_TIME_EXTERIOR_DAY_OUTSIDE_TEMPLE, ENTR_TEMPLE_OF_TIME_ENTRANCE, SINGLE_SCENE_INFO(SCENE_TEMPLE_OF_TIME), "Temple of Time Entrance", "Outside Temple of Time", ENTRANCE_GROUP_MARKET, ENTRANCE_GROUP_MARKET, ENTRANCE_TYPE_INTERIOR, "tot"}, + { ENTR_HYRULE_FIELD_ON_BRIDGE_SPAWN, ENTR_MARKET_ENTRANCE_NEAR_GUARD_EXIT, {SCENE_NO_SPAWN(SCENE_MARKET_ENTRANCE_DAY), SCENE_NO_SPAWN(SCENE_MARKET_ENTRANCE_NIGHT), SCENE_NO_SPAWN(SCENE_MARKET_ENTRANCE_RUINS)}, "Market Entrance South Exit", "Hyrule Field Drawbridge Exit", ENTRANCE_GROUP_MARKET, ENTRANCE_GROUP_HYRULE_FIELD, ENTRANCE_TYPE_OVERWORLD, "hf"}, + { ENTR_MARKET_SOUTH_EXIT, ENTR_MARKET_ENTRANCE_NORTH_EXIT, {SCENE_NO_SPAWN(SCENE_MARKET_ENTRANCE_DAY), SCENE_NO_SPAWN(SCENE_MARKET_ENTRANCE_NIGHT), SCENE_NO_SPAWN(SCENE_MARKET_ENTRANCE_RUINS)}, "Market Entrance North Exit", "Market South Exit", ENTRANCE_GROUP_MARKET, ENTRANCE_GROUP_MARKET, ENTRANCE_TYPE_OVERWORLD}, + { ENTR_MARKET_GUARD_HOUSE_0, ENTR_MARKET_ENTRANCE_OUTSIDE_GUARD_HOUSE, {SCENE_NO_SPAWN(SCENE_MARKET_ENTRANCE_DAY), SCENE_NO_SPAWN(SCENE_MARKET_ENTRANCE_NIGHT), SCENE_NO_SPAWN(SCENE_MARKET_ENTRANCE_RUINS)}, "MK Entrance Guard House Entry", "Guard House", ENTRANCE_GROUP_MARKET, ENTRANCE_GROUP_MARKET, ENTRANCE_TYPE_INTERIOR, "pots,poe", 1}, + { ENTR_MARKET_ENTRANCE_NORTH_EXIT, ENTR_MARKET_SOUTH_EXIT, {SCENE_NO_SPAWN(SCENE_MARKET_DAY), SCENE_NO_SPAWN(SCENE_MARKET_NIGHT), SCENE_NO_SPAWN(SCENE_MARKET_RUINS), SCENE_NO_SPAWN(SCENE_BACK_ALLEY_DAY), SCENE_NO_SPAWN(SCENE_BACK_ALLEY_NIGHT)}, "Market South Exit", "Market Entrance North Exit", ENTRANCE_GROUP_MARKET, ENTRANCE_GROUP_MARKET, ENTRANCE_TYPE_OVERWORLD}, + { ENTR_CASTLE_GROUNDS_SOUTH_EXIT, ENTR_MARKET_DAY_CASTLE_EXIT, {SCENE_NO_SPAWN(SCENE_MARKET_DAY), SCENE_NO_SPAWN(SCENE_MARKET_NIGHT), SCENE_NO_SPAWN(SCENE_MARKET_RUINS), SCENE_NO_SPAWN(SCENE_BACK_ALLEY_DAY), SCENE_NO_SPAWN(SCENE_BACK_ALLEY_NIGHT)}, "Market Castle Exit", "Castle Grounds South Exit", ENTRANCE_GROUP_MARKET, ENTRANCE_GROUP_HYRULE_CASTLE, ENTRANCE_TYPE_OVERWORLD, "outside ganon's castle"}, + { ENTR_TEMPLE_OF_TIME_EXTERIOR_DAY_GOSSIP_STONE_EXIT, ENTR_MARKET_DAY_TEMPLE_EXIT, {SCENE_NO_SPAWN(SCENE_MARKET_DAY), SCENE_NO_SPAWN(SCENE_MARKET_NIGHT), SCENE_NO_SPAWN(SCENE_MARKET_RUINS), SCENE_NO_SPAWN(SCENE_BACK_ALLEY_DAY), SCENE_NO_SPAWN(SCENE_BACK_ALLEY_NIGHT)}, "Market Temple Exit", "Outside Temple of Time", ENTRANCE_GROUP_MARKET, ENTRANCE_GROUP_MARKET, ENTRANCE_TYPE_OVERWORLD}, + { ENTR_SHOOTING_GALLERY_1, ENTR_MARKET_DAY_OUTSIDE_SHOOTING_GALLERY, {SCENE_NO_SPAWN(SCENE_MARKET_DAY), SCENE_NO_SPAWN(SCENE_MARKET_NIGHT), SCENE_NO_SPAWN(SCENE_MARKET_RUINS), SCENE_NO_SPAWN(SCENE_BACK_ALLEY_DAY), SCENE_NO_SPAWN(SCENE_BACK_ALLEY_NIGHT)}, "MK Shooting Gallery Entry", "MK Shooting Gallery", ENTRANCE_GROUP_MARKET, ENTRANCE_GROUP_MARKET, ENTRANCE_TYPE_INTERIOR, "child", 1}, + { ENTR_BOMBCHU_BOWLING_ALLEY_0, ENTR_MARKET_DAY_OUTSIDE_BOMBCHU_BOWLING, {SCENE_NO_SPAWN(SCENE_MARKET_DAY), SCENE_NO_SPAWN(SCENE_MARKET_NIGHT), SCENE_NO_SPAWN(SCENE_MARKET_RUINS), SCENE_NO_SPAWN(SCENE_BACK_ALLEY_DAY), SCENE_NO_SPAWN(SCENE_BACK_ALLEY_NIGHT)}, "MK Bombchu Bowling Entry", "Bombchu Bowling", ENTRANCE_GROUP_MARKET, ENTRANCE_GROUP_MARKET, ENTRANCE_TYPE_INTERIOR, "", 1}, + { ENTR_TREASURE_BOX_SHOP_0, ENTR_MARKET_DAY_OUTSIDE_TREASURE_BOX_SHOP, {SCENE_NO_SPAWN(SCENE_MARKET_DAY), SCENE_NO_SPAWN(SCENE_MARKET_NIGHT), SCENE_NO_SPAWN(SCENE_MARKET_RUINS), SCENE_NO_SPAWN(SCENE_BACK_ALLEY_DAY), SCENE_NO_SPAWN(SCENE_BACK_ALLEY_NIGHT)}, "MK Treasure Chest Game Entry", "Treasure Chest Game", ENTRANCE_GROUP_MARKET, ENTRANCE_GROUP_MARKET, ENTRANCE_TYPE_INTERIOR, "", 1}, + { ENTR_BACK_ALLEY_MAN_IN_GREEN_HOUSE, ENTR_BACK_ALLEY_DAY_OUTSIDE_MAN_IN_GREEN_HOUSE, {SCENE_NO_SPAWN(SCENE_MARKET_DAY), SCENE_NO_SPAWN(SCENE_MARKET_NIGHT), SCENE_NO_SPAWN(SCENE_MARKET_RUINS), SCENE_NO_SPAWN(SCENE_BACK_ALLEY_DAY), SCENE_NO_SPAWN(SCENE_BACK_ALLEY_NIGHT)}, "MK Man-in-Green House Entry", "Man-in-Green's House", ENTRANCE_GROUP_MARKET, ENTRANCE_GROUP_MARKET, ENTRANCE_TYPE_INTERIOR, "", 1}, + { ENTR_HAPPY_MASK_SHOP_0, ENTR_MARKET_DAY_OUTSIDE_HAPPY_MASK_SHOP, {SCENE_NO_SPAWN(SCENE_MARKET_DAY), SCENE_NO_SPAWN(SCENE_MARKET_NIGHT), SCENE_NO_SPAWN(SCENE_MARKET_RUINS), SCENE_NO_SPAWN(SCENE_BACK_ALLEY_DAY), SCENE_NO_SPAWN(SCENE_BACK_ALLEY_NIGHT)}, "MK Mask Shop Entry", "Mask Shop", ENTRANCE_GROUP_MARKET, ENTRANCE_GROUP_MARKET, ENTRANCE_TYPE_INTERIOR, "", 1}, + { ENTR_BAZAAR_1, ENTR_MARKET_DAY_OUTSIDE_BAZAAR, {SCENE_NO_SPAWN(SCENE_MARKET_DAY), SCENE_NO_SPAWN(SCENE_MARKET_NIGHT), SCENE_NO_SPAWN(SCENE_MARKET_RUINS), SCENE_NO_SPAWN(SCENE_BACK_ALLEY_DAY), SCENE_NO_SPAWN(SCENE_BACK_ALLEY_NIGHT)}, "MK Bazaar Entry", "MK Bazaar", ENTRANCE_GROUP_MARKET, ENTRANCE_GROUP_MARKET, ENTRANCE_TYPE_INTERIOR, "shop", 1}, + { ENTR_POTION_SHOP_MARKET_0, ENTR_MARKET_DAY_OUTSIDE_POTION_SHOP, {SCENE_NO_SPAWN(SCENE_MARKET_DAY), SCENE_NO_SPAWN(SCENE_MARKET_NIGHT), SCENE_NO_SPAWN(SCENE_MARKET_RUINS), SCENE_NO_SPAWN(SCENE_BACK_ALLEY_DAY), SCENE_NO_SPAWN(SCENE_BACK_ALLEY_NIGHT)}, "MK Potion Shop Entry", "MK Potion Shop", ENTRANCE_GROUP_MARKET, ENTRANCE_GROUP_MARKET, ENTRANCE_TYPE_INTERIOR, "", 1}, + { ENTR_BOMBCHU_SHOP_1, ENTR_BACK_ALLEY_DAY_OUTSIDE_BOMBCHU_SHOP, {SCENE_NO_SPAWN(SCENE_MARKET_DAY), SCENE_NO_SPAWN(SCENE_MARKET_NIGHT), SCENE_NO_SPAWN(SCENE_MARKET_RUINS), SCENE_NO_SPAWN(SCENE_BACK_ALLEY_DAY), SCENE_NO_SPAWN(SCENE_BACK_ALLEY_NIGHT)}, "MK Bombchu Shop Entry", "Bombchu Shop", ENTRANCE_GROUP_MARKET, ENTRANCE_GROUP_MARKET, ENTRANCE_TYPE_INTERIOR, "", 1}, + { ENTR_MARKET_ENTRANCE_OUTSIDE_GUARD_HOUSE, ENTR_MARKET_GUARD_HOUSE_0, {{ SCENE_MARKET_GUARD_HOUSE }}, "Guard House", "MK Entrance Guard House Entry", ENTRANCE_GROUP_MARKET, ENTRANCE_GROUP_MARKET, ENTRANCE_TYPE_INTERIOR, "pots,poe"}, + { ENTR_MARKET_DAY_OUTSIDE_SHOOTING_GALLERY, ENTR_SHOOTING_GALLERY_1, {{ SCENE_SHOOTING_GALLERY, 0x01 }}, "MK Shooting Gallery", "MK Shooting Gallery Entry", ENTRANCE_GROUP_MARKET, ENTRANCE_GROUP_MARKET, ENTRANCE_TYPE_INTERIOR}, + { ENTR_MARKET_DAY_OUTSIDE_BOMBCHU_BOWLING, ENTR_BOMBCHU_BOWLING_ALLEY_0, SINGLE_SCENE_INFO(SCENE_BOMBCHU_BOWLING_ALLEY), "Bombchu Bowling", "MK Bombchu Bowling Entry", ENTRANCE_GROUP_MARKET, ENTRANCE_GROUP_MARKET, ENTRANCE_TYPE_INTERIOR}, + { ENTR_MARKET_DAY_OUTSIDE_TREASURE_BOX_SHOP, ENTR_TREASURE_BOX_SHOP_0, SINGLE_SCENE_INFO(SCENE_TREASURE_BOX_SHOP), "Treasure Chest Game", "MK Treasure Chest Game Entry", ENTRANCE_GROUP_MARKET, ENTRANCE_GROUP_MARKET, ENTRANCE_TYPE_INTERIOR}, + { ENTR_BACK_ALLEY_DAY_OUTSIDE_MAN_IN_GREEN_HOUSE, ENTR_BACK_ALLEY_MAN_IN_GREEN_HOUSE, SINGLE_SCENE_INFO(SCENE_BACK_ALLEY_HOUSE), "Man-in-Green's House", "MK Man-in-Green House Entry", ENTRANCE_GROUP_MARKET, ENTRANCE_GROUP_MARKET, ENTRANCE_TYPE_INTERIOR}, + { ENTR_MARKET_DAY_OUTSIDE_HAPPY_MASK_SHOP, ENTR_HAPPY_MASK_SHOP_0, SINGLE_SCENE_INFO(SCENE_HAPPY_MASK_SHOP), "Mask Shop", "MK Mask Shop Entry", ENTRANCE_GROUP_MARKET, ENTRANCE_GROUP_MARKET, ENTRANCE_TYPE_INTERIOR}, + { ENTR_MARKET_DAY_OUTSIDE_BAZAAR, ENTR_BAZAAR_1, {{ SCENE_BAZAAR, 0x01 }}, "MK Bazaar", "MK Bazaar Entry", ENTRANCE_GROUP_MARKET, ENTRANCE_GROUP_MARKET, ENTRANCE_TYPE_INTERIOR, "shop"}, + { ENTR_MARKET_DAY_OUTSIDE_POTION_SHOP, ENTR_POTION_SHOP_MARKET_0, SINGLE_SCENE_INFO(SCENE_POTION_SHOP_MARKET), "MK Potion Shop", "MK Potion Shop Entry", ENTRANCE_GROUP_MARKET, ENTRANCE_GROUP_MARKET, ENTRANCE_TYPE_INTERIOR}, + { ENTR_BACK_ALLEY_DAY_OUTSIDE_BOMBCHU_SHOP, ENTR_BOMBCHU_SHOP_1, SINGLE_SCENE_INFO(SCENE_BOMBCHU_SHOP), "Bombchu Shop", "MK Bombchu Shop Entry", ENTRANCE_GROUP_MARKET, ENTRANCE_GROUP_MARKET, ENTRANCE_TYPE_INTERIOR}, + { ENTR_MARKET_DAY_TEMPLE_EXIT, ENTR_TEMPLE_OF_TIME_EXTERIOR_DAY_GOSSIP_STONE_EXIT, {SCENE_NO_SPAWN(SCENE_TEMPLE_OF_TIME_EXTERIOR_DAY), SCENE_NO_SPAWN(SCENE_TEMPLE_OF_TIME_EXTERIOR_NIGHT), SCENE_NO_SPAWN(SCENE_TEMPLE_OF_TIME_EXTERIOR_RUINS)}, "Outside Temple of Time", "Market Temple Exit", ENTRANCE_GROUP_MARKET, ENTRANCE_GROUP_MARKET, ENTRANCE_TYPE_OVERWORLD, "tot"}, + { ENTR_TEMPLE_OF_TIME_ENTRANCE, ENTR_TEMPLE_OF_TIME_EXTERIOR_DAY_OUTSIDE_TEMPLE, {SCENE_NO_SPAWN(SCENE_TEMPLE_OF_TIME_EXTERIOR_DAY), SCENE_NO_SPAWN(SCENE_TEMPLE_OF_TIME_EXTERIOR_NIGHT), SCENE_NO_SPAWN(SCENE_TEMPLE_OF_TIME_EXTERIOR_RUINS)}, "Outside Temple of Time", "Temple of Time Entrance", ENTRANCE_GROUP_MARKET, ENTRANCE_GROUP_MARKET, ENTRANCE_TYPE_INTERIOR, "tot", 1}, + { ENTR_TEMPLE_OF_TIME_EXTERIOR_DAY_OUTSIDE_TEMPLE, ENTR_TEMPLE_OF_TIME_ENTRANCE, SINGLE_SCENE_INFO(SCENE_TEMPLE_OF_TIME), "Temple of Time Entrance", "Outside Temple of Time", ENTRANCE_GROUP_MARKET, ENTRANCE_GROUP_MARKET, ENTRANCE_TYPE_INTERIOR, "tot"}, // Hyrule Castle - { ENTR_MARKET_DAY_CASTLE_EXIT, ENTR_CASTLE_GROUNDS_SOUTH_EXIT, {SCENE_NO_SPAWN(SCENE_HYRULE_CASTLE), SCENE_NO_SPAWN(SCENE_OUTSIDE_GANONS_CASTLE)}, "Castle Grounds South Exit", "Market Castle Exit", ENTRANCE_GROUP_HYRULE_CASTLE, ENTRANCE_GROUP_MARKET, ENTRANCE_TYPE_OVERWORLD, "outside ganon's castle"}, - { ENTR_GREAT_FAIRYS_FOUNTAIN_SPELLS_DINS_HC, ENTR_CASTLE_GROUNDS_GREAT_FAIRY_EXIT, SINGLE_SCENE_INFO(SCENE_HYRULE_CASTLE), "HC Boulder Crawlspace", "HC Great Fairy Fountain", ENTRANCE_GROUP_HYRULE_CASTLE, ENTRANCE_GROUP_HYRULE_CASTLE, ENTRANCE_TYPE_INTERIOR, "", 1}, - { ENTRANCE_GROTTO_LOAD(GROTTO_HC_STORMS_OFFSET), ENTRANCE_GROTTO_EXIT(GROTTO_HC_STORMS_OFFSET), SINGLE_SCENE_INFO(SCENE_HYRULE_CASTLE), "HC Storms Grotto Exit", "HC Storms Grotto", ENTRANCE_GROUP_HYRULE_CASTLE, ENTRANCE_GROUP_HYRULE_CASTLE, ENTRANCE_TYPE_GROTTO, "bombable", 1}, - { ENTR_CASTLE_GROUNDS_GREAT_FAIRY_EXIT, ENTR_GREAT_FAIRYS_FOUNTAIN_SPELLS_DINS_HC, {{ SCENE_GREAT_FAIRYS_FOUNTAIN_SPELLS, 0x01 }}, "HC Great Fairy Fountain", "HC Boulder Crawlspace", ENTRANCE_GROUP_HYRULE_CASTLE, ENTRANCE_GROUP_HYRULE_CASTLE, ENTRANCE_TYPE_INTERIOR}, - { ENTRANCE_GROTTO_EXIT(GROTTO_HC_STORMS_OFFSET), ENTRANCE_GROTTO_LOAD(GROTTO_HC_STORMS_OFFSET), {{ SCENE_GROTTOS, 0x09 }}, "HC Storms Grotto", "HC Storms Grotto Exit", ENTRANCE_GROUP_HYRULE_CASTLE, ENTRANCE_GROUP_HYRULE_CASTLE, ENTRANCE_TYPE_GROTTO, "bombable"}, - { ENTR_GREAT_FAIRYS_FOUNTAIN_MAGIC_OGC_DD, ENTR_POTION_SHOP_KAKARIKO_1, SINGLE_SCENE_INFO(SCENE_OUTSIDE_GANONS_CASTLE), "OGC Behind Pillar", "OGC Great Fairy Fountain", ENTRANCE_GROUP_HYRULE_CASTLE, ENTRANCE_GROUP_HYRULE_CASTLE, ENTRANCE_TYPE_INTERIOR, "outside ganon's castle", 1}, - { ENTR_INSIDE_GANONS_CASTLE_ENTRANCE, ENTR_CASTLE_GROUNDS_RAINBOW_BRIDGE_EXIT, SINGLE_SCENE_INFO(SCENE_OUTSIDE_GANONS_CASTLE), "OGC Rainbow Bridge Exit", "Ganon's Castle", ENTRANCE_GROUP_HYRULE_CASTLE, ENTRANCE_GROUP_HYRULE_CASTLE, ENTRANCE_TYPE_DUNGEON, "outside ganon's castle,gc", 1}, - { ENTR_POTION_SHOP_KAKARIKO_1, ENTR_GREAT_FAIRYS_FOUNTAIN_MAGIC_OGC_DD, {{ SCENE_GREAT_FAIRYS_FOUNTAIN_MAGIC, 0x02 }}, "OGC Great Fairy Fountain", "OGC Behind Pillar", ENTRANCE_GROUP_HYRULE_CASTLE, ENTRANCE_GROUP_HYRULE_CASTLE, ENTRANCE_TYPE_INTERIOR, "outside ganon's castle"}, - { ENTR_CASTLE_GROUNDS_RAINBOW_BRIDGE_EXIT, ENTR_INSIDE_GANONS_CASTLE_ENTRANCE, SINGLE_SCENE_INFO(SCENE_INSIDE_GANONS_CASTLE), "Inside Ganon's Castle Entrance", "OGC Rainbow Bridge Exit", ENTRANCE_GROUP_HYRULE_CASTLE, ENTRANCE_GROUP_HYRULE_CASTLE, ENTRANCE_TYPE_DUNGEON, "outside ganon's castle,gc"} + { ENTR_MARKET_DAY_CASTLE_EXIT, ENTR_CASTLE_GROUNDS_SOUTH_EXIT, {SCENE_NO_SPAWN(SCENE_HYRULE_CASTLE), SCENE_NO_SPAWN(SCENE_OUTSIDE_GANONS_CASTLE)}, "Castle Grounds South Exit", "Market Castle Exit", ENTRANCE_GROUP_HYRULE_CASTLE, ENTRANCE_GROUP_MARKET, ENTRANCE_TYPE_OVERWORLD, "outside ganon's castle"}, + { ENTR_GREAT_FAIRYS_FOUNTAIN_SPELLS_DINS_HC, ENTR_CASTLE_GROUNDS_GREAT_FAIRY_EXIT, SINGLE_SCENE_INFO(SCENE_HYRULE_CASTLE), "HC Boulder Crawlspace", "HC Great Fairy Fountain", ENTRANCE_GROUP_HYRULE_CASTLE, ENTRANCE_GROUP_HYRULE_CASTLE, ENTRANCE_TYPE_INTERIOR, "", 1}, + { ENTRANCE_GROTTO_LOAD(GROTTO_HC_STORMS_OFFSET), ENTRANCE_GROTTO_EXIT(GROTTO_HC_STORMS_OFFSET), SINGLE_SCENE_INFO(SCENE_HYRULE_CASTLE), "HC Storms Grotto Entry", "HC Storms Grotto", ENTRANCE_GROUP_HYRULE_CASTLE, ENTRANCE_GROUP_HYRULE_CASTLE, ENTRANCE_TYPE_GROTTO, "bombable", 1}, + { ENTR_CASTLE_GROUNDS_GREAT_FAIRY_EXIT, ENTR_GREAT_FAIRYS_FOUNTAIN_SPELLS_DINS_HC, {{ SCENE_GREAT_FAIRYS_FOUNTAIN_SPELLS, 0x01 }}, "HC Great Fairy Fountain", "HC Boulder Crawlspace", ENTRANCE_GROUP_HYRULE_CASTLE, ENTRANCE_GROUP_HYRULE_CASTLE, ENTRANCE_TYPE_INTERIOR}, + { ENTRANCE_GROTTO_EXIT(GROTTO_HC_STORMS_OFFSET), ENTRANCE_GROTTO_LOAD(GROTTO_HC_STORMS_OFFSET), {{ SCENE_GROTTOS, 0x09 }}, "HC Storms Grotto", "HC Storms Grotto Entry", ENTRANCE_GROUP_HYRULE_CASTLE, ENTRANCE_GROUP_HYRULE_CASTLE, ENTRANCE_TYPE_GROTTO, "bombable"}, + { ENTR_GREAT_FAIRYS_FOUNTAIN_MAGIC_OGC_DD, ENTR_POTION_SHOP_KAKARIKO_1, SINGLE_SCENE_INFO(SCENE_OUTSIDE_GANONS_CASTLE), "OGC Behind Pillar", "OGC Great Fairy Fountain", ENTRANCE_GROUP_HYRULE_CASTLE, ENTRANCE_GROUP_HYRULE_CASTLE, ENTRANCE_TYPE_INTERIOR, "outside ganon's castle", 1}, + { ENTR_INSIDE_GANONS_CASTLE_ENTRANCE, ENTR_CASTLE_GROUNDS_RAINBOW_BRIDGE_EXIT, SINGLE_SCENE_INFO(SCENE_OUTSIDE_GANONS_CASTLE), "OGC Rainbow Bridge Exit", "Inside Ganon's Castle Entrance", ENTRANCE_GROUP_HYRULE_CASTLE, ENTRANCE_GROUP_HYRULE_CASTLE, ENTRANCE_TYPE_DUNGEON, "outside ganon's castle,gc", 1}, + { ENTR_POTION_SHOP_KAKARIKO_1, ENTR_GREAT_FAIRYS_FOUNTAIN_MAGIC_OGC_DD, {{ SCENE_GREAT_FAIRYS_FOUNTAIN_MAGIC, 0x02 }}, "OGC Great Fairy Fountain", "OGC Behind Pillar", ENTRANCE_GROUP_HYRULE_CASTLE, ENTRANCE_GROUP_HYRULE_CASTLE, ENTRANCE_TYPE_INTERIOR, "outside ganon's castle"}, + { ENTR_CASTLE_GROUNDS_RAINBOW_BRIDGE_EXIT, ENTR_INSIDE_GANONS_CASTLE_ENTRANCE, SINGLE_SCENE_INFO(SCENE_INSIDE_GANONS_CASTLE), "Inside Ganon's Castle Entrance", "OGC Rainbow Bridge Exit", ENTRANCE_GROUP_HYRULE_CASTLE, ENTRANCE_GROUP_HYRULE_CASTLE, ENTRANCE_TYPE_DUNGEON, "outside ganon's castle,gc"} }; // Check if Link is in the area and return that scene/entrance for tracking @@ -442,6 +442,21 @@ const EntranceData* GetEntranceData(s16 index) { return nullptr; } +// Used for verifying the names on both sides of entrance pairs match. Keeping for ease of use for further name changes later +// TODO: Figure out how to remove the need for duplicate entrance names so this is no longer necessary +void CheckEntranceNames() { + SPDLOG_ERROR("Checking entrance names:"); + for (size_t i = 0; i < ARRAY_COUNT(entranceData); i++) { + auto entrance = &entranceData[i]; + auto reverse = GetEntranceData(entrance->reverseIndex); + if (entrance != nullptr && reverse != nullptr) { + if (entrance->source != reverse->destination) { + SPDLOG_ERROR("{}({}) -> {}({})", entrance->source, entrance->index, reverse->destination, reverse->reverseIndex); + } + } + } +} + void SortEntranceListByType(EntranceOverride* entranceList, u8 byDest) { EntranceOverride tempList[ENTRANCE_OVERRIDES_MAX_COUNT] = { 0 }; diff --git a/soh/soh/Enhancements/randomizer/randomizer_inf.h b/soh/soh/Enhancements/randomizer/randomizer_inf.h index c66c06fab..e43acf57c 100644 --- a/soh/soh/Enhancements/randomizer/randomizer_inf.h +++ b/soh/soh/Enhancements/randomizer/randomizer_inf.h @@ -1249,9 +1249,12 @@ typedef enum { RAND_INF_LH_ISLAND_SUN_FAIRY, RAND_INF_HF_POND_STORMS_FAIRY, RAND_INF_DMT_FLAG_SUN_FAIRY, + RAND_INF_DMT_COW_GROTTO_STORMS_FAIRY, RAND_INF_HF_FENCE_GROTTO_STORMS_FAIRY, RAND_INF_LW_SHORTCUT_STORMS_FAIRY, RAND_INF_GF_KITCHEN_SUN_FAIRY, + RAND_INF_LW_DEKU_SCRUB_GROTTO_SUN_FAIRY, + RAND_INF_GRAVEYARD_ROYAL_FAMILYS_TOMB_SUN_FAIRY, RAND_INF_SPIRIT_TEMPLE_BOULDER_ROOM_SUN_FAIRY, RAND_INF_SPIRIT_TEMPLE_ARMOS_ROOM_SUN_FAIRY, RAND_INF_SHADOW_TEMPLE_BEAMOS_STORM_FAIRY, @@ -1272,6 +1275,56 @@ typedef enum { RAND_INF_SHADOW_TEMPLE_MQ_WIND_HINT_SUN_FAIRY, RAND_INF_BOTTOM_OF_THE_WELL_MQ_CELL_SUN_FAIRY, RAND_INF_BOTTOM_OF_THE_WELL_MQ_BASEMENT_SUN_FAIRY, + + RAND_INF_GUARD_HOUSE_UNLOCKED, + RAND_INF_GUARD_HOUSE_KEY_OBTAINED, + RAND_INF_MARKET_BAZAAR_UNLOCKED, + RAND_INF_MARKET_BAZAAR_KEY_OBTAINED, + RAND_INF_MARKET_POTION_SHOP_UNLOCKED, + RAND_INF_MARKET_POTION_SHOP_KEY_OBTAINED, + RAND_INF_MASK_SHOP_UNLOCKED, + RAND_INF_MASK_SHOP_KEY_OBTAINED, + RAND_INF_MARKET_SHOOTING_GALLERY_UNLOCKED, + RAND_INF_MARKET_SHOOTING_GALLERY_KEY_OBTAINED, + RAND_INF_BOMBCHU_BOWLING_UNLOCKED, + RAND_INF_BOMBCHU_BOWLING_KEY_OBTAINED, + RAND_INF_TREASURE_CHEST_GAME_BUILDING_UNLOCKED, + RAND_INF_TREASURE_CHEST_GAME_BUILDING_KEY_OBTAINED, + RAND_INF_BOMBCHU_SHOP_UNLOCKED, + RAND_INF_BOMBCHU_SHOP_KEY_OBTAINED, + RAND_INF_RICHARDS_HOUSE_UNLOCKED, + RAND_INF_RICHARDS_HOUSE_KEY_OBTAINED, + RAND_INF_ALLEY_HOUSE_UNLOCKED, + RAND_INF_ALLEY_HOUSE_KEY_OBTAINED, + RAND_INF_KAK_BAZAAR_UNLOCKED, + RAND_INF_KAK_BAZAAR_KEY_OBTAINED, + RAND_INF_KAK_POTION_SHOP_UNLOCKED, + RAND_INF_KAK_POTION_SHOP_KEY_OBTAINED, + RAND_INF_BOSS_HOUSE_UNLOCKED, + RAND_INF_BOSS_HOUSE_KEY_OBTAINED, + RAND_INF_GRANNYS_POTION_SHOP_UNLOCKED, + RAND_INF_GRANNYS_POTION_SHOP_KEY_OBTAINED, + RAND_INF_SKULLTULA_HOUSE_UNLOCKED, + RAND_INF_SKULLTULA_HOUSE_KEY_OBTAINED, + RAND_INF_IMPAS_HOUSE_UNLOCKED, + RAND_INF_IMPAS_HOUSE_KEY_OBTAINED, + RAND_INF_WINDMILL_UNLOCKED, + RAND_INF_WINDMILL_KEY_OBTAINED, + RAND_INF_KAK_SHOOTING_GALLERY_UNLOCKED, + RAND_INF_KAK_SHOOTING_GALLERY_KEY_OBTAINED, + RAND_INF_DAMPES_HUT_UNLOCKED, + RAND_INF_DAMPES_HUT_KEY_OBTAINED, + RAND_INF_TALONS_HOUSE_UNLOCKED, + RAND_INF_TALONS_HOUSE_KEY_OBTAINED, + RAND_INF_STABLES_UNLOCKED, + RAND_INF_STABLES_KEY_OBTAINED, + RAND_INF_BACK_TOWER_UNLOCKED, + RAND_INF_BACK_TOWER_KEY_OBTAINED, + RAND_INF_HYLIA_LAB_UNLOCKED, + RAND_INF_HYLIA_LAB_KEY_OBTAINED, + RAND_INF_FISHING_HOLE_UNLOCKED, + RAND_INF_FISHING_HOLE_KEY_OBTAINED, + // If you add anything to this list, you need to update the size of randomizerInf in z64save.h to be ceil(RAND_INF_MAX / 16) RAND_INF_MAX, diff --git a/soh/soh/Enhancements/randomizer/randomizer_item_tracker.cpp b/soh/soh/Enhancements/randomizer/randomizer_item_tracker.cpp index 4c5ba4714..eb0b1aafd 100644 --- a/soh/soh/Enhancements/randomizer/randomizer_item_tracker.cpp +++ b/soh/soh/Enhancements/randomizer/randomizer_item_tracker.cpp @@ -4,7 +4,7 @@ #include "soh/cvar_prefixes.h" #include "soh/SaveManager.h" #include "soh/ResourceManagerHelpers.h" -#include "soh/UIWidgets.hpp" +#include "soh/SohGui/UIWidgets.hpp" #include "randomizerTypes.h" #include @@ -90,17 +90,15 @@ std::vector triforcePieces = { }; std::vector bossSoulItems = { - //Hack for right now, just gonna draw souls as bottles/big poes. - //Will replace with other macro once we have a custom texture - ITEM_TRACKER_ITEM_CUSTOM(RG_GOHMA_SOUL, ITEM_BIG_POE, ITEM_BOTTLE, 0, DrawItem ), - ITEM_TRACKER_ITEM_CUSTOM(RG_KING_DODONGO_SOUL, ITEM_BIG_POE, ITEM_BOTTLE, 0, DrawItem ), - ITEM_TRACKER_ITEM_CUSTOM(RG_BARINADE_SOUL, ITEM_BIG_POE, ITEM_BOTTLE, 0, DrawItem ), - ITEM_TRACKER_ITEM_CUSTOM(RG_PHANTOM_GANON_SOUL, ITEM_BIG_POE, ITEM_BOTTLE, 0, DrawItem ), - ITEM_TRACKER_ITEM_CUSTOM(RG_VOLVAGIA_SOUL, ITEM_BIG_POE, ITEM_BOTTLE, 0, DrawItem ), - ITEM_TRACKER_ITEM_CUSTOM(RG_MORPHA_SOUL, ITEM_BIG_POE, ITEM_BOTTLE, 0, DrawItem ), - ITEM_TRACKER_ITEM_CUSTOM(RG_BONGO_BONGO_SOUL, ITEM_BIG_POE, ITEM_BOTTLE, 0, DrawItem ), - ITEM_TRACKER_ITEM_CUSTOM(RG_TWINROVA_SOUL, ITEM_BIG_POE, ITEM_BOTTLE, 0, DrawItem ), - ITEM_TRACKER_ITEM_CUSTOM(RG_GANON_SOUL, ITEM_BIG_POE, ITEM_BOTTLE, 0, DrawItem ), + ITEM_TRACKER_ITEM(RG_GOHMA_SOUL, 0, DrawItem), + ITEM_TRACKER_ITEM(RG_KING_DODONGO_SOUL, 0, DrawItem ), + ITEM_TRACKER_ITEM(RG_BARINADE_SOUL, 0, DrawItem ), + ITEM_TRACKER_ITEM(RG_PHANTOM_GANON_SOUL, 0, DrawItem ), + ITEM_TRACKER_ITEM(RG_VOLVAGIA_SOUL, 0, DrawItem ), + ITEM_TRACKER_ITEM(RG_MORPHA_SOUL, 0, DrawItem ), + ITEM_TRACKER_ITEM(RG_BONGO_BONGO_SOUL, 0, DrawItem ), + ITEM_TRACKER_ITEM(RG_TWINROVA_SOUL, 0, DrawItem ), + ITEM_TRACKER_ITEM(RG_GANON_SOUL, 0, DrawItem ), }; std::vector ocarinaButtonItems = { @@ -411,17 +409,17 @@ ItemTrackerNumbers GetItemCurrentAndMax(ItemTrackerItem item) { break; case ITEM_HEART_CONTAINER: result.maxCapacity = result.currentCapacity = 8; - result.currentAmmo = gSaveContext.sohStats.heartContainers; + result.currentAmmo = gSaveContext.ship.stats.heartContainers; break; case ITEM_HEART_PIECE: result.maxCapacity = result.currentCapacity = 36; - result.currentAmmo = gSaveContext.sohStats.heartPieces; + result.currentAmmo = gSaveContext.ship.stats.heartPieces; break; case ITEM_KEY_SMALL: // Though the ammo/capacity naming doesn't really make sense for keys, we are // hijacking the same system to display key counts as there are enough similarities result.currentAmmo = MAX(gSaveContext.inventory.dungeonKeys[item.data], 0); - result.currentCapacity = gSaveContext.sohStats.dungeonKeys[item.data]; + result.currentCapacity = gSaveContext.ship.stats.dungeonKeys[item.data]; switch (item.data) { case SCENE_FOREST_TEMPLE: result.maxCapacity = FOREST_TEMPLE_SMALL_KEY_MAX; @@ -582,11 +580,11 @@ void DrawItemCount(ItemTrackerItem item, bool hideMax) { std::string maxString = ""; uint8_t piecesRequired = (OTRGlobals::Instance->gRandomizer->GetRandoSettingValue(RSK_TRIFORCE_HUNT_PIECES_REQUIRED) + 1); uint8_t piecesTotal = (OTRGlobals::Instance->gRandomizer->GetRandoSettingValue(RSK_TRIFORCE_HUNT_PIECES_TOTAL) + 1); - ImU32 currentColor = gSaveContext.triforcePiecesCollected >= piecesRequired ? IM_COL_GREEN : IM_COL_WHITE; + ImU32 currentColor = gSaveContext.ship.quest.data.randomizer.triforcePiecesCollected >= piecesRequired ? IM_COL_GREEN : IM_COL_WHITE; ImU32 maxColor = IM_COL_GREEN; int32_t trackerTriforcePieceNumberDisplayMode = CVarGetInteger(CVAR_TRACKER_ITEM("TriforcePieceCounts"), TRIFORCE_PIECE_COLLECTED_REQUIRED_MAX); - currentString += std::to_string(gSaveContext.triforcePiecesCollected); + currentString += std::to_string(gSaveContext.ship.quest.data.randomizer.triforcePiecesCollected); currentString += "/"; // gItemTrackerTriforcePieceTrack if (trackerTriforcePieceNumberDisplayMode == TRIFORCE_PIECE_COLLECTED_REQUIRED_MAX) { @@ -651,11 +649,11 @@ void DrawItem(ItemTrackerItem item) { switch (item.id) { case ITEM_HEART_CONTAINER: actualItemId = item.id; - hasItem = gSaveContext.sohStats.heartContainers > 0; + hasItem = gSaveContext.ship.stats.heartContainers > 0; break; case ITEM_HEART_PIECE: actualItemId = item.id; - hasItem = gSaveContext.sohStats.heartPieces > 0; + hasItem = gSaveContext.ship.stats.heartPieces > 0; break; case ITEM_MAGIC_SMALL: case ITEM_MAGIC_LARGE: diff --git a/soh/soh/Enhancements/randomizer/savefile.cpp b/soh/soh/Enhancements/randomizer/savefile.cpp index eb081552f..7e91026b0 100644 --- a/soh/soh/Enhancements/randomizer/savefile.cpp +++ b/soh/soh/Enhancements/randomizer/savefile.cpp @@ -25,7 +25,7 @@ void StartingItemGive(GetItemEntry getItemEntry, RandomizerCheck randomizerCheck Item_Give(NULL, getItemEntry.itemId); } else if (getItemEntry.modIndex == MOD_RANDOMIZER) { if (getItemEntry.getItemId == RG_ICE_TRAP) { - gSaveContext.pendingIceTrapCount++; + gSaveContext.ship.pendingIceTrapCount++; } else { Randomizer_Item_Give(NULL, getItemEntry); } @@ -174,22 +174,22 @@ void SetStartingItems() { } if (Randomizer_GetSettingValue(RSK_KEYSANITY) == RO_DUNGEON_ITEM_LOC_STARTWITH) { - gSaveContext.inventory.dungeonKeys[SCENE_FOREST_TEMPLE] = FOREST_TEMPLE_SMALL_KEY_MAX; // Forest - gSaveContext.sohStats.dungeonKeys[SCENE_FOREST_TEMPLE] = FOREST_TEMPLE_SMALL_KEY_MAX; // Forest - gSaveContext.inventory.dungeonKeys[SCENE_FIRE_TEMPLE] = FIRE_TEMPLE_SMALL_KEY_MAX; // Fire - gSaveContext.sohStats.dungeonKeys[SCENE_FIRE_TEMPLE] = FIRE_TEMPLE_SMALL_KEY_MAX; // Fire - gSaveContext.inventory.dungeonKeys[SCENE_WATER_TEMPLE] = WATER_TEMPLE_SMALL_KEY_MAX; // Water - gSaveContext.sohStats.dungeonKeys[SCENE_WATER_TEMPLE] = WATER_TEMPLE_SMALL_KEY_MAX; // Water - gSaveContext.inventory.dungeonKeys[SCENE_SPIRIT_TEMPLE] = SPIRIT_TEMPLE_SMALL_KEY_MAX; // Spirit - gSaveContext.sohStats.dungeonKeys[SCENE_SPIRIT_TEMPLE] = SPIRIT_TEMPLE_SMALL_KEY_MAX; // Spirit - gSaveContext.inventory.dungeonKeys[SCENE_SHADOW_TEMPLE] = SHADOW_TEMPLE_SMALL_KEY_MAX; // Shadow - gSaveContext.sohStats.dungeonKeys[SCENE_SHADOW_TEMPLE] = SHADOW_TEMPLE_SMALL_KEY_MAX; // Shadow - gSaveContext.inventory.dungeonKeys[SCENE_BOTTOM_OF_THE_WELL] = BOTTOM_OF_THE_WELL_SMALL_KEY_MAX; // BotW - gSaveContext.sohStats.dungeonKeys[SCENE_BOTTOM_OF_THE_WELL] = BOTTOM_OF_THE_WELL_SMALL_KEY_MAX; // BotW + gSaveContext.inventory.dungeonKeys[SCENE_FOREST_TEMPLE] = FOREST_TEMPLE_SMALL_KEY_MAX; // Forest + gSaveContext.ship.stats.dungeonKeys[SCENE_FOREST_TEMPLE] = FOREST_TEMPLE_SMALL_KEY_MAX; // Forest + gSaveContext.inventory.dungeonKeys[SCENE_FIRE_TEMPLE] = FIRE_TEMPLE_SMALL_KEY_MAX; // Fire + gSaveContext.ship.stats.dungeonKeys[SCENE_FIRE_TEMPLE] = FIRE_TEMPLE_SMALL_KEY_MAX; // Fire + gSaveContext.inventory.dungeonKeys[SCENE_WATER_TEMPLE] = WATER_TEMPLE_SMALL_KEY_MAX; // Water + gSaveContext.ship.stats.dungeonKeys[SCENE_WATER_TEMPLE] = WATER_TEMPLE_SMALL_KEY_MAX; // Water + gSaveContext.inventory.dungeonKeys[SCENE_SPIRIT_TEMPLE] = SPIRIT_TEMPLE_SMALL_KEY_MAX; // Spirit + gSaveContext.ship.stats.dungeonKeys[SCENE_SPIRIT_TEMPLE] = SPIRIT_TEMPLE_SMALL_KEY_MAX; // Spirit + gSaveContext.inventory.dungeonKeys[SCENE_SHADOW_TEMPLE] = SHADOW_TEMPLE_SMALL_KEY_MAX; // Shadow + gSaveContext.ship.stats.dungeonKeys[SCENE_SHADOW_TEMPLE] = SHADOW_TEMPLE_SMALL_KEY_MAX; // Shadow + gSaveContext.inventory.dungeonKeys[SCENE_BOTTOM_OF_THE_WELL] = BOTTOM_OF_THE_WELL_SMALL_KEY_MAX; // BotW + gSaveContext.ship.stats.dungeonKeys[SCENE_BOTTOM_OF_THE_WELL] = BOTTOM_OF_THE_WELL_SMALL_KEY_MAX; // BotW gSaveContext.inventory.dungeonKeys[SCENE_GERUDO_TRAINING_GROUND] = GERUDO_TRAINING_GROUND_SMALL_KEY_MAX; // GTG - gSaveContext.sohStats.dungeonKeys[SCENE_GERUDO_TRAINING_GROUND] = GERUDO_TRAINING_GROUND_SMALL_KEY_MAX; // GTG - gSaveContext.inventory.dungeonKeys[SCENE_INSIDE_GANONS_CASTLE] = GANONS_CASTLE_SMALL_KEY_MAX; // Ganon - gSaveContext.sohStats.dungeonKeys[SCENE_INSIDE_GANONS_CASTLE] = GANONS_CASTLE_SMALL_KEY_MAX; // Ganon + gSaveContext.ship.stats.dungeonKeys[SCENE_GERUDO_TRAINING_GROUND] = GERUDO_TRAINING_GROUND_SMALL_KEY_MAX; // GTG + gSaveContext.inventory.dungeonKeys[SCENE_INSIDE_GANONS_CASTLE] = GANONS_CASTLE_SMALL_KEY_MAX; // Ganon + gSaveContext.ship.stats.dungeonKeys[SCENE_INSIDE_GANONS_CASTLE] = GANONS_CASTLE_SMALL_KEY_MAX; // Ganon } else if (Randomizer_GetSettingValue(RSK_KEYSANITY) == RO_DUNGEON_ITEM_LOC_VANILLA) { // Logic cannot handle vanilla key layout in some dungeons // this is because vanilla expects the dungeon major item to be @@ -198,7 +198,7 @@ void SetStartingItems() { if (ResourceMgr_IsSceneMasterQuest(SCENE_SPIRIT_TEMPLE)) { // MQ Spirit needs 3 keys gSaveContext.inventory.dungeonKeys[SCENE_SPIRIT_TEMPLE] = 3; - gSaveContext.sohStats.dungeonKeys[SCENE_SPIRIT_TEMPLE] = 3; + gSaveContext.ship.stats.dungeonKeys[SCENE_SPIRIT_TEMPLE] = 3; } } @@ -220,10 +220,10 @@ extern "C" void Randomizer_InitSaveFile() { ctx->GetLogic()->SetSaveContext(&gSaveContext); // Starts pending ice traps out at 0 before potentially incrementing them down the line. - gSaveContext.pendingIceTrapCount = 0; + gSaveContext.ship.pendingIceTrapCount = 0; // Reset triforce pieces collected - gSaveContext.triforcePiecesCollected = 0; + gSaveContext.ship.quest.data.randomizer.triforcePiecesCollected = 0; // Set Cutscene flags and texts to skip them Flags_SetEventChkInf(EVENTCHKINF_FIRST_SPOKE_TO_MIDO); @@ -262,7 +262,7 @@ extern "C" void Randomizer_InitSaveFile() { // shuffle adult trade quest if (Randomizer_GetSettingValue(RSK_SHUFFLE_ADULT_TRADE)) { - gSaveContext.adultTradeItems = 0; + gSaveContext.ship.quest.data.randomizer.adultTradeItems = 0; } // remove One Time scrubs with scrubsanity off @@ -272,7 +272,7 @@ extern "C" void Randomizer_InitSaveFile() { Flags_SetRandomizerInf(RAND_INF_SCRUBS_PURCHASED_HF_DEKU_SCRUB_GROTTO); } - int startingAge = OTRGlobals::Instance->gRandoContext->GetSettings()->ResolvedStartingAge(); + int startingAge = OTRGlobals::Instance->gRandoContext->GetOption(RSK_SELECTED_STARTING_AGE).Get(); switch (startingAge) { case RO_AGE_ADULT: // Adult gSaveContext.linkAge = LINK_AGE_ADULT; diff --git a/soh/soh/Enhancements/randomizer/settings.cpp b/soh/soh/Enhancements/randomizer/settings.cpp index f5abde703..2ca325635 100644 --- a/soh/soh/Enhancements/randomizer/settings.cpp +++ b/soh/soh/Enhancements/randomizer/settings.cpp @@ -1,7 +1,6 @@ #include "settings.h" #include "trial.h" #include "dungeon.h" -#include "context.h" #include "soh/OTRGlobals.h" @@ -12,6 +11,8 @@ #include "consolevariablebridge.h" namespace Rando { +std::shared_ptr Settings::mInstance; + std::vector NumOpts(const int min, const int max, const int step = 1, const std::string& textBefore = {}, const std::string& textAfter = {}) { std::vector options; options.reserve((max - min) / step + 1); @@ -102,222 +103,229 @@ void Settings::HandleShopsanityPriceUI(){ Settings::Settings() : mExcludeLocationsOptionsAreas(RCAREA_INVALID) { } +#define OPT_U8(rsk, ...) mOptions[rsk] = Option::U8(rsk, __VA_ARGS__) +#define OPT_BOOL(rsk, ...) mOptions[rsk] = Option::Bool(rsk, __VA_ARGS__) +#define OPT_TRICK(rsk, ...) mTrickOptions[rsk] = TrickOption::LogicTrick(rsk, __VA_ARGS__) + void Settings::CreateOptions() { CreateOptionDescriptions(); // clang-format off - mOptions[RSK_FOREST] = Option::U8("Closed Forest", {"On", "Deku Only", "Off"}, OptionCategory::Setting, CVAR_RANDOMIZER_SETTING("ClosedForest"), mOptionDescriptions[RSK_FOREST], WidgetType::Combobox, RO_CLOSED_FOREST_ON); - mOptions[RSK_KAK_GATE] = Option::U8("Kakariko Gate", {"Closed", "Open"}, OptionCategory::Setting, CVAR_RANDOMIZER_SETTING("KakarikoGate"), mOptionDescriptions[RSK_KAK_GATE]); - mOptions[RSK_DOOR_OF_TIME] = Option::U8("Door of Time", {"Closed", "Song only", "Open"}, OptionCategory::Setting, CVAR_RANDOMIZER_SETTING("DoorOfTime"), mOptionDescriptions[RSK_DOOR_OF_TIME], WidgetType::Combobox); - mOptions[RSK_ZORAS_FOUNTAIN] = Option::U8("Zora's Fountain", {"Closed", "Closed as child", "Open"}, OptionCategory::Setting, CVAR_RANDOMIZER_SETTING("ZorasFountain"), mOptionDescriptions[RSK_ZORAS_FOUNTAIN]); - mOptions[RSK_SLEEPING_WATERFALL] = Option::U8("Sleeping Waterfall", {"Closed", "Open"}, OptionCategory::Setting, CVAR_RANDOMIZER_SETTING("SleepingWaterfall"), mOptionDescriptions[RSK_SLEEPING_WATERFALL]); - mOptions[RSK_GERUDO_FORTRESS] = Option::U8("Fortress Carpenters", {"Normal", "Fast", "Free"}, OptionCategory::Setting, CVAR_RANDOMIZER_SETTING("FortressCarpenters"), mOptionDescriptions[RSK_GERUDO_FORTRESS]); - mOptions[RSK_RAINBOW_BRIDGE] = Option::U8("Rainbow Bridge", {"Vanilla", "Always open", "Stones", "Medallions", "Dungeon rewards", "Dungeons", "Tokens", "Greg"}, OptionCategory::Setting, CVAR_RANDOMIZER_SETTING("RainbowBridge"), mOptionDescriptions[RSK_RAINBOW_BRIDGE], WidgetType::Combobox, RO_BRIDGE_VANILLA, false, IMFLAG_NONE); - mOptions[RSK_RAINBOW_BRIDGE_STONE_COUNT] = Option::U8("Bridge Stone Count", {NumOpts(0, 4)}, OptionCategory::Setting, CVAR_RANDOMIZER_SETTING("StoneCount"), "", WidgetType::Slider, 3, true); - mOptions[RSK_RAINBOW_BRIDGE_MEDALLION_COUNT] = Option::U8("Bridge Medallion Count", {NumOpts(0, 7)}, OptionCategory::Setting, CVAR_RANDOMIZER_SETTING("MedallionCount"), "", WidgetType::Slider, 6, true); - mOptions[RSK_RAINBOW_BRIDGE_REWARD_COUNT] = Option::U8("Bridge Reward Count", {NumOpts(0, 10)}, OptionCategory::Setting, CVAR_RANDOMIZER_SETTING("RewardCount"), "", WidgetType::Slider, 9, true); - mOptions[RSK_RAINBOW_BRIDGE_DUNGEON_COUNT] = Option::U8("Bridge Dungeon Count", {NumOpts(0, 9)}, OptionCategory::Setting, CVAR_RANDOMIZER_SETTING("DungeonCount"), "", WidgetType::Slider, 8, true); - mOptions[RSK_RAINBOW_BRIDGE_TOKEN_COUNT] = Option::U8("Bridge Token Count", {NumOpts(0, 100)}, OptionCategory::Setting, CVAR_RANDOMIZER_SETTING("TokenCount"), "", WidgetType::Slider, 100, true); - mOptions[RSK_RAINBOW_BRIDGE_STONE_COUNT] = Option::U8("Bridge Stone Count", {NumOpts(0, 4)}, OptionCategory::Setting, CVAR_RANDOMIZER_SETTING("StoneCount"), "", WidgetType::Slider, 3, true); - mOptions[RSK_RAINBOW_BRIDGE_MEDALLION_COUNT] = Option::U8("Bridge Medallion Count", {NumOpts(0, 7)}, OptionCategory::Setting, CVAR_RANDOMIZER_SETTING("MedallionCount"), "", WidgetType::Slider, 6, true); - mOptions[RSK_RAINBOW_BRIDGE_REWARD_COUNT] = Option::U8("Bridge Reward Count", {NumOpts(0, 10)}, OptionCategory::Setting, CVAR_RANDOMIZER_SETTING("RewardCount"), "", WidgetType::Slider, 9, true); - mOptions[RSK_RAINBOW_BRIDGE_DUNGEON_COUNT] = Option::U8("Bridge Dungeon Count", {NumOpts(0, 9)}, OptionCategory::Setting, CVAR_RANDOMIZER_SETTING("DungeonCount"), "", WidgetType::Slider, 8, true); - mOptions[RSK_RAINBOW_BRIDGE_TOKEN_COUNT] = Option::U8("Bridge Token Count", {NumOpts(0, 100)}, OptionCategory::Setting, CVAR_RANDOMIZER_SETTING("TokenCount"), "", WidgetType::Slider, 100, true); - mOptions[RSK_BRIDGE_OPTIONS] = Option::U8("Bridge Reward Options", {"Standard Rewards", "Greg as Reward", "Greg as Wildcard"}, OptionCategory::Setting, CVAR_RANDOMIZER_SETTING("BridgeRewardOptions"), mOptionDescriptions[RSK_BRIDGE_OPTIONS], WidgetType::Combobox, RO_BRIDGE_STANDARD_REWARD, false, IMFLAG_NONE); - mOptions[RSK_GANONS_TRIALS] = Option::U8("Ganon's Trials", {"Skip", "Set Number", "Random Number"}, OptionCategory::Setting, CVAR_RANDOMIZER_SETTING("GanonTrial"), mOptionDescriptions[RSK_GANONS_TRIALS], WidgetType::Combobox, RO_GANONS_TRIALS_SET_NUMBER); - mOptions[RSK_TRIAL_COUNT] = Option::U8("Ganon's Trials Count", {NumOpts(0, 6)}, OptionCategory::Setting, CVAR_RANDOMIZER_SETTING("GanonTrialCount"), mOptionDescriptions[RSK_TRIAL_COUNT], WidgetType::Slider, 6, true); - mOptions[RSK_STARTING_AGE] = Option::U8("Starting Age", {"Child", "Adult", "Random"}, OptionCategory::Setting, CVAR_RANDOMIZER_SETTING("StartingAge"), mOptionDescriptions[RSK_STARTING_AGE], WidgetType::Combobox, RO_AGE_CHILD); - mOptions[RSK_SHUFFLE_ENTRANCES] = Option::Bool("Shuffle Entrances"); - mOptions[RSK_SHUFFLE_DUNGEON_ENTRANCES] = Option::U8("Dungeon Entrances", {"Off", "On", "On + Ganon"}, OptionCategory::Setting, CVAR_RANDOMIZER_SETTING("ShuffleDungeonsEntrances"), mOptionDescriptions[RSK_SHUFFLE_DUNGEON_ENTRANCES], WidgetType::Combobox, RO_DUNGEON_ENTRANCE_SHUFFLE_OFF); - mOptions[RSK_SHUFFLE_BOSS_ENTRANCES] = Option::U8("Boss Entrances", {"Off", "Age Restricted", "Full"}, OptionCategory::Setting, CVAR_RANDOMIZER_SETTING("ShuffleBossEntrances"), mOptionDescriptions[RSK_SHUFFLE_BOSS_ENTRANCES], WidgetType::Combobox, RO_BOSS_ROOM_ENTRANCE_SHUFFLE_OFF); - mOptions[RSK_SHUFFLE_OVERWORLD_ENTRANCES] = Option::Bool("Overworld Entrances", CVAR_RANDOMIZER_SETTING("ShuffleOverworldEntrances"), mOptionDescriptions[RSK_SHUFFLE_OVERWORLD_ENTRANCES]); - mOptions[RSK_SHUFFLE_INTERIOR_ENTRANCES] = Option::U8("Interior Entrances", {"Off", "Simple", "All"}, OptionCategory::Setting, CVAR_RANDOMIZER_SETTING("ShuffleInteriorsEntrances"), mOptionDescriptions[RSK_SHUFFLE_INTERIOR_ENTRANCES], WidgetType::Combobox, RO_INTERIOR_ENTRANCE_SHUFFLE_OFF); - mOptions[RSK_SHUFFLE_GROTTO_ENTRANCES] = Option::Bool("Grottos Entrances", CVAR_RANDOMIZER_SETTING("ShuffleGrottosEntrances"), mOptionDescriptions[RSK_SHUFFLE_GROTTO_ENTRANCES]); - mOptions[RSK_SHUFFLE_OWL_DROPS] = Option::Bool("Owl Drops", CVAR_RANDOMIZER_SETTING("ShuffleOwlDrops"), mOptionDescriptions[RSK_SHUFFLE_OWL_DROPS]); - mOptions[RSK_SHUFFLE_WARP_SONGS] = Option::Bool("Warp Songs", CVAR_RANDOMIZER_SETTING("ShuffleWarpSongs"), mOptionDescriptions[RSK_SHUFFLE_WARP_SONGS]); - mOptions[RSK_SHUFFLE_OVERWORLD_SPAWNS] = Option::Bool("Overworld Spawns", CVAR_RANDOMIZER_SETTING("ShuffleOverworldSpawns"), mOptionDescriptions[RSK_SHUFFLE_OVERWORLD_SPAWNS]); - mOptions[RSK_MIXED_ENTRANCE_POOLS] = Option::Bool("Mixed Entrance Pools", CVAR_RANDOMIZER_SETTING("MixedEntrances"), mOptionDescriptions[RSK_MIXED_ENTRANCE_POOLS]); - mOptions[RSK_MIX_DUNGEON_ENTRANCES] = Option::Bool("Mix Dungeons", CVAR_RANDOMIZER_SETTING("MixDungeons"), mOptionDescriptions[RSK_MIX_DUNGEON_ENTRANCES], IMFLAG_NONE); - mOptions[RSK_MIX_BOSS_ENTRANCES] = Option::Bool("Mix Bosses", CVAR_RANDOMIZER_SETTING("MixBosses"), mOptionDescriptions[RSK_MIX_BOSS_ENTRANCES], IMFLAG_NONE); - mOptions[RSK_MIX_OVERWORLD_ENTRANCES] = Option::Bool("Mix Overworld", CVAR_RANDOMIZER_SETTING("MixOverworld"), mOptionDescriptions[RSK_MIX_OVERWORLD_ENTRANCES], IMFLAG_NONE); - mOptions[RSK_MIX_INTERIOR_ENTRANCES] = Option::Bool("Mix Interiors", CVAR_RANDOMIZER_SETTING("MixInteriors"), mOptionDescriptions[RSK_MIX_INTERIOR_ENTRANCES], IMFLAG_NONE); - mOptions[RSK_MIX_GROTTO_ENTRANCES] = Option::Bool("Mix Grottos", CVAR_RANDOMIZER_SETTING("MixGrottos"), mOptionDescriptions[RSK_MIX_GROTTO_ENTRANCES]); - mOptions[RSK_DECOUPLED_ENTRANCES] = Option::Bool("Decouple Entrances", CVAR_RANDOMIZER_SETTING("DecoupleEntrances"), mOptionDescriptions[RSK_DECOUPLED_ENTRANCES]); - mOptions[RSK_BOMBCHUS_IN_LOGIC] = Option::Bool("Bombchus in Logic", CVAR_RANDOMIZER_SETTING("BombchusInLogic"), mOptionDescriptions[RSK_BOMBCHUS_IN_LOGIC]); - mOptions[RSK_ENABLE_BOMBCHU_DROPS] = Option::U8("Bombchu Drops", {"No", "Yes"}, OptionCategory::Setting, CVAR_RANDOMIZER_SETTING("EnableBombchuDrops"), mOptionDescriptions[RSK_ENABLE_BOMBCHU_DROPS], WidgetType::Combobox, RO_AMMO_DROPS_ON); + OPT_U8(RSK_FOREST, "Closed Forest", {"On", "Deku Only", "Off"}, OptionCategory::Setting, CVAR_RANDOMIZER_SETTING("ClosedForest"), mOptionDescriptions[RSK_FOREST], WidgetType::Combobox, RO_CLOSED_FOREST_ON); + OPT_U8(RSK_KAK_GATE, "Kakariko Gate", {"Closed", "Open"}, OptionCategory::Setting, CVAR_RANDOMIZER_SETTING("KakarikoGate"), mOptionDescriptions[RSK_KAK_GATE]); + OPT_U8(RSK_DOOR_OF_TIME, "Door of Time", {"Closed", "Song only", "Open"}, OptionCategory::Setting, CVAR_RANDOMIZER_SETTING("DoorOfTime"), mOptionDescriptions[RSK_DOOR_OF_TIME], WidgetType::Combobox); + OPT_U8(RSK_ZORAS_FOUNTAIN, "Zora's Fountain", {"Closed", "Closed as child", "Open"}, OptionCategory::Setting, CVAR_RANDOMIZER_SETTING("ZorasFountain"), mOptionDescriptions[RSK_ZORAS_FOUNTAIN]); + OPT_U8(RSK_SLEEPING_WATERFALL, "Sleeping Waterfall", {"Closed", "Open"}, OptionCategory::Setting, CVAR_RANDOMIZER_SETTING("SleepingWaterfall"), mOptionDescriptions[RSK_SLEEPING_WATERFALL]); + OPT_BOOL(RSK_LOCK_OVERWORLD_DOORS, "Lock Overworld Doors", CVAR_RANDOMIZER_SETTING("LockOverworldDoors"), mOptionDescriptions[RSK_LOCK_OVERWORLD_DOORS]); + OPT_U8(RSK_GERUDO_FORTRESS, "Fortress Carpenters", {"Normal", "Fast", "Free"}, OptionCategory::Setting, CVAR_RANDOMIZER_SETTING("FortressCarpenters"), mOptionDescriptions[RSK_GERUDO_FORTRESS]); + OPT_U8(RSK_RAINBOW_BRIDGE, "Rainbow Bridge", {"Vanilla", "Always open", "Stones", "Medallions", "Dungeon rewards", "Dungeons", "Tokens", "Greg"}, OptionCategory::Setting, CVAR_RANDOMIZER_SETTING("RainbowBridge"), mOptionDescriptions[RSK_RAINBOW_BRIDGE], WidgetType::Combobox, RO_BRIDGE_VANILLA, false, IMFLAG_NONE); + OPT_U8(RSK_RAINBOW_BRIDGE_STONE_COUNT, "Bridge Stone Count", {NumOpts(0, 4)}, OptionCategory::Setting, CVAR_RANDOMIZER_SETTING("StoneCount"), "", WidgetType::Slider, 3, true); + OPT_U8(RSK_RAINBOW_BRIDGE_MEDALLION_COUNT, "Bridge Medallion Count", {NumOpts(0, 7)}, OptionCategory::Setting, CVAR_RANDOMIZER_SETTING("MedallionCount"), "", WidgetType::Slider, 6, true); + OPT_U8(RSK_RAINBOW_BRIDGE_REWARD_COUNT, "Bridge Reward Count", {NumOpts(0, 10)}, OptionCategory::Setting, CVAR_RANDOMIZER_SETTING("RewardCount"), "", WidgetType::Slider, 9, true); + OPT_U8(RSK_RAINBOW_BRIDGE_DUNGEON_COUNT, "Bridge Dungeon Count", {NumOpts(0, 9)}, OptionCategory::Setting, CVAR_RANDOMIZER_SETTING("DungeonCount"), "", WidgetType::Slider, 8, true); + OPT_U8(RSK_RAINBOW_BRIDGE_TOKEN_COUNT, "Bridge Token Count", {NumOpts(0, 100)}, OptionCategory::Setting, CVAR_RANDOMIZER_SETTING("TokenCount"), "", WidgetType::Slider, 100, true); + OPT_U8(RSK_RAINBOW_BRIDGE_STONE_COUNT, "Bridge Stone Count", {NumOpts(0, 4)}, OptionCategory::Setting, CVAR_RANDOMIZER_SETTING("StoneCount"), "", WidgetType::Slider, 3, true); + OPT_U8(RSK_RAINBOW_BRIDGE_MEDALLION_COUNT, "Bridge Medallion Count", {NumOpts(0, 7)}, OptionCategory::Setting, CVAR_RANDOMIZER_SETTING("MedallionCount"), "", WidgetType::Slider, 6, true); + OPT_U8(RSK_RAINBOW_BRIDGE_REWARD_COUNT, "Bridge Reward Count", {NumOpts(0, 10)}, OptionCategory::Setting, CVAR_RANDOMIZER_SETTING("RewardCount"), "", WidgetType::Slider, 9, true); + OPT_U8(RSK_RAINBOW_BRIDGE_DUNGEON_COUNT, "Bridge Dungeon Count", {NumOpts(0, 9)}, OptionCategory::Setting, CVAR_RANDOMIZER_SETTING("DungeonCount"), "", WidgetType::Slider, 8, true); + OPT_U8(RSK_RAINBOW_BRIDGE_TOKEN_COUNT, "Bridge Token Count", {NumOpts(0, 100)}, OptionCategory::Setting, CVAR_RANDOMIZER_SETTING("TokenCount"), "", WidgetType::Slider, 100, true); + OPT_U8(RSK_BRIDGE_OPTIONS, "Bridge Reward Options", {"Standard Rewards", "Greg as Reward", "Greg as Wildcard"}, OptionCategory::Setting, CVAR_RANDOMIZER_SETTING("BridgeRewardOptions"), mOptionDescriptions[RSK_BRIDGE_OPTIONS], WidgetType::Combobox, RO_BRIDGE_STANDARD_REWARD, false, IMFLAG_NONE); + OPT_U8(RSK_GANONS_TRIALS, "Ganon's Trials", {"Skip", "Set Number", "Random Number"}, OptionCategory::Setting, CVAR_RANDOMIZER_SETTING("GanonTrial"), mOptionDescriptions[RSK_GANONS_TRIALS], WidgetType::Combobox, RO_GANONS_TRIALS_SET_NUMBER); + OPT_U8(RSK_TRIAL_COUNT, "Ganon's Trials Count", {NumOpts(0, 6)}, OptionCategory::Setting, CVAR_RANDOMIZER_SETTING("GanonTrialCount"), mOptionDescriptions[RSK_TRIAL_COUNT], WidgetType::Slider, 6, true); + OPT_U8(RSK_STARTING_AGE, "Starting Age", {"Child", "Adult", "Random"}, OptionCategory::Setting, CVAR_RANDOMIZER_SETTING("StartingAge"), mOptionDescriptions[RSK_STARTING_AGE], WidgetType::Combobox, RO_AGE_CHILD); + OPT_U8(RSK_SELECTED_STARTING_AGE, "Selected Starting Age", {"Child", "Adult"}, OptionCategory::Setting, CVAR_RANDOMIZER_SETTING("SelectedStartingAge"), mOptionDescriptions[RSK_STARTING_AGE], WidgetType::Combobox, RO_AGE_CHILD); + OPT_BOOL(RSK_SHUFFLE_ENTRANCES, "Shuffle Entrances"); + OPT_U8(RSK_SHUFFLE_DUNGEON_ENTRANCES, "Dungeon Entrances", {"Off", "On", "On + Ganon"}, OptionCategory::Setting, CVAR_RANDOMIZER_SETTING("ShuffleDungeonsEntrances"), mOptionDescriptions[RSK_SHUFFLE_DUNGEON_ENTRANCES], WidgetType::Combobox, RO_DUNGEON_ENTRANCE_SHUFFLE_OFF); + OPT_U8(RSK_SHUFFLE_BOSS_ENTRANCES, "Boss Entrances", {"Off", "Age Restricted", "Full"}, OptionCategory::Setting, CVAR_RANDOMIZER_SETTING("ShuffleBossEntrances"), mOptionDescriptions[RSK_SHUFFLE_BOSS_ENTRANCES], WidgetType::Combobox, RO_BOSS_ROOM_ENTRANCE_SHUFFLE_OFF); + OPT_BOOL(RSK_SHUFFLE_OVERWORLD_ENTRANCES, "Overworld Entrances", CVAR_RANDOMIZER_SETTING("ShuffleOverworldEntrances"), mOptionDescriptions[RSK_SHUFFLE_OVERWORLD_ENTRANCES]); + OPT_U8(RSK_SHUFFLE_INTERIOR_ENTRANCES, "Interior Entrances", {"Off", "Simple", "All"}, OptionCategory::Setting, CVAR_RANDOMIZER_SETTING("ShuffleInteriorsEntrances"), mOptionDescriptions[RSK_SHUFFLE_INTERIOR_ENTRANCES], WidgetType::Combobox, RO_INTERIOR_ENTRANCE_SHUFFLE_OFF); + OPT_BOOL(RSK_SHUFFLE_GROTTO_ENTRANCES, "Grottos Entrances", CVAR_RANDOMIZER_SETTING("ShuffleGrottosEntrances"), mOptionDescriptions[RSK_SHUFFLE_GROTTO_ENTRANCES]); + OPT_BOOL(RSK_SHUFFLE_OWL_DROPS, "Owl Drops", CVAR_RANDOMIZER_SETTING("ShuffleOwlDrops"), mOptionDescriptions[RSK_SHUFFLE_OWL_DROPS]); + OPT_BOOL(RSK_SHUFFLE_WARP_SONGS, "Warp Songs", CVAR_RANDOMIZER_SETTING("ShuffleWarpSongs"), mOptionDescriptions[RSK_SHUFFLE_WARP_SONGS]); + OPT_BOOL(RSK_SHUFFLE_OVERWORLD_SPAWNS, "Overworld Spawns", CVAR_RANDOMIZER_SETTING("ShuffleOverworldSpawns"), mOptionDescriptions[RSK_SHUFFLE_OVERWORLD_SPAWNS]); + OPT_BOOL(RSK_MIXED_ENTRANCE_POOLS, "Mixed Entrance Pools", CVAR_RANDOMIZER_SETTING("MixedEntrances"), mOptionDescriptions[RSK_MIXED_ENTRANCE_POOLS]); + OPT_BOOL(RSK_MIX_DUNGEON_ENTRANCES, "Mix Dungeons", CVAR_RANDOMIZER_SETTING("MixDungeons"), mOptionDescriptions[RSK_MIX_DUNGEON_ENTRANCES], IMFLAG_NONE); + OPT_BOOL(RSK_MIX_BOSS_ENTRANCES, "Mix Bosses", CVAR_RANDOMIZER_SETTING("MixBosses"), mOptionDescriptions[RSK_MIX_BOSS_ENTRANCES], IMFLAG_NONE); + OPT_BOOL(RSK_MIX_OVERWORLD_ENTRANCES, "Mix Overworld", CVAR_RANDOMIZER_SETTING("MixOverworld"), mOptionDescriptions[RSK_MIX_OVERWORLD_ENTRANCES], IMFLAG_NONE); + OPT_BOOL(RSK_MIX_INTERIOR_ENTRANCES, "Mix Interiors", CVAR_RANDOMIZER_SETTING("MixInteriors"), mOptionDescriptions[RSK_MIX_INTERIOR_ENTRANCES], IMFLAG_NONE); + OPT_BOOL(RSK_MIX_GROTTO_ENTRANCES, "Mix Grottos", CVAR_RANDOMIZER_SETTING("MixGrottos"), mOptionDescriptions[RSK_MIX_GROTTO_ENTRANCES]); + OPT_BOOL(RSK_DECOUPLED_ENTRANCES, "Decouple Entrances", CVAR_RANDOMIZER_SETTING("DecoupleEntrances"), mOptionDescriptions[RSK_DECOUPLED_ENTRANCES]); + OPT_BOOL(RSK_BOMBCHU_BAG, "Bombchu Bag", CVAR_RANDOMIZER_SETTING("BombchuBag"), mOptionDescriptions[RSK_BOMBCHU_BAG]); + OPT_U8(RSK_ENABLE_BOMBCHU_DROPS, "Bombchu Drops", {"No", "Yes"}, OptionCategory::Setting, CVAR_RANDOMIZER_SETTING("EnableBombchuDrops"), mOptionDescriptions[RSK_ENABLE_BOMBCHU_DROPS], WidgetType::Combobox, RO_AMMO_DROPS_ON); // TODO: AmmoDrops and/or HeartDropRefill, combine with/separate Ammo Drops from Bombchu Drops? - mOptions[RSK_TRIFORCE_HUNT] = Option::Bool("Triforce Hunt", CVAR_RANDOMIZER_SETTING("TriforceHunt"), mOptionDescriptions[RSK_TRIFORCE_HUNT], IMFLAG_NONE); - mOptions[RSK_TRIFORCE_HUNT_PIECES_TOTAL] = Option::U8("Triforce Hunt Total Pieces", {NumOpts(1, 100)}, OptionCategory::Setting, CVAR_RANDOMIZER_SETTING("TriforceHuntTotalPieces"), mOptionDescriptions[RSK_TRIFORCE_HUNT_PIECES_TOTAL], WidgetType::Slider, 29, false, IMFLAG_NONE); - mOptions[RSK_TRIFORCE_HUNT_PIECES_REQUIRED] = Option::U8("Triforce Hunt Required Pieces", {NumOpts(1, 100)}, OptionCategory::Setting, CVAR_RANDOMIZER_SETTING("TriforceHuntRequiredPieces"), mOptionDescriptions[RSK_TRIFORCE_HUNT_PIECES_REQUIRED], WidgetType::Slider, 19); - mOptions[RSK_MQ_DUNGEON_RANDOM] = Option::U8("MQ Dungeon Setting", {"None", "Set Number", "Random", "Selection Only"}, OptionCategory::Setting, CVAR_RANDOMIZER_SETTING("MQDungeons"), mOptionDescriptions[RSK_MQ_DUNGEON_RANDOM], WidgetType::Combobox, RO_MQ_DUNGEONS_NONE, true, IMFLAG_NONE); - mOptions[RSK_MQ_DUNGEON_COUNT] = Option::U8("MQ Dungeon Count", {NumOpts(0, 12)}, OptionCategory::Setting, CVAR_RANDOMIZER_SETTING("MQDungeonCount"), "", WidgetType::Slider, 12, true, IMFLAG_NONE); - mOptions[RSK_MQ_DUNGEON_SET] = Option::Bool("Set Dungeon Quests", {"Off", "On"}, OptionCategory::Setting, CVAR_RANDOMIZER_SETTING("MQDungeonsSelection"), mOptionDescriptions[RSK_MQ_DUNGEON_SET], WidgetType::Checkbox, false, false, IMFLAG_NONE); - mOptions[RSK_MQ_DEKU_TREE] = Option::U8("Deku Tree Quest", {"Vanilla", "Master Quest", "Random"}, OptionCategory::Setting, CVAR_RANDOMIZER_SETTING("MQDungeonsDekuTree"), "", WidgetType::Combobox, RO_MQ_SET_VANILLA, false, IMFLAG_NONE); - mOptions[RSK_MQ_DODONGOS_CAVERN] = Option::U8("Dodongo's Cavern Quest", {"Vanilla", "Master Quest", "Random"}, OptionCategory::Setting, CVAR_RANDOMIZER_SETTING("MQDungeonsDodongosCavern"), "", WidgetType::Combobox, RO_MQ_SET_VANILLA, false, IMFLAG_NONE); - mOptions[RSK_MQ_JABU_JABU] = Option::U8("Jabu-Jabu's Belly Quest", {"Vanilla", "Master Quest", "Random"}, OptionCategory::Setting, CVAR_RANDOMIZER_SETTING("MQDungeonsJabuJabu"), "", WidgetType::Combobox, RO_MQ_SET_VANILLA, false, IMFLAG_NONE); - mOptions[RSK_MQ_FOREST_TEMPLE] = Option::U8("Forest Temple Quest", {"Vanilla", "Master Quest", "Random"}, OptionCategory::Setting, CVAR_RANDOMIZER_SETTING("MQDungeonsForestTemple"), "", WidgetType::Combobox, RO_MQ_SET_VANILLA, false, IMFLAG_NONE); - mOptions[RSK_MQ_FIRE_TEMPLE] = Option::U8("Fire Temple Quest", {"Vanilla", "Master Quest", "Random"}, OptionCategory::Setting, CVAR_RANDOMIZER_SETTING("MQDungeonsFireTemple"), "", WidgetType::Combobox, RO_MQ_SET_VANILLA, false, IMFLAG_NONE); - mOptions[RSK_MQ_WATER_TEMPLE] = Option::U8("Water Temple Quest", {"Vanilla", "Master Quest", "Random"}, OptionCategory::Setting, CVAR_RANDOMIZER_SETTING("MQDungeonsWaterTemple"), "", WidgetType::Combobox, RO_MQ_SET_VANILLA, false, IMFLAG_NONE); - mOptions[RSK_MQ_SPIRIT_TEMPLE] = Option::U8("Spirit Temple Quest", {"Vanilla", "Master Quest", "Random"}, OptionCategory::Setting, CVAR_RANDOMIZER_SETTING("MQDungeonsSpiritTemple"), "", WidgetType::Combobox, RO_MQ_SET_VANILLA, false, IMFLAG_NONE); - mOptions[RSK_MQ_SHADOW_TEMPLE] = Option::U8("Shadow Temple Quest", {"Vanilla", "Master Quest", "Random"}, OptionCategory::Setting, CVAR_RANDOMIZER_SETTING("MQDungeonsShadowTemple"), "", WidgetType::Combobox, RO_MQ_SET_VANILLA, false, IMFLAG_NONE); - mOptions[RSK_MQ_BOTTOM_OF_THE_WELL] = Option::U8("Bottom of the Well Quest", {"Vanilla", "Master Quest", "Random"}, OptionCategory::Setting, CVAR_RANDOMIZER_SETTING("MQDungeonsBottomOfTheWell"), "", WidgetType::Combobox, RO_MQ_SET_VANILLA, false, IMFLAG_NONE); - mOptions[RSK_MQ_ICE_CAVERN] = Option::U8("Ice Cavern Quest", {"Vanilla", "Master Quest", "Random"}, OptionCategory::Setting, CVAR_RANDOMIZER_SETTING("MQDungeonsIceCavern"), "", WidgetType::Combobox, RO_MQ_SET_VANILLA, false, IMFLAG_NONE); - mOptions[RSK_MQ_GTG] = Option::U8("Gerudo Training Ground Quest", {"Vanilla", "Master Quest", "Random"}, OptionCategory::Setting, CVAR_RANDOMIZER_SETTING("MQDungeonsGTG"), "", WidgetType::Combobox, RO_MQ_SET_VANILLA, false, IMFLAG_NONE); - mOptions[RSK_MQ_GANONS_CASTLE] = Option::U8("Ganon's Castle Quest", {"Vanilla", "Master Quest", "Random"}, OptionCategory::Setting, CVAR_RANDOMIZER_SETTING("MQDungeonsGanonsCastle"), "", WidgetType::Combobox, RO_MQ_SET_VANILLA); - mOptions[RSK_SHUFFLE_DUNGEON_REWARDS] = Option::U8("Shuffle Dungeon Rewards", {"End of Dungeons", "Any Dungeon", "Overworld", "Anywhere"}, OptionCategory::Setting, CVAR_RANDOMIZER_SETTING("ShuffleDungeonReward"), mOptionDescriptions[RSK_SHUFFLE_DUNGEON_REWARDS], WidgetType::Combobox, RO_DUNGEON_REWARDS_END_OF_DUNGEON); - mOptions[RSK_LINKS_POCKET] = Option::U8("Link's Pocket", {"Dungeon Reward", "Advancement", "Anything", "Nothing"}, OptionCategory::Setting, CVAR_RANDOMIZER_SETTING("LinksPocket"), "", WidgetType::Combobox, RO_LINKS_POCKET_DUNGEON_REWARD); - mOptions[RSK_SHUFFLE_SONGS] = Option::U8("Shuffle Songs", {"Song Locations", "Dungeon Rewards", "Anywhere"}, OptionCategory::Setting, CVAR_RANDOMIZER_SETTING("ShuffleSongs"), mOptionDescriptions[RSK_SHUFFLE_SONGS], WidgetType::Combobox, RO_SONG_SHUFFLE_SONG_LOCATIONS); - mOptions[RSK_SHOPSANITY] = Option::U8("Shop Shuffle", {"Off", "Specific Count", "Random"}, OptionCategory::Setting, CVAR_RANDOMIZER_SETTING("Shopsanity"), mOptionDescriptions[RSK_SHOPSANITY], WidgetType::Combobox, RO_SHOPSANITY_OFF); - mOptions[RSK_SHOPSANITY_COUNT] = Option::U8("Shops Item Count", {NumOpts(0, 7/*8*/)}, OptionCategory::Setting, CVAR_RANDOMIZER_SETTING("ShopsanityCount"), mOptionDescriptions[RSK_SHOPSANITY_COUNT], WidgetType::Slider, 0, false, IMFLAG_NONE); - mOptions[RSK_SHOPSANITY_PRICES] = Option::U8("Shops Prices", {"Vanilla", "Cheap Balanced", "Balanced", "Fixed", "Range", "Set By Wallet"}, OptionCategory::Setting, CVAR_RANDOMIZER_SETTING("ShopsanityPrices"), mOptionDescriptions[RSK_SHOPSANITY_PRICES], WidgetType::Combobox, RO_PRICE_VANILLA, false, IMFLAG_NONE); - mOptions[RSK_SHOPSANITY_PRICES_FIXED_PRICE] = Option::U8("Shops Fixed Price", {NumOpts(0, 995, 5)}, OptionCategory::Setting, CVAR_RANDOMIZER_SETTING("ShopsanityFixedPrice"), mOptionDescriptions[RSK_SHOPSANITY_PRICES_FIXED_PRICE], WidgetType::Slider, 10, true); - mOptions[RSK_SHOPSANITY_PRICES_RANGE_1] = Option::U8("Shops Lower Bound", {NumOpts(0, 995, 5)}, OptionCategory::Setting, CVAR_RANDOMIZER_SETTING("ShopsanityPriceRange1"), mOptionDescriptions[RSK_SHOPSANITY_PRICES_RANGE_1], WidgetType::Slider, 10, true, IMFLAG_NONE); - mOptions[RSK_SHOPSANITY_PRICES_RANGE_2] = Option::U8("Shops Upper Bound", {NumOpts(0, 995, 5)}, OptionCategory::Setting, CVAR_RANDOMIZER_SETTING("ShopsanityPriceRange2"), mOptionDescriptions[RSK_SHOPSANITY_PRICES_RANGE_2], WidgetType::Slider, 100, true, IMFLAG_NONE); - mOptions[RSK_SHOPSANITY_PRICES_NO_WALLET_WEIGHT] = Option::U8("Shops No Wallet Weight", {NumOpts(0, 100)}, OptionCategory::Setting, CVAR_RANDOMIZER_SETTING("ShopsanityNoWalletWeight"), mOptionDescriptions[RSK_SHOPSANITY_PRICES_NO_WALLET_WEIGHT], WidgetType::Slider, 10, true, IMFLAG_NONE); - mOptions[RSK_SHOPSANITY_PRICES_CHILD_WALLET_WEIGHT] = Option::U8("Shops Child Wallet Weight", {NumOpts(0, 100)}, OptionCategory::Setting, CVAR_RANDOMIZER_SETTING("ShopsanityChildWalletWeight"), mOptionDescriptions[RSK_SHOPSANITY_PRICES_CHILD_WALLET_WEIGHT], WidgetType::Slider, 10, true, IMFLAG_NONE); - mOptions[RSK_SHOPSANITY_PRICES_ADULT_WALLET_WEIGHT] = Option::U8("Shops Adult Wallet Weight", {NumOpts(0, 100)}, OptionCategory::Setting, CVAR_RANDOMIZER_SETTING("ShopsanityAdultWalletWeight"), mOptionDescriptions[RSK_SHOPSANITY_PRICES_ADULT_WALLET_WEIGHT], WidgetType::Slider, 10, true, IMFLAG_NONE); - mOptions[RSK_SHOPSANITY_PRICES_GIANT_WALLET_WEIGHT] = Option::U8("Shops Giant Wallet Weight", {NumOpts(0, 100)}, OptionCategory::Setting, CVAR_RANDOMIZER_SETTING("ShopsanityGiantWalletWeight"), mOptionDescriptions[RSK_SHOPSANITY_PRICES_GIANT_WALLET_WEIGHT], WidgetType::Slider, 10, true, IMFLAG_NONE); - mOptions[RSK_SHOPSANITY_PRICES_TYCOON_WALLET_WEIGHT] = Option::U8("Shops Tycoon Wallet Weight", {NumOpts(0, 100)}, OptionCategory::Setting, CVAR_RANDOMIZER_SETTING("ShopsanityTycoonWalletWeight"), mOptionDescriptions[RSK_SHOPSANITY_PRICES_TYCOON_WALLET_WEIGHT], WidgetType::Slider, 10, true, IMFLAG_NONE); - mOptions[RSK_SHOPSANITY_PRICES_AFFORDABLE] = Option::Bool("Shops Affordable Prices", CVAR_RANDOMIZER_SETTING("ShopsanityPricesAffordable"), mOptionDescriptions[RSK_SHOPSANITY_PRICES_AFFORDABLE]); - mOptions[RSK_SHUFFLE_TOKENS] = Option::U8("Token Shuffle", {"Off", "Dungeons", "Overworld", "All Tokens"}, OptionCategory::Setting, CVAR_RANDOMIZER_SETTING("ShuffleTokens"), mOptionDescriptions[RSK_SHUFFLE_TOKENS], WidgetType::Combobox, RO_TOKENSANITY_OFF); - mOptions[RSK_SHUFFLE_SCRUBS] = Option::U8("Scrubs Shuffle", {"Off", "One-Time Only", "All"}, OptionCategory::Setting, CVAR_RANDOMIZER_SETTING("ShuffleScrubs"), mOptionDescriptions[RSK_SHUFFLE_SCRUBS], WidgetType::Combobox, RO_SCRUBS_OFF); - mOptions[RSK_SCRUBS_PRICES] = Option::U8("Scrubs Prices", {"Vanilla", "Cheap Balanced", "Balanced", "Fixed", "Range", "Set By Wallet"}, OptionCategory::Setting, CVAR_RANDOMIZER_SETTING("ScrubsPrices"), mOptionDescriptions[RSK_SCRUBS_PRICES], WidgetType::Combobox, RO_PRICE_VANILLA, false, IMFLAG_NONE); - mOptions[RSK_SCRUBS_PRICES_FIXED_PRICE] = Option::U8("Scrubs Fixed Price", {NumOpts(0, 995, 5)}, OptionCategory::Setting, CVAR_RANDOMIZER_SETTING("ScrubsFixedPrice"), mOptionDescriptions[RSK_SCRUBS_PRICES_FIXED_PRICE], WidgetType::Slider, 10, true); - mOptions[RSK_SCRUBS_PRICES_RANGE_1] = Option::U8("Scrubs Lower Bound", {NumOpts(0, 995, 5)}, OptionCategory::Setting, CVAR_RANDOMIZER_SETTING("ScrubsPriceRange1"), mOptionDescriptions[RSK_SCRUBS_PRICES_RANGE_1], WidgetType::Slider, 10, true, IMFLAG_NONE); - mOptions[RSK_SCRUBS_PRICES_RANGE_2] = Option::U8("Scrubs Upper Bound", {NumOpts(0, 995, 5)}, OptionCategory::Setting, CVAR_RANDOMIZER_SETTING("ScrubsPriceRange2"), mOptionDescriptions[RSK_SCRUBS_PRICES_RANGE_2], WidgetType::Slider, 100, true, IMFLAG_NONE); - mOptions[RSK_SCRUBS_PRICES_NO_WALLET_WEIGHT] = Option::U8("Scrubs No Wallet Weight", {NumOpts(0, 100)}, OptionCategory::Setting, CVAR_RANDOMIZER_SETTING("ScrubsNoWalletWeight"), mOptionDescriptions[RSK_SCRUBS_PRICES_NO_WALLET_WEIGHT], WidgetType::Slider, 10, true, IMFLAG_NONE); - mOptions[RSK_SCRUBS_PRICES_CHILD_WALLET_WEIGHT] = Option::U8("Scrubs Child Wallet Weight", {NumOpts(0, 100)}, OptionCategory::Setting, CVAR_RANDOMIZER_SETTING("ScrubsChildWalletWeight"), mOptionDescriptions[RSK_SCRUBS_PRICES_CHILD_WALLET_WEIGHT], WidgetType::Slider, 10, true, IMFLAG_NONE); - mOptions[RSK_SCRUBS_PRICES_ADULT_WALLET_WEIGHT] = Option::U8("Scrubs Adult Wallet Weight", {NumOpts(0, 100)}, OptionCategory::Setting, CVAR_RANDOMIZER_SETTING("ScrubsAdultWalletWeight"), mOptionDescriptions[RSK_SCRUBS_PRICES_ADULT_WALLET_WEIGHT], WidgetType::Slider, 10, true, IMFLAG_NONE); - mOptions[RSK_SCRUBS_PRICES_GIANT_WALLET_WEIGHT] = Option::U8("Scrubs Giant Wallet Weight", {NumOpts(0, 100)}, OptionCategory::Setting, CVAR_RANDOMIZER_SETTING("ScrubsGiantWalletWeight"), mOptionDescriptions[RSK_SCRUBS_PRICES_GIANT_WALLET_WEIGHT], WidgetType::Slider, 10, true, IMFLAG_NONE); - mOptions[RSK_SCRUBS_PRICES_TYCOON_WALLET_WEIGHT] = Option::U8("Scrubs Tycoon Wallet Weight", {NumOpts(0, 100)}, OptionCategory::Setting, CVAR_RANDOMIZER_SETTING("ScrubsTycoonWalletWeight"), mOptionDescriptions[RSK_SCRUBS_PRICES_TYCOON_WALLET_WEIGHT], WidgetType::Slider, 10, true, IMFLAG_NONE); - mOptions[RSK_SCRUBS_PRICES_AFFORDABLE] = Option::Bool("Scrubs Affordable Prices", CVAR_RANDOMIZER_SETTING("ScrubsPricesAffordable"), mOptionDescriptions[RSK_SCRUBS_PRICES_AFFORDABLE]); - mOptions[RSK_SHUFFLE_BEEHIVES] = Option::Bool("Shuffle Beehives", CVAR_RANDOMIZER_SETTING("ShuffleBeehives"), mOptionDescriptions[RSK_SHUFFLE_BEEHIVES]); - mOptions[RSK_SHUFFLE_COWS] = Option::Bool("Shuffle Cows", CVAR_RANDOMIZER_SETTING("ShuffleCows"), mOptionDescriptions[RSK_SHUFFLE_COWS]); - mOptions[RSK_SHUFFLE_KOKIRI_SWORD] = Option::Bool("Shuffle Kokiri Sword", CVAR_RANDOMIZER_SETTING("ShuffleKokiriSword"), mOptionDescriptions[RSK_SHUFFLE_KOKIRI_SWORD]); - mOptions[RSK_SHUFFLE_MASTER_SWORD] = Option::Bool("Shuffle Master Sword", CVAR_RANDOMIZER_SETTING("ShuffleMasterSword"), mOptionDescriptions[RSK_SHUFFLE_MASTER_SWORD]); - mOptions[RSK_SHUFFLE_CHILD_WALLET] = Option::Bool("Shuffle Child's Wallet", CVAR_RANDOMIZER_SETTING("ShuffleChildWallet"), mOptionDescriptions[RSK_SHUFFLE_CHILD_WALLET], IMFLAG_NONE); - mOptions[RSK_INCLUDE_TYCOON_WALLET] = Option::Bool("Include Tycoon Wallet", CVAR_RANDOMIZER_SETTING("IncludeTycoonWallet"), mOptionDescriptions[RSK_INCLUDE_TYCOON_WALLET]); - mOptions[RSK_SHUFFLE_OCARINA] = Option::Bool("Shuffle Ocarinas", CVAR_RANDOMIZER_SETTING("ShuffleOcarinas"), mOptionDescriptions[RSK_SHUFFLE_OCARINA]); - mOptions[RSK_SHUFFLE_OCARINA_BUTTONS] = Option::Bool("Shuffle Ocarina Buttons", CVAR_RANDOMIZER_SETTING("ShuffleOcarinaButtons"), mOptionDescriptions[RSK_SHUFFLE_OCARINA_BUTTONS]); - mOptions[RSK_SHUFFLE_SWIM] = Option::Bool("Shuffle Swim", CVAR_RANDOMIZER_SETTING("ShuffleSwim"), mOptionDescriptions[RSK_SHUFFLE_SWIM]); - mOptions[RSK_SHUFFLE_WEIRD_EGG] = Option::Bool("Shuffle Weird Egg", CVAR_RANDOMIZER_SETTING("ShuffleWeirdEgg"), mOptionDescriptions[RSK_SHUFFLE_WEIRD_EGG]); - mOptions[RSK_SHUFFLE_GERUDO_MEMBERSHIP_CARD] = Option::Bool("Shuffle Gerudo Membership Card", CVAR_RANDOMIZER_SETTING("ShuffleGerudoToken"), mOptionDescriptions[RSK_SHUFFLE_GERUDO_MEMBERSHIP_CARD]); - mOptions[RSK_SHUFFLE_POTS] = Option::U8("Shuffle Pots", {"Off", "Dungeons", "Overworld", "All Pots"}, OptionCategory::Setting, CVAR_RANDOMIZER_SETTING("ShufflePots"), mOptionDescriptions[RSK_SHUFFLE_POTS], WidgetType::Combobox, RO_SHUFFLE_POTS_OFF); - mOptions[RSK_SHUFFLE_FISHING_POLE] = Option::Bool("Shuffle Fishing Pole", CVAR_RANDOMIZER_SETTING("ShuffleFishingPole"), mOptionDescriptions[RSK_SHUFFLE_FISHING_POLE]); - mOptions[RSK_SHUFFLE_MERCHANTS] = Option::U8("Shuffle Merchants", {"Off", "Bean Merchant Only", "All But Beans", "All"}, OptionCategory::Setting, CVAR_RANDOMIZER_SETTING("ShuffleMerchants"), mOptionDescriptions[RSK_SHUFFLE_MERCHANTS], WidgetType::Combobox, RO_SHUFFLE_MERCHANTS_OFF, IMFLAG_NONE); - mOptions[RSK_MERCHANT_PRICES] = Option::U8("Merchant Prices", {"Vanilla", "Cheap Balanced", "Balanced", "Fixed", "Range", "Set By Wallet"}, OptionCategory::Setting, CVAR_RANDOMIZER_SETTING("MerchantPrices"), mOptionDescriptions[RSK_MERCHANT_PRICES], WidgetType::Combobox, RO_PRICE_VANILLA, false, IMFLAG_NONE); - mOptions[RSK_MERCHANT_PRICES_FIXED_PRICE] = Option::U8("Merchant Fixed Price", {NumOpts(0, 995, 5)}, OptionCategory::Setting, CVAR_RANDOMIZER_SETTING("MerchantFixedPrice"), mOptionDescriptions[RSK_MERCHANT_PRICES_FIXED_PRICE], WidgetType::Slider, 10, true); - mOptions[RSK_MERCHANT_PRICES_RANGE_1] = Option::U8("Merchant Lower Bound", {NumOpts(0, 995, 5)}, OptionCategory::Setting, CVAR_RANDOMIZER_SETTING("MerchantPriceRange1"), mOptionDescriptions[RSK_MERCHANT_PRICES_RANGE_1], WidgetType::Slider, 10, true, IMFLAG_NONE); - mOptions[RSK_MERCHANT_PRICES_RANGE_2] = Option::U8("Merchant Upper Bound", {NumOpts(0, 995, 5)}, OptionCategory::Setting, CVAR_RANDOMIZER_SETTING("MerchantPriceRange2"), mOptionDescriptions[RSK_MERCHANT_PRICES_RANGE_2], WidgetType::Slider, 100, true, IMFLAG_NONE); - mOptions[RSK_MERCHANT_PRICES_NO_WALLET_WEIGHT] = Option::U8("Merchant No Wallet Weight", {NumOpts(0, 100)}, OptionCategory::Setting, CVAR_RANDOMIZER_SETTING("MerchantNoWalletWeight"), mOptionDescriptions[RSK_MERCHANT_PRICES_NO_WALLET_WEIGHT], WidgetType::Slider, 10, true, IMFLAG_NONE); - mOptions[RSK_MERCHANT_PRICES_CHILD_WALLET_WEIGHT] = Option::U8("Merchant Child Wallet Weight", {NumOpts(0, 100)}, OptionCategory::Setting, CVAR_RANDOMIZER_SETTING("MerchantChildWalletWeight"), mOptionDescriptions[RSK_MERCHANT_PRICES_CHILD_WALLET_WEIGHT], WidgetType::Slider, 10, true, IMFLAG_NONE); - mOptions[RSK_MERCHANT_PRICES_ADULT_WALLET_WEIGHT] = Option::U8("Merchant Adult Wallet Weight", {NumOpts(0, 100)}, OptionCategory::Setting, CVAR_RANDOMIZER_SETTING("MerchantAdultWalletWeight"), mOptionDescriptions[RSK_MERCHANT_PRICES_ADULT_WALLET_WEIGHT], WidgetType::Slider, 10, true, IMFLAG_NONE); - mOptions[RSK_MERCHANT_PRICES_GIANT_WALLET_WEIGHT] = Option::U8("Merchant Giant Wallet Weight", {NumOpts(0, 100)}, OptionCategory::Setting, CVAR_RANDOMIZER_SETTING("MerchantGiantWalletWeight"), mOptionDescriptions[RSK_MERCHANT_PRICES_GIANT_WALLET_WEIGHT], WidgetType::Slider, 10, true, IMFLAG_NONE); - mOptions[RSK_MERCHANT_PRICES_TYCOON_WALLET_WEIGHT] = Option::U8("Merchant Tycoon Wallet Weight", {NumOpts(0, 100)}, OptionCategory::Setting, CVAR_RANDOMIZER_SETTING("MerchantTycoonWalletWeight"), mOptionDescriptions[RSK_MERCHANT_PRICES_TYCOON_WALLET_WEIGHT], WidgetType::Slider, 10, true, IMFLAG_NONE); - mOptions[RSK_MERCHANT_PRICES_AFFORDABLE] = Option::Bool("Merchant Affordable Prices", CVAR_RANDOMIZER_SETTING("MerchantPricesAffordable"), mOptionDescriptions[RSK_MERCHANT_PRICES_AFFORDABLE]); - mOptions[RSK_SHUFFLE_FROG_SONG_RUPEES] = Option::Bool("Shuffle Frog Song Rupees", CVAR_RANDOMIZER_SETTING("ShuffleFrogSongRupees"), mOptionDescriptions[RSK_SHUFFLE_FROG_SONG_RUPEES]); - mOptions[RSK_SHUFFLE_ADULT_TRADE] = Option::Bool("Shuffle Adult Trade", CVAR_RANDOMIZER_SETTING("ShuffleAdultTrade"), mOptionDescriptions[RSK_SHUFFLE_ADULT_TRADE]); - mOptions[RSK_SHUFFLE_CHEST_MINIGAME] = Option::U8("Shuffle Chest Minigame", {"Off", "On (Separate)", "On (Pack)"}); - mOptions[RSK_SHUFFLE_100_GS_REWARD] = Option::Bool("Shuffle 100 GS Reward", CVAR_RANDOMIZER_SETTING("Shuffle100GSReward"), mOptionDescriptions[RSK_SHUFFLE_100_GS_REWARD], IMFLAG_SEPARATOR_BOTTOM, WidgetType::Checkbox, RO_GENERIC_OFF); - mOptions[RSK_SHUFFLE_BOSS_SOULS] = Option::U8("Shuffle Boss Souls", {"Off", "On", "On + Ganon"}, OptionCategory::Setting, CVAR_RANDOMIZER_SETTING("ShuffleBossSouls"), mOptionDescriptions[RSK_SHUFFLE_BOSS_SOULS], WidgetType::Combobox); - mOptions[RSK_SHUFFLE_DEKU_STICK_BAG] = Option::Bool("Shuffle Deku Stick Bag", CVAR_RANDOMIZER_SETTING("ShuffleDekuStickBag"), mOptionDescriptions[RSK_SHUFFLE_DEKU_STICK_BAG], IMFLAG_SEPARATOR_BOTTOM, WidgetType::Checkbox, RO_GENERIC_OFF); - mOptions[RSK_SHUFFLE_DEKU_NUT_BAG] = Option::Bool("Shuffle Deku Nut Bag", CVAR_RANDOMIZER_SETTING("ShuffleDekuNutBag"), mOptionDescriptions[RSK_SHUFFLE_DEKU_NUT_BAG], IMFLAG_SEPARATOR_BOTTOM, WidgetType::Checkbox, RO_GENERIC_OFF); - mOptions[RSK_SHUFFLE_FREESTANDING] = Option::U8("Shuffle Freestanding Items", {"Off", "Dungeons", "Overworld", "All Items"}, OptionCategory::Setting, CVAR_RANDOMIZER_SETTING("ShuffleFreestanding"), mOptionDescriptions[RSK_SHUFFLE_FREESTANDING], WidgetType::Combobox, RO_SHUFFLE_FREESTANDING_OFF); - mOptions[RSK_FISHSANITY] = Option::U8("Fishsanity", {"Off", "Shuffle only Hyrule Loach", "Shuffle Fishing Pond", "Shuffle Overworld Fish", "Shuffle Both"}, OptionCategory::Setting, CVAR_RANDOMIZER_SETTING("Fishsanity"), mOptionDescriptions[RSK_FISHSANITY], WidgetType::Combobox, RO_FISHSANITY_OFF); - mOptions[RSK_FISHSANITY_POND_COUNT] = Option::U8("Pond Fish Count", {NumOpts(0,17,1)}, OptionCategory::Setting, CVAR_RANDOMIZER_SETTING("FishsanityPondCount"), mOptionDescriptions[RSK_FISHSANITY_POND_COUNT], WidgetType::Slider, 0, true, IMFLAG_NONE); - mOptions[RSK_FISHSANITY_AGE_SPLIT] = Option::Bool("Pond Age Split", CVAR_RANDOMIZER_SETTING("FishsanityAgeSplit"), mOptionDescriptions[RSK_FISHSANITY_AGE_SPLIT]); - mOptions[RSK_SHUFFLE_FAIRIES] = Option::Bool("Shuffle Fairies", CVAR_RANDOMIZER_SETTING("ShuffleFairies"), mOptionDescriptions[RSK_SHUFFLE_FAIRIES]); - mOptions[RSK_SHUFFLE_MAPANDCOMPASS] = Option::U8("Maps/Compasses", {"Start With", "Vanilla", "Own Dungeon", "Any Dungeon", "Overworld", "Anywhere"}, OptionCategory::Setting, CVAR_RANDOMIZER_SETTING("StartingMapsCompasses"), mOptionDescriptions[RSK_SHUFFLE_MAPANDCOMPASS], WidgetType::Combobox, RO_DUNGEON_ITEM_LOC_OWN_DUNGEON); - mOptions[RSK_KEYSANITY] = Option::U8("Small Key Shuffle", {"Start With", "Vanilla", "Own Dungeon", "Any Dungeon", "Overworld", "Anywhere"}, OptionCategory::Setting, CVAR_RANDOMIZER_SETTING("Keysanity"), mOptionDescriptions[RSK_KEYSANITY], WidgetType::Combobox, RO_DUNGEON_ITEM_LOC_OWN_DUNGEON); - mOptions[RSK_GERUDO_KEYS] = Option::U8("Gerudo Fortress Keys", {"Vanilla", "Any Dungeon", "Overworld", "Anywhere"}, OptionCategory::Setting, CVAR_RANDOMIZER_SETTING("GerudoKeys"), mOptionDescriptions[RSK_GERUDO_KEYS], WidgetType::Combobox, RO_GERUDO_KEYS_VANILLA); - mOptions[RSK_BOSS_KEYSANITY] = Option::U8("Boss Key Shuffle", {"Start With", "Vanilla", "Own Dungeon", "Any Dungeon", "Overworld", "Anywhere"}, OptionCategory::Setting, CVAR_RANDOMIZER_SETTING("BossKeysanity"), mOptionDescriptions[RSK_BOSS_KEYSANITY], WidgetType::Combobox, RO_DUNGEON_ITEM_LOC_OWN_DUNGEON); - mOptions[RSK_GANONS_BOSS_KEY] = Option::U8("Ganon's Boss Key", {"Vanilla", "Own Dungeon", "Start With", "Any Dungeon", "Overworld", "Anywhere", "LACS-Vanilla", "LACS-Stones", "LACS-Medallions", "LACS-Rewards", "LACS-Dungeons", "LACS-Tokens", "100 GS Reward", "Triforce Hunt"}, OptionCategory::Setting, CVAR_RANDOMIZER_SETTING("ShuffleGanonBossKey"), mOptionDescriptions[RSK_GANONS_BOSS_KEY], WidgetType::Combobox, RO_GANON_BOSS_KEY_VANILLA); - mOptions[RSK_LACS_STONE_COUNT] = Option::U8("GCBK Stone Count", {NumOpts(0, 4)}, OptionCategory::Setting, CVAR_RANDOMIZER_SETTING("LacsStoneCount"), "", WidgetType::Slider, 3, true); - mOptions[RSK_LACS_MEDALLION_COUNT] = Option::U8("GCBK Medallion Count", {NumOpts(0, 7)}, OptionCategory::Setting, CVAR_RANDOMIZER_SETTING("LacsMedallionCount"), "", WidgetType::Slider, 6, true); - mOptions[RSK_LACS_REWARD_COUNT] = Option::U8("GCBK Reward Count", {NumOpts(0, 10)}, OptionCategory::Setting, CVAR_RANDOMIZER_SETTING("LacsRewardCount"), "", WidgetType::Slider, 9, true); - mOptions[RSK_LACS_DUNGEON_COUNT] = Option::U8("GCBK Dungeon Count", {NumOpts(0, 9)}, OptionCategory::Setting, CVAR_RANDOMIZER_SETTING("LacsDungeonCount"), "", WidgetType::Slider, 8, true); - mOptions[RSK_LACS_TOKEN_COUNT] = Option::U8("GCBK Token Count", {NumOpts(0, 100)}, OptionCategory::Setting, CVAR_RANDOMIZER_SETTING("LacsTokenCount"), "", WidgetType::Slider, 100, true); - mOptions[RSK_LACS_OPTIONS] = Option::U8("GCBK LACS Reward Options", {"Standard Reward", "Greg as Reward", "Greg as Wildcard"}, OptionCategory::Setting, CVAR_RANDOMIZER_SETTING("LacsRewardOptions"), "", WidgetType::Combobox, RO_LACS_STANDARD_REWARD); - mOptions[RSK_KEYRINGS] = Option::U8("Key Rings", {"Off", "Random", "Count", "Selection"}, OptionCategory::Setting, CVAR_RANDOMIZER_SETTING("ShuffleKeyRings"), mOptionDescriptions[RSK_KEYRINGS], WidgetType::Combobox, RO_KEYRINGS_OFF); - mOptions[RSK_KEYRINGS_RANDOM_COUNT] = Option::U8("Keyring Dungeon Count", {NumOpts(0, 9)}, OptionCategory::Setting, CVAR_RANDOMIZER_SETTING("ShuffleKeyRingsRandomCount"), "", WidgetType::Slider, 8); - mOptions[RSK_KEYRINGS_GERUDO_FORTRESS] = Option::U8("Gerudo Fortress Keyring", {"No", "Random", "Yes"}, OptionCategory::Setting, CVAR_RANDOMIZER_SETTING("ShuffleKeyRingsGerudoFortress"), "", WidgetType::TristateCheckbox, 0); - mOptions[RSK_KEYRINGS_FOREST_TEMPLE] = Option::U8("Forest Temple Keyring", {"No", "Random", "Yes"}, OptionCategory::Setting, CVAR_RANDOMIZER_SETTING("ShuffleKeyRingsForestTemple"), "", WidgetType::TristateCheckbox, 0); - mOptions[RSK_KEYRINGS_FIRE_TEMPLE] = Option::U8("Fire Temple Keyring", {"No", "Random", "Yes"}, OptionCategory::Setting, CVAR_RANDOMIZER_SETTING("ShuffleKeyRingsFireTemple"), "", WidgetType::TristateCheckbox, 0); - mOptions[RSK_KEYRINGS_WATER_TEMPLE] = Option::U8("Water Temple Keyring", {"No", "Random", "Yes"}, OptionCategory::Setting, CVAR_RANDOMIZER_SETTING("ShuffleKeyRingsWaterTemple"), "", WidgetType::TristateCheckbox, 0); - mOptions[RSK_KEYRINGS_SPIRIT_TEMPLE] = Option::U8("Spirit Temple Keyring", {"No", "Random", "Yes"}, OptionCategory::Setting, CVAR_RANDOMIZER_SETTING("ShuffleKeyRingsSpiritTemple"), "", WidgetType::TristateCheckbox, 0); - mOptions[RSK_KEYRINGS_SHADOW_TEMPLE] = Option::U8("Shadow Temple Keyring", {"No", "Random", "Yes"}, OptionCategory::Setting, CVAR_RANDOMIZER_SETTING("ShuffleKeyRingsShadowTemple"), "", WidgetType::TristateCheckbox, 0); - mOptions[RSK_KEYRINGS_BOTTOM_OF_THE_WELL] = Option::U8("Bottom of the Well Keyring", {"No", "Random", "Yes"}, OptionCategory::Setting, CVAR_RANDOMIZER_SETTING("ShuffleKeyRingsBottomOfTheWell"), "", WidgetType::TristateCheckbox, 0); - mOptions[RSK_KEYRINGS_GTG] = Option::U8("Gerudo Training Ground Keyring", {"No", "Random", "Yes"}, OptionCategory::Setting, CVAR_RANDOMIZER_SETTING("ShuffleKeyRingsGTG"), "", WidgetType::TristateCheckbox, 0); - mOptions[RSK_KEYRINGS_GANONS_CASTLE] = Option::U8("Ganon's Castle Keyring", {"No", "Random", "Yes"}, OptionCategory::Setting, CVAR_RANDOMIZER_SETTING("ShuffleKeyRingsGanonsCastle"), "", WidgetType::TristateCheckbox, 0); - mOptions[RSK_SKIP_CHILD_STEALTH] = Option::Bool("Skip Child Stealth", {"Don't Skip", "Skip"}, OptionCategory::Setting, CVAR_RANDOMIZER_SETTING("SkipChildStealth"), mOptionDescriptions[RSK_SKIP_CHILD_STEALTH], WidgetType::Checkbox, RO_GENERIC_DONT_SKIP); - mOptions[RSK_SKIP_CHILD_ZELDA] = Option::Bool("Skip Child Zelda", {"Don't Skip", "Skip"}, OptionCategory::Setting, CVAR_RANDOMIZER_SETTING("SkipChildZelda"), mOptionDescriptions[RSK_SKIP_CHILD_ZELDA], WidgetType::Checkbox, RO_GENERIC_DONT_SKIP); - mOptions[RSK_SKIP_EPONA_RACE] = Option::Bool("Skip Epona Race", {"Don't Skip", "Skip"}, OptionCategory::Setting, CVAR_RANDOMIZER_SETTING("SkipEponaRace"), mOptionDescriptions[RSK_SKIP_EPONA_RACE], WidgetType::Checkbox, RO_GENERIC_DONT_SKIP); - mOptions[RSK_SKIP_SCARECROWS_SONG] = Option::Bool("Skip Scarecrow's Song", CVAR_RANDOMIZER_SETTING("SkipScarecrowsSong"), mOptionDescriptions[RSK_SKIP_SCARECROWS_SONG]); - mOptions[RSK_BIG_POE_COUNT] = Option::U8("Big Poe Target Count", {NumOpts(1, 10)}, OptionCategory::Setting, CVAR_RANDOMIZER_SETTING("BigPoeTargetCount"), mOptionDescriptions[RSK_BIG_POE_COUNT], WidgetType::Slider, 9); - mOptions[RSK_CUCCO_COUNT] = Option::U8("Cuccos to return", {NumOpts(0, 7)}, OptionCategory::Setting, CVAR_RANDOMIZER_SETTING("CuccosToReturn"), mOptionDescriptions[RSK_CUCCO_COUNT], WidgetType::Slider, 7); - mOptions[RSK_COMPLETE_MASK_QUEST] = Option::Bool("Complete Mask Quest", CVAR_RANDOMIZER_SETTING("CompleteMaskQuest"), mOptionDescriptions[RSK_COMPLETE_MASK_QUEST]); - mOptions[RSK_ENABLE_GLITCH_CUTSCENES] = Option::Bool("Enable Glitch-Useful Cutscenes", CVAR_RANDOMIZER_SETTING("EnableGlitchCutscenes"), mOptionDescriptions[RSK_ENABLE_GLITCH_CUTSCENES]); - mOptions[RSK_GOSSIP_STONE_HINTS] = Option::U8("Gossip Stone Hints", {"No Hints", "Need Nothing", "Mask of Truth", "Stone of Agony"}, OptionCategory::Setting, CVAR_RANDOMIZER_SETTING("GossipStoneHints"), mOptionDescriptions[RSK_GOSSIP_STONE_HINTS], WidgetType::Combobox, RO_GOSSIP_STONES_NEED_NOTHING, false, IMFLAG_NONE); - mOptions[RSK_HINT_CLARITY] = Option::U8("Hint Clarity", {"Obscure", "Ambiguous", "Clear"}, OptionCategory::Setting, CVAR_RANDOMIZER_SETTING("HintClarity"), mOptionDescriptions[RSK_HINT_CLARITY], WidgetType::Combobox, RO_HINT_CLARITY_CLEAR, true, IMFLAG_INDENT); - mOptions[RSK_HINT_DISTRIBUTION] = Option::U8("Hint Distribution", {"Useless", "Balanced", "Strong", "Very Strong"}, OptionCategory::Setting, CVAR_RANDOMIZER_SETTING("HintDistribution"), mOptionDescriptions[RSK_HINT_DISTRIBUTION], WidgetType::Combobox, RO_HINT_DIST_BALANCED, true, IMFLAG_UNINDENT); - mOptions[RSK_TOT_ALTAR_HINT] = Option::Bool("ToT Altar Hint", {"Off", "On"}, OptionCategory::Setting, CVAR_RANDOMIZER_SETTING("AltarHint"), mOptionDescriptions[RSK_TOT_ALTAR_HINT], WidgetType::Checkbox, RO_GENERIC_ON, false, IMFLAG_INDENT); - mOptions[RSK_GANONDORF_HINT] = Option::Bool("Ganondorf Hint", {"Off", "On"}, OptionCategory::Setting, CVAR_RANDOMIZER_SETTING("GanondorfHint"), mOptionDescriptions[RSK_GANONDORF_HINT], WidgetType::Checkbox, RO_GENERIC_ON, false, IMFLAG_NONE); - mOptions[RSK_SHEIK_LA_HINT] = Option::Bool("Sheik Light Arrow Hint", {"Off", "On"}, OptionCategory::Setting, CVAR_RANDOMIZER_SETTING("SheikLAHint"), mOptionDescriptions[RSK_SHEIK_LA_HINT], WidgetType::Checkbox, RO_GENERIC_ON, false, IMFLAG_NONE); - mOptions[RSK_DAMPES_DIARY_HINT] = Option::Bool("Dampe's Diary Hint", CVAR_RANDOMIZER_SETTING("DampeHint"), mOptionDescriptions[RSK_DAMPES_DIARY_HINT], IMFLAG_NONE); - mOptions[RSK_GREG_HINT] = Option::Bool("Greg the Green Rupee Hint", CVAR_RANDOMIZER_SETTING("GregHint"), mOptionDescriptions[RSK_GREG_HINT], IMFLAG_NONE); - mOptions[RSK_LOACH_HINT] = Option::Bool("Hyrule Loach Hint", CVAR_RANDOMIZER_SETTING("LoachHint"), mOptionDescriptions[RSK_LOACH_HINT], IMFLAG_NONE); - mOptions[RSK_SARIA_HINT] = Option::Bool("Saria's Hint", CVAR_RANDOMIZER_SETTING("SariaHint"), mOptionDescriptions[RSK_SARIA_HINT], IMFLAG_NONE); - mOptions[RSK_FISHING_POLE_HINT] = Option::Bool("Fishing Pole Hint", CVAR_RANDOMIZER_SETTING("FishingPoleHint"), mOptionDescriptions[RSK_FISHING_POLE_HINT], IMFLAG_NONE); - mOptions[RSK_FROGS_HINT] = Option::Bool("Frog Ocarina Game Hint", CVAR_RANDOMIZER_SETTING("FrogsHint"), mOptionDescriptions[RSK_FROGS_HINT], IMFLAG_NONE); - mOptions[RSK_OOT_HINT] = Option::Bool("Ocarina of Time Hint", CVAR_RANDOMIZER_SETTING("OoTHint"), mOptionDescriptions[RSK_OOT_HINT], IMFLAG_NONE); - mOptions[RSK_BIGGORON_HINT] = Option::Bool("Biggoron's Hint", CVAR_RANDOMIZER_SETTING("BiggoronHint"), mOptionDescriptions[RSK_BIGGORON_HINT], IMFLAG_NONE); - mOptions[RSK_BIG_POES_HINT] = Option::Bool("Big Poes Hint", CVAR_RANDOMIZER_SETTING("BigPoesHint"), mOptionDescriptions[RSK_BIG_POES_HINT], IMFLAG_NONE); - mOptions[RSK_CHICKENS_HINT] = Option::Bool("Chickens Hint", CVAR_RANDOMIZER_SETTING("ChickensHint"), mOptionDescriptions[RSK_CHICKENS_HINT], IMFLAG_NONE); - mOptions[RSK_MALON_HINT] = Option::Bool("Malon Hint", CVAR_RANDOMIZER_SETTING("MalonHint"), mOptionDescriptions[RSK_MALON_HINT], IMFLAG_NONE); - mOptions[RSK_HBA_HINT] = Option::Bool("Horseback Archery Hint", CVAR_RANDOMIZER_SETTING("HBAHint"), mOptionDescriptions[RSK_HBA_HINT], IMFLAG_NONE); - mOptions[RSK_WARP_SONG_HINTS] = Option::Bool("Warp Song Hints", CVAR_RANDOMIZER_SETTING("WarpSongText"), mOptionDescriptions[RSK_WARP_SONG_HINTS], IMFLAG_NONE, WidgetType::Checkbox, RO_GENERIC_ON); - mOptions[RSK_SCRUB_TEXT_HINT] = Option::Bool("Scrub Hint Text", CVAR_RANDOMIZER_SETTING("ScrubText"), mOptionDescriptions[RSK_SCRUB_TEXT_HINT], IMFLAG_NONE); - mOptions[RSK_MERCHANT_TEXT_HINT] = Option::Bool("Merchant Hint Text", CVAR_RANDOMIZER_SETTING("MerchantText"), mOptionDescriptions[RSK_MERCHANT_TEXT_HINT], IMFLAG_NONE); - mOptions[RSK_KAK_10_SKULLS_HINT] = Option::Bool("10 GS Hint", CVAR_RANDOMIZER_SETTING("10GSHint"), mOptionDescriptions[RSK_KAK_10_SKULLS_HINT], IMFLAG_NONE); - mOptions[RSK_KAK_20_SKULLS_HINT] = Option::Bool("20 GS Hint", CVAR_RANDOMIZER_SETTING("20GSHint"), mOptionDescriptions[RSK_KAK_20_SKULLS_HINT], IMFLAG_NONE); - mOptions[RSK_KAK_30_SKULLS_HINT] = Option::Bool("30 GS Hint", CVAR_RANDOMIZER_SETTING("30GSHint"), mOptionDescriptions[RSK_KAK_30_SKULLS_HINT], IMFLAG_NONE); - mOptions[RSK_KAK_40_SKULLS_HINT] = Option::Bool("40 GS Hint", CVAR_RANDOMIZER_SETTING("40GSHint"), mOptionDescriptions[RSK_KAK_40_SKULLS_HINT], IMFLAG_NONE); - mOptions[RSK_KAK_50_SKULLS_HINT] = Option::Bool("50 GS Hint", CVAR_RANDOMIZER_SETTING("50GSHint"), mOptionDescriptions[RSK_KAK_50_SKULLS_HINT], IMFLAG_NONE); - mOptions[RSK_KAK_100_SKULLS_HINT] = Option::Bool("100 GS Hint", CVAR_RANDOMIZER_SETTING("100GSHint"), mOptionDescriptions[RSK_KAK_100_SKULLS_HINT], IMFLAG_NONE); - mOptions[RSK_MASK_SHOP_HINT] = Option::Bool("Mask Shop Hint", CVAR_RANDOMIZER_SETTING("MaskShopHint"), mOptionDescriptions[RSK_MASK_SHOP_HINT]); + OPT_BOOL(RSK_TRIFORCE_HUNT, "Triforce Hunt", CVAR_RANDOMIZER_SETTING("TriforceHunt"), mOptionDescriptions[RSK_TRIFORCE_HUNT], IMFLAG_NONE); + OPT_U8(RSK_TRIFORCE_HUNT_PIECES_TOTAL, "Triforce Hunt Total Pieces", {NumOpts(1, 100)}, OptionCategory::Setting, CVAR_RANDOMIZER_SETTING("TriforceHuntTotalPieces"), mOptionDescriptions[RSK_TRIFORCE_HUNT_PIECES_TOTAL], WidgetType::Slider, 29, false, IMFLAG_NONE); + OPT_U8(RSK_TRIFORCE_HUNT_PIECES_REQUIRED, "Triforce Hunt Required Pieces", {NumOpts(1, 100)}, OptionCategory::Setting, CVAR_RANDOMIZER_SETTING("TriforceHuntRequiredPieces"), mOptionDescriptions[RSK_TRIFORCE_HUNT_PIECES_REQUIRED], WidgetType::Slider, 19); + OPT_U8(RSK_MQ_DUNGEON_RANDOM, "MQ Dungeon Setting", {"None", "Set Number", "Random", "Selection Only"}, OptionCategory::Setting, CVAR_RANDOMIZER_SETTING("MQDungeons"), mOptionDescriptions[RSK_MQ_DUNGEON_RANDOM], WidgetType::Combobox, RO_MQ_DUNGEONS_NONE, true, IMFLAG_NONE); + OPT_U8(RSK_MQ_DUNGEON_COUNT, "MQ Dungeon Count", {NumOpts(0, 12)}, OptionCategory::Setting, CVAR_RANDOMIZER_SETTING("MQDungeonCount"), "", WidgetType::Slider, 12, true, IMFLAG_NONE); + OPT_BOOL(RSK_MQ_DUNGEON_SET, "Set Dungeon Quests", {"Off", "On"}, OptionCategory::Setting, CVAR_RANDOMIZER_SETTING("MQDungeonsSelection"), mOptionDescriptions[RSK_MQ_DUNGEON_SET], WidgetType::Checkbox, false, false, IMFLAG_NONE); + OPT_U8(RSK_MQ_DEKU_TREE, "Deku Tree Quest", {"Vanilla", "Master Quest", "Random"}, OptionCategory::Setting, CVAR_RANDOMIZER_SETTING("MQDungeonsDekuTree"), "", WidgetType::Combobox, RO_MQ_SET_VANILLA, false, IMFLAG_NONE); + OPT_U8(RSK_MQ_DODONGOS_CAVERN, "Dodongo's Cavern Quest", {"Vanilla", "Master Quest", "Random"}, OptionCategory::Setting, CVAR_RANDOMIZER_SETTING("MQDungeonsDodongosCavern"), "", WidgetType::Combobox, RO_MQ_SET_VANILLA, false, IMFLAG_NONE); + OPT_U8(RSK_MQ_JABU_JABU, "Jabu-Jabu's Belly Quest", {"Vanilla", "Master Quest", "Random"}, OptionCategory::Setting, CVAR_RANDOMIZER_SETTING("MQDungeonsJabuJabu"), "", WidgetType::Combobox, RO_MQ_SET_VANILLA, false, IMFLAG_NONE); + OPT_U8(RSK_MQ_FOREST_TEMPLE, "Forest Temple Quest", {"Vanilla", "Master Quest", "Random"}, OptionCategory::Setting, CVAR_RANDOMIZER_SETTING("MQDungeonsForestTemple"), "", WidgetType::Combobox, RO_MQ_SET_VANILLA, false, IMFLAG_NONE); + OPT_U8(RSK_MQ_FIRE_TEMPLE, "Fire Temple Quest", {"Vanilla", "Master Quest", "Random"}, OptionCategory::Setting, CVAR_RANDOMIZER_SETTING("MQDungeonsFireTemple"), "", WidgetType::Combobox, RO_MQ_SET_VANILLA, false, IMFLAG_NONE); + OPT_U8(RSK_MQ_WATER_TEMPLE, "Water Temple Quest", {"Vanilla", "Master Quest", "Random"}, OptionCategory::Setting, CVAR_RANDOMIZER_SETTING("MQDungeonsWaterTemple"), "", WidgetType::Combobox, RO_MQ_SET_VANILLA, false, IMFLAG_NONE); + OPT_U8(RSK_MQ_SPIRIT_TEMPLE, "Spirit Temple Quest", {"Vanilla", "Master Quest", "Random"}, OptionCategory::Setting, CVAR_RANDOMIZER_SETTING("MQDungeonsSpiritTemple"), "", WidgetType::Combobox, RO_MQ_SET_VANILLA, false, IMFLAG_NONE); + OPT_U8(RSK_MQ_SHADOW_TEMPLE, "Shadow Temple Quest", {"Vanilla", "Master Quest", "Random"}, OptionCategory::Setting, CVAR_RANDOMIZER_SETTING("MQDungeonsShadowTemple"), "", WidgetType::Combobox, RO_MQ_SET_VANILLA, false, IMFLAG_NONE); + OPT_U8(RSK_MQ_BOTTOM_OF_THE_WELL, "Bottom of the Well Quest", {"Vanilla", "Master Quest", "Random"}, OptionCategory::Setting, CVAR_RANDOMIZER_SETTING("MQDungeonsBottomOfTheWell"), "", WidgetType::Combobox, RO_MQ_SET_VANILLA, false, IMFLAG_NONE); + OPT_U8(RSK_MQ_ICE_CAVERN, "Ice Cavern Quest", {"Vanilla", "Master Quest", "Random"}, OptionCategory::Setting, CVAR_RANDOMIZER_SETTING("MQDungeonsIceCavern"), "", WidgetType::Combobox, RO_MQ_SET_VANILLA, false, IMFLAG_NONE); + OPT_U8(RSK_MQ_GTG, "Gerudo Training Ground Quest", {"Vanilla", "Master Quest", "Random"}, OptionCategory::Setting, CVAR_RANDOMIZER_SETTING("MQDungeonsGTG"), "", WidgetType::Combobox, RO_MQ_SET_VANILLA, false, IMFLAG_NONE); + OPT_U8(RSK_MQ_GANONS_CASTLE, "Ganon's Castle Quest", {"Vanilla", "Master Quest", "Random"}, OptionCategory::Setting, CVAR_RANDOMIZER_SETTING("MQDungeonsGanonsCastle"), "", WidgetType::Combobox, RO_MQ_SET_VANILLA); + OPT_U8(RSK_SHUFFLE_DUNGEON_REWARDS, "Shuffle Dungeon Rewards", {"End of Dungeons", "Any Dungeon", "Overworld", "Anywhere"}, OptionCategory::Setting, CVAR_RANDOMIZER_SETTING("ShuffleDungeonReward"), mOptionDescriptions[RSK_SHUFFLE_DUNGEON_REWARDS], WidgetType::Combobox, RO_DUNGEON_REWARDS_END_OF_DUNGEON); + OPT_U8(RSK_LINKS_POCKET, "Link's Pocket", {"Dungeon Reward", "Advancement", "Anything", "Nothing"}, OptionCategory::Setting, CVAR_RANDOMIZER_SETTING("LinksPocket"), "", WidgetType::Combobox, RO_LINKS_POCKET_DUNGEON_REWARD); + OPT_U8(RSK_SHUFFLE_SONGS, "Shuffle Songs", {"Song Locations", "Dungeon Rewards", "Anywhere"}, OptionCategory::Setting, CVAR_RANDOMIZER_SETTING("ShuffleSongs"), mOptionDescriptions[RSK_SHUFFLE_SONGS], WidgetType::Combobox, RO_SONG_SHUFFLE_SONG_LOCATIONS); + OPT_U8(RSK_SHOPSANITY, "Shop Shuffle", {"Off", "Specific Count", "Random"}, OptionCategory::Setting, CVAR_RANDOMIZER_SETTING("Shopsanity"), mOptionDescriptions[RSK_SHOPSANITY], WidgetType::Combobox, RO_SHOPSANITY_OFF); + OPT_U8(RSK_SHOPSANITY_COUNT, "Shops Item Count", {NumOpts(0, 7/*8*/)}, OptionCategory::Setting, CVAR_RANDOMIZER_SETTING("ShopsanityCount"), mOptionDescriptions[RSK_SHOPSANITY_COUNT], WidgetType::Slider, 0, false, IMFLAG_NONE); + OPT_U8(RSK_SHOPSANITY_PRICES, "Shops Prices", {"Vanilla", "Cheap Balanced", "Balanced", "Fixed", "Range", "Set By Wallet"}, OptionCategory::Setting, CVAR_RANDOMIZER_SETTING("ShopsanityPrices"), mOptionDescriptions[RSK_SHOPSANITY_PRICES], WidgetType::Combobox, RO_PRICE_VANILLA, false, IMFLAG_NONE); + OPT_U8(RSK_SHOPSANITY_PRICES_FIXED_PRICE, "Shops Fixed Price", {NumOpts(0, 995, 5)}, OptionCategory::Setting, CVAR_RANDOMIZER_SETTING("ShopsanityFixedPrice"), mOptionDescriptions[RSK_SHOPSANITY_PRICES_FIXED_PRICE], WidgetType::Slider, 10, true); + OPT_U8(RSK_SHOPSANITY_PRICES_RANGE_1, "Shops Lower Bound", {NumOpts(0, 995, 5)}, OptionCategory::Setting, CVAR_RANDOMIZER_SETTING("ShopsanityPriceRange1"), mOptionDescriptions[RSK_SHOPSANITY_PRICES_RANGE_1], WidgetType::Slider, 10, true, IMFLAG_NONE); + OPT_U8(RSK_SHOPSANITY_PRICES_RANGE_2, "Shops Upper Bound", {NumOpts(0, 995, 5)}, OptionCategory::Setting, CVAR_RANDOMIZER_SETTING("ShopsanityPriceRange2"), mOptionDescriptions[RSK_SHOPSANITY_PRICES_RANGE_2], WidgetType::Slider, 100, true, IMFLAG_NONE); + OPT_U8(RSK_SHOPSANITY_PRICES_NO_WALLET_WEIGHT, "Shops No Wallet Weight", {NumOpts(0, 100)}, OptionCategory::Setting, CVAR_RANDOMIZER_SETTING("ShopsanityNoWalletWeight"), mOptionDescriptions[RSK_SHOPSANITY_PRICES_NO_WALLET_WEIGHT], WidgetType::Slider, 10, true, IMFLAG_NONE); + OPT_U8(RSK_SHOPSANITY_PRICES_CHILD_WALLET_WEIGHT, "Shops Child Wallet Weight", {NumOpts(0, 100)}, OptionCategory::Setting, CVAR_RANDOMIZER_SETTING("ShopsanityChildWalletWeight"), mOptionDescriptions[RSK_SHOPSANITY_PRICES_CHILD_WALLET_WEIGHT], WidgetType::Slider, 10, true, IMFLAG_NONE); + OPT_U8(RSK_SHOPSANITY_PRICES_ADULT_WALLET_WEIGHT, "Shops Adult Wallet Weight", {NumOpts(0, 100)}, OptionCategory::Setting, CVAR_RANDOMIZER_SETTING("ShopsanityAdultWalletWeight"), mOptionDescriptions[RSK_SHOPSANITY_PRICES_ADULT_WALLET_WEIGHT], WidgetType::Slider, 10, true, IMFLAG_NONE); + OPT_U8(RSK_SHOPSANITY_PRICES_GIANT_WALLET_WEIGHT, "Shops Giant Wallet Weight", {NumOpts(0, 100)}, OptionCategory::Setting, CVAR_RANDOMIZER_SETTING("ShopsanityGiantWalletWeight"), mOptionDescriptions[RSK_SHOPSANITY_PRICES_GIANT_WALLET_WEIGHT], WidgetType::Slider, 10, true, IMFLAG_NONE); + OPT_U8(RSK_SHOPSANITY_PRICES_TYCOON_WALLET_WEIGHT, "Shops Tycoon Wallet Weight", {NumOpts(0, 100)}, OptionCategory::Setting, CVAR_RANDOMIZER_SETTING("ShopsanityTycoonWalletWeight"), mOptionDescriptions[RSK_SHOPSANITY_PRICES_TYCOON_WALLET_WEIGHT], WidgetType::Slider, 10, true, IMFLAG_NONE); + OPT_BOOL(RSK_SHOPSANITY_PRICES_AFFORDABLE, "Shops Affordable Prices", CVAR_RANDOMIZER_SETTING("ShopsanityPricesAffordable"), mOptionDescriptions[RSK_SHOPSANITY_PRICES_AFFORDABLE]); + OPT_U8(RSK_SHUFFLE_TOKENS, "Token Shuffle", {"Off", "Dungeons", "Overworld", "All Tokens"}, OptionCategory::Setting, CVAR_RANDOMIZER_SETTING("ShuffleTokens"), mOptionDescriptions[RSK_SHUFFLE_TOKENS], WidgetType::Combobox, RO_TOKENSANITY_OFF); + OPT_U8(RSK_SHUFFLE_SCRUBS, "Scrubs Shuffle", {"Off", "One-Time Only", "All"}, OptionCategory::Setting, CVAR_RANDOMIZER_SETTING("ShuffleScrubs"), mOptionDescriptions[RSK_SHUFFLE_SCRUBS], WidgetType::Combobox, RO_SCRUBS_OFF); + OPT_U8(RSK_SCRUBS_PRICES, "Scrubs Prices", {"Vanilla", "Cheap Balanced", "Balanced", "Fixed", "Range", "Set By Wallet"}, OptionCategory::Setting, CVAR_RANDOMIZER_SETTING("ScrubsPrices"), mOptionDescriptions[RSK_SCRUBS_PRICES], WidgetType::Combobox, RO_PRICE_VANILLA, false, IMFLAG_NONE); + OPT_U8(RSK_SCRUBS_PRICES_FIXED_PRICE, "Scrubs Fixed Price", {NumOpts(0, 995, 5)}, OptionCategory::Setting, CVAR_RANDOMIZER_SETTING("ScrubsFixedPrice"), mOptionDescriptions[RSK_SCRUBS_PRICES_FIXED_PRICE], WidgetType::Slider, 10, true); + OPT_U8(RSK_SCRUBS_PRICES_RANGE_1, "Scrubs Lower Bound", {NumOpts(0, 995, 5)}, OptionCategory::Setting, CVAR_RANDOMIZER_SETTING("ScrubsPriceRange1"), mOptionDescriptions[RSK_SCRUBS_PRICES_RANGE_1], WidgetType::Slider, 10, true, IMFLAG_NONE); + OPT_U8(RSK_SCRUBS_PRICES_RANGE_2, "Scrubs Upper Bound", {NumOpts(0, 995, 5)}, OptionCategory::Setting, CVAR_RANDOMIZER_SETTING("ScrubsPriceRange2"), mOptionDescriptions[RSK_SCRUBS_PRICES_RANGE_2], WidgetType::Slider, 100, true, IMFLAG_NONE); + OPT_U8(RSK_SCRUBS_PRICES_NO_WALLET_WEIGHT, "Scrubs No Wallet Weight", {NumOpts(0, 100)}, OptionCategory::Setting, CVAR_RANDOMIZER_SETTING("ScrubsNoWalletWeight"), mOptionDescriptions[RSK_SCRUBS_PRICES_NO_WALLET_WEIGHT], WidgetType::Slider, 10, true, IMFLAG_NONE); + OPT_U8(RSK_SCRUBS_PRICES_CHILD_WALLET_WEIGHT, "Scrubs Child Wallet Weight", {NumOpts(0, 100)}, OptionCategory::Setting, CVAR_RANDOMIZER_SETTING("ScrubsChildWalletWeight"), mOptionDescriptions[RSK_SCRUBS_PRICES_CHILD_WALLET_WEIGHT], WidgetType::Slider, 10, true, IMFLAG_NONE); + OPT_U8(RSK_SCRUBS_PRICES_ADULT_WALLET_WEIGHT, "Scrubs Adult Wallet Weight", {NumOpts(0, 100)}, OptionCategory::Setting, CVAR_RANDOMIZER_SETTING("ScrubsAdultWalletWeight"), mOptionDescriptions[RSK_SCRUBS_PRICES_ADULT_WALLET_WEIGHT], WidgetType::Slider, 10, true, IMFLAG_NONE); + OPT_U8(RSK_SCRUBS_PRICES_GIANT_WALLET_WEIGHT, "Scrubs Giant Wallet Weight", {NumOpts(0, 100)}, OptionCategory::Setting, CVAR_RANDOMIZER_SETTING("ScrubsGiantWalletWeight"), mOptionDescriptions[RSK_SCRUBS_PRICES_GIANT_WALLET_WEIGHT], WidgetType::Slider, 10, true, IMFLAG_NONE); + OPT_U8(RSK_SCRUBS_PRICES_TYCOON_WALLET_WEIGHT, "Scrubs Tycoon Wallet Weight", {NumOpts(0, 100)}, OptionCategory::Setting, CVAR_RANDOMIZER_SETTING("ScrubsTycoonWalletWeight"), mOptionDescriptions[RSK_SCRUBS_PRICES_TYCOON_WALLET_WEIGHT], WidgetType::Slider, 10, true, IMFLAG_NONE); + OPT_BOOL(RSK_SCRUBS_PRICES_AFFORDABLE, "Scrubs Affordable Prices", CVAR_RANDOMIZER_SETTING("ScrubsPricesAffordable"), mOptionDescriptions[RSK_SCRUBS_PRICES_AFFORDABLE]); + OPT_BOOL(RSK_SHUFFLE_BEEHIVES, "Shuffle Beehives", CVAR_RANDOMIZER_SETTING("ShuffleBeehives"), mOptionDescriptions[RSK_SHUFFLE_BEEHIVES]); + OPT_BOOL(RSK_SHUFFLE_COWS, "Shuffle Cows", CVAR_RANDOMIZER_SETTING("ShuffleCows"), mOptionDescriptions[RSK_SHUFFLE_COWS]); + OPT_BOOL(RSK_SHUFFLE_KOKIRI_SWORD, "Shuffle Kokiri Sword", CVAR_RANDOMIZER_SETTING("ShuffleKokiriSword"), mOptionDescriptions[RSK_SHUFFLE_KOKIRI_SWORD]); + OPT_BOOL(RSK_SHUFFLE_MASTER_SWORD, "Shuffle Master Sword", CVAR_RANDOMIZER_SETTING("ShuffleMasterSword"), mOptionDescriptions[RSK_SHUFFLE_MASTER_SWORD]); + OPT_BOOL(RSK_SHUFFLE_CHILD_WALLET, "Shuffle Child's Wallet", CVAR_RANDOMIZER_SETTING("ShuffleChildWallet"), mOptionDescriptions[RSK_SHUFFLE_CHILD_WALLET], IMFLAG_NONE); + OPT_BOOL(RSK_INCLUDE_TYCOON_WALLET, "Include Tycoon Wallet", CVAR_RANDOMIZER_SETTING("IncludeTycoonWallet"), mOptionDescriptions[RSK_INCLUDE_TYCOON_WALLET]); + OPT_BOOL(RSK_SHUFFLE_OCARINA, "Shuffle Ocarinas", CVAR_RANDOMIZER_SETTING("ShuffleOcarinas"), mOptionDescriptions[RSK_SHUFFLE_OCARINA]); + OPT_BOOL(RSK_SHUFFLE_OCARINA_BUTTONS, "Shuffle Ocarina Buttons", CVAR_RANDOMIZER_SETTING("ShuffleOcarinaButtons"), mOptionDescriptions[RSK_SHUFFLE_OCARINA_BUTTONS]); + OPT_BOOL(RSK_SHUFFLE_SWIM, "Shuffle Swim", CVAR_RANDOMIZER_SETTING("ShuffleSwim"), mOptionDescriptions[RSK_SHUFFLE_SWIM]); + OPT_BOOL(RSK_SHUFFLE_WEIRD_EGG, "Shuffle Weird Egg", CVAR_RANDOMIZER_SETTING("ShuffleWeirdEgg"), mOptionDescriptions[RSK_SHUFFLE_WEIRD_EGG]); + OPT_BOOL(RSK_SHUFFLE_GERUDO_MEMBERSHIP_CARD, "Shuffle Gerudo Membership Card", CVAR_RANDOMIZER_SETTING("ShuffleGerudoToken"), mOptionDescriptions[RSK_SHUFFLE_GERUDO_MEMBERSHIP_CARD]); + OPT_U8(RSK_SHUFFLE_POTS, "Shuffle Pots", {"Off", "Dungeons", "Overworld", "All Pots"}, OptionCategory::Setting, CVAR_RANDOMIZER_SETTING("ShufflePots"), mOptionDescriptions[RSK_SHUFFLE_POTS], WidgetType::Combobox, RO_SHUFFLE_POTS_OFF); + OPT_BOOL(RSK_SHUFFLE_FISHING_POLE, "Shuffle Fishing Pole", CVAR_RANDOMIZER_SETTING("ShuffleFishingPole"), mOptionDescriptions[RSK_SHUFFLE_FISHING_POLE]); + OPT_U8(RSK_SHUFFLE_MERCHANTS, "Shuffle Merchants", {"Off", "Bean Merchant Only", "All But Beans", "All"}, OptionCategory::Setting, CVAR_RANDOMIZER_SETTING("ShuffleMerchants"), mOptionDescriptions[RSK_SHUFFLE_MERCHANTS], WidgetType::Combobox, RO_SHUFFLE_MERCHANTS_OFF, IMFLAG_NONE); + OPT_U8(RSK_MERCHANT_PRICES, "Merchant Prices", {"Vanilla", "Cheap Balanced", "Balanced", "Fixed", "Range", "Set By Wallet"}, OptionCategory::Setting, CVAR_RANDOMIZER_SETTING("MerchantPrices"), mOptionDescriptions[RSK_MERCHANT_PRICES], WidgetType::Combobox, RO_PRICE_VANILLA, false, IMFLAG_NONE); + OPT_U8(RSK_MERCHANT_PRICES_FIXED_PRICE, "Merchant Fixed Price", {NumOpts(0, 995, 5)}, OptionCategory::Setting, CVAR_RANDOMIZER_SETTING("MerchantFixedPrice"), mOptionDescriptions[RSK_MERCHANT_PRICES_FIXED_PRICE], WidgetType::Slider, 10, true); + OPT_U8(RSK_MERCHANT_PRICES_RANGE_1, "Merchant Lower Bound", {NumOpts(0, 995, 5)}, OptionCategory::Setting, CVAR_RANDOMIZER_SETTING("MerchantPriceRange1"), mOptionDescriptions[RSK_MERCHANT_PRICES_RANGE_1], WidgetType::Slider, 10, true, IMFLAG_NONE); + OPT_U8(RSK_MERCHANT_PRICES_RANGE_2, "Merchant Upper Bound", {NumOpts(0, 995, 5)}, OptionCategory::Setting, CVAR_RANDOMIZER_SETTING("MerchantPriceRange2"), mOptionDescriptions[RSK_MERCHANT_PRICES_RANGE_2], WidgetType::Slider, 100, true, IMFLAG_NONE); + OPT_U8(RSK_MERCHANT_PRICES_NO_WALLET_WEIGHT, "Merchant No Wallet Weight", {NumOpts(0, 100)}, OptionCategory::Setting, CVAR_RANDOMIZER_SETTING("MerchantNoWalletWeight"), mOptionDescriptions[RSK_MERCHANT_PRICES_NO_WALLET_WEIGHT], WidgetType::Slider, 10, true, IMFLAG_NONE); + OPT_U8(RSK_MERCHANT_PRICES_CHILD_WALLET_WEIGHT, "Merchant Child Wallet Weight", {NumOpts(0, 100)}, OptionCategory::Setting, CVAR_RANDOMIZER_SETTING("MerchantChildWalletWeight"), mOptionDescriptions[RSK_MERCHANT_PRICES_CHILD_WALLET_WEIGHT], WidgetType::Slider, 10, true, IMFLAG_NONE); + OPT_U8(RSK_MERCHANT_PRICES_ADULT_WALLET_WEIGHT, "Merchant Adult Wallet Weight", {NumOpts(0, 100)}, OptionCategory::Setting, CVAR_RANDOMIZER_SETTING("MerchantAdultWalletWeight"), mOptionDescriptions[RSK_MERCHANT_PRICES_ADULT_WALLET_WEIGHT], WidgetType::Slider, 10, true, IMFLAG_NONE); + OPT_U8(RSK_MERCHANT_PRICES_GIANT_WALLET_WEIGHT, "Merchant Giant Wallet Weight", {NumOpts(0, 100)}, OptionCategory::Setting, CVAR_RANDOMIZER_SETTING("MerchantGiantWalletWeight"), mOptionDescriptions[RSK_MERCHANT_PRICES_GIANT_WALLET_WEIGHT], WidgetType::Slider, 10, true, IMFLAG_NONE); + OPT_U8(RSK_MERCHANT_PRICES_TYCOON_WALLET_WEIGHT, "Merchant Tycoon Wallet Weight", {NumOpts(0, 100)}, OptionCategory::Setting, CVAR_RANDOMIZER_SETTING("MerchantTycoonWalletWeight"), mOptionDescriptions[RSK_MERCHANT_PRICES_TYCOON_WALLET_WEIGHT], WidgetType::Slider, 10, true, IMFLAG_NONE); + OPT_BOOL(RSK_MERCHANT_PRICES_AFFORDABLE, "Merchant Affordable Prices", CVAR_RANDOMIZER_SETTING("MerchantPricesAffordable"), mOptionDescriptions[RSK_MERCHANT_PRICES_AFFORDABLE]); + OPT_BOOL(RSK_SHUFFLE_FROG_SONG_RUPEES, "Shuffle Frog Song Rupees", CVAR_RANDOMIZER_SETTING("ShuffleFrogSongRupees"), mOptionDescriptions[RSK_SHUFFLE_FROG_SONG_RUPEES]); + OPT_BOOL(RSK_SHUFFLE_ADULT_TRADE, "Shuffle Adult Trade", CVAR_RANDOMIZER_SETTING("ShuffleAdultTrade"), mOptionDescriptions[RSK_SHUFFLE_ADULT_TRADE]); + OPT_U8(RSK_SHUFFLE_CHEST_MINIGAME, "Shuffle Chest Minigame", {"Off", "On (Separate)", "On (Pack)"}); + OPT_BOOL(RSK_SHUFFLE_100_GS_REWARD, "Shuffle 100 GS Reward", CVAR_RANDOMIZER_SETTING("Shuffle100GSReward"), mOptionDescriptions[RSK_SHUFFLE_100_GS_REWARD], IMFLAG_SEPARATOR_BOTTOM, WidgetType::Checkbox, RO_GENERIC_OFF); + OPT_U8(RSK_SHUFFLE_BOSS_SOULS, "Shuffle Boss Souls", {"Off", "On", "On + Ganon"}, OptionCategory::Setting, CVAR_RANDOMIZER_SETTING("ShuffleBossSouls"), mOptionDescriptions[RSK_SHUFFLE_BOSS_SOULS], WidgetType::Combobox); + OPT_BOOL(RSK_SHUFFLE_DEKU_STICK_BAG, "Shuffle Deku Stick Bag", CVAR_RANDOMIZER_SETTING("ShuffleDekuStickBag"), mOptionDescriptions[RSK_SHUFFLE_DEKU_STICK_BAG], IMFLAG_SEPARATOR_BOTTOM, WidgetType::Checkbox, RO_GENERIC_OFF); + OPT_BOOL(RSK_SHUFFLE_DEKU_NUT_BAG, "Shuffle Deku Nut Bag", CVAR_RANDOMIZER_SETTING("ShuffleDekuNutBag"), mOptionDescriptions[RSK_SHUFFLE_DEKU_NUT_BAG], IMFLAG_SEPARATOR_BOTTOM, WidgetType::Checkbox, RO_GENERIC_OFF); + OPT_U8(RSK_SHUFFLE_FREESTANDING, "Shuffle Freestanding Items", {"Off", "Dungeons", "Overworld", "All Items"}, OptionCategory::Setting, CVAR_RANDOMIZER_SETTING("ShuffleFreestanding"), mOptionDescriptions[RSK_SHUFFLE_FREESTANDING], WidgetType::Combobox, RO_SHUFFLE_FREESTANDING_OFF); + OPT_U8(RSK_FISHSANITY, "Fishsanity", {"Off", "Shuffle only Hyrule Loach", "Shuffle Fishing Pond", "Shuffle Overworld Fish", "Shuffle Both"}, OptionCategory::Setting, CVAR_RANDOMIZER_SETTING("Fishsanity"), mOptionDescriptions[RSK_FISHSANITY], WidgetType::Combobox, RO_FISHSANITY_OFF); + OPT_U8(RSK_FISHSANITY_POND_COUNT, "Pond Fish Count", {NumOpts(0,17,1)}, OptionCategory::Setting, CVAR_RANDOMIZER_SETTING("FishsanityPondCount"), mOptionDescriptions[RSK_FISHSANITY_POND_COUNT], WidgetType::Slider, 0, true, IMFLAG_NONE); + OPT_BOOL(RSK_FISHSANITY_AGE_SPLIT, "Pond Age Split", CVAR_RANDOMIZER_SETTING("FishsanityAgeSplit"), mOptionDescriptions[RSK_FISHSANITY_AGE_SPLIT]); + OPT_BOOL(RSK_SHUFFLE_FAIRIES, "Shuffle Fairies", CVAR_RANDOMIZER_SETTING("ShuffleFairies"), mOptionDescriptions[RSK_SHUFFLE_FAIRIES]); + OPT_U8(RSK_SHUFFLE_MAPANDCOMPASS, "Maps/Compasses", {"Start With", "Vanilla", "Own Dungeon", "Any Dungeon", "Overworld", "Anywhere"}, OptionCategory::Setting, CVAR_RANDOMIZER_SETTING("StartingMapsCompasses"), mOptionDescriptions[RSK_SHUFFLE_MAPANDCOMPASS], WidgetType::Combobox, RO_DUNGEON_ITEM_LOC_OWN_DUNGEON); + OPT_U8(RSK_KEYSANITY, "Small Key Shuffle", {"Start With", "Vanilla", "Own Dungeon", "Any Dungeon", "Overworld", "Anywhere"}, OptionCategory::Setting, CVAR_RANDOMIZER_SETTING("Keysanity"), mOptionDescriptions[RSK_KEYSANITY], WidgetType::Combobox, RO_DUNGEON_ITEM_LOC_OWN_DUNGEON); + OPT_U8(RSK_GERUDO_KEYS, "Gerudo Fortress Keys", {"Vanilla", "Any Dungeon", "Overworld", "Anywhere"}, OptionCategory::Setting, CVAR_RANDOMIZER_SETTING("GerudoKeys"), mOptionDescriptions[RSK_GERUDO_KEYS], WidgetType::Combobox, RO_GERUDO_KEYS_VANILLA); + OPT_U8(RSK_BOSS_KEYSANITY, "Boss Key Shuffle", {"Start With", "Vanilla", "Own Dungeon", "Any Dungeon", "Overworld", "Anywhere"}, OptionCategory::Setting, CVAR_RANDOMIZER_SETTING("BossKeysanity"), mOptionDescriptions[RSK_BOSS_KEYSANITY], WidgetType::Combobox, RO_DUNGEON_ITEM_LOC_OWN_DUNGEON); + OPT_U8(RSK_GANONS_BOSS_KEY, "Ganon's Boss Key", {"Vanilla", "Own Dungeon", "Start With", "Any Dungeon", "Overworld", "Anywhere", "LACS-Vanilla", "LACS-Stones", "LACS-Medallions", "LACS-Rewards", "LACS-Dungeons", "LACS-Tokens", "100 GS Reward", "Triforce Hunt"}, OptionCategory::Setting, CVAR_RANDOMIZER_SETTING("ShuffleGanonBossKey"), mOptionDescriptions[RSK_GANONS_BOSS_KEY], WidgetType::Combobox, RO_GANON_BOSS_KEY_VANILLA); + OPT_U8(RSK_LACS_STONE_COUNT, "GCBK Stone Count", {NumOpts(0, 4)}, OptionCategory::Setting, CVAR_RANDOMIZER_SETTING("LacsStoneCount"), "", WidgetType::Slider, 3, true); + OPT_U8(RSK_LACS_MEDALLION_COUNT, "GCBK Medallion Count", {NumOpts(0, 7)}, OptionCategory::Setting, CVAR_RANDOMIZER_SETTING("LacsMedallionCount"), "", WidgetType::Slider, 6, true); + OPT_U8(RSK_LACS_REWARD_COUNT, "GCBK Reward Count", {NumOpts(0, 10)}, OptionCategory::Setting, CVAR_RANDOMIZER_SETTING("LacsRewardCount"), "", WidgetType::Slider, 9, true); + OPT_U8(RSK_LACS_DUNGEON_COUNT, "GCBK Dungeon Count", {NumOpts(0, 9)}, OptionCategory::Setting, CVAR_RANDOMIZER_SETTING("LacsDungeonCount"), "", WidgetType::Slider, 8, true); + OPT_U8(RSK_LACS_TOKEN_COUNT, "GCBK Token Count", {NumOpts(0, 100)}, OptionCategory::Setting, CVAR_RANDOMIZER_SETTING("LacsTokenCount"), "", WidgetType::Slider, 100, true); + OPT_U8(RSK_LACS_OPTIONS, "GCBK LACS Reward Options", {"Standard Reward", "Greg as Reward", "Greg as Wildcard"}, OptionCategory::Setting, CVAR_RANDOMIZER_SETTING("LacsRewardOptions"), "", WidgetType::Combobox, RO_LACS_STANDARD_REWARD); + OPT_U8(RSK_KEYRINGS, "Key Rings", {"Off", "Random", "Count", "Selection"}, OptionCategory::Setting, CVAR_RANDOMIZER_SETTING("ShuffleKeyRings"), mOptionDescriptions[RSK_KEYRINGS], WidgetType::Combobox, RO_KEYRINGS_OFF); + OPT_U8(RSK_KEYRINGS_RANDOM_COUNT, "Keyring Dungeon Count", {NumOpts(0, 9)}, OptionCategory::Setting, CVAR_RANDOMIZER_SETTING("ShuffleKeyRingsRandomCount"), "", WidgetType::Slider, 8); + OPT_U8(RSK_KEYRINGS_GERUDO_FORTRESS, "Gerudo Fortress Keyring", {"No", "Random", "Yes"}, OptionCategory::Setting, CVAR_RANDOMIZER_SETTING("ShuffleKeyRingsGerudoFortress"), "", WidgetType::TristateCheckbox, 0); + OPT_U8(RSK_KEYRINGS_FOREST_TEMPLE, "Forest Temple Keyring", {"No", "Random", "Yes"}, OptionCategory::Setting, CVAR_RANDOMIZER_SETTING("ShuffleKeyRingsForestTemple"), "", WidgetType::TristateCheckbox, 0); + OPT_U8(RSK_KEYRINGS_FIRE_TEMPLE, "Fire Temple Keyring", {"No", "Random", "Yes"}, OptionCategory::Setting, CVAR_RANDOMIZER_SETTING("ShuffleKeyRingsFireTemple"), "", WidgetType::TristateCheckbox, 0); + OPT_U8(RSK_KEYRINGS_WATER_TEMPLE, "Water Temple Keyring", {"No", "Random", "Yes"}, OptionCategory::Setting, CVAR_RANDOMIZER_SETTING("ShuffleKeyRingsWaterTemple"), "", WidgetType::TristateCheckbox, 0); + OPT_U8(RSK_KEYRINGS_SPIRIT_TEMPLE, "Spirit Temple Keyring", {"No", "Random", "Yes"}, OptionCategory::Setting, CVAR_RANDOMIZER_SETTING("ShuffleKeyRingsSpiritTemple"), "", WidgetType::TristateCheckbox, 0); + OPT_U8(RSK_KEYRINGS_SHADOW_TEMPLE, "Shadow Temple Keyring", {"No", "Random", "Yes"}, OptionCategory::Setting, CVAR_RANDOMIZER_SETTING("ShuffleKeyRingsShadowTemple"), "", WidgetType::TristateCheckbox, 0); + OPT_U8(RSK_KEYRINGS_BOTTOM_OF_THE_WELL, "Bottom of the Well Keyring", {"No", "Random", "Yes"}, OptionCategory::Setting, CVAR_RANDOMIZER_SETTING("ShuffleKeyRingsBottomOfTheWell"), "", WidgetType::TristateCheckbox, 0); + OPT_U8(RSK_KEYRINGS_GTG, "Gerudo Training Ground Keyring", {"No", "Random", "Yes"}, OptionCategory::Setting, CVAR_RANDOMIZER_SETTING("ShuffleKeyRingsGTG"), "", WidgetType::TristateCheckbox, 0); + OPT_U8(RSK_KEYRINGS_GANONS_CASTLE, "Ganon's Castle Keyring", {"No", "Random", "Yes"}, OptionCategory::Setting, CVAR_RANDOMIZER_SETTING("ShuffleKeyRingsGanonsCastle"), "", WidgetType::TristateCheckbox, 0); + //Dummied out due to redundancy with TimeSavers.SkipChildStealth until such a time that logic needs to consider child stealth e.g. because it's freestanding checks are added to freestanding shuffle. + //To undo this dummying, readd this setting to an OptionGroup so it appears in the UI, then edit the timesaver check hooks to look at this, and the timesaver setting to lock itself as needed. + OPT_BOOL(RSK_SKIP_CHILD_STEALTH, "Skip Child Stealth", {"Don't Skip", "Skip"}, OptionCategory::Setting, CVAR_RANDOMIZER_SETTING("SkipChildStealth"), mOptionDescriptions[RSK_SKIP_CHILD_STEALTH], WidgetType::Checkbox, RO_GENERIC_DONT_SKIP); + OPT_BOOL(RSK_SKIP_CHILD_ZELDA, "Skip Child Zelda", {"Don't Skip", "Skip"}, OptionCategory::Setting, CVAR_RANDOMIZER_SETTING("SkipChildZelda"), mOptionDescriptions[RSK_SKIP_CHILD_ZELDA], WidgetType::Checkbox, RO_GENERIC_DONT_SKIP); + OPT_BOOL(RSK_SKIP_EPONA_RACE, "Skip Epona Race", {"Don't Skip", "Skip"}, OptionCategory::Setting, CVAR_RANDOMIZER_SETTING("SkipEponaRace"), mOptionDescriptions[RSK_SKIP_EPONA_RACE], WidgetType::Checkbox, RO_GENERIC_DONT_SKIP); + OPT_BOOL(RSK_SKIP_SCARECROWS_SONG, "Skip Scarecrow's Song", CVAR_RANDOMIZER_SETTING("SkipScarecrowsSong"), mOptionDescriptions[RSK_SKIP_SCARECROWS_SONG]); + OPT_U8(RSK_BIG_POE_COUNT, "Big Poe Target Count", {NumOpts(1, 10)}, OptionCategory::Setting, CVAR_RANDOMIZER_SETTING("BigPoeTargetCount"), mOptionDescriptions[RSK_BIG_POE_COUNT], WidgetType::Slider, 9); + OPT_U8(RSK_CUCCO_COUNT, "Cuccos to return", {NumOpts(0, 7)}, OptionCategory::Setting, CVAR_RANDOMIZER_SETTING("CuccosToReturn"), mOptionDescriptions[RSK_CUCCO_COUNT], WidgetType::Slider, 7); + OPT_BOOL(RSK_COMPLETE_MASK_QUEST, "Complete Mask Quest", CVAR_RANDOMIZER_SETTING("CompleteMaskQuest"), mOptionDescriptions[RSK_COMPLETE_MASK_QUEST]); + OPT_U8(RSK_GOSSIP_STONE_HINTS, "Gossip Stone Hints", {"No Hints", "Need Nothing", "Mask of Truth", "Stone of Agony"}, OptionCategory::Setting, CVAR_RANDOMIZER_SETTING("GossipStoneHints"), mOptionDescriptions[RSK_GOSSIP_STONE_HINTS], WidgetType::Combobox, RO_GOSSIP_STONES_NEED_NOTHING, false, IMFLAG_NONE); + OPT_U8(RSK_HINT_CLARITY, "Hint Clarity", {"Obscure", "Ambiguous", "Clear"}, OptionCategory::Setting, CVAR_RANDOMIZER_SETTING("HintClarity"), mOptionDescriptions[RSK_HINT_CLARITY], WidgetType::Combobox, RO_HINT_CLARITY_CLEAR, true, IMFLAG_INDENT); + OPT_U8(RSK_HINT_DISTRIBUTION, "Hint Distribution", {"Useless", "Balanced", "Strong", "Very Strong"}, OptionCategory::Setting, CVAR_RANDOMIZER_SETTING("HintDistribution"), mOptionDescriptions[RSK_HINT_DISTRIBUTION], WidgetType::Combobox, RO_HINT_DIST_BALANCED, true, IMFLAG_UNINDENT); + OPT_BOOL(RSK_TOT_ALTAR_HINT, "ToT Altar Hint", {"Off", "On"}, OptionCategory::Setting, CVAR_RANDOMIZER_SETTING("AltarHint"), mOptionDescriptions[RSK_TOT_ALTAR_HINT], WidgetType::Checkbox, RO_GENERIC_ON, false, IMFLAG_INDENT); + OPT_BOOL(RSK_GANONDORF_HINT, "Ganondorf Hint", {"Off", "On"}, OptionCategory::Setting, CVAR_RANDOMIZER_SETTING("GanondorfHint"), mOptionDescriptions[RSK_GANONDORF_HINT], WidgetType::Checkbox, RO_GENERIC_ON, false, IMFLAG_NONE); + OPT_BOOL(RSK_SHEIK_LA_HINT, "Sheik Light Arrow Hint", {"Off", "On"}, OptionCategory::Setting, CVAR_RANDOMIZER_SETTING("SheikLAHint"), mOptionDescriptions[RSK_SHEIK_LA_HINT], WidgetType::Checkbox, RO_GENERIC_ON, false, IMFLAG_NONE); + OPT_BOOL(RSK_DAMPES_DIARY_HINT, "Dampe's Diary Hint", CVAR_RANDOMIZER_SETTING("DampeHint"), mOptionDescriptions[RSK_DAMPES_DIARY_HINT], IMFLAG_NONE); + OPT_BOOL(RSK_GREG_HINT, "Greg the Green Rupee Hint", CVAR_RANDOMIZER_SETTING("GregHint"), mOptionDescriptions[RSK_GREG_HINT], IMFLAG_NONE); + OPT_BOOL(RSK_LOACH_HINT, "Hyrule Loach Hint", CVAR_RANDOMIZER_SETTING("LoachHint"), mOptionDescriptions[RSK_LOACH_HINT], IMFLAG_NONE); + OPT_BOOL(RSK_SARIA_HINT, "Saria's Hint", CVAR_RANDOMIZER_SETTING("SariaHint"), mOptionDescriptions[RSK_SARIA_HINT], IMFLAG_NONE); + OPT_BOOL(RSK_FISHING_POLE_HINT, "Fishing Pole Hint", CVAR_RANDOMIZER_SETTING("FishingPoleHint"), mOptionDescriptions[RSK_FISHING_POLE_HINT], IMFLAG_NONE); + OPT_BOOL(RSK_FROGS_HINT, "Frog Ocarina Game Hint", CVAR_RANDOMIZER_SETTING("FrogsHint"), mOptionDescriptions[RSK_FROGS_HINT], IMFLAG_NONE); + OPT_BOOL(RSK_OOT_HINT, "Ocarina of Time Hint", CVAR_RANDOMIZER_SETTING("OoTHint"), mOptionDescriptions[RSK_OOT_HINT], IMFLAG_NONE); + OPT_BOOL(RSK_BIGGORON_HINT, "Biggoron's Hint", CVAR_RANDOMIZER_SETTING("BiggoronHint"), mOptionDescriptions[RSK_BIGGORON_HINT], IMFLAG_NONE); + OPT_BOOL(RSK_BIG_POES_HINT, "Big Poes Hint", CVAR_RANDOMIZER_SETTING("BigPoesHint"), mOptionDescriptions[RSK_BIG_POES_HINT], IMFLAG_NONE); + OPT_BOOL(RSK_CHICKENS_HINT, "Chickens Hint", CVAR_RANDOMIZER_SETTING("ChickensHint"), mOptionDescriptions[RSK_CHICKENS_HINT], IMFLAG_NONE); + OPT_BOOL(RSK_MALON_HINT, "Malon Hint", CVAR_RANDOMIZER_SETTING("MalonHint"), mOptionDescriptions[RSK_MALON_HINT], IMFLAG_NONE); + OPT_BOOL(RSK_HBA_HINT, "Horseback Archery Hint", CVAR_RANDOMIZER_SETTING("HBAHint"), mOptionDescriptions[RSK_HBA_HINT], IMFLAG_NONE); + OPT_BOOL(RSK_WARP_SONG_HINTS, "Warp Song Hints", CVAR_RANDOMIZER_SETTING("WarpSongText"), mOptionDescriptions[RSK_WARP_SONG_HINTS], IMFLAG_NONE, WidgetType::Checkbox, RO_GENERIC_ON); + OPT_BOOL(RSK_SCRUB_TEXT_HINT, "Scrub Hint Text", CVAR_RANDOMIZER_SETTING("ScrubText"), mOptionDescriptions[RSK_SCRUB_TEXT_HINT], IMFLAG_NONE); + OPT_BOOL(RSK_MERCHANT_TEXT_HINT, "Merchant Hint Text", CVAR_RANDOMIZER_SETTING("MerchantText"), mOptionDescriptions[RSK_MERCHANT_TEXT_HINT], IMFLAG_NONE); + OPT_BOOL(RSK_KAK_10_SKULLS_HINT, "10 GS Hint", CVAR_RANDOMIZER_SETTING("10GSHint"), mOptionDescriptions[RSK_KAK_10_SKULLS_HINT], IMFLAG_NONE); + OPT_BOOL(RSK_KAK_20_SKULLS_HINT, "20 GS Hint", CVAR_RANDOMIZER_SETTING("20GSHint"), mOptionDescriptions[RSK_KAK_20_SKULLS_HINT], IMFLAG_NONE); + OPT_BOOL(RSK_KAK_30_SKULLS_HINT, "30 GS Hint", CVAR_RANDOMIZER_SETTING("30GSHint"), mOptionDescriptions[RSK_KAK_30_SKULLS_HINT], IMFLAG_NONE); + OPT_BOOL(RSK_KAK_40_SKULLS_HINT, "40 GS Hint", CVAR_RANDOMIZER_SETTING("40GSHint"), mOptionDescriptions[RSK_KAK_40_SKULLS_HINT], IMFLAG_NONE); + OPT_BOOL(RSK_KAK_50_SKULLS_HINT, "50 GS Hint", CVAR_RANDOMIZER_SETTING("50GSHint"), mOptionDescriptions[RSK_KAK_50_SKULLS_HINT], IMFLAG_NONE); + OPT_BOOL(RSK_KAK_100_SKULLS_HINT, "100 GS Hint", CVAR_RANDOMIZER_SETTING("100GSHint"), mOptionDescriptions[RSK_KAK_100_SKULLS_HINT], IMFLAG_NONE); + OPT_BOOL(RSK_MASK_SHOP_HINT, "Mask Shop Hint", CVAR_RANDOMIZER_SETTING("MaskShopHint"), mOptionDescriptions[RSK_MASK_SHOP_HINT]); // TODO: Compasses show rewards/woth, maps show dungeon mode - mOptions[RSK_BLUE_FIRE_ARROWS] = Option::Bool("Blue Fire Arrows", CVAR_RANDOMIZER_SETTING("BlueFireArrows"), mOptionDescriptions[RSK_BLUE_FIRE_ARROWS]); - mOptions[RSK_SUNLIGHT_ARROWS] = Option::Bool("Sunlight Arrows", CVAR_RANDOMIZER_SETTING("SunlightArrows"), mOptionDescriptions[RSK_SUNLIGHT_ARROWS]); - mOptions[RSK_INFINITE_UPGRADES] = Option::U8("Infinite Upgrades", {"Off", "Progressive", "Condensed Progressive"}, OptionCategory::Setting, CVAR_RANDOMIZER_SETTING("InfiniteUpgrades"), mOptionDescriptions[RSK_INFINITE_UPGRADES]); - mOptions[RSK_SKELETON_KEY] = Option::Bool("Skeleton Key", CVAR_RANDOMIZER_SETTING("SkeletonKey"), mOptionDescriptions[RSK_SKELETON_KEY]); - mOptions[RSK_ITEM_POOL] = Option::U8("Item Pool", {"Plentiful", "Balanced", "Scarce", "Minimal"}, OptionCategory::Setting, CVAR_RANDOMIZER_SETTING("ItemPool"), mOptionDescriptions[RSK_ITEM_POOL], WidgetType::Combobox, RO_ITEM_POOL_BALANCED); - mOptions[RSK_ICE_TRAPS] = Option::U8("Ice Traps", {"Off", "Normal", "Extra", "Mayhem", "Onslaught"}, OptionCategory::Setting, CVAR_RANDOMIZER_SETTING("IceTraps"), mOptionDescriptions[RSK_ICE_TRAPS], WidgetType::Combobox, RO_ICE_TRAPS_NORMAL); + OPT_BOOL(RSK_BLUE_FIRE_ARROWS, "Blue Fire Arrows", CVAR_RANDOMIZER_SETTING("BlueFireArrows"), mOptionDescriptions[RSK_BLUE_FIRE_ARROWS]); + OPT_BOOL(RSK_SUNLIGHT_ARROWS, "Sunlight Arrows", CVAR_RANDOMIZER_SETTING("SunlightArrows"), mOptionDescriptions[RSK_SUNLIGHT_ARROWS]); + OPT_U8(RSK_INFINITE_UPGRADES, "Infinite Upgrades", {"Off", "Progressive", "Condensed Progressive"}, OptionCategory::Setting, CVAR_RANDOMIZER_SETTING("InfiniteUpgrades"), mOptionDescriptions[RSK_INFINITE_UPGRADES]); + OPT_BOOL(RSK_SKELETON_KEY, "Skeleton Key", CVAR_RANDOMIZER_SETTING("SkeletonKey"), mOptionDescriptions[RSK_SKELETON_KEY]); + OPT_U8(RSK_ITEM_POOL, "Item Pool", {"Plentiful", "Balanced", "Scarce", "Minimal"}, OptionCategory::Setting, CVAR_RANDOMIZER_SETTING("ItemPool"), mOptionDescriptions[RSK_ITEM_POOL], WidgetType::Combobox, RO_ITEM_POOL_BALANCED); + OPT_U8(RSK_ICE_TRAPS, "Ice Traps", {"Off", "Normal", "Extra", "Mayhem", "Onslaught"}, OptionCategory::Setting, CVAR_RANDOMIZER_SETTING("IceTraps"), mOptionDescriptions[RSK_ICE_TRAPS], WidgetType::Combobox, RO_ICE_TRAPS_NORMAL); // TODO: Remove Double Defense, Progressive Goron Sword - mOptions[RSK_STARTING_OCARINA] = Option::U8("Start with Ocarina", {"Off", "Fairy Ocarina", "Ocarina of Time"}, OptionCategory::Setting, CVAR_RANDOMIZER_SETTING("StartingOcarina"), "", WidgetType::Combobox, RO_STARTING_OCARINA_OFF); - mOptions[RSK_STARTING_DEKU_SHIELD] = Option::Bool("Start with Deku Shield", CVAR_RANDOMIZER_SETTING("StartingDekuShield")); - mOptions[RSK_STARTING_KOKIRI_SWORD] = Option::Bool("Start with Kokiri Sword", CVAR_RANDOMIZER_SETTING("StartingKokiriSword")); - mOptions[RSK_STARTING_MASTER_SWORD] = Option::Bool("Start with Master Sword", CVAR_RANDOMIZER_SETTING("StartingMasterSword")); - mOptions[RSK_STARTING_STICKS] = Option::Bool("Start with Stick Ammo", {"No", "Yes"}, OptionCategory::Setting, CVAR_RANDOMIZER_SETTING("StartingSticks"), "", WidgetType::Checkbox, RO_GENERIC_OFF); - mOptions[RSK_STARTING_NUTS] = Option::Bool("Start with Nut Ammo", {"No", "Yes"}, OptionCategory::Setting, CVAR_RANDOMIZER_SETTING("StartingNuts"), "", WidgetType::Checkbox, RO_GENERIC_OFF); - mOptions[RSK_FULL_WALLETS] = Option::Bool("Full Wallets", {"No", "Yes"}, OptionCategory::Setting, CVAR_RANDOMIZER_SETTING("FullWallets"), mOptionDescriptions[RSK_FULL_WALLETS], WidgetType::Checkbox, RO_GENERIC_OFF); - mOptions[RSK_STARTING_ZELDAS_LULLABY] = Option::Bool("Start with Zelda's Lullaby", CVAR_RANDOMIZER_SETTING("StartingZeldasLullaby"), "", IMFLAG_NONE); - mOptions[RSK_STARTING_EPONAS_SONG] = Option::Bool("Start with Epona's Song", CVAR_RANDOMIZER_SETTING("StartingEponasSong"), "", IMFLAG_NONE); - mOptions[RSK_STARTING_SARIAS_SONG] = Option::Bool("Start with Saria's Song", CVAR_RANDOMIZER_SETTING("StartingSariasSong"), "", IMFLAG_NONE); - mOptions[RSK_STARTING_SUNS_SONG] = Option::Bool("Start with Sun's Song", CVAR_RANDOMIZER_SETTING("StartingSunsSong"), "", IMFLAG_NONE); - mOptions[RSK_STARTING_SONG_OF_TIME] = Option::Bool("Start with Song of Time", CVAR_RANDOMIZER_SETTING("StartingSongOfTime"), "", IMFLAG_NONE); - mOptions[RSK_STARTING_SONG_OF_STORMS] = Option::Bool("Start with Song of Storms", CVAR_RANDOMIZER_SETTING("StartingSongOfStorms"), "", IMFLAG_NONE); - mOptions[RSK_STARTING_MINUET_OF_FOREST] = Option::Bool("Start with Minuet of Forest", CVAR_RANDOMIZER_SETTING("StartingMinuetOfForest"), "", IMFLAG_NONE); - mOptions[RSK_STARTING_BOLERO_OF_FIRE] = Option::Bool("Start with Bolero of Fire", CVAR_RANDOMIZER_SETTING("StartingBoleroOfFire"), "", IMFLAG_NONE); - mOptions[RSK_STARTING_SERENADE_OF_WATER] = Option::Bool("Start with Serenade of Water", CVAR_RANDOMIZER_SETTING("StartingSerenadeOfWater"), "", IMFLAG_NONE); - mOptions[RSK_STARTING_REQUIEM_OF_SPIRIT] = Option::Bool("Start with Requiem of Spirit", CVAR_RANDOMIZER_SETTING("StartingRequiemOfSpirit"), "", IMFLAG_NONE); - mOptions[RSK_STARTING_NOCTURNE_OF_SHADOW] = Option::Bool("Start with Nocturne of Shadow", CVAR_RANDOMIZER_SETTING("StartingNocturneOfShadow"), "", IMFLAG_NONE); - mOptions[RSK_STARTING_PRELUDE_OF_LIGHT] = Option::Bool("Start with Prelude of Light", CVAR_RANDOMIZER_SETTING("StartingPreludeOfLight")); - mOptions[RSK_STARTING_SKULLTULA_TOKEN] = Option::U8("Gold Skulltula Tokens", {NumOpts(0, 100)}, OptionCategory::Setting, CVAR_RANDOMIZER_SETTING("StartingSkulltulaToken"), "", WidgetType::Slider); - mOptions[RSK_STARTING_HEARTS] = Option::U8("Starting Hearts", {NumOpts(1, 20)}, OptionCategory::Setting, CVAR_RANDOMIZER_SETTING("StartingHearts"), "", WidgetType::Slider, 2); + OPT_U8(RSK_STARTING_OCARINA, "Start with Ocarina", {"Off", "Fairy Ocarina", "Ocarina of Time"}, OptionCategory::Setting, CVAR_RANDOMIZER_SETTING("StartingOcarina"), "", WidgetType::Combobox, RO_STARTING_OCARINA_OFF); + OPT_BOOL(RSK_STARTING_DEKU_SHIELD, "Start with Deku Shield", CVAR_RANDOMIZER_SETTING("StartingDekuShield")); + OPT_BOOL(RSK_STARTING_KOKIRI_SWORD, "Start with Kokiri Sword", CVAR_RANDOMIZER_SETTING("StartingKokiriSword")); + OPT_BOOL(RSK_STARTING_MASTER_SWORD, "Start with Master Sword", CVAR_RANDOMIZER_SETTING("StartingMasterSword")); + OPT_BOOL(RSK_STARTING_STICKS, "Start with Stick Ammo", {"No", "Yes"}, OptionCategory::Setting, CVAR_RANDOMIZER_SETTING("StartingSticks"), "", WidgetType::Checkbox, RO_GENERIC_OFF); + OPT_BOOL(RSK_STARTING_NUTS, "Start with Nut Ammo", {"No", "Yes"}, OptionCategory::Setting, CVAR_RANDOMIZER_SETTING("StartingNuts"), "", WidgetType::Checkbox, RO_GENERIC_OFF); + OPT_BOOL(RSK_FULL_WALLETS, "Full Wallets", {"No", "Yes"}, OptionCategory::Setting, CVAR_RANDOMIZER_SETTING("FullWallets"), mOptionDescriptions[RSK_FULL_WALLETS], WidgetType::Checkbox, RO_GENERIC_OFF); + OPT_BOOL(RSK_STARTING_ZELDAS_LULLABY, "Start with Zelda's Lullaby", CVAR_RANDOMIZER_SETTING("StartingZeldasLullaby"), "", IMFLAG_NONE); + OPT_BOOL(RSK_STARTING_EPONAS_SONG, "Start with Epona's Song", CVAR_RANDOMIZER_SETTING("StartingEponasSong"), "", IMFLAG_NONE); + OPT_BOOL(RSK_STARTING_SARIAS_SONG, "Start with Saria's Song", CVAR_RANDOMIZER_SETTING("StartingSariasSong"), "", IMFLAG_NONE); + OPT_BOOL(RSK_STARTING_SUNS_SONG, "Start with Sun's Song", CVAR_RANDOMIZER_SETTING("StartingSunsSong"), "", IMFLAG_NONE); + OPT_BOOL(RSK_STARTING_SONG_OF_TIME, "Start with Song of Time", CVAR_RANDOMIZER_SETTING("StartingSongOfTime"), "", IMFLAG_NONE); + OPT_BOOL(RSK_STARTING_SONG_OF_STORMS, "Start with Song of Storms", CVAR_RANDOMIZER_SETTING("StartingSongOfStorms"), "", IMFLAG_NONE); + OPT_BOOL(RSK_STARTING_MINUET_OF_FOREST, "Start with Minuet of Forest", CVAR_RANDOMIZER_SETTING("StartingMinuetOfForest"), "", IMFLAG_NONE); + OPT_BOOL(RSK_STARTING_BOLERO_OF_FIRE, "Start with Bolero of Fire", CVAR_RANDOMIZER_SETTING("StartingBoleroOfFire"), "", IMFLAG_NONE); + OPT_BOOL(RSK_STARTING_SERENADE_OF_WATER, "Start with Serenade of Water", CVAR_RANDOMIZER_SETTING("StartingSerenadeOfWater"), "", IMFLAG_NONE); + OPT_BOOL(RSK_STARTING_REQUIEM_OF_SPIRIT, "Start with Requiem of Spirit", CVAR_RANDOMIZER_SETTING("StartingRequiemOfSpirit"), "", IMFLAG_NONE); + OPT_BOOL(RSK_STARTING_NOCTURNE_OF_SHADOW, "Start with Nocturne of Shadow", CVAR_RANDOMIZER_SETTING("StartingNocturneOfShadow"), "", IMFLAG_NONE); + OPT_BOOL(RSK_STARTING_PRELUDE_OF_LIGHT, "Start with Prelude of Light", CVAR_RANDOMIZER_SETTING("StartingPreludeOfLight")); + OPT_U8(RSK_STARTING_SKULLTULA_TOKEN, "Gold Skulltula Tokens", {NumOpts(0, 100)}, OptionCategory::Setting, CVAR_RANDOMIZER_SETTING("StartingSkulltulaToken"), "", WidgetType::Slider); + OPT_U8(RSK_STARTING_HEARTS, "Starting Hearts", {NumOpts(1, 20)}, OptionCategory::Setting, CVAR_RANDOMIZER_SETTING("StartingHearts"), "", WidgetType::Slider, 2); // TODO: Remainder of Starting Items - mOptions[RSK_LOGIC_RULES] = Option::U8("Logic", {"Glitchless", "Glitched", "No Logic", "Vanilla"}, OptionCategory::Setting, CVAR_RANDOMIZER_SETTING("LogicRules"), mOptionDescriptions[RSK_LOGIC_RULES], WidgetType::Combobox, RO_LOGIC_GLITCHLESS); - mOptions[RSK_ALL_LOCATIONS_REACHABLE] = Option::Bool("All Locations Reachable", {"Off", "On"}, OptionCategory::Setting, CVAR_RANDOMIZER_SETTING("AllLocationsReachable"), mOptionDescriptions[RSK_ALL_LOCATIONS_REACHABLE], WidgetType::Checkbox, RO_GENERIC_ON); - mOptions[RSK_SKULLS_SUNS_SONG] = Option::Bool("Night Skulltula's Expect Sun's Song", CVAR_RANDOMIZER_SETTING("GsExpectSunsSong"), mOptionDescriptions[RSK_SKULLS_SUNS_SONG]); - mOptions[RSK_DAMAGE_MULTIPLIER] = Option::U8("Damage Multiplier", {"x1/2", "x1", "x2", "x4", "x8", "x16", "OHKO"}, OptionCategory::Setting, "", "", WidgetType::Slider, RO_DAMAGE_MULTIPLIER_DEFAULT); + OPT_U8(RSK_LOGIC_RULES, "Logic", {"Glitchless", "No Logic", "Vanilla"}, OptionCategory::Setting, CVAR_RANDOMIZER_SETTING("LogicRules"), mOptionDescriptions[RSK_LOGIC_RULES], WidgetType::Combobox, RO_LOGIC_GLITCHLESS); + OPT_BOOL(RSK_ALL_LOCATIONS_REACHABLE, "All Locations Reachable", {"Off", "On"}, OptionCategory::Setting, CVAR_RANDOMIZER_SETTING("AllLocationsReachable"), mOptionDescriptions[RSK_ALL_LOCATIONS_REACHABLE], WidgetType::Checkbox, RO_GENERIC_ON); + OPT_BOOL(RSK_SKULLS_SUNS_SONG, "Night Skulltula's Expect Sun's Song", CVAR_RANDOMIZER_SETTING("GsExpectSunsSong"), mOptionDescriptions[RSK_SKULLS_SUNS_SONG]); + OPT_U8(RSK_DAMAGE_MULTIPLIER, "Damage Multiplier", {"x1/2", "x1", "x2", "x4", "x8", "x16", "OHKO"}, OptionCategory::Setting, "", "", WidgetType::Slider, RO_DAMAGE_MULTIPLIER_DEFAULT); // clang-format on StaticData::optionNameToEnum = PopulateOptionNameToEnum(); @@ -325,205 +333,205 @@ void Settings::CreateOptions() { mExcludeLocationsOptionsAreas.reserve(RCAREA_INVALID); // the following are glitches and are currently disabled - // mTrickOptions[RT_ACUTE_ANGLE_CLIP] = TrickOption::LogicTrick(RCQUEST_BOTH, RA_NONE, {Tricks::Tag::ADVANCED, Tricks::Tag::EXPERIMENTAL, Tricks::Tag::GLITCH}, "Acute angle clip", "Enables locations requiring jumpslash clips through walls which meet at an acute angle."); - // mTrickOptions[RT_ADVANCED_CLIPS] = TrickOption::LogicTrick(RCQUEST_BOTH, RA_NONE, {Tricks::Tag::ADVANCED, Tricks::Tag::EXPERIMENTAL, Tricks::Tag::GLITCH}, "Advanced clips", "Enables locations requiring clips through walls and objects requiring precise jumps or other tricks."); - // mTrickOptions[RT_BLANK_A] = TrickOption::LogicTrick(RCQUEST_BOTH, RA_NONE, {Tricks::Tag::ADVANCED, Tricks::Tag::EXPERIMENTAL, Tricks::Tag::GLITCH}, "Blank A", "Enables locations requiring blank A button; NOTE: this requires the 'Quick Putaway' restoration."); - // mTrickOptions[RT_DOOM_JUMP] = TrickOption::LogicTrick(RCQUEST_BOTH, RA_NONE, {Tricks::Tag::ADVANCED, Tricks::Tag::EXPERIMENTAL, Tricks::Tag::GLITCH}, "Doom Jump", "Enables locations requiring doom jumps."); - // mTrickOptions[RT_EPG] = TrickOption::LogicTrick(RCQUEST_BOTH, RA_NONE, {Tricks::Tag::ADVANCED, Tricks::Tag::EXPERIMENTAL, Tricks::Tag::GLITCH}, "EPG", "Enables locations requiring use of the Entrance Point Glitch."); - // mTrickOptions[RT_EQUIP_SWAP] = TrickOption::LogicTrick(RCQUEST_BOTH, RA_NONE, {Tricks::Tag::ADVANCED, Tricks::Tag::EXPERIMENTAL, Tricks::Tag::GLITCH}, "Equip Swap", "Enables locations requiring use of equip swap; NOTE: this may expect the 'Allow cursor to be over any slot' enhancement to be turned off."); - // mTrickOptions[RT_EQUIP_SWAP_EXPECTS_DINS] = TrickOption::LogicTrick(RCQUEST_BOTH, RA_NONE, {Tricks::Tag::ADVANCED, Tricks::Tag::EXPERIMENTAL, Tricks::Tag::GLITCH}, "Equip Swap Require's Din's Fire", "Enables locations requiring use of equip swap once Din's Fire is found."); - // mTrickOptions[RT_FLAME_STORAGE] = TrickOption::LogicTrick(RCQUEST_BOTH, RA_NONE, {Tricks::Tag::ADVANCED, Tricks::Tag::EXPERIMENTAL, Tricks::Tag::GLITCH}, "Flame Storage", "Enables locations requiring flame storage."); - // mTrickOptions[RT_GROUND_CLIP] = TrickOption::LogicTrick(RCQUEST_BOTH, RA_NONE, {Tricks::Tag::ADVANCED, Tricks::Tag::EXPERIMENTAL, Tricks::Tag::GLITCH}, "Ground Clip", "Enables locations requiring ground clips."); - // mTrickOptions[RT_GROUND_JUMP] = TrickOption::LogicTrick(RCQUEST_BOTH, RA_NONE, {Tricks::Tag::ADVANCED, Tricks::Tag::EXPERIMENTAL, Tricks::Tag::GLITCH}, "Ground Jump", "Enables locations requiring ground jumps."); - // mTrickOptions[RT_HESS] = TrickOption::LogicTrick(RCQUEST_BOTH, RA_NONE, {Tricks::Tag::ADVANCED, Tricks::Tag::EXPERIMENTAL, Tricks::Tag::GLITCH}, "HESS", "Enables locations requiring a Hyper Extended Super Slide."); - // mTrickOptions[RT_HOOKSHOT_CLIP] = TrickOption::LogicTrick(RCQUEST_BOTH, RA_NONE, {Tricks::Tag::ADVANCED, Tricks::Tag::EXPERIMENTAL, Tricks::Tag::GLITCH}, "Hookshot Clip", "Enables locations requiring hookshot clips."); - // mTrickOptions[RT_HOOKSHOT_JUMP] = TrickOption::LogicTrick(RCQUEST_BOTH, RA_NONE, {Tricks::Tag::ADVANCED, Tricks::Tag::EXPERIMENTAL, Tricks::Tag::GLITCH}, "Hookshot Jump", "Enables locations requiring hookshot jumps."); - // mTrickOptions[RT_ISG] = TrickOption::LogicTrick(RCQUEST_BOTH, RA_NONE, {Tricks::Tag::ADVANCED, Tricks::Tag::EXPERIMENTAL, Tricks::Tag::GLITCH}, "ISG", "Enables locations requiring use of the infinite sword glitch."); + // OPT_TRICK(RT_ACUTE_ANGLE_CLIP, RCQUEST_BOTH, RA_NONE, {Tricks::Tag::ADVANCED, Tricks::Tag::EXPERIMENTAL, Tricks::Tag::GLITCH}, "Acute angle clip", "Enables locations requiring jumpslash clips through walls which meet at an acute angle."); + // OPT_TRICK(RT_ADVANCED_CLIPS, RCQUEST_BOTH, RA_NONE, {Tricks::Tag::ADVANCED, Tricks::Tag::EXPERIMENTAL, Tricks::Tag::GLITCH}, "Advanced clips", "Enables locations requiring clips through walls and objects requiring precise jumps or other tricks."); + // OPT_TRICK(RT_BLANK_A, RCQUEST_BOTH, RA_NONE, {Tricks::Tag::ADVANCED, Tricks::Tag::EXPERIMENTAL, Tricks::Tag::GLITCH}, "Blank A", "Enables locations requiring blank A button; NOTE: this requires the 'Quick Putaway' restoration."); + // OPT_TRICK(RT_DOOM_JUMP, RCQUEST_BOTH, RA_NONE, {Tricks::Tag::ADVANCED, Tricks::Tag::EXPERIMENTAL, Tricks::Tag::GLITCH}, "Doom Jump", "Enables locations requiring doom jumps."); + // OPT_TRICK(RT_EPG, RCQUEST_BOTH, RA_NONE, {Tricks::Tag::ADVANCED, Tricks::Tag::EXPERIMENTAL, Tricks::Tag::GLITCH}, "EPG", "Enables locations requiring use of the Entrance Point Glitch."); + // OPT_TRICK(RT_EQUIP_SWAP, RCQUEST_BOTH, RA_NONE, {Tricks::Tag::ADVANCED, Tricks::Tag::EXPERIMENTAL, Tricks::Tag::GLITCH}, "Equip Swap", "Enables locations requiring use of equip swap; NOTE: this may expect the 'Allow cursor to be over any slot' enhancement to be turned off."); + // OPT_TRICK(RT_EQUIP_SWAP_EXPECTS_DINS, RCQUEST_BOTH, RA_NONE, {Tricks::Tag::ADVANCED, Tricks::Tag::EXPERIMENTAL, Tricks::Tag::GLITCH}, "Equip Swap Require's Din's Fire", "Enables locations requiring use of equip swap once Din's Fire is found."); + // OPT_TRICK(RT_FLAME_STORAGE, RCQUEST_BOTH, RA_NONE, {Tricks::Tag::ADVANCED, Tricks::Tag::EXPERIMENTAL, Tricks::Tag::GLITCH}, "Flame Storage", "Enables locations requiring flame storage."); + // OPT_TRICK(RT_GROUND_CLIP, RCQUEST_BOTH, RA_NONE, {Tricks::Tag::ADVANCED, Tricks::Tag::EXPERIMENTAL, Tricks::Tag::GLITCH}, "Ground Clip", "Enables locations requiring ground clips."); + // OPT_TRICK(RT_GROUND_JUMP, RCQUEST_BOTH, RA_NONE, {Tricks::Tag::ADVANCED, Tricks::Tag::EXPERIMENTAL, Tricks::Tag::GLITCH}, "Ground Jump", "Enables locations requiring ground jumps."); + // OPT_TRICK(RT_HESS, RCQUEST_BOTH, RA_NONE, {Tricks::Tag::ADVANCED, Tricks::Tag::EXPERIMENTAL, Tricks::Tag::GLITCH}, "HESS", "Enables locations requiring a Hyper Extended Super Slide."); + // OPT_TRICK(RT_HOOKSHOT_CLIP, RCQUEST_BOTH, RA_NONE, {Tricks::Tag::ADVANCED, Tricks::Tag::EXPERIMENTAL, Tricks::Tag::GLITCH}, "Hookshot Clip", "Enables locations requiring hookshot clips."); + // OPT_TRICK(RT_HOOKSHOT_JUMP, RCQUEST_BOTH, RA_NONE, {Tricks::Tag::ADVANCED, Tricks::Tag::EXPERIMENTAL, Tricks::Tag::GLITCH}, "Hookshot Jump", "Enables locations requiring hookshot jumps."); + // OPT_TRICK(RT_ISG, RCQUEST_BOTH, RA_NONE, {Tricks::Tag::ADVANCED, Tricks::Tag::EXPERIMENTAL, Tricks::Tag::GLITCH}, "ISG", "Enables locations requiring use of the infinite sword glitch."); - mTrickOptions[RT_VISIBLE_COLLISION] = TrickOption::LogicTrick(RCQUEST_BOTH, RA_NONE, {Tricks::Tag::NOVICE}, "Pass Through Visible One-Way Collision", "Allows climbing through the platform to reach Impa's House Back as adult with no items and going through the Kakariko Village Gate as child when coming from the Mountain Trail side."); - mTrickOptions[RT_GROTTOS_WITHOUT_AGONY] = TrickOption::LogicTrick(RCQUEST_BOTH, RA_NONE, {Tricks::Tag::NOVICE}, "Hidden Grottos without Stone of Agony", "Allows entering hidden grottos without the Stone of Agony."); - mTrickOptions[RT_FEWER_TUNIC_REQUIREMENTS] = TrickOption::LogicTrick(RCQUEST_BOTH, RA_NONE, {Tricks::Tag::INTERMEDIATE}, "Fewer Tunic Requirements", "Allows the following possible without Tunics:\n- Enter Water Temple. The area below the center pillar still requires Zora Tunic. Applies to MQ also.\n- Enter Fire Temple. Volvagia still requires Goron tunic. Applies to MQ also, and includes child access to first floor with dungeon shuffle."); - mTrickOptions[RT_RUSTED_SWITCHES] = TrickOption::LogicTrick(RCQUEST_BOTH, RA_NONE, {Tricks::Tag::NOVICE}, "Hammer Rusted Switches Through Walls", "Applies to:\n- Fire Temple Highest Goron Chest.\n- MQ Fire Temple Lizalfos Maze.\n- MQ Spirit Trial."); - mTrickOptions[RT_FLAMING_CHESTS] = TrickOption::LogicTrick(RCQUEST_BOTH, RA_NONE, {Tricks::Tag::INTERMEDIATE}, "Flaming Chests", "The chests encircled in flames in Gerudo Training Ground and in Spirit Temple can be opened by running into the flames while Link is invincible after taking damage."); + OPT_TRICK(RT_VISIBLE_COLLISION, RCQUEST_BOTH, RA_NONE, {Tricks::Tag::NOVICE}, "Pass Through Visible One-Way Collision", "Allows climbing through the platform to reach Impa's House Back as adult with no items and going through the Kakariko Village Gate as child when coming from the Mountain Trail side."); + OPT_TRICK(RT_GROTTOS_WITHOUT_AGONY, RCQUEST_BOTH, RA_NONE, {Tricks::Tag::NOVICE}, "Hidden Grottos without Stone of Agony", "Allows entering hidden grottos without the Stone of Agony."); + OPT_TRICK(RT_FEWER_TUNIC_REQUIREMENTS, RCQUEST_BOTH, RA_NONE, {Tricks::Tag::INTERMEDIATE}, "Fewer Tunic Requirements", "Allows the following possible without Tunics:\n- Enter Water Temple. The area below the center pillar still requires Zora Tunic. Applies to MQ also.\n- Enter Fire Temple. Volvagia still requires Goron tunic. Applies to MQ also, and includes child access to first floor with dungeon shuffle."); + OPT_TRICK(RT_RUSTED_SWITCHES, RCQUEST_BOTH, RA_NONE, {Tricks::Tag::NOVICE}, "Hammer Rusted Switches Through Walls", "Applies to:\n- Fire Temple Highest Goron Chest.\n- MQ Fire Temple Lizalfos Maze.\n- MQ Spirit Trial."); + OPT_TRICK(RT_FLAMING_CHESTS, RCQUEST_BOTH, RA_NONE, {Tricks::Tag::INTERMEDIATE}, "Flaming Chests", "The chests encircled in flames in Gerudo Training Ground and in Spirit Temple can be opened by running into the flames while Link is invincible after taking damage."); // disabled for now, can't check for being able to use bunny hood & bunny hood speedup is currently completely decoupled from rando - // mTrickOptions[RT_BUNNY_HOOD_JUMPS] = TrickOption::LogicTrick(RCQUEST_BOTH, RA_NONE, {Tricks::Tag::ADVANCED}, "Bunny Hood Jumps", "Allows reaching locations using Bunny Hood's extended jumps."); - mTrickOptions[RT_DAMAGE_BOOST_SIMPLE] = TrickOption::LogicTrick(RCQUEST_BOTH, RA_NONE, {Tricks::Tag::ADVANCED, Tricks::Tag::EXPERIMENTAL}, "Simple damage boosts", "Allows damage boosts in order to reach further locations. Can be combined with \"Simple hover boosts\" for reaching far distances."); - mTrickOptions[RT_HOVER_BOOST_SIMPLE] = TrickOption::LogicTrick(RCQUEST_BOTH, RA_NONE, {Tricks::Tag::ADVANCED, Tricks::Tag::EXPERIMENTAL}, "Simple hover boosts", "Allows equipping of hover boots when link is moving at high speeds to extend distance covered. Can be combined with \"Simple damage boosts\" for greater uses."); - mTrickOptions[RT_BOMBCHU_BEEHIVES] = TrickOption::LogicTrick(RCQUEST_BOTH, RA_NONE, {Tricks::Tag::NOVICE}, "Bombchu Beehives", "Allows exploding beehives with bombchus."); - mTrickOptions[RT_BLUE_FIRE_MUD_WALLS] = TrickOption::LogicTrick(RCQUEST_BOTH, RA_NONE, {Tricks::Tag::NOVICE}, "Break Mud Walls with Blue Fire", "Use Blue Fire to break mud walls."); - mTrickOptions[RT_KF_ADULT_GS] = TrickOption::LogicTrick(RCQUEST_BOTH, RA_KOKIRI_FOREST, {Tricks::Tag::NOVICE}, "Adult Kokiri Forest GS with Hover Boots", "Can be obtained without Hookshot by using the Hover Boots off of one of the roots."); - mTrickOptions[RT_LW_BRIDGE] = TrickOption::LogicTrick(RCQUEST_BOTH, RA_THE_LOST_WOODS, {Tricks::Tag::EXPERT}, "Jump onto the Lost Woods Bridge as Adult with Nothing", "With very precise movement it's possible for adult to jump onto the bridge without needing Longshot, Hover Boots, or Bean."); - mTrickOptions[RT_LW_MIDO_BACKFLIP] = TrickOption::LogicTrick(RCQUEST_BOTH, RA_THE_LOST_WOODS, {Tricks::Tag::NOVICE}, "Backflip over Mido as Adult", "With a specific position and angle, you can backflip over Mido."); - mTrickOptions[RT_LW_GS_BEAN] = TrickOption::LogicTrick(RCQUEST_BOTH, RA_THE_LOST_WOODS, {Tricks::Tag::INTERMEDIATE}, "Lost Woods Adult GS without Bean", "You can collect the token with a precise Hookshot use, as long as you can kill the Skulltula somehow first. It can be killed using Longshot, Bow, Bombchus or Din's Fire."); - mTrickOptions[RT_HC_STORMS_GS] = TrickOption::LogicTrick(RCQUEST_BOTH, RA_HYRULE_CASTLE, {Tricks::Tag::INTERMEDIATE}, "Hyrule Castle Storms Grotto GS with Just Boomerang", "With precise throws, the Boomerang alone can kill the Skulltula and collect the token, without first needing to blow up the wall."); - mTrickOptions[RT_KAK_MAN_ON_ROOF] = TrickOption::LogicTrick(RCQUEST_BOTH, RA_KAKARIKO_VILLAGE, {Tricks::Tag::NOVICE}, "Man on Roof without Hookshot", "Can be reached by side-hopping off the watchtower as either age, or by jumping onto the potion shop's roof from the ledge as adult."); - mTrickOptions[RT_KAK_TOWER_GS] = TrickOption::LogicTrick(RCQUEST_BOTH, RA_KAKARIKO_VILLAGE, {Tricks::Tag::INTERMEDIATE}, "Kakariko Tower GS with Jump Slash", "Climb the tower as high as you can without touching the Gold Skulltula, then let go and jump slash immediately. By jump-slashing from as low on the ladder as possible to still hit the Skulltula, this trick can be done without taking fall damage."); - mTrickOptions[RT_KAK_ADULT_WINDMILL_POH] = TrickOption::LogicTrick(RCQUEST_BOTH, RA_KAKARIKO_VILLAGE, {Tricks::Tag::NOVICE}, "Windmill PoH as Adult with Nothing", "Can jump up to the spinning platform from below as adult."); - mTrickOptions[RT_KAK_CHILD_WINDMILL_POH] = TrickOption::LogicTrick(RCQUEST_BOTH, RA_KAKARIKO_VILLAGE, {Tricks::Tag::EXTREME}, "Windmill PoH as Child with Precise Jump Slash", "Can jump up to the spinning platform from below as child with a precise jumpslash timed with the platforms rotation."); - mTrickOptions[RT_KAK_ROOFTOP_GS] = TrickOption::LogicTrick(RCQUEST_BOTH, RA_KAKARIKO_VILLAGE, {Tricks::Tag::ADVANCED}, "Kakariko Rooftop GS with Hover Boots", "Take the Hover Boots from the entrance to Impa's House over to the rooftop of Skulltula House. From there, a precise Hover Boots backwalk with backflip can be used to get onto a hill above the side of the village. And then from there you can Hover onto Impa's rooftop to kill the Skulltula and backflip into the token."); - mTrickOptions[RT_GY_POH] = TrickOption::LogicTrick(RCQUEST_BOTH, RA_THE_GRAVEYARD, {Tricks::Tag::INTERMEDIATE}, "Graveyard Freestanding PoH with Boomerang", "Using a precise moving setup you can obtain the Piece of Heart by having the Boomerang interact with it along the return path."); - mTrickOptions[RT_GY_CHILD_DAMPE_RACE_POH] = TrickOption::LogicTrick(RCQUEST_BOTH, RA_THE_GRAVEYARD, {Tricks::Tag::NOVICE}, "Second Dampe Race as Child", "It is possible to complete the second dampe race as child in under a minute, but it is a strict time limit."); - mTrickOptions[RT_GY_SHADOW_FIRE_ARROWS] = TrickOption::LogicTrick(RCQUEST_BOTH, RA_THE_GRAVEYARD, {Tricks::Tag::EXPERT}, "Shadow Temple Entry with Fire Arrows", "It is possible to light all of the torches to open the Shadow Temple entrance with just Fire Arrows, but you must be very quick, precise, and strategic with how you take your shots."); - mTrickOptions[RT_DMT_SOIL_GS] = TrickOption::LogicTrick(RCQUEST_BOTH, RA_DEATH_MOUNTAIN_TRAIL, {Tricks::Tag::INTERMEDIATE}, "Death Mountain Trail Soil GS without Destroying Boulder", "Bugs will go into the soft soil even while the boulder is still blocking the entrance. Then, using a precise moving setup you can kill the Gold Skulltula and obtain the token by having the Boomerang interact with it along the return path."); - mTrickOptions[RT_DMT_BOMBABLE] = TrickOption::LogicTrick(RCQUEST_BOTH, RA_DEATH_MOUNTAIN_TRAIL, {Tricks::Tag::INTERMEDIATE}, "Death Mountain Trail Chest with Strength", "Child Link can blow up the wall using a nearby bomb flower. You must backwalk with the flower and then quickly throw it toward the wall."); - mTrickOptions[RT_DMT_HOOKSHOT_LOWER_GS] = TrickOption::LogicTrick(RCQUEST_BOTH, RA_DEATH_MOUNTAIN_TRAIL, {Tricks::Tag::INTERMEDIATE}, "Death Mountain Trail Lower Red Rock GS with Hookshot", "After killing the Skulltula, the token can be fished out of the rock without needing to destroy it, by using the Hookshot in the correct way."); - mTrickOptions[RT_DMT_HOVERS_LOWER_GS] = TrickOption::LogicTrick(RCQUEST_BOTH, RA_DEATH_MOUNTAIN_TRAIL, {Tricks::Tag::ADVANCED}, "Death Mountain Trail Lower Red Rock GS with Hover Boots", "After killing the Skulltula, the token can be collected without needing to destroy the rock by backflipping down onto it with the Hover Boots. First use the Hover Boots to stand on a nearby fence, and go for the Skulltula Token from there."); - mTrickOptions[RT_DMT_BEAN_LOWER_GS] = TrickOption::LogicTrick(RCQUEST_BOTH, RA_DEATH_MOUNTAIN_TRAIL, {Tricks::Tag::EXPERT}, "Death Mountain Trail Lower Red Rock GS with Magic Bean", "After killing the Skulltula, the token can be collected without needing to destroy the rock by jumping down onto it from the bean plant, midflight, with precise timing and positioning."); - mTrickOptions[RT_DMT_JS_LOWER_GS] = TrickOption::LogicTrick(RCQUEST_BOTH, RA_DEATH_MOUNTAIN_TRAIL, {Tricks::Tag::INTERMEDIATE}, "Death Mountain Trail Lower Red Rock GS with Jump Slash", "After killing the Skulltula, the token can be collected without needing to destroy the rock by jump slashing from a precise angle."); - mTrickOptions[RT_DMT_CLIMB_HOVERS] = TrickOption::LogicTrick(RCQUEST_BOTH, RA_DEATH_MOUNTAIN_TRAIL, {Tricks::Tag::ADVANCED}, "Death Mountain Trail Climb with Hover Boots", "It is possible to use the Hover Boots to bypass needing to destroy the boulders blocking the path to the top of Death Mountain."); - mTrickOptions[RT_DMT_UPPER_GS] = TrickOption::LogicTrick(RCQUEST_BOTH, RA_DEATH_MOUNTAIN_TRAIL, {Tricks::Tag::NOVICE}, "Death Mountain Trail Upper Red Rock GS without Hammer", "After killing the Skulltula, the token can be collected by backflipping into the rock at the correct angle."); + // OPT_TRICK(RT_BUNNY_HOOD_JUMPS, RCQUEST_BOTH, RA_NONE, {Tricks::Tag::ADVANCED}, "Bunny Hood Jumps", "Allows reaching locations using Bunny Hood's extended jumps."); + OPT_TRICK(RT_DAMAGE_BOOST_SIMPLE, RCQUEST_BOTH, RA_NONE, {Tricks::Tag::ADVANCED, Tricks::Tag::EXPERIMENTAL}, "Simple damage boosts", "Allows damage boosts in order to reach further locations. Can be combined with \"Simple hover boosts\" for reaching far distances."); + OPT_TRICK(RT_HOVER_BOOST_SIMPLE, RCQUEST_BOTH, RA_NONE, {Tricks::Tag::ADVANCED, Tricks::Tag::EXPERIMENTAL}, "Simple hover boosts", "Allows equipping of hover boots when link is moving at high speeds to extend distance covered. Can be combined with \"Simple damage boosts\" for greater uses."); + OPT_TRICK(RT_BOMBCHU_BEEHIVES, RCQUEST_BOTH, RA_NONE, {Tricks::Tag::NOVICE}, "Bombchu Beehives", "Allows exploding beehives with bombchus."); + OPT_TRICK(RT_BLUE_FIRE_MUD_WALLS, RCQUEST_BOTH, RA_NONE, {Tricks::Tag::NOVICE}, "Break Mud Walls with Blue Fire", "Use Blue Fire to break mud walls."); + OPT_TRICK(RT_KF_ADULT_GS, RCQUEST_BOTH, RA_KOKIRI_FOREST, {Tricks::Tag::NOVICE}, "Adult Kokiri Forest GS with Hover Boots", "Can be obtained without Hookshot by using the Hover Boots off of one of the roots."); + OPT_TRICK(RT_LW_BRIDGE, RCQUEST_BOTH, RA_THE_LOST_WOODS, {Tricks::Tag::EXPERT}, "Jump onto the Lost Woods Bridge as Adult with Nothing", "With very precise movement it's possible for adult to jump onto the bridge without needing Longshot, Hover Boots, or Bean."); + OPT_TRICK(RT_LW_MIDO_BACKFLIP, RCQUEST_BOTH, RA_THE_LOST_WOODS, {Tricks::Tag::NOVICE}, "Backflip over Mido as Adult", "With a specific position and angle, you can backflip over Mido."); + OPT_TRICK(RT_LW_GS_BEAN, RCQUEST_BOTH, RA_THE_LOST_WOODS, {Tricks::Tag::INTERMEDIATE}, "Lost Woods Adult GS without Bean", "You can collect the token with a precise Hookshot use, as long as you can kill the Skulltula somehow first. It can be killed using Longshot, Bow, Bombchus or Din's Fire."); + OPT_TRICK(RT_HC_STORMS_GS, RCQUEST_BOTH, RA_HYRULE_CASTLE, {Tricks::Tag::INTERMEDIATE}, "Hyrule Castle Storms Grotto GS with Just Boomerang", "With precise throws, the Boomerang alone can kill the Skulltula and collect the token, without first needing to blow up the wall."); + OPT_TRICK(RT_KAK_MAN_ON_ROOF, RCQUEST_BOTH, RA_KAKARIKO_VILLAGE, {Tricks::Tag::NOVICE}, "Man on Roof without Hookshot", "Can be reached by side-hopping off the watchtower as either age, or by jumping onto the potion shop's roof from the ledge as adult."); + OPT_TRICK(RT_KAK_TOWER_GS, RCQUEST_BOTH, RA_KAKARIKO_VILLAGE, {Tricks::Tag::INTERMEDIATE}, "Kakariko Tower GS with Jump Slash", "Climb the tower as high as you can without touching the Gold Skulltula, then let go and jump slash immediately. By jump-slashing from as low on the ladder as possible to still hit the Skulltula, this trick can be done without taking fall damage."); + OPT_TRICK(RT_KAK_ADULT_WINDMILL_POH, RCQUEST_BOTH, RA_KAKARIKO_VILLAGE, {Tricks::Tag::NOVICE}, "Windmill PoH as Adult with Nothing", "Can jump up to the spinning platform from below as adult."); + OPT_TRICK(RT_KAK_CHILD_WINDMILL_POH, RCQUEST_BOTH, RA_KAKARIKO_VILLAGE, {Tricks::Tag::EXTREME}, "Windmill PoH as Child with Precise Jump Slash", "Can jump up to the spinning platform from below as child with a precise jumpslash timed with the platforms rotation."); + OPT_TRICK(RT_KAK_ROOFTOP_GS, RCQUEST_BOTH, RA_KAKARIKO_VILLAGE, {Tricks::Tag::ADVANCED}, "Kakariko Rooftop GS with Hover Boots", "Take the Hover Boots from the entrance to Impa's House over to the rooftop of Skulltula House. From there, a precise Hover Boots backwalk with backflip can be used to get onto a hill above the side of the village. And then from there you can Hover onto Impa's rooftop to kill the Skulltula and backflip into the token."); + OPT_TRICK(RT_GY_POH, RCQUEST_BOTH, RA_THE_GRAVEYARD, {Tricks::Tag::INTERMEDIATE}, "Graveyard Freestanding PoH with Boomerang", "Using a precise moving setup you can obtain the Piece of Heart by having the Boomerang interact with it along the return path."); + OPT_TRICK(RT_GY_CHILD_DAMPE_RACE_POH, RCQUEST_BOTH, RA_THE_GRAVEYARD, {Tricks::Tag::NOVICE}, "Second Dampe Race as Child", "It is possible to complete the second dampe race as child in under a minute, but it is a strict time limit."); + OPT_TRICK(RT_GY_SHADOW_FIRE_ARROWS, RCQUEST_BOTH, RA_THE_GRAVEYARD, {Tricks::Tag::EXPERT}, "Shadow Temple Entry with Fire Arrows", "It is possible to light all of the torches to open the Shadow Temple entrance with just Fire Arrows, but you must be very quick, precise, and strategic with how you take your shots."); + OPT_TRICK(RT_DMT_SOIL_GS, RCQUEST_BOTH, RA_DEATH_MOUNTAIN_TRAIL, {Tricks::Tag::INTERMEDIATE}, "Death Mountain Trail Soil GS without Destroying Boulder", "Bugs will go into the soft soil even while the boulder is still blocking the entrance. Then, using a precise moving setup you can kill the Gold Skulltula and obtain the token by having the Boomerang interact with it along the return path."); + OPT_TRICK(RT_DMT_BOMBABLE, RCQUEST_BOTH, RA_DEATH_MOUNTAIN_TRAIL, {Tricks::Tag::INTERMEDIATE}, "Death Mountain Trail Chest with Strength", "Child Link can blow up the wall using a nearby bomb flower. You must backwalk with the flower and then quickly throw it toward the wall."); + OPT_TRICK(RT_DMT_HOOKSHOT_LOWER_GS, RCQUEST_BOTH, RA_DEATH_MOUNTAIN_TRAIL, {Tricks::Tag::INTERMEDIATE}, "Death Mountain Trail Lower Red Rock GS with Hookshot", "After killing the Skulltula, the token can be fished out of the rock without needing to destroy it, by using the Hookshot in the correct way."); + OPT_TRICK(RT_DMT_HOVERS_LOWER_GS, RCQUEST_BOTH, RA_DEATH_MOUNTAIN_TRAIL, {Tricks::Tag::ADVANCED}, "Death Mountain Trail Lower Red Rock GS with Hover Boots", "After killing the Skulltula, the token can be collected without needing to destroy the rock by backflipping down onto it with the Hover Boots. First use the Hover Boots to stand on a nearby fence, and go for the Skulltula Token from there."); + OPT_TRICK(RT_DMT_BEAN_LOWER_GS, RCQUEST_BOTH, RA_DEATH_MOUNTAIN_TRAIL, {Tricks::Tag::EXPERT}, "Death Mountain Trail Lower Red Rock GS with Magic Bean", "After killing the Skulltula, the token can be collected without needing to destroy the rock by jumping down onto it from the bean plant, midflight, with precise timing and positioning."); + OPT_TRICK(RT_DMT_JS_LOWER_GS, RCQUEST_BOTH, RA_DEATH_MOUNTAIN_TRAIL, {Tricks::Tag::INTERMEDIATE}, "Death Mountain Trail Lower Red Rock GS with Jump Slash", "After killing the Skulltula, the token can be collected without needing to destroy the rock by jump slashing from a precise angle."); + OPT_TRICK(RT_DMT_CLIMB_HOVERS, RCQUEST_BOTH, RA_DEATH_MOUNTAIN_TRAIL, {Tricks::Tag::ADVANCED}, "Death Mountain Trail Climb with Hover Boots", "It is possible to use the Hover Boots to bypass needing to destroy the boulders blocking the path to the top of Death Mountain."); + OPT_TRICK(RT_DMT_UPPER_GS, RCQUEST_BOTH, RA_DEATH_MOUNTAIN_TRAIL, {Tricks::Tag::NOVICE}, "Death Mountain Trail Upper Red Rock GS without Hammer", "After killing the Skulltula, the token can be collected by backflipping into the rock at the correct angle."); // disabled for now, only applies when trade quest is not shuffled so there's a timer (currently not considered in logic) - // mTrickOptions[RT_DMT_BOLERO_BIGGORON] = TrickOption::LogicTrick(RCQUEST_BOTH, RA_DEATH_MOUNTAIN_TRAIL, {Tricks::Tag::INTERMEDIATE}, "Deliver Eye Drops with Bolero of Fire", "Playing a warp song normally causes a trade item to spoil immediately, however, it is possible use Bolero to reach Biggoron and still deliver the Eye Drops before they spoil. If you do not wear the Goron Tunic, the heat timer inside the crater will override the trade item\'s timer. When you exit to Death Mountain Trail you will have one second to show the Eye Drops before they expire. You can get extra time to show the Eye Drops if you warp immediately upon receiving them. If you don't have many hearts, you may have to reset the heat timer by quickly dipping in and out of Darunia\'s chamber or quickly equipping and unequipping the Goron Tunic. This trick does not apply if \"Randomize Warp Song Destinations\" is enabled, or if the settings are such that trade items do not need to be delivered within a time limit."); - mTrickOptions[RT_GC_POT] = TrickOption::LogicTrick(RCQUEST_BOTH, RA_GORON_CITY, {Tricks::Tag::ADVANCED}, "Goron City Spinning Pot PoH with Bombchu", "A Bombchu can be used to stop the spinning pot, but it can be quite finicky to get it to work."); - mTrickOptions[RT_GC_POT_STRENGTH] = TrickOption::LogicTrick(RCQUEST_BOTH, RA_GORON_CITY, {Tricks::Tag::INTERMEDIATE}, "Goron City Spinning Pot PoH with Strength", "Allows for stopping the Goron City Spinning Pot using a bomb flower alone, requiring strength in lieu of inventory explosives."); - mTrickOptions[RT_GC_ROLLING_STRENGTH] = TrickOption::LogicTrick(RCQUEST_BOTH, RA_GORON_CITY, {Tricks::Tag::INTERMEDIATE}, "Rolling Goron (Hot Rodder Goron) as Child with Strength", "Use the bombflower on the stairs or near Medigoron. Timing is tight, especially without backwalking."); - mTrickOptions[RT_GC_LEFTMOST] = TrickOption::LogicTrick(RCQUEST_BOTH, RA_GORON_CITY, {Tricks::Tag::ADVANCED}, "Goron City Maze Left Chest with Hover Boots", "A precise backwalk starting from on top of the crate and ending with a precisely-timed backflip can reach this chest without needing either the Hammer or Silver Gauntlets."); - mTrickOptions[RT_GC_GROTTO] = TrickOption::LogicTrick(RCQUEST_BOTH, RA_GORON_CITY, {Tricks::Tag::ADVANCED}, "Goron City Grotto with Hookshot While Taking Damage", "It is possible to reach the Goron City Grotto by quickly using the Hookshot while in the midst of taking damage from the lava floor."); - mTrickOptions[RT_GC_LINK_GORON_DINS] = TrickOption::LogicTrick(RCQUEST_BOTH, RA_GORON_CITY, {Tricks::Tag::NOVICE}, "Stop Link the Goron with Din\'s Fire", "The timing is quite awkward."); - mTrickOptions[RT_DMC_HOVER_BEAN_POH] = TrickOption::LogicTrick(RCQUEST_BOTH, RA_DEATH_MOUNTAIN_CRATER, {Tricks::Tag::NOVICE}, "Crater\'s Bean PoH with Hover Boots", "Hover from the base of the bridge near Goron City and walk up the very steep slope."); - mTrickOptions[RT_DMC_BOLERO_JUMP] = TrickOption::LogicTrick(RCQUEST_BOTH, RA_DEATH_MOUNTAIN_CRATER, {Tricks::Tag::EXTREME}, "Death Mountain Crater Jump to Bolero", "As Adult, using a shield to drop a pot while you have the perfect speed and position, the pot can push you that little extra distance you need to jump across the gap in the bridge."); - mTrickOptions[RT_DMC_BOULDER_JS] = TrickOption::LogicTrick(RCQUEST_BOTH, RA_DEATH_MOUNTAIN_CRATER, {Tricks::Tag::NOVICE}, "Death Mountain Crater Upper to Lower with Hammer", "With the Hammer, you can jump slash the rock twice in the same jump in order to destroy it before you fall into the lava."); - mTrickOptions[RT_DMC_BOULDER_SKIP] = TrickOption::LogicTrick(RCQUEST_BOTH, RA_DEATH_MOUNTAIN_CRATER, {Tricks::Tag::INTERMEDIATE}, "Death Mountain Crater Upper to Lower Boulder Skip", "As adult, With careful positioning, you can jump to the ledge where the boulder is, then use repeated ledge grabs to shimmy to a climbable ledge. This trick supersedes \"Death Mountain Crater Upper to Lower with Hammer\"."); - mTrickOptions[RT_ZR_LOWER] = TrickOption::LogicTrick(RCQUEST_BOTH, RA_ZORAS_RIVER, {Tricks::Tag::INTERMEDIATE}, "Zora\'s River Lower Freestanding PoH as Adult with Nothing", "Adult can reach this PoH with a precise jump, no Hover Boots required."); - mTrickOptions[RT_ZR_UPPER] = TrickOption::LogicTrick(RCQUEST_BOTH, RA_ZORAS_RIVER, {Tricks::Tag::INTERMEDIATE}, "Zora\'s River Upper Freestanding PoH as Adult with Nothing", "Adult can reach this PoH with a precise jump, no Hover Boots required."); - mTrickOptions[RT_ZR_HOVERS] = TrickOption::LogicTrick(RCQUEST_BOTH, RA_ZORAS_RIVER, {Tricks::Tag::NOVICE}, "Zora\'s Domain Entry with Hover Boots", "Can hover behind the waterfall as adult."); - mTrickOptions[RT_ZR_CUCCO] = TrickOption::LogicTrick(RCQUEST_BOTH, RA_ZORAS_RIVER, {Tricks::Tag::NOVICE}, "Zora\'s Domain Entry with Cucco", "You can fly behind the waterfall with a Cucco as child."); - mTrickOptions[RT_ZD_KING_ZORA_SKIP] = TrickOption::LogicTrick(RCQUEST_BOTH, RA_ZORAS_DOMAIN, {Tricks::Tag::INTERMEDIATE}, "Skip King Zora as Adult with Nothing", "With a precise jump as adult, it is possible to get on the fence next to King Zora from the front to access Zora's Fountain."); - mTrickOptions[RT_ZD_GS] = TrickOption::LogicTrick(RCQUEST_BOTH, RA_ZORAS_DOMAIN, {Tricks::Tag::INTERMEDIATE}, "Zora\'s Domain GS with No Additional Items", "A precise jump slash can kill the Skulltula and recoil back onto the top of the frozen waterfall. To kill it, the logic normally guarantees one of Hookshot, Bow, or Magic."); - mTrickOptions[RT_ZF_GREAT_FAIRY_WITHOUT_EXPLOSIVES] = TrickOption::LogicTrick(RCQUEST_BOTH, RA_ZORAS_FOUNTAIN, {Tricks::Tag::NOVICE}, "Zora\'s Fountain Great Fairy Without Explosives", "It's possible to use silver gauntlets to pick up the silver rock and hammer to break the rock below it, allowing you to ledge grab the edge of the hole and get past the breakable wall (hammer can't break the wall itself)."); - mTrickOptions[RT_LH_LAB_WALL_GS] = TrickOption::LogicTrick(RCQUEST_BOTH, RA_LAKE_HYLIA, {Tricks::Tag::NOVICE}, "Lake Hylia Lab Wall GS with Jump Slash", "The jump slash to actually collect the token is somewhat precise."); - mTrickOptions[RT_LH_LAB_DIVING] = TrickOption::LogicTrick(RCQUEST_BOTH, RA_LAKE_HYLIA, {Tricks::Tag::NOVICE}, "Lake Hylia Lab Dive without Gold Scale", "Remove the Iron Boots in the midst of Hookshotting the underwater crate."); - mTrickOptions[RT_LH_WATER_HOOKSHOT] = TrickOption::LogicTrick(RCQUEST_BOTH, RA_LAKE_HYLIA, {Tricks::Tag::INTERMEDIATE}, "Water Temple Entry without Iron Boots using Hookshot", "When entering Water Temple using Gold Scale instead of Iron Boots, the Longshot is usually used to be able to hit the switch and open the gate. But, by standing in a particular spot, the switch can be hit with only the reach of the Hookshot."); - mTrickOptions[RT_GV_CRATE_HOVERS] = TrickOption::LogicTrick(RCQUEST_BOTH, RA_GERUDO_VALLEY, {Tricks::Tag::INTERMEDIATE}, "Gerudo Valley Crate PoH as Adult with Hover Boots", "From the far side of Gerudo Valley, a precise Hover Boots movement and jump-slash recoil can allow adult to reach the ledge with the crate PoH without needing Longshot. You will take fall damage."); - mTrickOptions[RT_GF_KITCHEN] = TrickOption::LogicTrick(RCQUEST_BOTH, RA_GERUDO_FORTRESS, {Tricks::Tag::NOVICE}, "Thieves\' Hideout \"Kitchen\" with No Additional Items", "Allows passing through the kitchen by avoiding being seen by the guards. The logic normally guarantees Bow or Hookshot to stun them from a distance, or Hover Boots to cross the room without needing to deal with the guards."); - mTrickOptions[RT_GF_JUMP] = TrickOption::LogicTrick(RCQUEST_BOTH, RA_GERUDO_FORTRESS, {Tricks::Tag::NOVICE}, "Gerudo\'s Fortress Ledge Jumps", "Adult can jump onto the top roof of the fortress without going through the interior of the hideout."); - mTrickOptions[RT_GF_WARRIOR_WITH_DIFFICULT_WEAPON] = TrickOption::LogicTrick(RCQUEST_BOTH, RA_GERUDO_FORTRESS, {Tricks::Tag::NOVICE}, "Gerudo\'s Fortress Warriors with Difficult Weapons", "Warriors can be defeated with slingshot or bombchus."); + // OPT_TRICK(RT_DMT_BOLERO_BIGGORON, RCQUEST_BOTH, RA_DEATH_MOUNTAIN_TRAIL, {Tricks::Tag::INTERMEDIATE}, "Deliver Eye Drops with Bolero of Fire", "Playing a warp song normally causes a trade item to spoil immediately, however, it is possible use Bolero to reach Biggoron and still deliver the Eye Drops before they spoil. If you do not wear the Goron Tunic, the heat timer inside the crater will override the trade item\'s timer. When you exit to Death Mountain Trail you will have one second to show the Eye Drops before they expire. You can get extra time to show the Eye Drops if you warp immediately upon receiving them. If you don't have many hearts, you may have to reset the heat timer by quickly dipping in and out of Darunia\'s chamber or quickly equipping and unequipping the Goron Tunic. This trick does not apply if \"Randomize Warp Song Destinations\" is enabled, or if the settings are such that trade items do not need to be delivered within a time limit."); + OPT_TRICK(RT_GC_POT, RCQUEST_BOTH, RA_GORON_CITY, {Tricks::Tag::ADVANCED}, "Goron City Spinning Pot PoH with Bombchu", "A Bombchu can be used to stop the spinning pot, but it can be quite finicky to get it to work."); + OPT_TRICK(RT_GC_POT_STRENGTH, RCQUEST_BOTH, RA_GORON_CITY, {Tricks::Tag::INTERMEDIATE}, "Goron City Spinning Pot PoH with Strength", "Allows for stopping the Goron City Spinning Pot using a bomb flower alone, requiring strength in lieu of inventory explosives."); + OPT_TRICK(RT_GC_ROLLING_STRENGTH, RCQUEST_BOTH, RA_GORON_CITY, {Tricks::Tag::INTERMEDIATE}, "Rolling Goron (Hot Rodder Goron) as Child with Strength", "Use the bombflower on the stairs or near Medigoron. Timing is tight, especially without backwalking."); + OPT_TRICK(RT_GC_LEFTMOST, RCQUEST_BOTH, RA_GORON_CITY, {Tricks::Tag::ADVANCED}, "Goron City Maze Left Chest with Hover Boots", "A precise backwalk starting from on top of the crate and ending with a precisely-timed backflip can reach this chest without needing either the Hammer or Silver Gauntlets."); + OPT_TRICK(RT_GC_GROTTO, RCQUEST_BOTH, RA_GORON_CITY, {Tricks::Tag::ADVANCED}, "Goron City Grotto with Hookshot While Taking Damage", "It is possible to reach the Goron City Grotto by quickly using the Hookshot while in the midst of taking damage from the lava floor."); + OPT_TRICK(RT_GC_LINK_GORON_DINS, RCQUEST_BOTH, RA_GORON_CITY, {Tricks::Tag::NOVICE}, "Stop Link the Goron with Din\'s Fire", "The timing is quite awkward."); + OPT_TRICK(RT_DMC_HOVER_BEAN_POH, RCQUEST_BOTH, RA_DEATH_MOUNTAIN_CRATER, {Tricks::Tag::NOVICE}, "Crater\'s Bean PoH with Hover Boots", "Hover from the base of the bridge near Goron City and walk up the very steep slope."); + OPT_TRICK(RT_DMC_BOLERO_JUMP, RCQUEST_BOTH, RA_DEATH_MOUNTAIN_CRATER, {Tricks::Tag::EXTREME}, "Death Mountain Crater Jump to Bolero", "As Adult, using a shield to drop a pot while you have the perfect speed and position, the pot can push you that little extra distance you need to jump across the gap in the bridge."); + OPT_TRICK(RT_DMC_BOULDER_JS, RCQUEST_BOTH, RA_DEATH_MOUNTAIN_CRATER, {Tricks::Tag::NOVICE}, "Death Mountain Crater Upper to Lower with Hammer", "With the Hammer, you can jump slash the rock twice in the same jump in order to destroy it before you fall into the lava."); + OPT_TRICK(RT_DMC_BOULDER_SKIP, RCQUEST_BOTH, RA_DEATH_MOUNTAIN_CRATER, {Tricks::Tag::INTERMEDIATE}, "Death Mountain Crater Upper to Lower Boulder Skip", "As adult, With careful positioning, you can jump to the ledge where the boulder is, then use repeated ledge grabs to shimmy to a climbable ledge. This trick supersedes \"Death Mountain Crater Upper to Lower with Hammer\"."); + OPT_TRICK(RT_ZR_LOWER, RCQUEST_BOTH, RA_ZORAS_RIVER, {Tricks::Tag::INTERMEDIATE}, "Zora\'s River Lower Freestanding PoH as Adult with Nothing", "Adult can reach this PoH with a precise jump, no Hover Boots required."); + OPT_TRICK(RT_ZR_UPPER, RCQUEST_BOTH, RA_ZORAS_RIVER, {Tricks::Tag::INTERMEDIATE}, "Zora\'s River Upper Freestanding PoH as Adult with Nothing", "Adult can reach this PoH with a precise jump, no Hover Boots required."); + OPT_TRICK(RT_ZR_HOVERS, RCQUEST_BOTH, RA_ZORAS_RIVER, {Tricks::Tag::NOVICE}, "Zora\'s Domain Entry with Hover Boots", "Can hover behind the waterfall as adult."); + OPT_TRICK(RT_ZR_CUCCO, RCQUEST_BOTH, RA_ZORAS_RIVER, {Tricks::Tag::NOVICE}, "Zora\'s Domain Entry with Cucco", "You can fly behind the waterfall with a Cucco as child."); + OPT_TRICK(RT_ZD_KING_ZORA_SKIP, RCQUEST_BOTH, RA_ZORAS_DOMAIN, {Tricks::Tag::INTERMEDIATE}, "Skip King Zora as Adult with Nothing", "With a precise jump as adult, it is possible to get on the fence next to King Zora from the front to access Zora's Fountain."); + OPT_TRICK(RT_ZD_GS, RCQUEST_BOTH, RA_ZORAS_DOMAIN, {Tricks::Tag::INTERMEDIATE}, "Zora\'s Domain GS with No Additional Items", "A precise jump slash can kill the Skulltula and recoil back onto the top of the frozen waterfall. To kill it, the logic normally guarantees one of Hookshot, Bow, or Magic."); + OPT_TRICK(RT_ZF_GREAT_FAIRY_WITHOUT_EXPLOSIVES, RCQUEST_BOTH, RA_ZORAS_FOUNTAIN, {Tricks::Tag::NOVICE}, "Zora\'s Fountain Great Fairy Without Explosives", "It's possible to use silver gauntlets to pick up the silver rock and hammer to break the rock below it, allowing you to ledge grab the edge of the hole and get past the breakable wall (hammer can't break the wall itself)."); + OPT_TRICK(RT_LH_LAB_WALL_GS, RCQUEST_BOTH, RA_LAKE_HYLIA, {Tricks::Tag::NOVICE}, "Lake Hylia Lab Wall GS with Jump Slash", "The jump slash to actually collect the token is somewhat precise."); + OPT_TRICK(RT_LH_LAB_DIVING, RCQUEST_BOTH, RA_LAKE_HYLIA, {Tricks::Tag::NOVICE}, "Lake Hylia Lab Dive without Gold Scale", "Remove the Iron Boots in the midst of Hookshotting the underwater crate."); + OPT_TRICK(RT_LH_WATER_HOOKSHOT, RCQUEST_BOTH, RA_LAKE_HYLIA, {Tricks::Tag::INTERMEDIATE}, "Water Temple Entry without Iron Boots using Hookshot", "When entering Water Temple using Gold Scale instead of Iron Boots, the Longshot is usually used to be able to hit the switch and open the gate. But, by standing in a particular spot, the switch can be hit with only the reach of the Hookshot."); + OPT_TRICK(RT_GV_CRATE_HOVERS, RCQUEST_BOTH, RA_GERUDO_VALLEY, {Tricks::Tag::INTERMEDIATE}, "Gerudo Valley Crate PoH as Adult with Hover Boots", "From the far side of Gerudo Valley, a precise Hover Boots movement and jump-slash recoil can allow adult to reach the ledge with the crate PoH without needing Longshot. You will take fall damage."); + OPT_TRICK(RT_GF_KITCHEN, RCQUEST_BOTH, RA_GERUDO_FORTRESS, {Tricks::Tag::NOVICE}, "Thieves\' Hideout \"Kitchen\" with No Additional Items", "Allows passing through the kitchen by avoiding being seen by the guards. The logic normally guarantees Bow or Hookshot to stun them from a distance, or Hover Boots to cross the room without needing to deal with the guards."); + OPT_TRICK(RT_GF_JUMP, RCQUEST_BOTH, RA_GERUDO_FORTRESS, {Tricks::Tag::NOVICE}, "Gerudo\'s Fortress Ledge Jumps", "Adult can jump onto the top roof of the fortress without going through the interior of the hideout."); + OPT_TRICK(RT_GF_WARRIOR_WITH_DIFFICULT_WEAPON, RCQUEST_BOTH, RA_GERUDO_FORTRESS, {Tricks::Tag::NOVICE}, "Gerudo\'s Fortress Warriors with Difficult Weapons", "Warriors can be defeated with slingshot or bombchus."); // disabled for now, can't check for being able to use bunny hood & bunny hood speedup is currently completely decoupled from rando - // mTrickOptions[RT_HW_BUNNY_CROSSING] = TrickOption::LogicTrick(RCQUEST_BOTH, RA_HAUNTED_WASTELAND, {Tricks::Tag::NOVICE}, "Wasteland Crossing with Bunny Hood", "You can beat the quicksand by using the increased speed of the Bunny Hood. Note that jumping to the carpet merchant as child typically requires a fairly precise jump slash."); - mTrickOptions[RT_HW_CROSSING] = TrickOption::LogicTrick(RCQUEST_BOTH, RA_HAUNTED_WASTELAND, {Tricks::Tag::INTERMEDIATE}, "Wasteland Crossing without Hover Boots or Longshot", "You can beat the quicksand by backwalking across it in a specific way. Note that jumping to the carpet merchant as child typically requires a fairly precise jump slash."); - mTrickOptions[RT_LENS_HW] = TrickOption::LogicTrick(RCQUEST_BOTH, RA_HAUNTED_WASTELAND, {Tricks::Tag::INTERMEDIATE}, "Lensless Wasteland", "By memorizing the path, you can travel through the Wasteland without using the Lens of Truth to see the Poe. The equivalent trick for going in reverse through the Wasteland is \"Reverse Wasteland\"."); - mTrickOptions[RT_HW_REVERSE] = TrickOption::LogicTrick(RCQUEST_BOTH, RA_HAUNTED_WASTELAND, {Tricks::Tag::INTERMEDIATE}, "Reverse Wasteland", "By memorizing the path, you can travel through the Wasteland in reverse. Note that jumping to the carpet merchant as child typically requires a fairly precise jump slash. The equivalent trick for going forward through the Wasteland is \"Lensless Wasteland\". To cross the river of sand with no additional items, be sure to also enable \"Wasteland Crossing without Hover Boots or Longshot\". Unless all overworld entrances are randomized, child Link will not be expected to do anything at Gerudo's Fortress."); - mTrickOptions[RT_COLOSSUS_GS] = TrickOption::LogicTrick(RCQUEST_BOTH, RA_DESERT_COLOSSUS, {Tricks::Tag::NOVICE}, "Colossus Hill GS with Hookshot", "Somewhat precise. If you kill enough Leevers you can get enough of a break to take some time to aim more carefully."); - mTrickOptions[RT_DEKU_BASEMENT_GS] = TrickOption::LogicTrick(RCQUEST_VANILLA, RA_DEKU_TREE, {Tricks::Tag::NOVICE}, "Deku Tree Basement Vines GS with Jump Slash", "Can be defeated by doing a precise jump slash."); - mTrickOptions[RT_DEKU_B1_SKIP] = TrickOption::LogicTrick(RCQUEST_BOTH, RA_DEKU_TREE, {Tricks::Tag::INTERMEDIATE}, "Deku Tree Basement without Slingshot", "A precise jump can be used to skip needing to use the Slingshot to go around B1 of the Deku Tree. If used with the \"Closed Forest\" setting, a Slingshot will not be guaranteed to exist somewhere inside the Forest. This trick applies to both Vanilla and Master Quest."); - mTrickOptions[RT_DEKU_B1_BOW_WEBS] = TrickOption::LogicTrick(RCQUEST_VANILLA, RA_DEKU_TREE, {Tricks::Tag::NOVICE}, "Deku Tree Basement Web to Gohma with Bow", "All spider web walls in the Deku Tree basement can be burnt as adult with just a bow by shooting through torches. This trick only applies to the circular web leading to Gohma; the two vertical webs are always in logic. Backflip onto the chest near the torch at the bottom of the vine wall. With precise positioning you can shoot through the torch to the right edge of the circular web. This allows completion of adult Deku Tree with no fire source."); - mTrickOptions[RT_DEKU_B1_BACKFLIP_OVER_SPIKED_LOG] = TrickOption::LogicTrick(RCQUEST_VANILLA, RA_DEKU_TREE, {Tricks::Tag::NOVICE}, "Deku Tree Basement Backflip over Spiked Log", "Allows backflipping over the spiked log in the Deku Tree basement in vanilla. Only relevant if \"Shuffle Swim\" is enabled."); - mTrickOptions[RT_DEKU_MQ_COMPASS_GS] = TrickOption::LogicTrick(RCQUEST_MQ, RA_DEKU_TREE, {Tricks::Tag::NOVICE}, "Deku Tree MQ Compass Room GS Boulders with Just Hammer", "Climb to the top of the vines, then let go and jump slash immediately to destroy the boulders using the Hammer, without needing to spawn a Song of Time block."); - mTrickOptions[RT_DEKU_MQ_LOG] = TrickOption::LogicTrick(RCQUEST_MQ, RA_DEKU_TREE, {Tricks::Tag::NOVICE}, "Deku Tree MQ Roll Under the Spiked Log", "You can get past the spiked log by rolling to briefly shrink your hitbox. As adult, the timing is a bit more precise."); - mTrickOptions[RT_DC_SCARECROW_GS] = TrickOption::LogicTrick(RCQUEST_VANILLA, RA_DODONGOS_CAVERN, {Tricks::Tag::NOVICE}, "Dodongo\'s Cavern Scarecrow GS with Armos Statue", "You can jump off an Armos Statue to reach the alcove with the Gold Skulltula. It takes quite a long time to pull the statue the entire way. The jump to the alcove can be a bit picky when done as child."); - mTrickOptions[RT_DC_VINES_GS] = TrickOption::LogicTrick(RCQUEST_VANILLA, RA_DODONGOS_CAVERN, {Tricks::Tag::NOVICE}, "Dodongo\'s Cavern Vines GS from Below with Longshot", "The vines upon which this Skulltula rests are one-sided collision. You can use the Longshot to get it from below, by shooting it through the vines, bypassing the need to lower the staircase."); - mTrickOptions[RT_DC_STAIRCASE] = TrickOption::LogicTrick(RCQUEST_VANILLA, RA_DODONGOS_CAVERN, {Tricks::Tag::NOVICE}, "Dodongo\'s Cavern Staircase with Bow", "The Bow can be used to knock down the stairs with two well-timed shots."); - mTrickOptions[RT_DC_SLINGSHOT_SKIP] = TrickOption::LogicTrick(RCQUEST_VANILLA, RA_DODONGOS_CAVERN, {Tricks::Tag::EXPERT}, "Dodongo\'s Cavern Child Slingshot Skips", "With precise platforming, child can cross the platforms while the flame circles are there. When enabling this trick, it's recommended that you also enable the Adult variant: \"Dodongo's Cavern Spike Trap Room Jump without Hover Boots\"."); - mTrickOptions[RT_DC_SCRUB_ROOM] = TrickOption::LogicTrick(RCQUEST_VANILLA, RA_DODONGOS_CAVERN, {Tricks::Tag::NOVICE}, "Dodongo\'s Cavern Two Scrub Room with Strength", "With help from a conveniently-positioned block, Adult can quickly carry a bomb flower over to destroy the mud wall blocking the room with two Deku Scrubs."); - mTrickOptions[RT_DC_JUMP] = TrickOption::LogicTrick(RCQUEST_BOTH, RA_DODONGOS_CAVERN, {Tricks::Tag::NOVICE}, "Dodongo\'s Cavern Spike Trap Room Jump without Hover Boots", "The jump is adult Link only. Applies to both Vanilla and MQ."); - mTrickOptions[RT_DC_HAMMER_FLOOR] = TrickOption::LogicTrick(RCQUEST_BOTH, RA_DODONGOS_CAVERN, {Tricks::Tag::NOVICE}, "Dodongo\'s Cavern Smash the Boss Lobby Floor", "The bombable floor before King Dodongo can be destroyed with Hammer if hit in the very center. This is only relevant with Shuffle Boss Entrances or if Dodongo's Cavern is MQ and either variant of \"Dodongo's Cavern MQ Light the Eyes with Strength\" is on."); - mTrickOptions[RT_DC_MQ_CHILD_BOMBS] = TrickOption::LogicTrick(RCQUEST_MQ, RA_DODONGOS_CAVERN, {Tricks::Tag::ADVANCED}, "Dodongo\'s Cavern MQ Early Bomb Bag Area as Child", "With a precise jump slash from above, you can reach the Bomb Bag area as only child without needing a Slingshot. You will take fall damage."); - mTrickOptions[RT_DC_MQ_CHILD_EYES] = TrickOption::LogicTrick(RCQUEST_MQ, RA_DODONGOS_CAVERN, {Tricks::Tag::EXPERT}, "Dodongo\'s Cavern MQ Light the Eyes with Strength as Child", "If you move very quickly, it is possible to use the bomb flower at the top of the room to light the eyes. To perform this trick as child is significantly more difficult than adult. The player is also expected to complete the DC back area without explosives, including getting past the Armos wall to the switch for the boss door."); - mTrickOptions[RT_DC_MQ_ADULT_EYES] = TrickOption::LogicTrick(RCQUEST_MQ, RA_DODONGOS_CAVERN, {Tricks::Tag::ADVANCED}, "Dodongo\'s Cavern MQ Light the Eyes with Strength as Adult", "If you move very quickly, it is possible to use the bomb flower at the top of the room to light the eyes."); - mTrickOptions[RT_JABU_ALCOVE_JUMP_DIVE] = TrickOption::LogicTrick(RCQUEST_BOTH, RA_JABU_JABUS_BELLY, {Tricks::Tag::NOVICE}, "Jabu Underwater Alcove as Adult with Jump Dive", "Standing above the underwater tunnel leading to the scrub, jump down and swim through the tunnel. This allows adult to access the alcove with no Scale or Iron Boots. In vanilla Jabu, this alcove has a business scrub. In MQ Jabu, it has the compass chest and a door switch for the main floor."); - mTrickOptions[RT_JABU_BOSS_HOVER] = TrickOption::LogicTrick(RCQUEST_VANILLA, RA_JABU_JABUS_BELLY, {Tricks::Tag::INTERMEDIATE}, "Jabu Near Boss Room with Hover Boots", "A box for the blue switch can be carried over by backwalking with one while the elevator is at its peak. Alternatively, you can skip transporting a box by quickly rolling from the switch and opening the door before it closes. However, the timing for this is very tight."); - mTrickOptions[RT_JABU_NEAR_BOSS_RANGED] = TrickOption::LogicTrick(RCQUEST_BOTH, RA_JABU_JABUS_BELLY, {Tricks::Tag::NOVICE}, "Jabu Near Boss Ceiling Switch/GS without Boomerang or Explosives", "Vanilla Jabu: From near the entrance into the room, you can hit the switch that opens the door to the boss room using a precisely-aimed use of the Slingshot, Bow, or Longshot. As well, if you climb to the top of the vines you can stand on the right edge of the platform and shoot around the glass. From this distance, even the Hookshot can reach the switch. This trick is only relevant if \"Shuffle Boss Entrances\" is enabled. MQ Jabu: A Gold Skulltula Token can be collected with the Hookshot or Longshot using the same methods as hitting the switch in vanilla. This MQ trick is not currently relevant in logic."); - mTrickOptions[RT_JABU_NEAR_BOSS_EXPLOSIVES] = TrickOption::LogicTrick(RCQUEST_VANILLA, RA_JABU_JABUS_BELLY, {Tricks::Tag::INTERMEDIATE}, "Jabu Near Boss Ceiling Switch with Explosives", "You can hit the switch that opens the door to the boss room using a precisely-aimed Bombchu. Also, using the Hover Boots, adult can throw a Bomb at the switch. This trick is only relevant if \"Shuffle Boss Entrances\" is enabled."); - mTrickOptions[RT_LENS_JABU_MQ] = TrickOption::LogicTrick(RCQUEST_MQ, RA_JABU_JABUS_BELLY, {Tricks::Tag::NOVICE}, "Jabu MQ without Lens of Truth", "Removes the requirements for the Lens of Truth in Jabu MQ."); - mTrickOptions[RT_JABU_MQ_RANG_JUMP] = TrickOption::LogicTrick(RCQUEST_MQ, RA_JABU_JABUS_BELLY, {Tricks::Tag::ADVANCED}, "Jabu MQ Compass Chest with Boomerang", "Boomerang can reach the cow switch to spawn the chest by targeting the cow, jumping off of the ledge where the chest spawns, and throwing the Boomerang in midair."); - mTrickOptions[RT_JABU_MQ_SOT_GS] = TrickOption::LogicTrick(RCQUEST_MQ, RA_JABU_JABUS_BELLY, {Tricks::Tag::INTERMEDIATE}, "Jabu MQ Song of Time Block GS with Boomerang", "Allow the Boomerang to return to you through the Song of Time block to grab the token."); - mTrickOptions[RT_LENS_BOTW] = TrickOption::LogicTrick(RCQUEST_VANILLA, RA_BOTTOM_OF_THE_WELL, {Tricks::Tag::NOVICE}, "Bottom of the Well without Lens of Truth", "Removes the requirements for the Lens of Truth in Bottom of the Well."); - mTrickOptions[RT_BOTW_CHILD_DEADHAND] = TrickOption::LogicTrick(RCQUEST_BOTH, RA_BOTTOM_OF_THE_WELL, {Tricks::Tag::NOVICE}, "Child Dead Hand without Kokiri Sword", "Requires 9 sticks or 5 jump slashes."); - mTrickOptions[RT_BOTW_BASEMENT] = TrickOption::LogicTrick(RCQUEST_VANILLA, RA_BOTTOM_OF_THE_WELL, {Tricks::Tag::NOVICE}, "Bottom of the Well Map Chest with Strength & Sticks", "The chest in the basement can be reached with strength by doing a jump slash with a lit stick to access the bomb flowers."); - mTrickOptions[RT_BOTW_MQ_PITS] = TrickOption::LogicTrick(RCQUEST_MQ, RA_BOTTOM_OF_THE_WELL, {Tricks::Tag::NOVICE}, "Bottom of the Well MQ Jump Over the Pits", "While the pits in Bottom of the Well don't allow you to jump just by running straight at them, you can still get over them by side-hopping or backflipping across. With explosives, this allows you to access the central areas without Zelda's Lullaby. With Zelda's Lullaby, it allows you to access the west inner room without explosives."); - mTrickOptions[RT_BOTW_MQ_DEADHAND_KEY] = TrickOption::LogicTrick(RCQUEST_MQ, RA_BOTTOM_OF_THE_WELL, {Tricks::Tag::NOVICE}, "Bottom of the Well MQ Dead Hand Freestanding Key with Boomerang", "Boomerang can fish the item out of the rubble without needing explosives to blow it up."); - mTrickOptions[RT_FOREST_FIRST_GS] = TrickOption::LogicTrick(RCQUEST_VANILLA, RA_FOREST_TEMPLE, {Tricks::Tag::NOVICE}, "Forest Temple First Room GS with Difficult-to-Use Weapons", "Allows killing this Skulltula with Sword or Sticks by jump slashing it as you let go from the vines. You can avoid taking fall damage by recoiling onto the tree. Also allows killing it as Child with a Bomb throw. It's much more difficult to use a Bomb as child due to Child Link's shorter height."); - mTrickOptions[RT_FOREST_OUTDOORS_EAST_GS] = TrickOption::LogicTrick(RCQUEST_VANILLA, RA_FOREST_TEMPLE, {Tricks::Tag::NOVICE}, "Forest Temple East Courtyard GS with Boomerang", "Precise Boomerang throws can allow child to kill the Skulltula and collect the token."); - mTrickOptions[RT_FOREST_VINES] = TrickOption::LogicTrick(RCQUEST_BOTH, RA_FOREST_TEMPLE, {Tricks::Tag::NOVICE}, "Forest Temple East Courtyard Vines with Hookshot", "The vines in Forest Temple leading to where the well drain switch is in the standard form can be barely reached with just the Hookshot. Applies to MQ also."); - mTrickOptions[RT_FOREST_OUTDOORS_LEDGE] = TrickOption::LogicTrick(RCQUEST_BOTH, RA_FOREST_TEMPLE, {Tricks::Tag::NOVICE}, "Forest Temple NE Outdoors Ledge with Hover Boots", "With precise Hover Boots movement you can fall down to this ledge from upper balconies. If done precisely enough, it is not necessary to take fall damage. In MQ, this skips a Longshot requirement. In Vanilla, this can skip a Hookshot requirement in entrance randomizer."); - mTrickOptions[RT_FOREST_DOORFRAME] = TrickOption::LogicTrick(RCQUEST_BOTH, RA_FOREST_TEMPLE, {Tricks::Tag::ADVANCED}, "Forest Temple East Courtyard Door Frame with Hover Boots", "A precise Hover Boots movement from the upper balconies in this courtyard can be used to get on top of the door frame. Applies to both Vanilla and Master Quest. In Vanilla, from on top the door frame you can summon Pierre, allowing you to access the falling ceiling room early. In Master Quest, this allows you to obtain the GS on the door frame as adult without Hookshot or Song of Time."); - mTrickOptions[RT_FOREST_OUTSIDE_BACKDOOR] = TrickOption::LogicTrick(RCQUEST_BOTH, RA_FOREST_TEMPLE, {Tricks::Tag::ADVANCED}, "Forest Temple Outside Backdoor with Jump Slash", "A jump slash recoil can be used to reach the ledge in the block puzzle room that leads to the west courtyard. This skips a potential Hover Boots requirement in vanilla, and it can sometimes apply in MQ as well. This trick can be performed as both ages."); - mTrickOptions[RT_FOREST_OUTDOORS_HEARTS_BOOMERANG] = TrickOption::LogicTrick(RCQUEST_BOTH, RA_FOREST_TEMPLE, {Tricks::Tag::NOVICE}, "Forest Temple Outside Hearts with Boomerang", "A well aimed boomerang from the water's edge can reach the hearts from ground level. If unable to swim, you can back away from the water while the boomerang is returning so the hearts land on the ground."); - mTrickOptions[RT_FOREST_MQ_WELL_SWIM] = TrickOption::LogicTrick(RCQUEST_MQ, RA_FOREST_TEMPLE, {Tricks::Tag::ADVANCED}, "Swim Through Forest Temple MQ Well with Hookshot", "Shoot the vines in the well as low and as far to the right as possible, and then immediately swim under the ceiling to the right. This can only be required if Forest Temple is in its Master Quest form."); - mTrickOptions[RT_FOREST_MQ_BLOCK_PUZZLE] = TrickOption::LogicTrick(RCQUEST_MQ, RA_FOREST_TEMPLE, {Tricks::Tag::NOVICE}, "Skip Forest Temple MQ Block Puzzle with Bombchu", "Send the Bombchu straight up the center of the wall directly to the left upon entering the room."); + // OPT_TRICK(RT_HW_BUNNY_CROSSING, RCQUEST_BOTH, RA_HAUNTED_WASTELAND, {Tricks::Tag::NOVICE}, "Wasteland Crossing with Bunny Hood", "You can beat the quicksand by using the increased speed of the Bunny Hood. Note that jumping to the carpet merchant as child typically requires a fairly precise jump slash."); + OPT_TRICK(RT_HW_CROSSING, RCQUEST_BOTH, RA_HAUNTED_WASTELAND, {Tricks::Tag::INTERMEDIATE}, "Wasteland Crossing without Hover Boots or Longshot", "You can beat the quicksand by backwalking across it in a specific way. Note that jumping to the carpet merchant as child typically requires a fairly precise jump slash."); + OPT_TRICK(RT_LENS_HW, RCQUEST_BOTH, RA_HAUNTED_WASTELAND, {Tricks::Tag::INTERMEDIATE}, "Lensless Wasteland", "By memorizing the path, you can travel through the Wasteland without using the Lens of Truth to see the Poe. The equivalent trick for going in reverse through the Wasteland is \"Reverse Wasteland\"."); + OPT_TRICK(RT_HW_REVERSE, RCQUEST_BOTH, RA_HAUNTED_WASTELAND, {Tricks::Tag::INTERMEDIATE}, "Reverse Wasteland", "By memorizing the path, you can travel through the Wasteland in reverse. Note that jumping to the carpet merchant as child typically requires a fairly precise jump slash. The equivalent trick for going forward through the Wasteland is \"Lensless Wasteland\". To cross the river of sand with no additional items, be sure to also enable \"Wasteland Crossing without Hover Boots or Longshot\". Unless all overworld entrances are randomized, child Link will not be expected to do anything at Gerudo's Fortress."); + OPT_TRICK(RT_COLOSSUS_GS, RCQUEST_BOTH, RA_DESERT_COLOSSUS, {Tricks::Tag::NOVICE}, "Colossus Hill GS with Hookshot", "Somewhat precise. If you kill enough Leevers you can get enough of a break to take some time to aim more carefully."); + OPT_TRICK(RT_DEKU_BASEMENT_GS, RCQUEST_VANILLA, RA_DEKU_TREE, {Tricks::Tag::NOVICE}, "Deku Tree Basement Vines GS with Jump Slash", "Can be defeated by doing a precise jump slash."); + OPT_TRICK(RT_DEKU_B1_SKIP, RCQUEST_BOTH, RA_DEKU_TREE, {Tricks::Tag::INTERMEDIATE}, "Deku Tree Basement without Slingshot", "A precise jump can be used to skip needing to use the Slingshot to go around B1 of the Deku Tree. If used with the \"Closed Forest\" setting, a Slingshot will not be guaranteed to exist somewhere inside the Forest. This trick applies to both Vanilla and Master Quest."); + OPT_TRICK(RT_DEKU_B1_BOW_WEBS, RCQUEST_VANILLA, RA_DEKU_TREE, {Tricks::Tag::NOVICE}, "Deku Tree Basement Web to Gohma with Bow", "All spider web walls in the Deku Tree basement can be burnt as adult with just a bow by shooting through torches. This trick only applies to the circular web leading to Gohma; the two vertical webs are always in logic. Backflip onto the chest near the torch at the bottom of the vine wall. With precise positioning you can shoot through the torch to the right edge of the circular web. This allows completion of adult Deku Tree with no fire source."); + OPT_TRICK(RT_DEKU_B1_BACKFLIP_OVER_SPIKED_LOG, RCQUEST_VANILLA, RA_DEKU_TREE, {Tricks::Tag::NOVICE}, "Deku Tree Basement Backflip over Spiked Log", "Allows backflipping over the spiked log in the Deku Tree basement in vanilla. Only relevant if \"Shuffle Swim\" is enabled."); + OPT_TRICK(RT_DEKU_MQ_COMPASS_GS, RCQUEST_MQ, RA_DEKU_TREE, {Tricks::Tag::NOVICE}, "Deku Tree MQ Compass Room GS Boulders with Just Hammer", "Climb to the top of the vines, then let go and jump slash immediately to destroy the boulders using the Hammer, without needing to spawn a Song of Time block."); + OPT_TRICK(RT_DEKU_MQ_LOG, RCQUEST_MQ, RA_DEKU_TREE, {Tricks::Tag::NOVICE}, "Deku Tree MQ Roll Under the Spiked Log", "You can get past the spiked log by rolling to briefly shrink your hitbox. As adult, the timing is a bit more precise."); + OPT_TRICK(RT_DC_SCARECROW_GS, RCQUEST_VANILLA, RA_DODONGOS_CAVERN, {Tricks::Tag::NOVICE}, "Dodongo\'s Cavern Scarecrow GS with Armos Statue", "You can jump off an Armos Statue to reach the alcove with the Gold Skulltula. It takes quite a long time to pull the statue the entire way. The jump to the alcove can be a bit picky when done as child."); + OPT_TRICK(RT_DC_VINES_GS, RCQUEST_VANILLA, RA_DODONGOS_CAVERN, {Tricks::Tag::NOVICE}, "Dodongo\'s Cavern Vines GS from Below with Longshot", "The vines upon which this Skulltula rests are one-sided collision. You can use the Longshot to get it from below, by shooting it through the vines, bypassing the need to lower the staircase."); + OPT_TRICK(RT_DC_STAIRCASE, RCQUEST_VANILLA, RA_DODONGOS_CAVERN, {Tricks::Tag::NOVICE}, "Dodongo\'s Cavern Staircase with Bow", "The Bow can be used to knock down the stairs with two well-timed shots."); + OPT_TRICK(RT_DC_SLINGSHOT_SKIP, RCQUEST_VANILLA, RA_DODONGOS_CAVERN, {Tricks::Tag::EXPERT}, "Dodongo\'s Cavern Child Slingshot Skips", "With precise platforming, child can cross the platforms while the flame circles are there. When enabling this trick, it's recommended that you also enable the Adult variant: \"Dodongo's Cavern Spike Trap Room Jump without Hover Boots\"."); + OPT_TRICK(RT_DC_SCRUB_ROOM, RCQUEST_VANILLA, RA_DODONGOS_CAVERN, {Tricks::Tag::NOVICE}, "Dodongo\'s Cavern Two Scrub Room with Strength", "With help from a conveniently-positioned block, Adult can quickly carry a bomb flower over to destroy the mud wall blocking the room with two Deku Scrubs."); + OPT_TRICK(RT_DC_JUMP, RCQUEST_BOTH, RA_DODONGOS_CAVERN, {Tricks::Tag::NOVICE}, "Dodongo\'s Cavern Spike Trap Room Jump without Hover Boots", "The jump is adult Link only. Applies to both Vanilla and MQ."); + OPT_TRICK(RT_DC_HAMMER_FLOOR, RCQUEST_BOTH, RA_DODONGOS_CAVERN, {Tricks::Tag::NOVICE}, "Dodongo\'s Cavern Smash the Boss Lobby Floor", "The bombable floor before King Dodongo can be destroyed with Hammer if hit in the very center. This is only relevant with Shuffle Boss Entrances or if Dodongo's Cavern is MQ and either variant of \"Dodongo's Cavern MQ Light the Eyes with Strength\" is on."); + OPT_TRICK(RT_DC_MQ_CHILD_BOMBS, RCQUEST_MQ, RA_DODONGOS_CAVERN, {Tricks::Tag::ADVANCED}, "Dodongo\'s Cavern MQ Early Bomb Bag Area as Child", "With a precise jump slash from above, you can reach the Bomb Bag area as only child without needing a Slingshot. You will take fall damage."); + OPT_TRICK(RT_DC_MQ_CHILD_EYES, RCQUEST_MQ, RA_DODONGOS_CAVERN, {Tricks::Tag::EXPERT}, "Dodongo\'s Cavern MQ Light the Eyes with Strength as Child", "If you move very quickly, it is possible to use the bomb flower at the top of the room to light the eyes. To perform this trick as child is significantly more difficult than adult. The player is also expected to complete the DC back area without explosives, including getting past the Armos wall to the switch for the boss door."); + OPT_TRICK(RT_DC_MQ_ADULT_EYES, RCQUEST_MQ, RA_DODONGOS_CAVERN, {Tricks::Tag::ADVANCED}, "Dodongo\'s Cavern MQ Light the Eyes with Strength as Adult", "If you move very quickly, it is possible to use the bomb flower at the top of the room to light the eyes."); + OPT_TRICK(RT_JABU_ALCOVE_JUMP_DIVE, RCQUEST_BOTH, RA_JABU_JABUS_BELLY, {Tricks::Tag::NOVICE}, "Jabu Underwater Alcove as Adult with Jump Dive", "Standing above the underwater tunnel leading to the scrub, jump down and swim through the tunnel. This allows adult to access the alcove with no Scale or Iron Boots. In vanilla Jabu, this alcove has a business scrub. In MQ Jabu, it has the compass chest and a door switch for the main floor."); + OPT_TRICK(RT_JABU_BOSS_HOVER, RCQUEST_VANILLA, RA_JABU_JABUS_BELLY, {Tricks::Tag::INTERMEDIATE}, "Jabu Near Boss Room with Hover Boots", "A box for the blue switch can be carried over by backwalking with one while the elevator is at its peak. Alternatively, you can skip transporting a box by quickly rolling from the switch and opening the door before it closes. However, the timing for this is very tight."); + OPT_TRICK(RT_JABU_NEAR_BOSS_RANGED, RCQUEST_BOTH, RA_JABU_JABUS_BELLY, {Tricks::Tag::NOVICE}, "Jabu Near Boss Ceiling Switch/GS without Boomerang or Explosives", "Vanilla Jabu: From near the entrance into the room, you can hit the switch that opens the door to the boss room using a precisely-aimed use of the Slingshot, Bow, or Longshot. As well, if you climb to the top of the vines you can stand on the right edge of the platform and shoot around the glass. From this distance, even the Hookshot can reach the switch. This trick is only relevant if \"Shuffle Boss Entrances\" is enabled. MQ Jabu: A Gold Skulltula Token can be collected with the Hookshot or Longshot using the same methods as hitting the switch in vanilla. This MQ trick is not currently relevant in logic."); + OPT_TRICK(RT_JABU_NEAR_BOSS_EXPLOSIVES, RCQUEST_VANILLA, RA_JABU_JABUS_BELLY, {Tricks::Tag::INTERMEDIATE}, "Jabu Near Boss Ceiling Switch with Explosives", "You can hit the switch that opens the door to the boss room using a precisely-aimed Bombchu. Also, using the Hover Boots, adult can throw a Bomb at the switch. This trick is only relevant if \"Shuffle Boss Entrances\" is enabled."); + OPT_TRICK(RT_LENS_JABU_MQ, RCQUEST_MQ, RA_JABU_JABUS_BELLY, {Tricks::Tag::NOVICE}, "Jabu MQ without Lens of Truth", "Removes the requirements for the Lens of Truth in Jabu MQ."); + OPT_TRICK(RT_JABU_MQ_RANG_JUMP, RCQUEST_MQ, RA_JABU_JABUS_BELLY, {Tricks::Tag::ADVANCED}, "Jabu MQ Compass Chest with Boomerang", "Boomerang can reach the cow switch to spawn the chest by targeting the cow, jumping off of the ledge where the chest spawns, and throwing the Boomerang in midair."); + OPT_TRICK(RT_JABU_MQ_SOT_GS, RCQUEST_MQ, RA_JABU_JABUS_BELLY, {Tricks::Tag::INTERMEDIATE}, "Jabu MQ Song of Time Block GS with Boomerang", "Allow the Boomerang to return to you through the Song of Time block to grab the token."); + OPT_TRICK(RT_LENS_BOTW, RCQUEST_VANILLA, RA_BOTTOM_OF_THE_WELL, {Tricks::Tag::NOVICE}, "Bottom of the Well without Lens of Truth", "Removes the requirements for the Lens of Truth in Bottom of the Well."); + OPT_TRICK(RT_BOTW_CHILD_DEADHAND, RCQUEST_BOTH, RA_BOTTOM_OF_THE_WELL, {Tricks::Tag::NOVICE}, "Child Dead Hand without Kokiri Sword", "Requires 9 sticks or 5 jump slashes."); + OPT_TRICK(RT_BOTW_BASEMENT, RCQUEST_VANILLA, RA_BOTTOM_OF_THE_WELL, {Tricks::Tag::NOVICE}, "Bottom of the Well Map Chest with Strength & Sticks", "The chest in the basement can be reached with strength by doing a jump slash with a lit stick to access the bomb flowers."); + OPT_TRICK(RT_BOTW_MQ_PITS, RCQUEST_MQ, RA_BOTTOM_OF_THE_WELL, {Tricks::Tag::NOVICE}, "Bottom of the Well MQ Jump Over the Pits", "While the pits in Bottom of the Well don't allow you to jump just by running straight at them, you can still get over them by side-hopping or backflipping across. With explosives, this allows you to access the central areas without Zelda's Lullaby. With Zelda's Lullaby, it allows you to access the west inner room without explosives."); + OPT_TRICK(RT_BOTW_MQ_DEADHAND_KEY, RCQUEST_MQ, RA_BOTTOM_OF_THE_WELL, {Tricks::Tag::NOVICE}, "Bottom of the Well MQ Dead Hand Freestanding Key with Boomerang", "Boomerang can fish the item out of the rubble without needing explosives to blow it up."); + OPT_TRICK(RT_FOREST_FIRST_GS, RCQUEST_VANILLA, RA_FOREST_TEMPLE, {Tricks::Tag::NOVICE}, "Forest Temple First Room GS with Difficult-to-Use Weapons", "Allows killing this Skulltula with Sword or Sticks by jump slashing it as you let go from the vines. You can avoid taking fall damage by recoiling onto the tree. Also allows killing it as Child with a Bomb throw. It's much more difficult to use a Bomb as child due to Child Link's shorter height."); + OPT_TRICK(RT_FOREST_OUTDOORS_EAST_GS, RCQUEST_VANILLA, RA_FOREST_TEMPLE, {Tricks::Tag::NOVICE}, "Forest Temple East Courtyard GS with Boomerang", "Precise Boomerang throws can allow child to kill the Skulltula and collect the token."); + OPT_TRICK(RT_FOREST_VINES, RCQUEST_BOTH, RA_FOREST_TEMPLE, {Tricks::Tag::NOVICE}, "Forest Temple East Courtyard Vines with Hookshot", "The vines in Forest Temple leading to where the well drain switch is in the standard form can be barely reached with just the Hookshot. Applies to MQ also."); + OPT_TRICK(RT_FOREST_OUTDOORS_LEDGE, RCQUEST_BOTH, RA_FOREST_TEMPLE, {Tricks::Tag::NOVICE}, "Forest Temple NE Outdoors Ledge with Hover Boots", "With precise Hover Boots movement you can fall down to this ledge from upper balconies. If done precisely enough, it is not necessary to take fall damage. In MQ, this skips a Longshot requirement. In Vanilla, this can skip a Hookshot requirement in entrance randomizer."); + OPT_TRICK(RT_FOREST_DOORFRAME, RCQUEST_BOTH, RA_FOREST_TEMPLE, {Tricks::Tag::ADVANCED}, "Forest Temple East Courtyard Door Frame with Hover Boots", "A precise Hover Boots movement from the upper balconies in this courtyard can be used to get on top of the door frame. Applies to both Vanilla and Master Quest. In Vanilla, from on top the door frame you can summon Pierre, allowing you to access the falling ceiling room early. In Master Quest, this allows you to obtain the GS on the door frame as adult without Hookshot or Song of Time."); + OPT_TRICK(RT_FOREST_OUTSIDE_BACKDOOR, RCQUEST_BOTH, RA_FOREST_TEMPLE, {Tricks::Tag::ADVANCED}, "Forest Temple Outside Backdoor with Jump Slash", "A jump slash recoil can be used to reach the ledge in the block puzzle room that leads to the west courtyard. This skips a potential Hover Boots requirement in vanilla, and it can sometimes apply in MQ as well. This trick can be performed as both ages."); + OPT_TRICK(RT_FOREST_OUTDOORS_HEARTS_BOOMERANG, RCQUEST_BOTH, RA_FOREST_TEMPLE, {Tricks::Tag::NOVICE}, "Forest Temple Outside Hearts with Boomerang", "A well aimed boomerang from the water's edge can reach the hearts from ground level. If unable to swim, you can back away from the water while the boomerang is returning so the hearts land on the ground."); + OPT_TRICK(RT_FOREST_MQ_WELL_SWIM, RCQUEST_MQ, RA_FOREST_TEMPLE, {Tricks::Tag::ADVANCED}, "Swim Through Forest Temple MQ Well with Hookshot", "Shoot the vines in the well as low and as far to the right as possible, and then immediately swim under the ceiling to the right. This can only be required if Forest Temple is in its Master Quest form."); + OPT_TRICK(RT_FOREST_MQ_BLOCK_PUZZLE, RCQUEST_MQ, RA_FOREST_TEMPLE, {Tricks::Tag::NOVICE}, "Skip Forest Temple MQ Block Puzzle with Bombchu", "Send the Bombchu straight up the center of the wall directly to the left upon entering the room."); //Child with hovers cannot do this from the lower floor, and most go to the upper floor which needs goron bracelet. Adult can do this with hammer and KSword, But child cannot. - mTrickOptions[RT_FOREST_MQ_JS_HALLWAY_SWITCH] = TrickOption::LogicTrick(RCQUEST_MQ, RA_FOREST_TEMPLE, {Tricks::Tag::NOVICE}, "Forest Temple MQ Twisted Hallway Switch with Jump Slash", "The switch to twist the hallway can be hit with a jump slash through the glass block. To get in front of the switch, either use the Hover Boots or hit the shortcut switch at the top of the room and jump from the glass blocks that spawn. Sticks can be used as child, but the Kokiri Sword is too short to reach through the glass."); - mTrickOptions[RT_FOREST_MQ_HOOKSHOT_HALLWAY_SWITCH] = TrickOption::LogicTrick(RCQUEST_MQ, RA_FOREST_TEMPLE, {Tricks::Tag::INTERMEDIATE}, "Forest Temple MQ Twisted Hallway Switch with Hookshot", "There's a very small gap between the glass block and the wall. Through that gap you can hookshot the target on the ceiling."); - mTrickOptions[RT_FOREST_MQ_RANG_HALLWAY_SWITCH] = TrickOption::LogicTrick(RCQUEST_MQ, RA_FOREST_TEMPLE, {Tricks::Tag::INTERMEDIATE}, "Forest Temple MQ Twisted Hallway Switch with Boomerang", "The Boomerang can return to Link through walls, allowing child to hit the hallway switch. This can be used to allow adult to pass through later, or in conjuction with \"Forest Temple Outside Backdoor with Jump Slash\"."); - mTrickOptions[RT_FIRE_BOSS_DOOR_JUMP] = TrickOption::LogicTrick(RCQUEST_BOTH, RA_FIRE_TEMPLE, {Tricks::Tag::NOVICE}, "Fire Temple Boss Door without Hover Boots or Pillar", "The Fire Temple Boss Door can be reached as adult with a precise jump. You must be touching the side wall of the room so that Link will grab the ledge from farther away than is normally possible."); + OPT_TRICK(RT_FOREST_MQ_JS_HALLWAY_SWITCH, RCQUEST_MQ, RA_FOREST_TEMPLE, {Tricks::Tag::NOVICE}, "Forest Temple MQ Twisted Hallway Switch with Jump Slash", "The switch to twist the hallway can be hit with a jump slash through the glass block. To get in front of the switch, either use the Hover Boots or hit the shortcut switch at the top of the room and jump from the glass blocks that spawn. Sticks can be used as child, but the Kokiri Sword is too short to reach through the glass."); + OPT_TRICK(RT_FOREST_MQ_HOOKSHOT_HALLWAY_SWITCH, RCQUEST_MQ, RA_FOREST_TEMPLE, {Tricks::Tag::INTERMEDIATE}, "Forest Temple MQ Twisted Hallway Switch with Hookshot", "There's a very small gap between the glass block and the wall. Through that gap you can hookshot the target on the ceiling."); + OPT_TRICK(RT_FOREST_MQ_RANG_HALLWAY_SWITCH, RCQUEST_MQ, RA_FOREST_TEMPLE, {Tricks::Tag::INTERMEDIATE}, "Forest Temple MQ Twisted Hallway Switch with Boomerang", "The Boomerang can return to Link through walls, allowing child to hit the hallway switch. This can be used to allow adult to pass through later, or in conjuction with \"Forest Temple Outside Backdoor with Jump Slash\"."); + OPT_TRICK(RT_FIRE_BOSS_DOOR_JUMP, RCQUEST_BOTH, RA_FIRE_TEMPLE, {Tricks::Tag::NOVICE}, "Fire Temple Boss Door without Hover Boots or Pillar", "The Fire Temple Boss Door can be reached as adult with a precise jump. You must be touching the side wall of the room so that Link will grab the ledge from farther away than is normally possible."); //Is also used in MQ logic, but has no practical effect there as of now - mTrickOptions[RT_FIRE_SOT] = TrickOption::LogicTrick(RCQUEST_VANILLA, RA_FIRE_TEMPLE, {Tricks::Tag::INTERMEDIATE}, "Fire Temple Song of Time Room GS without Song of Time", "A precise jump can be used to reach this room."); - mTrickOptions[RT_FIRE_STRENGTH] = TrickOption::LogicTrick(RCQUEST_VANILLA, RA_FIRE_TEMPLE, {Tricks::Tag::INTERMEDIATE}, "Fire Temple Climb without Strength", "A precise jump can be used to skip pushing the block."); - mTrickOptions[RT_FIRE_SCARECROW] = TrickOption::LogicTrick(RCQUEST_VANILLA, RA_FIRE_TEMPLE, {Tricks::Tag::EXPERT}, "Fire Temple East Tower without Scarecrow\'s Song", "Also known as \"Pixelshot\". The Longshot can reach the target on the elevator itself, allowing you to skip needing to spawn the scarecrow."); - mTrickOptions[RT_FIRE_FLAME_MAZE] = TrickOption::LogicTrick(RCQUEST_VANILLA, RA_FIRE_TEMPLE, {Tricks::Tag::INTERMEDIATE}, "Fire Temple Flame Wall Maze Skip", "If you move quickly you can sneak past the edge of a flame wall before it can rise up to block you. To do it without taking damage is more precise. Allows you to progress without needing either a Small Key or Hover Boots."); - mTrickOptions[RT_FIRE_MQ_NEAR_BOSS] = TrickOption::LogicTrick(RCQUEST_MQ, RA_FIRE_TEMPLE, {Tricks::Tag::NOVICE}, "Fire Temple MQ Chest Near Boss without Breaking Crate", "The hitbox for the torch extends a bit outside of the crate. Shoot a flaming arrow at the side of the crate to light the torch without needing to get over there and break the crate."); - mTrickOptions[RT_FIRE_MQ_BLOCKED_CHEST] = TrickOption::LogicTrick(RCQUEST_MQ, RA_FIRE_TEMPLE, {Tricks::Tag::INTERMEDIATE}, "Fire Temple MQ Big Lava Room Blocked Door without Hookshot", "There is a gap between the hitboxes of the flame wall in the big lava room. If you know where this gap is located, you can jump through it and skip needing to use the Hookshot. To do this without taking damage is more precise."); - mTrickOptions[RT_FIRE_MQ_BK_CHEST] = TrickOption::LogicTrick(RCQUEST_MQ, RA_FIRE_TEMPLE, {Tricks::Tag::INTERMEDIATE}, "Fire Temple MQ Boss Key Chest without Bow", "It is possible to light both of the timed torches to unbar the door to the boss key chest's room with just Din's Fire if you move very quickly between the two torches. It is also possible to unbar the door with just Din's by abusing an oversight in the way the game counts how many torches have been lit."); - mTrickOptions[RT_FIRE_MQ_CLIMB] = TrickOption::LogicTrick(RCQUEST_MQ, RA_FIRE_TEMPLE, {Tricks::Tag::NOVICE}, "Fire Temple MQ Climb without Fire Source", "You can use the Hover Boots to hover around to the climbable wall, skipping the need to use a fire source and spawn a Hookshot target."); - mTrickOptions[RT_FIRE_MQ_MAZE_SIDE_ROOM] = TrickOption::LogicTrick(RCQUEST_MQ, RA_FIRE_TEMPLE, {Tricks::Tag::NOVICE}, "Fire Temple MQ Lizalfos Maze Side Room without Box", "You can walk from the blue switch to the door and quickly open the door before the bars reclose. This skips needing to reach the upper sections of the maze to get a box to place on the switch."); - mTrickOptions[RT_FIRE_MQ_MAZE_HOVERS] = TrickOption::LogicTrick(RCQUEST_MQ, RA_FIRE_TEMPLE, {Tricks::Tag::NOVICE}, "Fire Temple MQ Lower to Upper Lizalfos Maze with Hover Boots", "Use the Hover Boots off of a crate to climb to the upper maze without needing to spawn and use the Hookshot targets."); - mTrickOptions[RT_FIRE_MQ_MAZE_JUMP] = TrickOption::LogicTrick(RCQUEST_MQ, RA_FIRE_TEMPLE, {Tricks::Tag::INTERMEDIATE}, "Fire Temple MQ Lower to Upper Lizalfos Maze with Precise Jump", "A precise jump off of a crate can be used to climb to the upper maze without needing to spawn and use the Hookshot targets. This trick supersedes both \"Fire Temple MQ Lower to Upper Lizalfos Maze with Hover Boots\" and \"Fire Temple MQ Lizalfos Maze Side Room without Box\"."); - mTrickOptions[RT_FIRE_MQ_ABOVE_MAZE_GS] = TrickOption::LogicTrick(RCQUEST_MQ, RA_FIRE_TEMPLE, {Tricks::Tag::INTERMEDIATE}, "Fire Temple MQ Above Flame Wall Maze GS from Below with Longshot", "The floor of the room that contains this Skulltula is only solid from above. From the maze below, the Longshot can be shot through the ceiling to obtain the token with two fewer small keys than normal."); - mTrickOptions[RT_FIRE_MQ_FLAME_MAZE] = TrickOption::LogicTrick(RCQUEST_MQ, RA_FIRE_TEMPLE, {Tricks::Tag::INTERMEDIATE}, "Fire Temple MQ Flame Wall Maze Skip", "If you move quickly you can sneak past the edge of a flame wall before it can rise up to block you. To do it without taking damage is more precise. Allows you to reach the side room GS without needing Song of Time or Hover Boots. If either of \"Fire Temple MQ Lower to Upper Lizalfos Maze with Hover Boots\" or \"with Precise Jump\" are enabled, this also allows you to progress deeper into the dungeon without Hookshot."); - mTrickOptions[RT_WATER_LONGSHOT_TORCH] = TrickOption::LogicTrick(RCQUEST_VANILLA, RA_WATER_TEMPLE, {Tricks::Tag::NOVICE}, "Water Temple Torch Longshot", "Stand on the eastern side of the central pillar and longshot the torches on the bottom level. Swim through the corridor and float up to the top level. This allows access to this area and lower water levels without Iron Boots. The majority of the tricks that allow you to skip Iron Boots in the Water Temple are not going to be relevant unless this trick is first enabled."); - mTrickOptions[RT_WATER_CRACKED_WALL_HOVERS] = TrickOption::LogicTrick(RCQUEST_VANILLA, RA_WATER_TEMPLE, {Tricks::Tag::NOVICE}, "Water Temple Cracked Wall with Hover Boots", "With a midair side-hop while wearing the Hover Boots, you can reach the cracked wall without needing to raise the water up to the middle level."); - mTrickOptions[RT_WATER_CRACKED_WALL] = TrickOption::LogicTrick(RCQUEST_VANILLA, RA_WATER_TEMPLE, {Tricks::Tag::INTERMEDIATE}, "Water Temple Cracked Wall with No Additional Items", "A precise jump slash (among other methods) will get you to the cracked wall without needing the Hover Boots or to raise the water to the middle level. This trick supersedes \"Water Temple Cracked Wall with Hover Boots\"."); - mTrickOptions[RT_WATER_BK_REGION] = TrickOption::LogicTrick(RCQUEST_VANILLA, RA_WATER_TEMPLE, {Tricks::Tag::INTERMEDIATE}, "Water Temple Boss Key Region with Hover Boots", "With precise Hover Boots movement it is possible to reach the boss key chest's region without needing the Longshot. It is not necessary to take damage from the spikes. The Gold Skulltula Token in the following room can also be obtained with just the Hover Boots."); - mTrickOptions[RT_WATER_NORTH_BASEMENT_LEDGE_JUMP] = TrickOption::LogicTrick(RCQUEST_BOTH, RA_WATER_TEMPLE, {Tricks::Tag::INTERMEDIATE}, "Water Temple North Basement Ledge with Precise Jump", "In the northern basement there's a ledge from where, in vanilla Water Temple, boulders roll out into the room. Normally to jump directly to this ledge logically requires the Hover Boots, but with precise jump, it can be done without them. This trick applies to both Vanilla and Master Quest."); - mTrickOptions[RT_WATER_BK_JUMP_DIVE] = TrickOption::LogicTrick(RCQUEST_VANILLA, RA_WATER_TEMPLE, {Tricks::Tag::NOVICE}, "Water Temple Boss Key Jump Dive", "Stand on the very edge of the raised corridor leading from the push block room to the rolling boulder corridor. Face the Gold Skulltula on the waterfall and jump over the boulder corridor floor into the pool of water, swimming right once underwater. This allows access to the boss key room without Iron boots."); + OPT_TRICK(RT_FIRE_SOT, RCQUEST_VANILLA, RA_FIRE_TEMPLE, {Tricks::Tag::INTERMEDIATE}, "Fire Temple Song of Time Room GS without Song of Time", "A precise jump can be used to reach this room."); + OPT_TRICK(RT_FIRE_STRENGTH, RCQUEST_VANILLA, RA_FIRE_TEMPLE, {Tricks::Tag::INTERMEDIATE}, "Fire Temple Climb without Strength", "A precise jump can be used to skip pushing the block."); + OPT_TRICK(RT_FIRE_SCARECROW, RCQUEST_VANILLA, RA_FIRE_TEMPLE, {Tricks::Tag::EXPERT}, "Fire Temple East Tower without Scarecrow\'s Song", "Also known as \"Pixelshot\". The Longshot can reach the target on the elevator itself, allowing you to skip needing to spawn the scarecrow."); + OPT_TRICK(RT_FIRE_FLAME_MAZE, RCQUEST_VANILLA, RA_FIRE_TEMPLE, {Tricks::Tag::INTERMEDIATE}, "Fire Temple Flame Wall Maze Skip", "If you move quickly you can sneak past the edge of a flame wall before it can rise up to block you. To do it without taking damage is more precise. Allows you to progress without needing either a Small Key or Hover Boots."); + OPT_TRICK(RT_FIRE_MQ_NEAR_BOSS, RCQUEST_MQ, RA_FIRE_TEMPLE, {Tricks::Tag::NOVICE}, "Fire Temple MQ Chest Near Boss without Breaking Crate", "The hitbox for the torch extends a bit outside of the crate. Shoot a flaming arrow at the side of the crate to light the torch without needing to get over there and break the crate."); + OPT_TRICK(RT_FIRE_MQ_BLOCKED_CHEST, RCQUEST_MQ, RA_FIRE_TEMPLE, {Tricks::Tag::INTERMEDIATE}, "Fire Temple MQ Big Lava Room Blocked Door without Hookshot", "There is a gap between the hitboxes of the flame wall in the big lava room. If you know where this gap is located, you can jump through it and skip needing to use the Hookshot. To do this without taking damage is more precise."); + OPT_TRICK(RT_FIRE_MQ_BK_CHEST, RCQUEST_MQ, RA_FIRE_TEMPLE, {Tricks::Tag::INTERMEDIATE}, "Fire Temple MQ Boss Key Chest without Bow", "It is possible to light both of the timed torches to unbar the door to the boss key chest's room with just Din's Fire if you move very quickly between the two torches. It is also possible to unbar the door with just Din's by abusing an oversight in the way the game counts how many torches have been lit."); + OPT_TRICK(RT_FIRE_MQ_CLIMB, RCQUEST_MQ, RA_FIRE_TEMPLE, {Tricks::Tag::NOVICE}, "Fire Temple MQ Climb without Fire Source", "You can use the Hover Boots to hover around to the climbable wall, skipping the need to use a fire source and spawn a Hookshot target."); + OPT_TRICK(RT_FIRE_MQ_MAZE_SIDE_ROOM, RCQUEST_MQ, RA_FIRE_TEMPLE, {Tricks::Tag::NOVICE}, "Fire Temple MQ Lizalfos Maze Side Room without Box", "You can walk from the blue switch to the door and quickly open the door before the bars reclose. This skips needing to reach the upper sections of the maze to get a box to place on the switch."); + OPT_TRICK(RT_FIRE_MQ_MAZE_HOVERS, RCQUEST_MQ, RA_FIRE_TEMPLE, {Tricks::Tag::NOVICE}, "Fire Temple MQ Lower to Upper Lizalfos Maze with Hover Boots", "Use the Hover Boots off of a crate to climb to the upper maze without needing to spawn and use the Hookshot targets."); + OPT_TRICK(RT_FIRE_MQ_MAZE_JUMP, RCQUEST_MQ, RA_FIRE_TEMPLE, {Tricks::Tag::INTERMEDIATE}, "Fire Temple MQ Lower to Upper Lizalfos Maze with Precise Jump", "A precise jump off of a crate can be used to climb to the upper maze without needing to spawn and use the Hookshot targets. This trick supersedes both \"Fire Temple MQ Lower to Upper Lizalfos Maze with Hover Boots\" and \"Fire Temple MQ Lizalfos Maze Side Room without Box\"."); + OPT_TRICK(RT_FIRE_MQ_ABOVE_MAZE_GS, RCQUEST_MQ, RA_FIRE_TEMPLE, {Tricks::Tag::INTERMEDIATE}, "Fire Temple MQ Above Flame Wall Maze GS from Below with Longshot", "The floor of the room that contains this Skulltula is only solid from above. From the maze below, the Longshot can be shot through the ceiling to obtain the token with two fewer small keys than normal."); + OPT_TRICK(RT_FIRE_MQ_FLAME_MAZE, RCQUEST_MQ, RA_FIRE_TEMPLE, {Tricks::Tag::INTERMEDIATE}, "Fire Temple MQ Flame Wall Maze Skip", "If you move quickly you can sneak past the edge of a flame wall before it can rise up to block you. To do it without taking damage is more precise. Allows you to reach the side room GS without needing Song of Time or Hover Boots. If either of \"Fire Temple MQ Lower to Upper Lizalfos Maze with Hover Boots\" or \"with Precise Jump\" are enabled, this also allows you to progress deeper into the dungeon without Hookshot."); + OPT_TRICK(RT_WATER_LONGSHOT_TORCH, RCQUEST_VANILLA, RA_WATER_TEMPLE, {Tricks::Tag::NOVICE}, "Water Temple Torch Longshot", "Stand on the eastern side of the central pillar and longshot the torches on the bottom level. Swim through the corridor and float up to the top level. This allows access to this area and lower water levels without Iron Boots. The majority of the tricks that allow you to skip Iron Boots in the Water Temple are not going to be relevant unless this trick is first enabled."); + OPT_TRICK(RT_WATER_CRACKED_WALL_HOVERS, RCQUEST_VANILLA, RA_WATER_TEMPLE, {Tricks::Tag::NOVICE}, "Water Temple Cracked Wall with Hover Boots", "With a midair side-hop while wearing the Hover Boots, you can reach the cracked wall without needing to raise the water up to the middle level."); + OPT_TRICK(RT_WATER_CRACKED_WALL, RCQUEST_VANILLA, RA_WATER_TEMPLE, {Tricks::Tag::INTERMEDIATE}, "Water Temple Cracked Wall with No Additional Items", "A precise jump slash (among other methods) will get you to the cracked wall without needing the Hover Boots or to raise the water to the middle level. This trick supersedes \"Water Temple Cracked Wall with Hover Boots\"."); + OPT_TRICK(RT_WATER_BK_REGION, RCQUEST_VANILLA, RA_WATER_TEMPLE, {Tricks::Tag::INTERMEDIATE}, "Water Temple Boss Key Region with Hover Boots", "With precise Hover Boots movement it is possible to reach the boss key chest's region without needing the Longshot. It is not necessary to take damage from the spikes. The Gold Skulltula Token in the following room can also be obtained with just the Hover Boots."); + OPT_TRICK(RT_WATER_NORTH_BASEMENT_LEDGE_JUMP, RCQUEST_BOTH, RA_WATER_TEMPLE, {Tricks::Tag::INTERMEDIATE}, "Water Temple North Basement Ledge with Precise Jump", "In the northern basement there's a ledge from where, in vanilla Water Temple, boulders roll out into the room. Normally to jump directly to this ledge logically requires the Hover Boots, but with precise jump, it can be done without them. This trick applies to both Vanilla and Master Quest."); + OPT_TRICK(RT_WATER_BK_JUMP_DIVE, RCQUEST_VANILLA, RA_WATER_TEMPLE, {Tricks::Tag::NOVICE}, "Water Temple Boss Key Jump Dive", "Stand on the very edge of the raised corridor leading from the push block room to the rolling boulder corridor. Face the Gold Skulltula on the waterfall and jump over the boulder corridor floor into the pool of water, swimming right once underwater. This allows access to the boss key room without Iron boots."); //Also used in MQ logic, but won't be relevent unless a way to enter tower without irons exists (likely a clip + swim) - mTrickOptions[RT_WATER_FW_CENTRAL_GS] = TrickOption::LogicTrick(RCQUEST_VANILLA, RA_WATER_TEMPLE, {Tricks::Tag::NOVICE}, "Water Temple Central Pillar GS with Farore\'s Wind", "If you set Farore's Wind inside the central pillar and then return to that warp point after raising the water to the highest level, you can obtain this Skulltula Token with Hookshot or Boomerang."); - mTrickOptions[RT_WATER_IRONS_CENTRAL_GS] = TrickOption::LogicTrick(RCQUEST_VANILLA, RA_WATER_TEMPLE, {Tricks::Tag::NOVICE}, "Water Temple Central Pillar GS with Iron Boots", "After opening the middle water level door into the central pillar, the door will stay unbarred so long as you do not leave the room -- even if you were to raise the water up to the highest level. With the Iron Boots to go through the door after the water has been raised, you can obtain the Skulltula Token with the Hookshot."); - mTrickOptions[RT_WATER_CENTRAL_BOW] = TrickOption::LogicTrick(RCQUEST_VANILLA, RA_WATER_TEMPLE, {Tricks::Tag::ADVANCED}, "Water Temple Central Bow Target without Longshot or Hover Boots", "A very precise Bow shot can hit the eye switch from the floor above. Then, you can jump down into the hallway and make through it before the gate closes. It can also be done as child, using the Slingshot instead of the Bow."); - mTrickOptions[RT_WATER_HOOKSHOT_FALLING_PLATFORM_GS] = TrickOption::LogicTrick(RCQUEST_VANILLA, RA_WATER_TEMPLE, {Tricks::Tag::NOVICE}, "Water Temple Falling Platform Room GS with Hookshot", "If you stand on the very edge of the platform, this Gold Skulltula can be obtained with only the Hookshot."); - mTrickOptions[RT_WATER_RANG_FALLING_PLATFORM_GS] = TrickOption::LogicTrick(RCQUEST_VANILLA, RA_WATER_TEMPLE, {Tricks::Tag::INTERMEDIATE}, "Water Temple Falling Platform Room GS with Boomerang", "If you stand on the very edge of the platform, this Gold Skulltula can be obtained with only the Boomerang."); - mTrickOptions[RT_WATER_RIVER_GS] = TrickOption::LogicTrick(RCQUEST_VANILLA, RA_WATER_TEMPLE, {Tricks::Tag::INTERMEDIATE}, "Water Temple River GS without Iron Boots", "Standing on the exposed ground toward the end of the river, a precise Longshot use can obtain the token. The Longshot cannot normally reach far enough to kill the Skulltula, however. You'll first have to find some other way of killing it."); - mTrickOptions[RT_WATER_DRAGON_JUMP_DIVE] = TrickOption::LogicTrick(RCQUEST_BOTH, RA_WATER_TEMPLE, {Tricks::Tag::NOVICE}, "Water Temple Dragon Statue Jump Dive", "If you come into the dragon statue room from the serpent river, you can jump down from above and get into the tunnel without needing either Iron Boots or a Scale. This trick applies to both Vanilla and Master Quest. In Vanilla, you must shoot the switch from above with the Bow, and then quickly get through the tunnel before the gate closes."); - mTrickOptions[RT_WATER_ADULT_DRAGON] = TrickOption::LogicTrick(RCQUEST_VANILLA, RA_WATER_TEMPLE, {Tricks::Tag::NOVICE}, "Water Temple Dragon Statue Switch from Above the Water as Adult", "Normally you need both Hookshot and Iron Boots to hit the switch and swim through the tunnel to get to the chest. But by hitting the switch from dry land, using one of Bombchus, Hookshot, or Bow, it is possible to skip one or both of those requirements. After the gate has been opened, besides just using the Iron Boots, a well-timed dive with at least the Silver Scale could be used to swim through the tunnel. If coming from the serpent river, a jump dive can also be used to get into the tunnel."); - mTrickOptions[RT_WATER_CHILD_DRAGON] = TrickOption::LogicTrick(RCQUEST_VANILLA, RA_WATER_TEMPLE, {Tricks::Tag::ADVANCED}, "Water Temple Dragon Statue Switch from Above the Water as Child", "It is possible for child to hit the switch from dry land using one of Bombchus, Slingshot or Boomerang. Then, to get to the chest, child can dive through the tunnel using at least the Silver Scale. The timing and positioning of this dive needs to be perfect to actually make it under the gate, and it all needs to be done very quickly to be able to get through before the gate closes. Be sure to enable \"Water Temple Dragon Statue Switch from Above the Water as Adult\" for adult's variant of this trick."); - mTrickOptions[RT_WATER_MQ_CENTRAL_PILLAR] = TrickOption::LogicTrick(RCQUEST_MQ, RA_WATER_TEMPLE, {Tricks::Tag::NOVICE}, "Water Temple MQ Central Pillar with Fire Arrows", "Slanted torches have misleading hitboxes. Whenever you see a slanted torch jutting out of the wall, you can expect most or all of its hitbox is actually on the other side that wall. This can make slanted torches very finicky to light when using arrows. The torches in the central pillar of MQ Water Temple are a particularly egregious example. Logic normally expects Din's Fire and Song of Time."); - mTrickOptions[RT_WATER_MQ_LOCKED_GS] = TrickOption::LogicTrick(RCQUEST_MQ, RA_WATER_TEMPLE, {Tricks::Tag::NOVICE}, "Water Temple MQ North Basement GS without Small Key", "There is an invisible Hookshot target that can be used to get over the gate that blocks you from going to this Skulltula early, skipping a small key as well as needing Hovers or Scarecrow to reach the locked door."); - mTrickOptions[RT_LENS_SHADOW] = TrickOption::LogicTrick(RCQUEST_VANILLA, RA_SHADOW_TEMPLE, {Tricks::Tag::NOVICE}, "Shadow Temple Stationary Objects without Lens of Truth", "Removes the requirements for the Lens of Truth in Shadow Temple for most areas in the dungeon except for crossing the moving platform in the huge pit room and for fighting Bongo Bongo."); - mTrickOptions[RT_LENS_SHADOW_PLATFORM] = TrickOption::LogicTrick(RCQUEST_VANILLA, RA_SHADOW_TEMPLE, {Tricks::Tag::NOVICE}, "Shadow Temple Invisible Moving Platform without Lens of Truth", "Removes the requirements for the Lens of Truth in Shadow Temple to cross the invisible moving platform in the huge pit room in either direction."); - mTrickOptions[RT_LENS_BONGO] = TrickOption::LogicTrick(RCQUEST_BOTH, RA_SHADOW_TEMPLE, {Tricks::Tag::NOVICE}, "Shadow Temple Bongo Bongo without Lens of Truth", "Bongo Bongo can be defeated without the use of Lens of Truth, as the hands give a pretty good idea of where the eye is."); - mTrickOptions[RT_SHADOW_UMBRELLA] = TrickOption::LogicTrick(RCQUEST_BOTH, RA_SHADOW_TEMPLE, {Tricks::Tag::EXPERT}, "Shadow Temple Stone Umbrella Skip", "A very precise Hover Boots movement from off of the lower chest can get you on top of the crushing spikes without needing to pull the block. Applies to both Vanilla and Master Quest."); - mTrickOptions[RT_SHADOW_UMBRELLA_GS] = TrickOption::LogicTrick(RCQUEST_BOTH, RA_SHADOW_TEMPLE, {Tricks::Tag::EXPERT}, "Shadow Temple Falling Spikes GS with Hover Boots", "After killing the Skulltula, a very precise Hover Boots movement from off of the lower chest can get you on top of the crushing spikes without needing to pull the block. From there, another very precise Hover Boots movement can be used to obtain the token without needing the Hookshot. Applies to both Vanilla and Master Quest. For obtaining the chests in this room with just Hover Boots, be sure to enable \"Shadow Temple Stone Umbrella Skip\"."); - mTrickOptions[RT_SHADOW_FREESTANDING_KEY] = TrickOption::LogicTrick(RCQUEST_VANILLA, RA_SHADOW_TEMPLE, {Tricks::Tag::NOVICE}, "Shadow Temple Freestanding Key with Bombchu", "Release the Bombchu with good timing so that it explodes near the bottom of the pot."); - mTrickOptions[RT_SHADOW_STATUE] = TrickOption::LogicTrick(RCQUEST_BOTH, RA_SHADOW_TEMPLE, {Tricks::Tag::INTERMEDIATE}, "Shadow Temple River Statue with Bombchu", "By sending a Bombchu around the edge of the gorge, you can knock down the statue without needing a Bow. Applies in both vanilla and MQ Shadow."); - mTrickOptions[RT_SHADOW_BONGO] = TrickOption::LogicTrick(RCQUEST_BOTH, RA_SHADOW_TEMPLE, {Tricks::Tag::INTERMEDIATE}, "Shadow Temple Bongo Bongo without projectiles", "Using precise sword slashes, Bongo Bongo can be defeated without using projectiles. This is only relevant in conjunction with Shadow Temple dungeon shortcuts or shuffled boss entrances."); - mTrickOptions[RT_LENS_SHADOW_MQ] = TrickOption::LogicTrick(RCQUEST_MQ, RA_SHADOW_TEMPLE, {Tricks::Tag::NOVICE}, "Shadow Temple MQ Stationary Objects without Lens of Truth", "Removes the requirements for the Lens of Truth in Shadow Temple MQ for most areas in the dungeon. See \"Shadow Temple MQ Invisible Moving Platform without Lens of Truth\", \"Shadow Temple MQ Invisible Blades Silver Rupees without Lens of Truth\", \"Shadow Temple MQ 2nd Dead Hand without Lens of Truth\", and \"Shadow Temple Bongo Bongo without Lens of Truth\" for exceptions."); - mTrickOptions[RT_LENS_SHADOW_MQ_INVISIBLE_BLADES] = TrickOption::LogicTrick(RCQUEST_MQ, RA_SHADOW_TEMPLE, {Tricks::Tag::NOVICE}, "Shadow Temple MQ Invisible Blades Silver Rupees without Lens of Truth", "Removes the requirement for the Lens of Truth or Nayru's Love in Shadow Temple MQ for the Invisible Blades room silver rupee collection."); - mTrickOptions[RT_LENS_SHADOW_MQ_PLATFORM] = TrickOption::LogicTrick(RCQUEST_MQ, RA_SHADOW_TEMPLE, {Tricks::Tag::NOVICE}, "Shadow Temple MQ Invisible Moving Platform without Lens of Truth", "Removes the requirements for the Lens of Truth in Shadow Temple MQ to cross the invisible moving platform in the huge pit room in either direction."); - mTrickOptions[RT_LENS_SHADOW_MQ_DEADHAND] = TrickOption::LogicTrick(RCQUEST_MQ, RA_SHADOW_TEMPLE, {Tricks::Tag::NOVICE}, "Shadow Temple MQ 2nd Dead Hand without Lens of Truth", "Dead Hand spawns in a random spot within the room. Having Lens removes the hassle of having to comb the room looking for his spawn location."); - mTrickOptions[RT_SHADOW_MQ_GAP] = TrickOption::LogicTrick(RCQUEST_MQ, RA_SHADOW_TEMPLE, {Tricks::Tag::INTERMEDIATE}, "Shadow Temple MQ Truth Spinner Gap with Longshot", "You can Longshot a torch and jump-slash recoil onto the tongue. It works best if you Longshot the right torch from the left side of the room."); - mTrickOptions[RT_SHADOW_MQ_INVISIBLE_BLADES] = TrickOption::LogicTrick(RCQUEST_MQ, RA_SHADOW_TEMPLE, {Tricks::Tag::INTERMEDIATE}, "Shadow Temple MQ Invisible Blades without Song of Time", "The Like Like can be used to boost you into the silver rupee or recovery hearts that normally require Song of Time. This cannot be performed on OHKO since the Like Like does not boost you high enough if you die."); - mTrickOptions[RT_SHADOW_MQ_HUGE_PIT] = TrickOption::LogicTrick(RCQUEST_MQ, RA_SHADOW_TEMPLE, {Tricks::Tag::INTERMEDIATE}, "Shadow Temple MQ Lower Huge Pit without Fire Source", "Normally a frozen eye switch spawns some platforms that you can use to climb down, but there's actually a small piece of ground that you can stand on that you can just jump down to."); - mTrickOptions[RT_SHADOW_MQ_WINDY_WALKWAY] = TrickOption::LogicTrick(RCQUEST_MQ, RA_SHADOW_TEMPLE, {Tricks::Tag::INTERMEDIATE}, "Shadow Temple MQ Windy Walkway Reverse without Hover Boots", "It is possible to jump from the alcove in the windy hallway to the middle platform. There are two methods: wait out the fan opposite the door and hold forward, or jump to the right to be pushed by the fan there towards the platform ledge. Note that jumps of this distance are inconsistent, but still possible."); - mTrickOptions[RT_LENS_SPIRIT] = TrickOption::LogicTrick(RCQUEST_VANILLA, RA_SPIRIT_TEMPLE, {Tricks::Tag::NOVICE}, "Spirit Temple without Lens of Truth", "Removes the requirements for the Lens of Truth in Spirit Temple."); - mTrickOptions[RT_SPIRIT_CHILD_CHU] = TrickOption::LogicTrick(RCQUEST_VANILLA, RA_SPIRIT_TEMPLE, {Tricks::Tag::NOVICE}, "Spirit Temple Child Side Bridge with Bombchu", "A carefully-timed Bombchu can hit the switch."); - mTrickOptions[RT_SPIRIT_LOBBY_GS] = TrickOption::LogicTrick(RCQUEST_VANILLA, RA_SPIRIT_TEMPLE, {Tricks::Tag::NOVICE}, "Spirit Temple Main Room GS with Boomerang", "Standing on the highest part of the arm of the statue, a precise Boomerang throw can kill and obtain this Gold Skulltula. You must throw the Boomerang slightly off to the side so that it curves into the Skulltula, as aiming directly at it will clank off of the wall in front."); - mTrickOptions[RT_SPIRIT_LOWER_ADULT_SWITCH] = TrickOption::LogicTrick(RCQUEST_VANILLA, RA_SPIRIT_TEMPLE, {Tricks::Tag::ADVANCED}, "Spirit Temple Lower Adult Switch with Bombs", "A bomb can be used to hit the switch on the ceiling, but it must be thrown from a particular distance away and with precise timing."); - mTrickOptions[RT_SPIRIT_LOBBY_JUMP] = TrickOption::LogicTrick(RCQUEST_BOTH, RA_SPIRIT_TEMPLE, {Tricks::Tag::INTERMEDIATE}, "Spirit Temple Main Room Jump from Hands to Upper Ledges", "A precise jump to obtain the following as adult without needing one of Hover Boots, or Hookshot (in vanilla) or Song of Time (in MQ): - Spirit Temple Statue Room Northeast Chest - Spirit Temple GS Lobby - Spirit Temple MQ Central Chamber Top Left Pot (Left) - Spirit Temple MQ Central Chamber Top Left Pot (Right)"); + OPT_TRICK(RT_WATER_FW_CENTRAL_GS, RCQUEST_VANILLA, RA_WATER_TEMPLE, {Tricks::Tag::NOVICE}, "Water Temple Central Pillar GS with Farore\'s Wind", "If you set Farore's Wind inside the central pillar and then return to that warp point after raising the water to the highest level, you can obtain this Skulltula Token with Hookshot or Boomerang."); + OPT_TRICK(RT_WATER_IRONS_CENTRAL_GS, RCQUEST_VANILLA, RA_WATER_TEMPLE, {Tricks::Tag::NOVICE}, "Water Temple Central Pillar GS with Iron Boots", "After opening the middle water level door into the central pillar, the door will stay unbarred so long as you do not leave the room -- even if you were to raise the water up to the highest level. With the Iron Boots to go through the door after the water has been raised, you can obtain the Skulltula Token with the Hookshot."); + OPT_TRICK(RT_WATER_CENTRAL_BOW, RCQUEST_VANILLA, RA_WATER_TEMPLE, {Tricks::Tag::ADVANCED}, "Water Temple Central Bow Target without Longshot or Hover Boots", "A very precise Bow shot can hit the eye switch from the floor above. Then, you can jump down into the hallway and make through it before the gate closes. It can also be done as child, using the Slingshot instead of the Bow."); + OPT_TRICK(RT_WATER_HOOKSHOT_FALLING_PLATFORM_GS, RCQUEST_VANILLA, RA_WATER_TEMPLE, {Tricks::Tag::NOVICE}, "Water Temple Falling Platform Room GS with Hookshot", "If you stand on the very edge of the platform, this Gold Skulltula can be obtained with only the Hookshot."); + OPT_TRICK(RT_WATER_RANG_FALLING_PLATFORM_GS, RCQUEST_VANILLA, RA_WATER_TEMPLE, {Tricks::Tag::INTERMEDIATE}, "Water Temple Falling Platform Room GS with Boomerang", "If you stand on the very edge of the platform, this Gold Skulltula can be obtained with only the Boomerang."); + OPT_TRICK(RT_WATER_RIVER_GS, RCQUEST_VANILLA, RA_WATER_TEMPLE, {Tricks::Tag::INTERMEDIATE}, "Water Temple River GS without Iron Boots", "Standing on the exposed ground toward the end of the river, a precise Longshot use can obtain the token. The Longshot cannot normally reach far enough to kill the Skulltula, however. You'll first have to find some other way of killing it."); + OPT_TRICK(RT_WATER_DRAGON_JUMP_DIVE, RCQUEST_BOTH, RA_WATER_TEMPLE, {Tricks::Tag::NOVICE}, "Water Temple Dragon Statue Jump Dive", "If you come into the dragon statue room from the serpent river, you can jump down from above and get into the tunnel without needing either Iron Boots or a Scale. This trick applies to both Vanilla and Master Quest. In Vanilla, you must shoot the switch from above with the Bow, and then quickly get through the tunnel before the gate closes."); + OPT_TRICK(RT_WATER_ADULT_DRAGON, RCQUEST_VANILLA, RA_WATER_TEMPLE, {Tricks::Tag::NOVICE}, "Water Temple Dragon Statue Switch from Above the Water as Adult", "Normally you need both Hookshot and Iron Boots to hit the switch and swim through the tunnel to get to the chest. But by hitting the switch from dry land, using one of Bombchus, Hookshot, or Bow, it is possible to skip one or both of those requirements. After the gate has been opened, besides just using the Iron Boots, a well-timed dive with at least the Silver Scale could be used to swim through the tunnel. If coming from the serpent river, a jump dive can also be used to get into the tunnel."); + OPT_TRICK(RT_WATER_CHILD_DRAGON, RCQUEST_VANILLA, RA_WATER_TEMPLE, {Tricks::Tag::ADVANCED}, "Water Temple Dragon Statue Switch from Above the Water as Child", "It is possible for child to hit the switch from dry land using one of Bombchus, Slingshot or Boomerang. Then, to get to the chest, child can dive through the tunnel using at least the Silver Scale. The timing and positioning of this dive needs to be perfect to actually make it under the gate, and it all needs to be done very quickly to be able to get through before the gate closes. Be sure to enable \"Water Temple Dragon Statue Switch from Above the Water as Adult\" for adult's variant of this trick."); + OPT_TRICK(RT_WATER_MQ_CENTRAL_PILLAR, RCQUEST_MQ, RA_WATER_TEMPLE, {Tricks::Tag::NOVICE}, "Water Temple MQ Central Pillar with Fire Arrows", "Slanted torches have misleading hitboxes. Whenever you see a slanted torch jutting out of the wall, you can expect most or all of its hitbox is actually on the other side that wall. This can make slanted torches very finicky to light when using arrows. The torches in the central pillar of MQ Water Temple are a particularly egregious example. Logic normally expects Din's Fire and Song of Time."); + OPT_TRICK(RT_WATER_MQ_LOCKED_GS, RCQUEST_MQ, RA_WATER_TEMPLE, {Tricks::Tag::NOVICE}, "Water Temple MQ North Basement GS without Small Key", "There is an invisible Hookshot target that can be used to get over the gate that blocks you from going to this Skulltula early, skipping a small key as well as needing Hovers or Scarecrow to reach the locked door."); + OPT_TRICK(RT_LENS_SHADOW, RCQUEST_VANILLA, RA_SHADOW_TEMPLE, {Tricks::Tag::NOVICE}, "Shadow Temple Stationary Objects without Lens of Truth", "Removes the requirements for the Lens of Truth in Shadow Temple for most areas in the dungeon except for crossing the moving platform in the huge pit room and for fighting Bongo Bongo."); + OPT_TRICK(RT_LENS_SHADOW_PLATFORM, RCQUEST_VANILLA, RA_SHADOW_TEMPLE, {Tricks::Tag::NOVICE}, "Shadow Temple Invisible Moving Platform without Lens of Truth", "Removes the requirements for the Lens of Truth in Shadow Temple to cross the invisible moving platform in the huge pit room in either direction."); + OPT_TRICK(RT_LENS_BONGO, RCQUEST_BOTH, RA_SHADOW_TEMPLE, {Tricks::Tag::NOVICE}, "Shadow Temple Bongo Bongo without Lens of Truth", "Bongo Bongo can be defeated without the use of Lens of Truth, as the hands give a pretty good idea of where the eye is."); + OPT_TRICK(RT_SHADOW_UMBRELLA, RCQUEST_BOTH, RA_SHADOW_TEMPLE, {Tricks::Tag::EXPERT}, "Shadow Temple Stone Umbrella Skip", "A very precise Hover Boots movement from off of the lower chest can get you on top of the crushing spikes without needing to pull the block. Applies to both Vanilla and Master Quest."); + OPT_TRICK(RT_SHADOW_UMBRELLA_GS, RCQUEST_BOTH, RA_SHADOW_TEMPLE, {Tricks::Tag::EXPERT}, "Shadow Temple Falling Spikes GS with Hover Boots", "After killing the Skulltula, a very precise Hover Boots movement from off of the lower chest can get you on top of the crushing spikes without needing to pull the block. From there, another very precise Hover Boots movement can be used to obtain the token without needing the Hookshot. Applies to both Vanilla and Master Quest. For obtaining the chests in this room with just Hover Boots, be sure to enable \"Shadow Temple Stone Umbrella Skip\"."); + OPT_TRICK(RT_SHADOW_FREESTANDING_KEY, RCQUEST_VANILLA, RA_SHADOW_TEMPLE, {Tricks::Tag::NOVICE}, "Shadow Temple Freestanding Key with Bombchu", "Release the Bombchu with good timing so that it explodes near the bottom of the pot."); + OPT_TRICK(RT_SHADOW_STATUE, RCQUEST_BOTH, RA_SHADOW_TEMPLE, {Tricks::Tag::INTERMEDIATE}, "Shadow Temple River Statue with Bombchu", "By sending a Bombchu around the edge of the gorge, you can knock down the statue without needing a Bow. Applies in both vanilla and MQ Shadow."); + OPT_TRICK(RT_SHADOW_BONGO, RCQUEST_BOTH, RA_SHADOW_TEMPLE, {Tricks::Tag::INTERMEDIATE}, "Shadow Temple Bongo Bongo without projectiles", "Using precise sword slashes, Bongo Bongo can be defeated without using projectiles. This is only relevant in conjunction with Shadow Temple dungeon shortcuts or shuffled boss entrances."); + OPT_TRICK(RT_LENS_SHADOW_MQ, RCQUEST_MQ, RA_SHADOW_TEMPLE, {Tricks::Tag::NOVICE}, "Shadow Temple MQ Stationary Objects without Lens of Truth", "Removes the requirements for the Lens of Truth in Shadow Temple MQ for most areas in the dungeon. See \"Shadow Temple MQ Invisible Moving Platform without Lens of Truth\", \"Shadow Temple MQ Invisible Blades Silver Rupees without Lens of Truth\", \"Shadow Temple MQ 2nd Dead Hand without Lens of Truth\", and \"Shadow Temple Bongo Bongo without Lens of Truth\" for exceptions."); + OPT_TRICK(RT_LENS_SHADOW_MQ_INVISIBLE_BLADES, RCQUEST_MQ, RA_SHADOW_TEMPLE, {Tricks::Tag::NOVICE}, "Shadow Temple MQ Invisible Blades Silver Rupees without Lens of Truth", "Removes the requirement for the Lens of Truth or Nayru's Love in Shadow Temple MQ for the Invisible Blades room silver rupee collection."); + OPT_TRICK(RT_LENS_SHADOW_MQ_PLATFORM, RCQUEST_MQ, RA_SHADOW_TEMPLE, {Tricks::Tag::NOVICE}, "Shadow Temple MQ Invisible Moving Platform without Lens of Truth", "Removes the requirements for the Lens of Truth in Shadow Temple MQ to cross the invisible moving platform in the huge pit room in either direction."); + OPT_TRICK(RT_LENS_SHADOW_MQ_DEADHAND, RCQUEST_MQ, RA_SHADOW_TEMPLE, {Tricks::Tag::NOVICE}, "Shadow Temple MQ 2nd Dead Hand without Lens of Truth", "Dead Hand spawns in a random spot within the room. Having Lens removes the hassle of having to comb the room looking for his spawn location."); + OPT_TRICK(RT_SHADOW_MQ_GAP, RCQUEST_MQ, RA_SHADOW_TEMPLE, {Tricks::Tag::INTERMEDIATE}, "Shadow Temple MQ Truth Spinner Gap with Longshot", "You can Longshot a torch and jump-slash recoil onto the tongue. It works best if you Longshot the right torch from the left side of the room."); + OPT_TRICK(RT_SHADOW_MQ_INVISIBLE_BLADES, RCQUEST_MQ, RA_SHADOW_TEMPLE, {Tricks::Tag::INTERMEDIATE}, "Shadow Temple MQ Invisible Blades without Song of Time", "The Like Like can be used to boost you into the silver rupee or recovery hearts that normally require Song of Time. This cannot be performed on OHKO since the Like Like does not boost you high enough if you die."); + OPT_TRICK(RT_SHADOW_MQ_HUGE_PIT, RCQUEST_MQ, RA_SHADOW_TEMPLE, {Tricks::Tag::INTERMEDIATE}, "Shadow Temple MQ Lower Huge Pit without Fire Source", "Normally a frozen eye switch spawns some platforms that you can use to climb down, but there's actually a small piece of ground that you can stand on that you can just jump down to."); + OPT_TRICK(RT_SHADOW_MQ_WINDY_WALKWAY, RCQUEST_MQ, RA_SHADOW_TEMPLE, {Tricks::Tag::INTERMEDIATE}, "Shadow Temple MQ Windy Walkway Reverse without Hover Boots", "It is possible to jump from the alcove in the windy hallway to the middle platform. There are two methods: wait out the fan opposite the door and hold forward, or jump to the right to be pushed by the fan there towards the platform ledge. Note that jumps of this distance are inconsistent, but still possible."); + OPT_TRICK(RT_LENS_SPIRIT, RCQUEST_VANILLA, RA_SPIRIT_TEMPLE, {Tricks::Tag::NOVICE}, "Spirit Temple without Lens of Truth", "Removes the requirements for the Lens of Truth in Spirit Temple."); + OPT_TRICK(RT_SPIRIT_CHILD_CHU, RCQUEST_VANILLA, RA_SPIRIT_TEMPLE, {Tricks::Tag::NOVICE}, "Spirit Temple Child Side Bridge with Bombchu", "A carefully-timed Bombchu can hit the switch."); + OPT_TRICK(RT_SPIRIT_LOBBY_GS, RCQUEST_VANILLA, RA_SPIRIT_TEMPLE, {Tricks::Tag::NOVICE}, "Spirit Temple Main Room GS with Boomerang", "Standing on the highest part of the arm of the statue, a precise Boomerang throw can kill and obtain this Gold Skulltula. You must throw the Boomerang slightly off to the side so that it curves into the Skulltula, as aiming directly at it will clank off of the wall in front."); + OPT_TRICK(RT_SPIRIT_LOWER_ADULT_SWITCH, RCQUEST_VANILLA, RA_SPIRIT_TEMPLE, {Tricks::Tag::ADVANCED}, "Spirit Temple Lower Adult Switch with Bombs", "A bomb can be used to hit the switch on the ceiling, but it must be thrown from a particular distance away and with precise timing."); + OPT_TRICK(RT_SPIRIT_LOBBY_JUMP, RCQUEST_BOTH, RA_SPIRIT_TEMPLE, {Tricks::Tag::INTERMEDIATE}, "Spirit Temple Main Room Jump from Hands to Upper Ledges", "A precise jump to obtain the following as adult without needing one of Hover Boots, or Hookshot (in vanilla) or Song of Time (in MQ): - Spirit Temple Statue Room Northeast Chest - Spirit Temple GS Lobby - Spirit Temple MQ Central Chamber Top Left Pot (Left) - Spirit Temple MQ Central Chamber Top Left Pot (Right)"); // disabled since "Spirit Temple boss shortcuts" (pre-lowers the platform where you break the statues face) isn't a setting in ship - // mTrickOptions[RT_SPIRIT_PLATFORM_HOOKSHOT] = TrickOption::LogicTrick(RCQUEST_VANILLA, RA_SPIRIT_TEMPLE, {Tricks::Tag::INTERMEDIATE}, "Spirit Temple Main Room Hookshot to Boss Platform", "Precise hookshot aiming at the platform chains can be used to reach the boss platform from the middle landings. Using a jump slash immediately after reaching a chain makes aiming more lenient. Relevant only when Spirit Temple boss shortcuts are on."); - mTrickOptions[RT_SPIRIT_MAP_CHEST] = TrickOption::LogicTrick(RCQUEST_VANILLA, RA_SPIRIT_TEMPLE, {Tricks::Tag::NOVICE}, "Spirit Temple Map Chest with Bow", "To get a line of sight from the upper torch to the map chest torches, you must pull an Armos statue all the way up the stairs."); - mTrickOptions[RT_SPIRIT_SUN_CHEST] = TrickOption::LogicTrick(RCQUEST_VANILLA, RA_SPIRIT_TEMPLE, {Tricks::Tag::ADVANCED}, "Spirit Temple Sun Block Room Chest with Bow", "Using the blocks in the room as platforms you can get lines of sight to all three torches. The timer on the torches is quite short so you must move quickly in order to light all three."); - mTrickOptions[RT_SPIRIT_WALL] = TrickOption::LogicTrick(RCQUEST_VANILLA, RA_SPIRIT_TEMPLE, {Tricks::Tag::INTERMEDIATE}, "Spirit Temple Shifting Wall with No Additional Items", "Logic normally guarantees a way of dealing with both the Beamos and the Walltula before climbing the wall."); - mTrickOptions[RT_LENS_SPIRIT_MQ] = TrickOption::LogicTrick(RCQUEST_MQ, RA_SPIRIT_TEMPLE, {Tricks::Tag::NOVICE}, "Spirit Temple MQ without Lens of Truth", "Removes the requirements for the Lens of Truth in Spirit Temple MQ."); - mTrickOptions[RT_SPIRIT_MQ_SUN_BLOCK_SOT] = TrickOption::LogicTrick(RCQUEST_MQ, RA_SPIRIT_TEMPLE, {Tricks::Tag::INTERMEDIATE}, "Spirit Temple MQ Sun Block Room as Child without Song of Time", "While adult can easily jump directly to the switch that unbars the door to the sun block room, child Link cannot make the jump without spawning a Song of Time block to jump from. You can skip this by throwing the crate down onto the switch from above, which does unbar the door, however the crate immediately breaks, so you must move quickly to get through the door before it closes back up."); - mTrickOptions[RT_SPIRIT_MQ_SUN_BLOCK_GS] = TrickOption::LogicTrick(RCQUEST_MQ, RA_SPIRIT_TEMPLE, {Tricks::Tag::INTERMEDIATE}, "Spirit Temple MQ Sun Block Room GS with Boomerang", "Throw the Boomerang in such a way that it curves through the side of the glass block to hit the Gold Skulltula."); - mTrickOptions[RT_SPIRIT_MQ_LOWER_ADULT] = TrickOption::LogicTrick(RCQUEST_MQ, RA_SPIRIT_TEMPLE, {Tricks::Tag::INTERMEDIATE}, "Spirit Temple MQ Lower Adult without Fire Arrows", "By standing in a precise position it is possible to light two of the torches with a single use of Din\'s Fire. This saves enough time to be able to light all three torches with only Din\'s."); - mTrickOptions[RT_SPIRIT_MQ_FROZEN_EYE] = TrickOption::LogicTrick(RCQUEST_MQ, RA_SPIRIT_TEMPLE, {Tricks::Tag::NOVICE}, "Spirit Temple MQ Frozen Eye Switch without Fire", "You can melt the ice by shooting an arrow through a torch. The only way to find a line of sight for this shot is to first spawn a Song of Time block, and then stand on the very edge of it."); - mTrickOptions[RT_ICE_BLOCK_GS] = TrickOption::LogicTrick(RCQUEST_VANILLA, RA_ICE_CAVERN, {Tricks::Tag::INTERMEDIATE}, "Ice Cavern Block Room GS with Hover Boots", "The Hover Boots can be used to get in front of the Skulltula to kill it with a jump slash. Then, the Hover Boots can again be used to obtain the Token, all without Hookshot or Boomerang."); - mTrickOptions[RT_ICE_MQ_RED_ICE_GS] = TrickOption::LogicTrick(RCQUEST_MQ, RA_ICE_CAVERN, {Tricks::Tag::INTERMEDIATE}, "Ice Cavern MQ Red Ice GS without Song of Time", "If you side-hop into the perfect position, you can briefly stand on the platform with the red ice just long enough to dump some blue fire."); - mTrickOptions[RT_ICE_MQ_SCARECROW] = TrickOption::LogicTrick(RCQUEST_MQ, RA_ICE_CAVERN, {Tricks::Tag::INTERMEDIATE}, "Ice Cavern MQ Scarecrow GS with No Additional Items", "As adult a precise jump can be used to reach this alcove."); - mTrickOptions[RT_LENS_GTG] = TrickOption::LogicTrick(RCQUEST_VANILLA, RA_GERUDO_TRAINING_GROUND, {Tricks::Tag::NOVICE}, "Gerudo Training Ground without Lens of Truth", "Removes the requirements for the Lens of Truth in Gerudo Training Ground."); - mTrickOptions[RT_GTG_WITHOUT_HOOKSHOT] = TrickOption::LogicTrick(RCQUEST_VANILLA, RA_GERUDO_TRAINING_GROUND, {Tricks::Tag::INTERMEDIATE}, "Gerudo Training Ground Left Side Silver Rupees without Hookshot", "After collecting the rest of the silver rupees in the room, you can reach the final silver rupee on the ceiling by being pulled up into it after getting grabbed by the Wallmaster. Then, you must also reach the exit of the room without the use of the Hookshot. If you move quickly you can sneak past the edge of a flame wall before it can rise up to block you. To do so without taking damage is more precise."); - mTrickOptions[RT_GTG_FAKE_WALL] = TrickOption::LogicTrick(RCQUEST_BOTH, RA_GERUDO_TRAINING_GROUND, {Tricks::Tag::NOVICE}, "Reach Gerudo Training Ground Fake Wall Ledge with Hover Boots", "A precise Hover Boots use from the top of the chest can allow you to grab the ledge without needing the usual requirements. In Master Quest, this always skips a Song of Time requirement. In Vanilla, this skips a Hookshot requirement, but is only relevant if \"Gerudo Training Ground Left Side Silver Rupees without Hookshot\" is enabled."); - mTrickOptions[RT_LENS_GTG_MQ] = TrickOption::LogicTrick(RCQUEST_MQ, RA_GERUDO_TRAINING_GROUND, {Tricks::Tag::NOVICE}, "Gerudo Training Ground MQ without Lens of Truth", "Removes the requirements for the Lens of Truth in Gerudo Training Ground MQ."); - mTrickOptions[RT_GTG_MQ_WITH_HOOKSHOT] = TrickOption::LogicTrick(RCQUEST_MQ, RA_GERUDO_TRAINING_GROUND, {Tricks::Tag::NOVICE}, "Gerudo Training Ground MQ Left Side Silver Rupees with Hookshot", "The highest silver rupee can be obtained by hookshotting the target and then immediately jump slashing toward the rupee."); - mTrickOptions[RT_GTG_MQ_WIHTOUT_HOOKSHOT] = TrickOption::LogicTrick(RCQUEST_MQ, RA_GERUDO_TRAINING_GROUND, {Tricks::Tag::INTERMEDIATE}, "Gerudo Training Ground MQ Left Side Silver Rupees without Hookshot", "After collecting the rest of the silver rupees in the room, you can reach the final silver rupee on the ceiling by being pulled up into it after getting grabbed by the Wallmaster. The Wallmaster will not track you to directly underneath the rupee. You should take the last step to be under the rupee after the Wallmaster has begun its attempt to grab you. Also included with this trick is that fact that the switch that unbars the door to the final chest of GTG can be hit without a projectile, using a precise jump slash. This trick supersedes \"Gerudo Training Ground MQ Left Side Silver Rupees with Hookshot\"."); - mTrickOptions[RT_LENS_GANON] = TrickOption::LogicTrick(RCQUEST_VANILLA, RA_GANONS_CASTLE, {Tricks::Tag::NOVICE}, "Ganon\'s Castle without Lens of Truth", "Removes the requirements for the Lens of Truth in Ganon's Castle."); - mTrickOptions[RT_GANON_SPIRIT_TRIAL_HOOKSHOT] = TrickOption::LogicTrick(RCQUEST_VANILLA, RA_GANONS_CASTLE, {Tricks::Tag::NOVICE}, "Spirit Trial without Hookshot", "The highest rupee can be obtained as either age by performing a precise jump and a well-timed jumpslash off of an Armos."); - mTrickOptions[RT_LENS_GANON_MQ] = TrickOption::LogicTrick(RCQUEST_MQ, RA_GANONS_CASTLE, {Tricks::Tag::NOVICE}, "Ganon\'s Castle MQ without Lens of Truth", "Removes the requirements for the Lens of Truth in Ganon's Castle MQ."); - mTrickOptions[RT_GANON_MQ_FIRE_TRIAL] = TrickOption::LogicTrick(RCQUEST_MQ, RA_GANONS_CASTLE, {Tricks::Tag::ADVANCED}, "Fire Trial MQ with Hookshot", "It's possible to hook the target at the end of fire trial with just Hookshot, but it requires precise aim and perfect positioning. The main difficulty comes from getting on the very corner of the obelisk without falling into the lava."); - mTrickOptions[RT_GANON_MQ_SHADOW_TRIAL] = TrickOption::LogicTrick(RCQUEST_MQ, RA_GANONS_CASTLE, {Tricks::Tag::NOVICE}, "Shadow Trial MQ Torch with Bow", "You can light the torch in this room without a fire source by shooting an arrow through the lit torch at the beginning of the room. Because the room is so dark and the unlit torch is so far away, it can be difficult to aim the shot correctly."); - mTrickOptions[RT_GANON_MQ_LIGHT_TRIAL] = TrickOption::LogicTrick(RCQUEST_MQ, RA_GANONS_CASTLE, {Tricks::Tag::INTERMEDIATE}, "Light Trial MQ without Hookshot", "If you move quickly you can sneak past the edge of a flame wall before it can rise up to block you. In this case to do it without taking damage is especially precise."); + // OPT_TRICK(RT_SPIRIT_PLATFORM_HOOKSHOT, RCQUEST_VANILLA, RA_SPIRIT_TEMPLE, {Tricks::Tag::INTERMEDIATE}, "Spirit Temple Main Room Hookshot to Boss Platform", "Precise hookshot aiming at the platform chains can be used to reach the boss platform from the middle landings. Using a jump slash immediately after reaching a chain makes aiming more lenient. Relevant only when Spirit Temple boss shortcuts are on."); + OPT_TRICK(RT_SPIRIT_MAP_CHEST, RCQUEST_VANILLA, RA_SPIRIT_TEMPLE, {Tricks::Tag::NOVICE}, "Spirit Temple Map Chest with Bow", "To get a line of sight from the upper torch to the map chest torches, you must pull an Armos statue all the way up the stairs."); + OPT_TRICK(RT_SPIRIT_SUN_CHEST, RCQUEST_VANILLA, RA_SPIRIT_TEMPLE, {Tricks::Tag::ADVANCED}, "Spirit Temple Sun Block Room Chest with Bow", "Using the blocks in the room as platforms you can get lines of sight to all three torches. The timer on the torches is quite short so you must move quickly in order to light all three."); + OPT_TRICK(RT_SPIRIT_WALL, RCQUEST_VANILLA, RA_SPIRIT_TEMPLE, {Tricks::Tag::INTERMEDIATE}, "Spirit Temple Shifting Wall with No Additional Items", "Logic normally guarantees a way of dealing with both the Beamos and the Walltula before climbing the wall."); + OPT_TRICK(RT_LENS_SPIRIT_MQ, RCQUEST_MQ, RA_SPIRIT_TEMPLE, {Tricks::Tag::NOVICE}, "Spirit Temple MQ without Lens of Truth", "Removes the requirements for the Lens of Truth in Spirit Temple MQ."); + OPT_TRICK(RT_SPIRIT_MQ_SUN_BLOCK_SOT, RCQUEST_MQ, RA_SPIRIT_TEMPLE, {Tricks::Tag::INTERMEDIATE}, "Spirit Temple MQ Sun Block Room as Child without Song of Time", "While adult can easily jump directly to the switch that unbars the door to the sun block room, child Link cannot make the jump without spawning a Song of Time block to jump from. You can skip this by throwing the crate down onto the switch from above, which does unbar the door, however the crate immediately breaks, so you must move quickly to get through the door before it closes back up."); + OPT_TRICK(RT_SPIRIT_MQ_SUN_BLOCK_GS, RCQUEST_MQ, RA_SPIRIT_TEMPLE, {Tricks::Tag::INTERMEDIATE}, "Spirit Temple MQ Sun Block Room GS with Boomerang", "Throw the Boomerang in such a way that it curves through the side of the glass block to hit the Gold Skulltula."); + OPT_TRICK(RT_SPIRIT_MQ_LOWER_ADULT, RCQUEST_MQ, RA_SPIRIT_TEMPLE, {Tricks::Tag::INTERMEDIATE}, "Spirit Temple MQ Lower Adult without Fire Arrows", "By standing in a precise position it is possible to light two of the torches with a single use of Din\'s Fire. This saves enough time to be able to light all three torches with only Din\'s."); + OPT_TRICK(RT_SPIRIT_MQ_FROZEN_EYE, RCQUEST_MQ, RA_SPIRIT_TEMPLE, {Tricks::Tag::NOVICE}, "Spirit Temple MQ Frozen Eye Switch without Fire", "You can melt the ice by shooting an arrow through a torch. The only way to find a line of sight for this shot is to first spawn a Song of Time block, and then stand on the very edge of it."); + OPT_TRICK(RT_ICE_BLOCK_GS, RCQUEST_VANILLA, RA_ICE_CAVERN, {Tricks::Tag::INTERMEDIATE}, "Ice Cavern Block Room GS with Hover Boots", "The Hover Boots can be used to get in front of the Skulltula to kill it with a jump slash. Then, the Hover Boots can again be used to obtain the Token, all without Hookshot or Boomerang."); + OPT_TRICK(RT_ICE_MQ_RED_ICE_GS, RCQUEST_MQ, RA_ICE_CAVERN, {Tricks::Tag::INTERMEDIATE}, "Ice Cavern MQ Red Ice GS without Song of Time", "If you side-hop into the perfect position, you can briefly stand on the platform with the red ice just long enough to dump some blue fire."); + OPT_TRICK(RT_ICE_MQ_SCARECROW, RCQUEST_MQ, RA_ICE_CAVERN, {Tricks::Tag::INTERMEDIATE}, "Ice Cavern MQ Scarecrow GS with No Additional Items", "As adult a precise jump can be used to reach this alcove."); + OPT_TRICK(RT_LENS_GTG, RCQUEST_VANILLA, RA_GERUDO_TRAINING_GROUND, {Tricks::Tag::NOVICE}, "Gerudo Training Ground without Lens of Truth", "Removes the requirements for the Lens of Truth in Gerudo Training Ground."); + OPT_TRICK(RT_GTG_WITHOUT_HOOKSHOT, RCQUEST_VANILLA, RA_GERUDO_TRAINING_GROUND, {Tricks::Tag::INTERMEDIATE}, "Gerudo Training Ground Left Side Silver Rupees without Hookshot", "After collecting the rest of the silver rupees in the room, you can reach the final silver rupee on the ceiling by being pulled up into it after getting grabbed by the Wallmaster. Then, you must also reach the exit of the room without the use of the Hookshot. If you move quickly you can sneak past the edge of a flame wall before it can rise up to block you. To do so without taking damage is more precise."); + OPT_TRICK(RT_GTG_FAKE_WALL, RCQUEST_BOTH, RA_GERUDO_TRAINING_GROUND, {Tricks::Tag::NOVICE}, "Reach Gerudo Training Ground Fake Wall Ledge with Hover Boots", "A precise Hover Boots use from the top of the chest can allow you to grab the ledge without needing the usual requirements. In Master Quest, this always skips a Song of Time requirement. In Vanilla, this skips a Hookshot requirement, but is only relevant if \"Gerudo Training Ground Left Side Silver Rupees without Hookshot\" is enabled."); + OPT_TRICK(RT_LENS_GTG_MQ, RCQUEST_MQ, RA_GERUDO_TRAINING_GROUND, {Tricks::Tag::NOVICE}, "Gerudo Training Ground MQ without Lens of Truth", "Removes the requirements for the Lens of Truth in Gerudo Training Ground MQ."); + OPT_TRICK(RT_GTG_MQ_WITH_HOOKSHOT, RCQUEST_MQ, RA_GERUDO_TRAINING_GROUND, {Tricks::Tag::NOVICE}, "Gerudo Training Ground MQ Left Side Silver Rupees with Hookshot", "The highest silver rupee can be obtained by hookshotting the target and then immediately jump slashing toward the rupee."); + OPT_TRICK(RT_GTG_MQ_WIHTOUT_HOOKSHOT, RCQUEST_MQ, RA_GERUDO_TRAINING_GROUND, {Tricks::Tag::INTERMEDIATE}, "Gerudo Training Ground MQ Left Side Silver Rupees without Hookshot", "After collecting the rest of the silver rupees in the room, you can reach the final silver rupee on the ceiling by being pulled up into it after getting grabbed by the Wallmaster. The Wallmaster will not track you to directly underneath the rupee. You should take the last step to be under the rupee after the Wallmaster has begun its attempt to grab you. Also included with this trick is that fact that the switch that unbars the door to the final chest of GTG can be hit without a projectile, using a precise jump slash. This trick supersedes \"Gerudo Training Ground MQ Left Side Silver Rupees with Hookshot\"."); + OPT_TRICK(RT_LENS_GANON, RCQUEST_VANILLA, RA_GANONS_CASTLE, {Tricks::Tag::NOVICE}, "Ganon\'s Castle without Lens of Truth", "Removes the requirements for the Lens of Truth in Ganon's Castle."); + OPT_TRICK(RT_GANON_SPIRIT_TRIAL_HOOKSHOT, RCQUEST_VANILLA, RA_GANONS_CASTLE, {Tricks::Tag::NOVICE}, "Spirit Trial without Hookshot", "The highest rupee can be obtained as either age by performing a precise jump and a well-timed jumpslash off of an Armos."); + OPT_TRICK(RT_LENS_GANON_MQ, RCQUEST_MQ, RA_GANONS_CASTLE, {Tricks::Tag::NOVICE}, "Ganon\'s Castle MQ without Lens of Truth", "Removes the requirements for the Lens of Truth in Ganon's Castle MQ."); + OPT_TRICK(RT_GANON_MQ_FIRE_TRIAL, RCQUEST_MQ, RA_GANONS_CASTLE, {Tricks::Tag::ADVANCED}, "Fire Trial MQ with Hookshot", "It's possible to hook the target at the end of fire trial with just Hookshot, but it requires precise aim and perfect positioning. The main difficulty comes from getting on the very corner of the obelisk without falling into the lava."); + OPT_TRICK(RT_GANON_MQ_SHADOW_TRIAL, RCQUEST_MQ, RA_GANONS_CASTLE, {Tricks::Tag::NOVICE}, "Shadow Trial MQ Torch with Bow", "You can light the torch in this room without a fire source by shooting an arrow through the lit torch at the beginning of the room. Because the room is so dark and the unlit torch is so far away, it can be difficult to aim the shot correctly."); + OPT_TRICK(RT_GANON_MQ_LIGHT_TRIAL, RCQUEST_MQ, RA_GANONS_CASTLE, {Tricks::Tag::INTERMEDIATE}, "Light Trial MQ without Hookshot", "If you move quickly you can sneak past the edge of a flame wall before it can rise up to block you. In this case to do it without taking damage is especially precise."); mOptionGroups[RSG_LOGIC] = OptionGroup::SubGroup("Logic Options", { &mOptions[RSK_LOGIC_RULES], @@ -531,190 +539,18 @@ void Settings::CreateOptions() { &mOptions[RSK_SKULLS_SUNS_SONG], }); // TODO: Exclude Locations Menus - mOptionGroups[RSG_TRICKS] = OptionGroup::SubGroup("Logical Tricks", { - &mTrickOptions[RT_VISIBLE_COLLISION], - &mTrickOptions[RT_GROTTOS_WITHOUT_AGONY], - &mTrickOptions[RT_FEWER_TUNIC_REQUIREMENTS], - &mTrickOptions[RT_RUSTED_SWITCHES], - &mTrickOptions[RT_FLAMING_CHESTS], - &mTrickOptions[RT_BUNNY_HOOD_JUMPS], - &mTrickOptions[RT_DAMAGE_BOOST_SIMPLE], - &mTrickOptions[RT_HOVER_BOOST_SIMPLE], - &mTrickOptions[RT_KF_ADULT_GS], - &mTrickOptions[RT_LW_BRIDGE], - &mTrickOptions[RT_LW_MIDO_BACKFLIP], - &mTrickOptions[RT_LW_GS_BEAN], - &mTrickOptions[RT_HC_STORMS_GS], - &mTrickOptions[RT_KAK_MAN_ON_ROOF], - &mTrickOptions[RT_KAK_TOWER_GS], - &mTrickOptions[RT_KAK_ADULT_WINDMILL_POH], - &mTrickOptions[RT_KAK_CHILD_WINDMILL_POH], - &mTrickOptions[RT_KAK_ROOFTOP_GS], - &mTrickOptions[RT_GY_POH], - &mTrickOptions[RT_GY_CHILD_DAMPE_RACE_POH], - &mTrickOptions[RT_GY_SHADOW_FIRE_ARROWS], - &mTrickOptions[RT_DMT_SOIL_GS], - &mTrickOptions[RT_DMT_BOMBABLE], - &mTrickOptions[RT_DMT_HOOKSHOT_LOWER_GS], - &mTrickOptions[RT_DMT_HOVERS_LOWER_GS], - &mTrickOptions[RT_DMT_BEAN_LOWER_GS], - &mTrickOptions[RT_DMT_JS_LOWER_GS], - &mTrickOptions[RT_DMT_CLIMB_HOVERS], - &mTrickOptions[RT_DMT_UPPER_GS], - &mTrickOptions[RT_DMT_BOLERO_BIGGORON], - &mTrickOptions[RT_GC_POT], - &mTrickOptions[RT_GC_POT_STRENGTH], - &mTrickOptions[RT_GC_ROLLING_STRENGTH], - &mTrickOptions[RT_GC_LEFTMOST], - &mTrickOptions[RT_GC_GROTTO], - &mTrickOptions[RT_GC_LINK_GORON_DINS], - &mTrickOptions[RT_DMC_HOVER_BEAN_POH], - &mTrickOptions[RT_DMC_BOLERO_JUMP], - &mTrickOptions[RT_DMC_BOULDER_JS], - &mTrickOptions[RT_DMC_BOULDER_SKIP], - &mTrickOptions[RT_ZR_LOWER], - &mTrickOptions[RT_ZR_UPPER], - &mTrickOptions[RT_ZR_HOVERS], - &mTrickOptions[RT_ZR_CUCCO], - &mTrickOptions[RT_ZD_KING_ZORA_SKIP], - &mTrickOptions[RT_ZD_GS], - &mTrickOptions[RT_ZF_GREAT_FAIRY_WITHOUT_EXPLOSIVES], - &mTrickOptions[RT_LH_LAB_WALL_GS], - &mTrickOptions[RT_LH_LAB_DIVING], - &mTrickOptions[RT_LH_WATER_HOOKSHOT], - &mTrickOptions[RT_GV_CRATE_HOVERS], - &mTrickOptions[RT_GF_KITCHEN], - &mTrickOptions[RT_GF_JUMP], - &mTrickOptions[RT_HW_BUNNY_CROSSING], - &mTrickOptions[RT_HW_CROSSING], - &mTrickOptions[RT_LENS_HW], - &mTrickOptions[RT_HW_REVERSE], - &mTrickOptions[RT_COLOSSUS_GS], - &mTrickOptions[RT_DEKU_BASEMENT_GS], - &mTrickOptions[RT_DEKU_B1_SKIP], - &mTrickOptions[RT_DEKU_B1_BOW_WEBS], - &mTrickOptions[RT_DEKU_B1_BACKFLIP_OVER_SPIKED_LOG], - &mTrickOptions[RT_DEKU_MQ_COMPASS_GS], - &mTrickOptions[RT_DEKU_MQ_LOG], - &mTrickOptions[RT_DC_SCARECROW_GS], - &mTrickOptions[RT_DC_VINES_GS], - &mTrickOptions[RT_DC_STAIRCASE], - &mTrickOptions[RT_DC_SLINGSHOT_SKIP], - &mTrickOptions[RT_DC_SCRUB_ROOM], - &mTrickOptions[RT_DC_JUMP], - &mTrickOptions[RT_DC_HAMMER_FLOOR], - &mTrickOptions[RT_DC_MQ_CHILD_BOMBS], - &mTrickOptions[RT_DC_MQ_CHILD_EYES], - &mTrickOptions[RT_DC_MQ_ADULT_EYES], - &mTrickOptions[RT_JABU_ALCOVE_JUMP_DIVE], - &mTrickOptions[RT_JABU_BOSS_HOVER], - &mTrickOptions[RT_JABU_NEAR_BOSS_RANGED], - &mTrickOptions[RT_JABU_NEAR_BOSS_EXPLOSIVES], - &mTrickOptions[RT_LENS_JABU_MQ], - &mTrickOptions[RT_JABU_MQ_RANG_JUMP], - &mTrickOptions[RT_JABU_MQ_SOT_GS], - &mTrickOptions[RT_LENS_BOTW], - &mTrickOptions[RT_BOTW_CHILD_DEADHAND], - &mTrickOptions[RT_BOTW_BASEMENT], - &mTrickOptions[RT_BOTW_MQ_PITS], - &mTrickOptions[RT_BOTW_MQ_DEADHAND_KEY], - &mTrickOptions[RT_FOREST_FIRST_GS], - &mTrickOptions[RT_FOREST_OUTDOORS_EAST_GS], - &mTrickOptions[RT_FOREST_VINES], - &mTrickOptions[RT_FOREST_OUTDOORS_LEDGE], - &mTrickOptions[RT_FOREST_DOORFRAME], - &mTrickOptions[RT_FOREST_OUTSIDE_BACKDOOR], - &mTrickOptions[RT_FOREST_OUTDOORS_HEARTS_BOOMERANG], - &mTrickOptions[RT_FOREST_MQ_WELL_SWIM], - &mTrickOptions[RT_FOREST_MQ_BLOCK_PUZZLE], - &mTrickOptions[RT_FOREST_MQ_JS_HALLWAY_SWITCH], - &mTrickOptions[RT_FOREST_MQ_HOOKSHOT_HALLWAY_SWITCH], - &mTrickOptions[RT_FOREST_MQ_RANG_HALLWAY_SWITCH], - &mTrickOptions[RT_FIRE_BOSS_DOOR_JUMP], - &mTrickOptions[RT_FIRE_SOT], - &mTrickOptions[RT_FIRE_STRENGTH], - &mTrickOptions[RT_FIRE_SCARECROW], - &mTrickOptions[RT_FIRE_FLAME_MAZE], - &mTrickOptions[RT_FIRE_MQ_NEAR_BOSS], - &mTrickOptions[RT_FIRE_MQ_BLOCKED_CHEST], - &mTrickOptions[RT_FIRE_MQ_BK_CHEST], - &mTrickOptions[RT_FIRE_MQ_CLIMB], - &mTrickOptions[RT_FIRE_MQ_MAZE_SIDE_ROOM], - &mTrickOptions[RT_FIRE_MQ_MAZE_HOVERS], - &mTrickOptions[RT_FIRE_MQ_MAZE_JUMP], - &mTrickOptions[RT_FIRE_MQ_ABOVE_MAZE_GS], - &mTrickOptions[RT_FIRE_MQ_FLAME_MAZE], - &mTrickOptions[RT_WATER_LONGSHOT_TORCH], - &mTrickOptions[RT_WATER_CRACKED_WALL_HOVERS], - &mTrickOptions[RT_WATER_CRACKED_WALL], - &mTrickOptions[RT_WATER_BK_REGION], - &mTrickOptions[RT_WATER_NORTH_BASEMENT_LEDGE_JUMP], - &mTrickOptions[RT_WATER_BK_JUMP_DIVE], - &mTrickOptions[RT_WATER_FW_CENTRAL_GS], - &mTrickOptions[RT_WATER_IRONS_CENTRAL_GS], - &mTrickOptions[RT_WATER_CENTRAL_BOW], - &mTrickOptions[RT_WATER_HOOKSHOT_FALLING_PLATFORM_GS], - &mTrickOptions[RT_WATER_RANG_FALLING_PLATFORM_GS], - &mTrickOptions[RT_WATER_RIVER_GS], - &mTrickOptions[RT_WATER_DRAGON_JUMP_DIVE], - &mTrickOptions[RT_WATER_ADULT_DRAGON], - &mTrickOptions[RT_WATER_CHILD_DRAGON], - &mTrickOptions[RT_WATER_MQ_CENTRAL_PILLAR], - &mTrickOptions[RT_WATER_MQ_LOCKED_GS], - &mTrickOptions[RT_LENS_SHADOW], - &mTrickOptions[RT_LENS_SHADOW_PLATFORM], - &mTrickOptions[RT_LENS_BONGO], - &mTrickOptions[RT_SHADOW_UMBRELLA], - &mTrickOptions[RT_SHADOW_UMBRELLA_GS], - &mTrickOptions[RT_SHADOW_FREESTANDING_KEY], - &mTrickOptions[RT_SHADOW_STATUE], - &mTrickOptions[RT_SHADOW_BONGO], - &mTrickOptions[RT_LENS_SHADOW_MQ], - &mTrickOptions[RT_LENS_SHADOW_MQ_INVISIBLE_BLADES], - &mTrickOptions[RT_LENS_SHADOW_MQ_PLATFORM], - &mTrickOptions[RT_LENS_SHADOW_MQ_DEADHAND], - &mTrickOptions[RT_SHADOW_MQ_GAP], - &mTrickOptions[RT_SHADOW_MQ_INVISIBLE_BLADES], - &mTrickOptions[RT_SHADOW_MQ_HUGE_PIT], - &mTrickOptions[RT_SHADOW_MQ_WINDY_WALKWAY], - &mTrickOptions[RT_LENS_SPIRIT], - &mTrickOptions[RT_SPIRIT_CHILD_CHU], - &mTrickOptions[RT_SPIRIT_LOBBY_GS], - &mTrickOptions[RT_SPIRIT_LOWER_ADULT_SWITCH], - &mTrickOptions[RT_SPIRIT_LOBBY_JUMP], - &mTrickOptions[RT_SPIRIT_PLATFORM_HOOKSHOT], - &mTrickOptions[RT_SPIRIT_MAP_CHEST], - &mTrickOptions[RT_SPIRIT_SUN_CHEST], - &mTrickOptions[RT_SPIRIT_WALL], - &mTrickOptions[RT_LENS_SPIRIT_MQ], - &mTrickOptions[RT_SPIRIT_MQ_SUN_BLOCK_SOT], - &mTrickOptions[RT_SPIRIT_MQ_SUN_BLOCK_GS], - &mTrickOptions[RT_SPIRIT_MQ_LOWER_ADULT], - &mTrickOptions[RT_SPIRIT_MQ_FROZEN_EYE], - &mTrickOptions[RT_ICE_BLOCK_GS], - &mTrickOptions[RT_ICE_MQ_RED_ICE_GS], - &mTrickOptions[RT_ICE_MQ_SCARECROW], - &mTrickOptions[RT_LENS_GTG], - &mTrickOptions[RT_GTG_WITHOUT_HOOKSHOT], - &mTrickOptions[RT_GTG_FAKE_WALL], - &mTrickOptions[RT_LENS_GTG_MQ], - &mTrickOptions[RT_GTG_MQ_WITH_HOOKSHOT], - &mTrickOptions[RT_GTG_MQ_WIHTOUT_HOOKSHOT], - &mTrickOptions[RT_LENS_GANON], - &mTrickOptions[RT_GANON_SPIRIT_TRIAL_HOOKSHOT], - &mTrickOptions[RT_LENS_GANON_MQ], - &mTrickOptions[RT_GANON_MQ_FIRE_TRIAL], - &mTrickOptions[RT_GANON_MQ_SHADOW_TRIAL], - &mTrickOptions[RT_GANON_MQ_LIGHT_TRIAL], - }); mTricksByArea.clear(); + std::vector tricksOption; + tricksOption.reserve(mTrickOptions.size()); for (int i = 0; i < RT_MAX; i++) { - auto& trick = mTrickOptions[i]; - if (!trick.GetName().empty()) { - mTrickNameToEnum[std::string(trick.GetName())] = static_cast(i); + auto trick = &mTrickOptions[i]; + if (!trick->GetName().empty()) { + tricksOption.push_back(trick); + mTrickNameToEnum[std::string(trick->GetName())] = static_cast(i); + mTricksByArea[trick->GetArea()].push_back(static_cast(i)); } - mTricksByArea[trick.GetArea()].push_back(static_cast(i)); } + mOptionGroups[RSG_TRICKS] = OptionGroup::SubGroup("Logical Tricks", tricksOption); // TODO: Glitches mOptionGroups[RSG_AREA_ACCESS_IMGUI] = OptionGroup::SubGroup("Area Access", { &mOptions[RSK_FOREST], @@ -722,6 +558,7 @@ void Settings::CreateOptions() { &mOptions[RSK_DOOR_OF_TIME], &mOptions[RSK_ZORAS_FOUNTAIN], &mOptions[RSK_SLEEPING_WATERFALL], + &mOptions[RSK_LOCK_OVERWORLD_DOORS], }, WidgetContainerType::COLUMN); mOptionGroups[RSG_WORLD_IMGUI] = OptionGroup::SubGroup("World Settings", { &mOptions[RSK_STARTING_AGE], @@ -874,7 +711,6 @@ void Settings::CreateOptions() { mOptionGroups[RSG_TIMESAVERS_IMGUI] = OptionGroup::SubGroup("Timesavers", { &mOptions[RSK_CUCCO_COUNT], &mOptions[RSK_BIG_POE_COUNT], - &mOptions[RSK_SKIP_CHILD_STEALTH], &mOptions[RSK_SKIP_CHILD_ZELDA], &mOptions[RSK_SKIP_EPONA_RACE], &mOptions[RSK_COMPLETE_MASK_QUEST], @@ -920,7 +756,7 @@ void Settings::CreateOptions() { }, WidgetContainerType::COLUMN); mOptionGroups[RSG_ADDITIONAL_FEATURES_IMGUI] = OptionGroup::SubGroup("Additional Features", { &mOptions[RSK_FULL_WALLETS], - &mOptions[RSK_BOMBCHUS_IN_LOGIC], + &mOptions[RSK_BOMBCHU_BAG], &mOptions[RSK_ENABLE_BOMBCHU_DROPS], &mOptions[RSK_BLUE_FIRE_ARROWS], &mOptions[RSK_SUNLIGHT_ARROWS], @@ -976,6 +812,7 @@ void Settings::CreateOptions() { &mOptions[RSK_DOOR_OF_TIME], &mOptions[RSK_ZORAS_FOUNTAIN], &mOptions[RSK_SLEEPING_WATERFALL], + &mOptions[RSK_LOCK_OVERWORLD_DOORS], &mOptions[RSK_GERUDO_FORTRESS], &mOptions[RSK_RAINBOW_BRIDGE], &mOptions[RSK_RAINBOW_BRIDGE_STONE_COUNT], @@ -1005,7 +842,7 @@ void Settings::CreateOptions() { &mOptions[RSK_MIX_INTERIOR_ENTRANCES], &mOptions[RSK_MIX_GROTTO_ENTRANCES], &mOptions[RSK_DECOUPLED_ENTRANCES], - &mOptions[RSK_BOMBCHUS_IN_LOGIC], + &mOptions[RSK_BOMBCHU_BAG], &mOptions[RSK_ENABLE_BOMBCHU_DROPS], &mOptions[RSK_TRIFORCE_HUNT], &mOptions[RSK_TRIFORCE_HUNT_PIECES_TOTAL], @@ -1147,14 +984,12 @@ void Settings::CreateOptions() { &mOptionGroups[RSG_STARTING_OTHER], }, OptionGroupType::DEFAULT); mOptionGroups[RSG_TIMESAVERS] = OptionGroup("Timesaver Settings", { - &mOptions[RSK_SKIP_CHILD_STEALTH], &mOptions[RSK_SKIP_CHILD_ZELDA], &mOptions[RSK_SKIP_EPONA_RACE], &mOptions[RSK_SKIP_SCARECROWS_SONG], &mOptions[RSK_BIG_POE_COUNT], &mOptions[RSK_CUCCO_COUNT], &mOptions[RSK_COMPLETE_MASK_QUEST], - &mOptions[RSK_ENABLE_GLITCH_CUTSCENES], }); mOptionGroups[RSG_MISC] = OptionGroup("Miscellaneous Settings", { &mOptions[RSK_GOSSIP_STONE_HINTS], @@ -1268,30 +1103,6 @@ void Settings::CreateOptions() { &mOptionGroups[RSG_TRICKS], &mOptionGroups[RSG_EXCLUDES] }); - - VanillaLogicDefaults = {//RANDOTODO check what this does - &mOptions[RSK_LINKS_POCKET], - &mOptions[RSK_SHUFFLE_DUNGEON_REWARDS], - &mOptions[RSK_SHUFFLE_SONGS], - &mOptions[RSK_SHOPSANITY], - &mOptions[RSK_SHOPSANITY_COUNT], - &mOptions[RSK_SHOPSANITY_PRICES], - &mOptions[RSK_SHOPSANITY_PRICES_AFFORDABLE], - &mOptions[RSK_FISHSANITY], - &mOptions[RSK_FISHSANITY_POND_COUNT], - &mOptions[RSK_FISHSANITY_AGE_SPLIT], - &mOptions[RSK_SHUFFLE_SCRUBS], - &mOptions[RSK_SHUFFLE_BEEHIVES], - &mOptions[RSK_SHUFFLE_COWS], - &mOptions[RSK_SHUFFLE_POTS], - &mOptions[RSK_SHUFFLE_FREESTANDING], - &mOptions[RSK_SHUFFLE_MERCHANTS], - &mOptions[RSK_SHUFFLE_FROG_SONG_RUPEES], - &mOptions[RSK_SHUFFLE_ADULT_TRADE], - &mOptions[RSK_SHUFFLE_100_GS_REWARD], - &mOptions[RSK_SHUFFLE_FAIRIES], - &mOptions[RSK_GOSSIP_STONE_HINTS], - }; } std::unordered_map Settings::PopulateOptionNameToEnum(){ @@ -1310,9 +1121,9 @@ TrickOption& Settings::GetTrickOption(const RandomizerTrick key) { return mTrickOptions[key]; } -void Settings::ResetTrickOptions() { +void Context::ResetTrickOptions() { for (int count = 0; count < RT_MAX; count++){ - mTrickOptions[count].SetContextIndex(0); //RANDOTODO this can probably be done better + mTrickOptions[count].Set(0); //RANDOTODO this can probably be done better }; } @@ -1328,38 +1139,6 @@ const std::vector>& Settings::GetExcludeLocationsOptions() return mExcludeLocationsOptionsAreas; } -RandoOptionStartingAge Settings::ResolvedStartingAge() const { - return mResolvedStartingAge; -} - -RandoOptionLACSCondition Settings::LACSCondition() const { - return mLACSCondition; -} - -std::string Settings::GetHash() const { - return mHash; -} - -void Settings::SetHash(std::string hash) { - mHash = std::move(hash); -} - -const std::string& Settings::GetSeedString() const { - return mSeedString; -} - -void Settings::SetSeedString(std::string seedString) { - mSeedString = std::move(seedString); -} - -uint32_t Settings::GetSeed() const { - return mFinalSeed; -} - -void Settings::SetSeed(const uint32_t seed) { - mFinalSeed = seed; -} - const std::array& Settings::GetOptionGroups() { return mOptionGroups; } @@ -2064,48 +1843,43 @@ void Settings::UpdateOptionProperties() { } } -void Settings::FinalizeSettings(const std::set& excludedLocations, const std::set& enabledTricks) { - const auto ctx = Rando::Context::GetInstance(); - for (Option& option : mOptions) { - option.SetContextIndex(option.GetMenuOptionIndex()); - } - +void Context::FinalizeSettings(const std::set& excludedLocations, const std::set& enabledTricks) { // if we skip child zelda, we start with zelda's letter, and malon starts // at the ranch, so we should *not* shuffle the weird egg if (mOptions[RSK_SKIP_CHILD_ZELDA]) { - mOptions[RSK_SHUFFLE_WEIRD_EGG].SetContextIndex(RO_GENERIC_OFF); + mOptions[RSK_SHUFFLE_WEIRD_EGG].Set(RO_GENERIC_OFF); } // With certain access settings, the seed is only beatable if Starting Age is set to Child. if (mOptions[RSK_FOREST].Is(RO_CLOSED_FOREST_ON) || (mOptions[RSK_DOOR_OF_TIME].Is(RO_DOOROFTIME_CLOSED) && !mOptions[RSK_SHUFFLE_OCARINA])) { - mOptions[RSK_STARTING_AGE].SetContextIndex(RO_AGE_CHILD); + mOptions[RSK_STARTING_AGE].Set(RO_AGE_CHILD); } if (mOptions[RSK_TRIFORCE_HUNT]) { - mOptions[RSK_GANONS_BOSS_KEY].SetContextIndex(RO_GANON_BOSS_KEY_TRIFORCE_HUNT); + mOptions[RSK_GANONS_BOSS_KEY].Set(RO_GANON_BOSS_KEY_TRIFORCE_HUNT); } // Force 100 GS Shuffle if that's where Ganon's Boss Key is if (mOptions[RSK_GANONS_BOSS_KEY].Is(RO_GANON_BOSS_KEY_KAK_TOKENS)) { - mOptions[RSK_SHUFFLE_100_GS_REWARD].SetContextIndex(1); + mOptions[RSK_SHUFFLE_100_GS_REWARD].Set(1); } // If we only have MQ, set all dungeons to MQ if (OTRGlobals::Instance->HasMasterQuest() && !OTRGlobals::Instance->HasOriginal()) { - mOptions[RSK_MQ_DUNGEON_RANDOM].SetContextIndex(RO_MQ_DUNGEONS_SET_NUMBER); - mOptions[RSK_MQ_DUNGEON_COUNT].SetContextIndex(12); - mOptions[RSK_MQ_DUNGEON_SET].SetContextIndex(RO_GENERIC_OFF); + mOptions[RSK_MQ_DUNGEON_RANDOM].Set(RO_MQ_DUNGEONS_SET_NUMBER); + mOptions[RSK_MQ_DUNGEON_COUNT].Set(12); + mOptions[RSK_MQ_DUNGEON_SET].Set(RO_GENERIC_OFF); } // If we don't have MQ, set all dungeons to Vanilla if (OTRGlobals::Instance->HasOriginal() && !OTRGlobals::Instance->HasMasterQuest()) { - mOptions[RSK_MQ_DUNGEON_RANDOM].SetContextIndex(RO_MQ_DUNGEONS_NONE); + mOptions[RSK_MQ_DUNGEON_RANDOM].Set(RO_MQ_DUNGEONS_NONE); } if (mOptions[RSK_MQ_DUNGEON_RANDOM].Is(RO_MQ_DUNGEONS_NONE)) { - mOptions[RSK_MQ_DUNGEON_COUNT].SetContextIndex(0); - mOptions[RSK_MQ_DUNGEON_SET].SetContextIndex(RO_GENERIC_OFF); + mOptions[RSK_MQ_DUNGEON_COUNT].Set(0); + mOptions[RSK_MQ_DUNGEON_SET].Set(RO_GENERIC_OFF); } // If any of the individual shuffle settings are on, turn on the main Shuffle Entrances option @@ -2115,61 +1889,60 @@ void Settings::FinalizeSettings(const std::set& excludedLocatio || mOptions[RSK_SHUFFLE_INTERIOR_ENTRANCES].IsNot(RO_INTERIOR_ENTRANCE_SHUFFLE_OFF) || mOptions[RSK_SHUFFLE_GROTTO_ENTRANCES] || mOptions[RSK_SHUFFLE_OWL_DROPS] || mOptions[RSK_SHUFFLE_WARP_SONGS] || mOptions[RSK_SHUFFLE_OVERWORLD_SPAWNS]) { - mOptions[RSK_SHUFFLE_ENTRANCES].SetContextIndex(RO_GENERIC_ON); + mOptions[RSK_SHUFFLE_ENTRANCES].Set(RO_GENERIC_ON); } else { - mOptions[RSK_SHUFFLE_ENTRANCES].SetContextIndex(RO_GENERIC_OFF); + mOptions[RSK_SHUFFLE_ENTRANCES].Set(RO_GENERIC_OFF); } if (mOptions[RSK_SHUFFLE_DUNGEON_REWARDS].Is(RO_DUNGEON_REWARDS_END_OF_DUNGEON)) { - mOptions[RSK_LINKS_POCKET].SetContextIndex(RO_LINKS_POCKET_DUNGEON_REWARD); + mOptions[RSK_LINKS_POCKET].Set(RO_LINKS_POCKET_DUNGEON_REWARD); } - ctx->AddExcludedOptions(); - for (const auto locationKey : ctx->everyPossibleLocation) { - if (const auto location = ctx->GetItemLocation(locationKey); excludedLocations.contains(location->GetRandomizerCheck())) { - location->GetExcludedOption()->SetContextIndex(1); + for (const auto locationKey : this->everyPossibleLocation) { + if (const auto location = this->GetItemLocation(locationKey); excludedLocations.contains(location->GetRandomizerCheck())) { + location->SetExcludedOption(1); } else { - location->GetExcludedOption()->SetContextIndex(0); + location->SetExcludedOption(0); } } // Tricks ResetTrickOptions(); for (const auto randomizerTrick : enabledTricks) { - mTrickOptions[randomizerTrick].SetContextIndex(1); + mTrickOptions[randomizerTrick].Set(1); } if (!mOptions[RSK_SHUFFLE_KOKIRI_SWORD]) { if (mOptions[RSK_STARTING_KOKIRI_SWORD]) { - ctx->GetItemLocation(RC_KF_KOKIRI_SWORD_CHEST)->GetExcludedOption()->SetContextIndex(1); + this->GetItemLocation(RC_KF_KOKIRI_SWORD_CHEST)->SetExcludedOption(1); } } if (!mOptions[RSK_SHUFFLE_MASTER_SWORD]) { if (mOptions[RSK_STARTING_MASTER_SWORD]) { - ctx->GetItemLocation(RC_MASTER_SWORD_PEDESTAL)->GetExcludedOption()->SetContextIndex(1); + this->GetItemLocation(RC_MASTER_SWORD_PEDESTAL)->SetExcludedOption(1); } } if (!mOptions[RSK_SHUFFLE_OCARINA]) { if (mOptions[RSK_STARTING_OCARINA].IsNot(RO_STARTING_OCARINA_OFF)) { - ctx->GetItemLocation(RC_LW_GIFT_FROM_SARIA)->GetExcludedOption()->SetContextIndex(1); + this->GetItemLocation(RC_LW_GIFT_FROM_SARIA)->SetExcludedOption(1); if (mOptions[RSK_STARTING_OCARINA].Is(RO_STARTING_OCARINA_TIME)) { - ctx->GetItemLocation(RC_HF_OCARINA_OF_TIME_ITEM)->GetExcludedOption()->SetContextIndex(1); + this->GetItemLocation(RC_HF_OCARINA_OF_TIME_ITEM)->SetExcludedOption(1); } } } if (mOptions[RSK_SHUFFLE_DEKU_STICK_BAG]) { - mOptions[RSK_STARTING_STICKS].SetContextIndex(false); + mOptions[RSK_STARTING_STICKS].Set(false); } if (mOptions[RSK_SHUFFLE_DEKU_NUT_BAG]) { - mOptions[RSK_STARTING_NUTS].SetContextIndex(false); + mOptions[RSK_STARTING_NUTS].Set(false); } // RANDOTODO implement chest shuffle with keysanity - // ShuffleChestMinigame.SetContextIndex(cvarSettings[RSK_SHUFFLE_CHEST_MINIGAME]); - mOptions[RSK_SHUFFLE_CHEST_MINIGAME].SetContextIndex(RO_CHEST_GAME_OFF); + // ShuffleChestMinigame.Set(cvarSettings[RSK_SHUFFLE_CHEST_MINIGAME]); + mOptions[RSK_SHUFFLE_CHEST_MINIGAME].Set(RO_CHEST_GAME_OFF); //TODO: RandomizeAllSettings(true) when implementing the ability to randomize the options themselves. - std::array dungeons = ctx->GetDungeons()->GetDungeonList(); + std::array dungeons = this->GetDungeons()->GetDungeonList(); //reset the MQ vars for (auto dungeon: dungeons) { @@ -2177,12 +1950,12 @@ void Settings::FinalizeSettings(const std::set& excludedLocatio dungeon->SetDungeonKnown(true); } //if it's selection mode, process the selection directly - if (mOptions[RSK_MQ_DUNGEON_RANDOM].GetContextOptionIndex() == RO_MQ_DUNGEONS_SELECTION){ - mOptions[RSK_MQ_DUNGEON_SET].SetContextIndex(RO_GENERIC_ON); + if (mOptions[RSK_MQ_DUNGEON_RANDOM].Is(RO_MQ_DUNGEONS_SELECTION)) { + mOptions[RSK_MQ_DUNGEON_SET].Set(RO_GENERIC_ON); //How many dungeons are set to MQ in selection uint8_t mqSet = 0; for (auto dungeon: dungeons) { - switch (mOptions[dungeon->GetMQSetting()].GetContextOptionIndex()) { + switch (mOptions[dungeon->GetMQSetting()].Get()) { case RO_MQ_SET_MQ: dungeon->SetMQ(); mqSet += 1; @@ -2201,11 +1974,11 @@ void Settings::FinalizeSettings(const std::set& excludedLocatio } } //override the dungeons set with the ones set by selection, so it's accurate for anything that wants to know MQ dungeon count - mOptions[RSK_MQ_DUNGEON_COUNT].SetContextIndex(mqSet); + mOptions[RSK_MQ_DUNGEON_COUNT].Set(mqSet); //handling set number and random number together - } else if (mOptions[RSK_MQ_DUNGEON_RANDOM].GetContextOptionIndex() != RO_MQ_DUNGEONS_NONE){ + } else if (mOptions[RSK_MQ_DUNGEON_RANDOM].IsNot(RO_MQ_DUNGEONS_NONE)){ // so we don't have to call this repeatedly - uint8_t mqCount = mOptions[RSK_MQ_DUNGEON_COUNT].GetContextOptionIndex(); + uint8_t mqCount = mOptions[RSK_MQ_DUNGEON_COUNT].Get(); //How many dungeons are set to MQ in selection uint8_t mqSet = 0; //the number of random @@ -2215,7 +1988,7 @@ void Settings::FinalizeSettings(const std::set& excludedLocatio //if dungeons have been preset, process them if (mOptions[RSK_MQ_DUNGEON_SET]){ for (size_t i = 0; i < dungeons.size(); i++) { - switch (mOptions[dungeons[i]->GetMQSetting()].GetContextOptionIndex()) { + switch (mOptions[dungeons[i]->GetMQSetting()].Get()) { case RO_MQ_SET_MQ: dungeons[i]->SetMQ(); mqSet += 1; @@ -2231,22 +2004,22 @@ void Settings::FinalizeSettings(const std::set& excludedLocatio //otherwise, every dungeon is possible } else { //if the count is fixed to 12, we know everything is MQ, so can skip some setps and do not set Known - if (mOptions[RSK_MQ_DUNGEON_RANDOM].GetContextOptionIndex() == RO_MQ_DUNGEONS_SET_NUMBER && + if (mOptions[RSK_MQ_DUNGEON_RANDOM].Is(RO_MQ_DUNGEONS_SET_NUMBER) && mqCount == 12) { randMQOption = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11}; for (auto dungeon: dungeons) { - mOptions[dungeon->GetMQSetting()].SetContextIndex(RO_MQ_SET_MQ); + mOptions[dungeon->GetMQSetting()].Set(RO_MQ_SET_MQ); } //if it's fixed to zero, set it to None instead. the rest is processed after - } else if (mOptions[RSK_MQ_DUNGEON_RANDOM].GetContextOptionIndex() == RO_MQ_DUNGEONS_SET_NUMBER && + } else if (mOptions[RSK_MQ_DUNGEON_RANDOM].Is(RO_MQ_DUNGEONS_SET_NUMBER) && mqCount == 0){ - mOptions[RSK_MQ_DUNGEON_RANDOM].SetContextIndex(RO_MQ_DUNGEONS_NONE); + mOptions[RSK_MQ_DUNGEON_RANDOM].Set(RO_MQ_DUNGEONS_NONE); //otherwise, make everything a possibility and unknown } else { for (size_t i = 0; i < dungeons.size(); i++) { randMQOption.push_back(i); dungeons[i]->SetDungeonKnown(false); - mOptions[dungeons[i]->GetMQSetting()].SetContextIndex(RO_MQ_SET_RANDOM); + mOptions[dungeons[i]->GetMQSetting()].Set(RO_MQ_SET_RANDOM); } } } @@ -2268,20 +2041,20 @@ void Settings::FinalizeSettings(const std::set& excludedLocatio } else { //if there's no random options, check if we can collapse the setting into None or Selection if (mqSet == 0){ - mOptions[RSK_MQ_DUNGEON_RANDOM].SetContextIndex(RO_MQ_DUNGEONS_NONE); + mOptions[RSK_MQ_DUNGEON_RANDOM].Set(RO_MQ_DUNGEONS_NONE); } else { - mOptions[RSK_MQ_DUNGEON_RANDOM].SetContextIndex(RO_MQ_DUNGEONS_SELECTION); + mOptions[RSK_MQ_DUNGEON_RANDOM].Set(RO_MQ_DUNGEONS_SELECTION); } } //reset the value set based on what was actually set - mOptions[RSK_MQ_DUNGEON_COUNT].SetContextIndex(mqToSet + mqSet); + mOptions[RSK_MQ_DUNGEON_COUNT].Set(mqToSet + mqSet); } //Not an if else as other settings can become None in processing - if (mOptions[RSK_MQ_DUNGEON_RANDOM].GetContextOptionIndex() == RO_MQ_DUNGEONS_NONE) { - mOptions[RSK_MQ_DUNGEON_SET].SetContextIndex(RO_GENERIC_OFF); - mOptions[RSK_MQ_DUNGEON_COUNT].SetContextIndex(0); + if (mOptions[RSK_MQ_DUNGEON_RANDOM].Is(RO_MQ_DUNGEONS_NONE)) { + mOptions[RSK_MQ_DUNGEON_SET].Set(RO_GENERIC_OFF); + mOptions[RSK_MQ_DUNGEON_COUNT].Set(0); for (auto dungeon: dungeons) { - mOptions[dungeon->GetMQSetting()].SetContextIndex(RO_MQ_SET_VANILLA); + mOptions[dungeon->GetMQSetting()].Set(RO_MQ_SET_VANILLA); } } @@ -2290,7 +2063,7 @@ void Settings::FinalizeSettings(const std::set& excludedLocatio dungeon->ClearKeyRing(); } - const std::vector keyRingOptions = { + const std::vector keyRingOptions = { &mOptions[RSK_KEYRINGS_FOREST_TEMPLE], &mOptions[RSK_KEYRINGS_FIRE_TEMPLE], &mOptions[RSK_KEYRINGS_WATER_TEMPLE], @@ -2307,55 +2080,55 @@ void Settings::FinalizeSettings(const std::set& excludedLocatio if (mOptions[RSK_GERUDO_FORTRESS].Is(RO_GF_CARPENTERS_NORMAL) && mOptions[RSK_GERUDO_KEYS].IsNot(RO_GERUDO_KEYS_VANILLA)) { keyrings.push_back(&mOptions[RSK_KEYRINGS_GERUDO_FORTRESS]); } else { - mOptions[RSK_KEYRINGS_GERUDO_FORTRESS].SetContextIndex(RO_KEYRING_FOR_DUNGEON_OFF); + mOptions[RSK_KEYRINGS_GERUDO_FORTRESS].Set(RO_KEYRING_FOR_DUNGEON_OFF); } if (mOptions[RSK_KEYRINGS].Is(RO_KEYRINGS_RANDOM) || mOptions[RSK_KEYRINGS].Is(RO_KEYRINGS_COUNT)) { - const uint32_t keyRingCount = mOptions[RSK_KEYRINGS].Is(RO_KEYRINGS_COUNT) ? mOptions[RSK_KEYRINGS_RANDOM_COUNT].GetContextOptionIndex() : Random(0, static_cast(keyrings.size())); + const uint32_t keyRingCount = mOptions[RSK_KEYRINGS].Is(RO_KEYRINGS_COUNT) ? mOptions[RSK_KEYRINGS_RANDOM_COUNT].Get() : Random(0, static_cast(keyrings.size())); Shuffle(keyrings); for (size_t i = 0; i < keyRingCount; i++) { - keyrings[i]->SetContextIndex(RO_KEYRING_FOR_DUNGEON_ON); + keyrings[i]->Set(RO_KEYRING_FOR_DUNGEON_ON); } for (size_t i = keyRingCount; i < keyrings.size(); i++) { - keyrings[i]->SetContextIndex(RO_KEYRING_FOR_DUNGEON_OFF); + keyrings[i]->Set(RO_KEYRING_FOR_DUNGEON_OFF); } } if (mOptions[RSK_KEYRINGS_BOTTOM_OF_THE_WELL].Is(RO_KEYRING_FOR_DUNGEON_ON) || (mOptions[RSK_KEYRINGS_BOTTOM_OF_THE_WELL].Is(RO_KEYRING_FOR_DUNGEON_RANDOM) && Random(0, 2) == 1)) { - ctx->GetDungeon(BOTTOM_OF_THE_WELL)->SetKeyRing(); + this->GetDungeon(BOTTOM_OF_THE_WELL)->SetKeyRing(); } if (mOptions[RSK_KEYRINGS_FOREST_TEMPLE].Is(RO_KEYRING_FOR_DUNGEON_ON) || (mOptions[RSK_KEYRINGS_FOREST_TEMPLE].Is(RO_KEYRING_FOR_DUNGEON_RANDOM) && Random(0, 2) == 1)) { - ctx->GetDungeon(FOREST_TEMPLE)->SetKeyRing(); + this->GetDungeon(FOREST_TEMPLE)->SetKeyRing(); } if (mOptions[RSK_KEYRINGS_FIRE_TEMPLE].Is(RO_KEYRING_FOR_DUNGEON_ON) || (mOptions[RSK_KEYRINGS_FIRE_TEMPLE].Is(RO_KEYRING_FOR_DUNGEON_RANDOM) && Random(0, 2) == 1)) { - ctx->GetDungeon(FIRE_TEMPLE)->SetKeyRing(); + this->GetDungeon(FIRE_TEMPLE)->SetKeyRing(); } if (mOptions[RSK_KEYRINGS_WATER_TEMPLE].Is(RO_KEYRING_FOR_DUNGEON_ON) || (mOptions[RSK_KEYRINGS_WATER_TEMPLE].Is(RO_KEYRING_FOR_DUNGEON_RANDOM) && Random(0, 2) == 1)) { - ctx->GetDungeon(WATER_TEMPLE)->SetKeyRing(); + this->GetDungeon(WATER_TEMPLE)->SetKeyRing(); } if (mOptions[RSK_KEYRINGS_SPIRIT_TEMPLE].Is(RO_KEYRING_FOR_DUNGEON_ON) || (mOptions[RSK_KEYRINGS_SPIRIT_TEMPLE].Is(RO_KEYRING_FOR_DUNGEON_RANDOM) && Random(0, 2) == 1)) { - ctx->GetDungeon(SPIRIT_TEMPLE)->SetKeyRing(); + this->GetDungeon(SPIRIT_TEMPLE)->SetKeyRing(); } if (mOptions[RSK_KEYRINGS_SHADOW_TEMPLE].Is(RO_KEYRING_FOR_DUNGEON_ON) || (mOptions[RSK_KEYRINGS_SHADOW_TEMPLE].Is(RO_KEYRING_FOR_DUNGEON_RANDOM) && Random(0, 2) == 1)) { - ctx->GetDungeon(SHADOW_TEMPLE)->SetKeyRing(); + this->GetDungeon(SHADOW_TEMPLE)->SetKeyRing(); } if (mOptions[RSK_KEYRINGS_GTG].Is(RO_KEYRING_FOR_DUNGEON_ON) || (mOptions[RSK_KEYRINGS_GTG].Is(RO_KEYRING_FOR_DUNGEON_RANDOM) && Random(0, 2) == 1)) { - ctx->GetDungeon(GERUDO_TRAINING_GROUND)->SetKeyRing(); + this->GetDungeon(GERUDO_TRAINING_GROUND)->SetKeyRing(); } if (mOptions[RSK_KEYRINGS_GANONS_CASTLE].Is(RO_KEYRING_FOR_DUNGEON_ON) || (mOptions[RSK_KEYRINGS_GANONS_CASTLE].Is(RO_KEYRING_FOR_DUNGEON_RANDOM) && Random(0, 2) == 1)) { - ctx->GetDungeon(GANONS_CASTLE)->SetKeyRing(); + this->GetDungeon(GANONS_CASTLE)->SetKeyRing(); } } - auto trials = ctx->GetTrials()->GetTrialList(); + auto trials = this->GetTrials()->GetTrialList(); Shuffle(trials); for (const auto trial : trials) { trial->SetAsSkipped(); } if(mOptions[RSK_GANONS_TRIALS].Is(RO_GANONS_TRIALS_SKIP)){ - mOptions[RSK_TRIAL_COUNT].SetContextIndex(0); + mOptions[RSK_TRIAL_COUNT].Set(0); } else if(mOptions[RSK_GANONS_TRIALS].Is(RO_GANONS_TRIALS_RANDOM_NUMBER)) { - mOptions[RSK_TRIAL_COUNT].SetContextIndex(Random(0, static_cast(mOptions[RSK_TRIAL_COUNT].GetOptionCount()))); + mOptions[RSK_TRIAL_COUNT].Set(Random(0, static_cast(Rando::Settings::GetInstance()->GetOption(RSK_TRIAL_COUNT).GetOptionCount()))); } - for (uint8_t i = 0; i < mOptions[RSK_TRIAL_COUNT].GetContextOptionIndex(); i++) { + for (uint8_t i = 0; i < mOptions[RSK_TRIAL_COUNT].Get(); i++) { trials[i]->SetAsRequired(); } @@ -2363,17 +2136,17 @@ void Settings::FinalizeSettings(const std::set& excludedLocatio (mOptions[RSK_SHUFFLE_INTERIOR_ENTRANCES].Is(RO_INTERIOR_ENTRANCE_SHUFFLE_ALL) || mOptions[RSK_SHUFFLE_OVERWORLD_ENTRANCES] || mOptions[RSK_SHUFFLE_OVERWORLD_SPAWNS] || mOptions[RSK_DECOUPLED_ENTRANCES] || mOptions[RSK_MIXED_ENTRANCE_POOLS])) { - mOptions[RSK_FOREST].SetContextIndex(RO_CLOSED_FOREST_DEKU_ONLY); + mOptions[RSK_FOREST].Set(RO_CLOSED_FOREST_DEKU_ONLY); } if (mOptions[RSK_STARTING_AGE].Is(RO_AGE_RANDOM)) { if (const uint32_t choice = Random(0, 2); choice == 0) { - mResolvedStartingAge = RO_AGE_CHILD; + mOptions[RSK_SELECTED_STARTING_AGE].Set(RO_AGE_CHILD); } else { - mResolvedStartingAge = RO_AGE_ADULT; + mOptions[RSK_SELECTED_STARTING_AGE].Set(RO_AGE_ADULT); } } else { - mResolvedStartingAge = static_cast(mOptions[RSK_STARTING_AGE].GetContextOptionIndex()); + mOptions[RSK_SELECTED_STARTING_AGE].Set(mOptions[RSK_STARTING_AGE].Get()); } // TODO: Random Starting Time @@ -2393,58 +2166,57 @@ void Settings::FinalizeSettings(const std::set& excludedLocatio } if (mOptions[RSK_LOGIC_RULES].Is(RO_LOGIC_VANILLA)) { - for (Option* setting : VanillaLogicDefaults) { + for (OptionValue* setting : VanillaLogicDefaults) { //setting->SetDelayedOption(); - setting->SetContextIndex(0); + setting->Set(0); } //mOptions[RSK_KEYSANITY].SetDelayedOption(); - mOptions[RSK_KEYSANITY].SetContextIndex(3); + mOptions[RSK_KEYSANITY].Set(3); } if (!mOptions[RSK_SHUFFLE_WARP_SONGS]) { - mOptions[RSK_WARP_SONG_HINTS].SetContextIndex(RO_GENERIC_OFF); + mOptions[RSK_WARP_SONG_HINTS].Set(RO_GENERIC_OFF); } if (!mOptions[RSK_SHUFFLE_COWS]) { - mOptions[RSK_MALON_HINT].SetContextIndex(RO_GENERIC_OFF); + mOptions[RSK_MALON_HINT].Set(RO_GENERIC_OFF); } if (!mOptions[RSK_SHUFFLE_100_GS_REWARD]) { - mOptions[RSK_KAK_100_SKULLS_HINT].SetContextIndex(RO_GENERIC_OFF); + mOptions[RSK_KAK_100_SKULLS_HINT].Set(RO_GENERIC_OFF); } if (!mOptions[RSK_SHUFFLE_FISHING_POLE]) { - mOptions[RSK_FISHING_POLE_HINT].SetContextIndex(RO_GENERIC_OFF); + mOptions[RSK_FISHING_POLE_HINT].Set(RO_GENERIC_OFF); } if (mOptions[RSK_FISHSANITY].IsNot(RO_FISHSANITY_HYRULE_LOACH)) { - mOptions[RSK_LOACH_HINT].SetContextIndex(RO_GENERIC_OFF); + mOptions[RSK_LOACH_HINT].Set(RO_GENERIC_OFF); } if (mOptions[RSK_CUCCO_COUNT].Is(0)) { - mOptions[RSK_CHICKENS_HINT].SetContextIndex(RO_GENERIC_OFF); + mOptions[RSK_CHICKENS_HINT].Set(RO_GENERIC_OFF); } } void Settings::ParseJson(nlohmann::json spoilerFileJson) { - mSeedString = spoilerFileJson["seed"].get(); - mFinalSeed = spoilerFileJson["finalSeed"].get(); + mContext->SetSeedString(spoilerFileJson["seed"].get()); + mContext->SetSeed(spoilerFileJson["finalSeed"].get()); nlohmann::json settingsJson = spoilerFileJson["settings"]; for (auto it = settingsJson.begin(); it != settingsJson.end(); ++it) { // todo load into cvars for UI //RANDOTODO handle numeric value to options conversion better than brute froce if (StaticData::optionNameToEnum.contains(it.key())) { const RandomizerSettingKey index = StaticData::optionNameToEnum[it.key()]; - mOptions[index].SetContextIndexFromText(it.value()); + mContext->GetOption(index).Set(mOptions[index].GetValueFromText(it.value())); } } nlohmann::json jsonExcludedLocations = spoilerFileJson["excludedLocations"]; const auto ctx = Context::GetInstance(); - ctx->AddExcludedOptions(); for (auto it = jsonExcludedLocations.begin(); it != jsonExcludedLocations.end(); ++it) { const RandomizerCheck rc = Rando::StaticData::locationNameToEnum[it.value()]; - ctx->GetItemLocation(rc)->GetExcludedOption()->SetContextIndex(RO_GENERIC_ON); + ctx->GetItemLocation(rc)->SetExcludedOption(RO_GENERIC_ON); } nlohmann::json enabledTricksJson = spoilerFileJson["enabledTricks"]; @@ -2459,4 +2231,30 @@ void Settings::ReloadOptions() { mOptions[i].SetFromCVar(); } } +void Settings::AssignContext(std::shared_ptr ctx) { + mContext = ctx; +} + +void Settings::ClearContext() { + mContext = nullptr; +} + +void Settings::SetAllToContext() { + for (int i = 0; i < RSK_MAX; i++) { + mContext->GetOption(static_cast(i)).Set(mOptions[i].GetMenuOptionIndex()); + } + for (int i = 0; i < RT_MAX; i++) { + mContext->GetTrickOption(static_cast(i)).Set(mTrickOptions[i].GetMenuOptionIndex()); + } + for (int i = 0; i < RC_MAX; i++) { + mContext->GetItemLocation(i)->SetExcludedOption(StaticData::GetLocation(static_cast(i))->GetExcludedOption()->GetMenuOptionIndex()); + } +} + +std::shared_ptr Settings::GetInstance() { + if (mInstance == nullptr) { + mInstance = std::make_shared(); + } + return mInstance; +} } // namespace Rando diff --git a/soh/soh/Enhancements/randomizer/settings.h b/soh/soh/Enhancements/randomizer/settings.h index 90613cf14..6810b6832 100644 --- a/soh/soh/Enhancements/randomizer/settings.h +++ b/soh/soh/Enhancements/randomizer/settings.h @@ -1,5 +1,6 @@ #pragma once +#include "context.h" #include "option.h" #include "randomizerTypes.h" #include "3drando/spoiler_log.hpp" @@ -49,11 +50,6 @@ class Settings { */ TrickOption& GetTrickOption(RandomizerTrick key); - /** - * @brief Reset all RandomizerTrick keys. - */ - void ResetTrickOptions(); - /** * @brief Returns a reference to the entire array of options. * @@ -77,64 +73,6 @@ class Settings { */ const std::vector>& GetExcludeLocationsOptions() const; - /** - * @brief Gets the resolved Starting Age. Represents the actual starting age when the - * RSK_STARTING_AGE option is set to Random. - * - * @return RandoOptionStartingAge - */ - RandoOptionStartingAge ResolvedStartingAge() const; - - /** - * @brief Gets the resolved Light Arrow CutScene check condition. - * There is no direct option for this, it is inferred based on the value of a few other options. - * - * @return RandoOptionLACSCondition - */ - RandoOptionLACSCondition LACSCondition() const; - - /** - * @brief Get the hash for the current seed. - * - * @return std::string - */ - std::string GetHash() const; - - /** - * @brief Get the Seed String - * - * @return const std::string& - */ - const std::string& GetSeedString() const; - - /** - * @brief Set the Seed String - * - * @param seedString - */ - void SetSeedString(std::string seedString); - - /** - * @brief Get the Seed - * - * @return const uint32_t - */ - uint32_t GetSeed() const; - - /** - * @brief Set the Seed - * - * @param seed - */ - void SetSeed(uint32_t seed); - - /** - * @brief Set the Seed Hash for the current seed. - * - * @param hash - */ - void SetHash(std::string hash); - /** * @brief Get the list of `OptionGroup`s. * @@ -168,43 +106,43 @@ class Settings { */ void UpdateOptionProperties(); - /** - * @brief Runs before seed generation to ensure all options are compatible with each - * other and resolve options that have been set to random (such as random trial count, - * or starting age). - * - * @param excludedLocations Set of locations that should be forced to have junk items. - * @param enabledTricks Set of tricks that should be considered logically possible. Tricks - * are things that are possible to do in gameplay but are difficult, not intuitive or that - * require more extensive game knowledge, i.e. opening invisible chests without the Lens of Truth. - */ - void FinalizeSettings(const std::set& excludedLocations, const std::set& enabledTricks); - /** * @brief Parse Options from a JSON file. * * @param spoilerFileJson */ void ParseJson(nlohmann::json spoilerFileJson); - std::vector VanillaLogicDefaults = {}; std::map> mTricksByArea = {}; void ReloadOptions(); + /** + * @brief Assigns a Rando::Context instance to this settings instance + * with which to later instantiate and access OptionValues. + * + * @param ctx + */ + void AssignContext(std::shared_ptr ctx); + void ClearContext(); + + /** + * @brief Sets all the currently selected MenuIndexes to the currently assigned Rando::Context. + */ + void SetAllToContext(); + + static std::shared_ptr GetInstance(); + private: /** * @brief Create the list of description strings for `Option`s. */ void CreateOptionDescriptions(); + static std::shared_ptr mInstance; + std::shared_ptr mContext = nullptr; std::array mOptions = {}; std::array mOptionDescriptions = {}; std::array mOptionGroups = {}; std::array mTrickOptions = {}; std::vector> mExcludeLocationsOptionsAreas = {}; - RandoOptionStartingAge mResolvedStartingAge = RO_AGE_CHILD; - RandoOptionLACSCondition mLACSCondition = RO_LACS_VANILLA; - std::string mHash; - std::string mSeedString; - uint32_t mFinalSeed = 0; std::unordered_map mTrickNameToEnum; }; } // namespace Rando diff --git a/soh/soh/Enhancements/resolution-editor/ResolutionEditor.cpp b/soh/soh/Enhancements/resolution-editor/ResolutionEditor.cpp index c15f04364..a18aea8dc 100644 --- a/soh/soh/Enhancements/resolution-editor/ResolutionEditor.cpp +++ b/soh/soh/Enhancements/resolution-editor/ResolutionEditor.cpp @@ -2,7 +2,7 @@ #include #include -#include +#include "soh/SohGui/UIWidgets.hpp" #include #include "soh/OTRGlobals.h" #include "soh/cvar_prefixes.h" diff --git a/soh/soh/Enhancements/timesaver_hook_handlers.cpp b/soh/soh/Enhancements/timesaver_hook_handlers.cpp index 1056f9c9b..d4675621f 100644 --- a/soh/soh/Enhancements/timesaver_hook_handlers.cpp +++ b/soh/soh/Enhancements/timesaver_hook_handlers.cpp @@ -44,13 +44,13 @@ extern void EnGo2_CurledUp(EnGo2* enGo2, PlayState* play); extern void EnRu2_SetEncounterSwitchFlag(EnRu2* enRu2, PlayState* play); } -#define RAND_GET_OPTION(option) Rando::Context::GetInstance()->GetOption(option).GetContextOptionIndex() +#define RAND_GET_OPTION(option) Rando::Context::GetInstance()->GetOption(option).Get() void EnMa1_EndTeachSong(EnMa1* enMa1, PlayState* play) { if (Message_GetState(&gPlayState->msgCtx) == TEXT_STATE_CLOSING) { Flags_SetRandomizerInf(RAND_INF_LEARNED_EPONA_SONG); Sfx_PlaySfxCentered(NA_SE_SY_CORRECT_CHIME); - enMa1->actor.flags &= ~ACTOR_FLAG_WILL_TALK; + enMa1->actor.flags &= ~ACTOR_FLAG_TALK_OFFER_AUTO_ACCEPTED; play->msgCtx.ocarinaMode = OCARINA_MODE_04; enMa1->actionFunc = func_80AA0D88; enMa1->unk_1E0 = 1; @@ -63,7 +63,7 @@ void EnFu_EndTeachSong(EnFu* enFu, PlayState* play) { if (Message_GetState(&gPlayState->msgCtx) == TEXT_STATE_CLOSING) { Sfx_PlaySfxCentered(NA_SE_SY_CORRECT_CHIME); enFu->actionFunc = EnFu_WaitAdult; - enFu->actor.flags &= ~ACTOR_FLAG_WILL_TALK; + enFu->actor.flags &= ~ACTOR_FLAG_TALK_OFFER_AUTO_ACCEPTED; play->msgCtx.ocarinaMode = OCARINA_MODE_04; Flags_SetEventChkInf(EVENTCHKINF_PLAYED_SONG_OF_STORMS_IN_WINDMILL); @@ -108,8 +108,7 @@ void BgSpot03Taki_KeepOpen(BgSpot03Taki* bgSpot03Taki, PlayState* play) { static int successChimeCooldown = 0; void RateLimitedSuccessChime() { if (successChimeCooldown == 0) { - // Currently disabled, need to find a better way to do this, while being consistent with vanilla - // func_80078884(NA_SE_SY_CORRECT_CHIME); + Sfx_PlaySfxCentered(NA_SE_SY_CORRECT_CHIME); successChimeCooldown = 120; } } diff --git a/soh/soh/Enhancements/timesplits/TimeSplits.cpp b/soh/soh/Enhancements/timesplits/TimeSplits.cpp index 01faf7bf5..de9e157c3 100644 --- a/soh/soh/Enhancements/timesplits/TimeSplits.cpp +++ b/soh/soh/Enhancements/timesplits/TimeSplits.cpp @@ -1,5 +1,5 @@ #include "TimeSplits.h" -#include "soh/UIWidgets.hpp" +#include "soh/SohGui/UIWidgets.hpp" #include "soh/Enhancements/gameplaystats.h" #include "soh/SaveManager.h" #include "soh/util.h" @@ -345,8 +345,8 @@ void HandleDragAndDrop(std::vector& objectList, int targetIndex, co } void TimeSplitCompleteSplits() { - gSaveContext.sohStats.itemTimestamp[TIMESTAMP_DEFEAT_GANON] = GAMEPLAYSTAT_TOTAL_TIME; - gSaveContext.sohStats.gameComplete = true; + gSaveContext.ship.stats.itemTimestamp[TIMESTAMP_DEFEAT_GANON] = GAMEPLAYSTAT_TOTAL_TIME; + gSaveContext.ship.stats.gameComplete = true; } void TimeSplitsSkipSplit(uint32_t index) { diff --git a/soh/soh/OTRGlobals.cpp b/soh/soh/OTRGlobals.cpp index 7856de88f..c19b186db 100644 --- a/soh/soh/OTRGlobals.cpp +++ b/soh/soh/OTRGlobals.cpp @@ -42,7 +42,6 @@ #include "Fonts.h" #include #include "Enhancements/custom-message/CustomMessageManager.h" -#include "ImGuiUtils.h" #include "Enhancements/presets.h" #include "util.h" #include @@ -70,7 +69,8 @@ #include "Enhancements/custom-message/CustomMessageTypes.h" #include #include "Enhancements/item-tables/ItemTableManager.h" -#include "SohGui.hpp" +#include "soh/SohGui/SohGui.hpp" +#include "soh/SohGui/ImGuiUtils.h" #include "ActorDB.h" #include "SaveManager.h" @@ -341,7 +341,6 @@ OTRGlobals::OTRGlobals() { BTN_CUSTOM_OCARINA_PITCH_DOWN, })); context->InitControlDeck(controlDeck); - context->GetControlDeck()->SetSinglePlayerMappingMode(true); context->InitCrashHandler(); context->InitConsole(); @@ -392,9 +391,10 @@ OTRGlobals::OTRGlobals() { gSaveStateMgr = std::make_shared(); gRandoContext->InitStaticData(); gRandoContext = Rando::Context::CreateInstance(); + Rando::Settings::GetInstance()->AssignContext(gRandoContext); Rando::StaticData::InitItemTable();//RANDOTODO make this not rely on context's logic so it can be initialised in InitStaticData gRandoContext->AddExcludedOptions(); - gRandoContext->GetSettings()->CreateOptions(); + Rando::Settings::GetInstance()->CreateOptions(); gRandomizer = std::make_shared(); hasMasterQuest = hasOriginal = false; @@ -1836,17 +1836,25 @@ extern "C" void AudioPlayer_Play(const uint8_t* buf, uint32_t len) { } extern "C" int Controller_ShouldRumble(size_t slot) { - for (auto [id, mapping] : Ship::Context::GetInstance() - ->GetControlDeck() - ->GetControllerByPort(static_cast(slot)) - ->GetRumble() - ->GetAllRumbleMappings()) { - if (mapping->PhysicalDeviceIsConnected()) { - return 1; - } + // don't rumble if we don't have rumble mappings + if (Ship::Context::GetInstance() + ->GetControlDeck() + ->GetControllerByPort(static_cast(slot)) + ->GetRumble() + ->GetAllRumbleMappings().empty()) { + return 0; } - return 0; + // don't rumble if we don't have connected gamepads + if (Ship::Context::GetInstance() + ->GetControlDeck() + ->GetConnectedPhysicalDeviceManager() + ->GetConnectedSDLGamepadsForPort(slot).empty()) { + return 0; + } + + // rumble + return 1; } extern "C" void* getN64WeirdFrame(s32 i) { @@ -1923,7 +1931,7 @@ extern "C" u32 SpoilerFileExists(const char* spoilerFileName) { } extern "C" u8 Randomizer_GetSettingValue(RandomizerSettingKey randoSettingKey) { - return OTRGlobals::Instance->gRandoContext->GetOption(randoSettingKey).GetContextOptionIndex(); + return OTRGlobals::Instance->gRandoContext->GetOption(randoSettingKey).Get(); } extern "C" RandomizerCheck Randomizer_GetCheckFromActor(s16 actorId, s16 sceneNum, s16 actorParams) { @@ -2322,10 +2330,10 @@ extern "C" int CustomMessage_RetrieveIfExists(PlayState* play) { messageEntry = CustomMessageManager::Instance->RetrieveMessage(customMessageTableID, textId, MF_FORMATTED); } else if (textId == TEXT_HEART_CONTAINER && CVarGetInteger(CVAR_ENHANCEMENT("InjectItemCounts.HeartContainer"), 0)) { messageEntry = CustomMessageManager::Instance->RetrieveMessage(customMessageTableID, TEXT_HEART_CONTAINER, MF_FORMATTED); - messageEntry.Replace("[[heartContainerCount]]", std::to_string(gSaveContext.sohStats.heartContainers + 1)); + messageEntry.Replace("[[heartContainerCount]]", std::to_string(gSaveContext.ship.stats.heartContainers + 1)); } else if (textId >= TEXT_HEART_PIECE && textId < TEXT_HEART_CONTAINER && CVarGetInteger(CVAR_ENHANCEMENT("InjectItemCounts.HeartPiece"), 0)) { messageEntry = CustomMessageManager::Instance->RetrieveMessage(customMessageTableID, TEXT_HEART_PIECE, MF_FORMATTED); - messageEntry.Replace("[[heartPieceCount]]", std::to_string(gSaveContext.sohStats.heartPieces + 1)); + messageEntry.Replace("[[heartPieceCount]]", std::to_string(gSaveContext.ship.stats.heartPieces + 1)); } else if (textId == TEXT_MARKET_GUARD_NIGHT && CVarGetInteger(CVAR_ENHANCEMENT("MarketSneak"), 0) && play->sceneNum == SCENE_MARKET_ENTRANCE_NIGHT) { messageEntry = CustomMessageManager::Instance->RetrieveMessage(customMessageTableID, TEXT_MARKET_GUARD_NIGHT, MF_FORMATTED); } @@ -2432,6 +2440,9 @@ void SoH_ProcessDroppedFiles(std::string filePath) { } } + Rando::Settings::GetInstance()->UpdateOptionProperties(); + Rando::Settings::GetInstance()->SetAllFromCVar(); + auto gui = Ship::Context::GetInstance()->GetWindow()->GetGui(); gui->GetGuiWindow("Console")->Hide(); gui->GetGuiWindow("Actor Viewer")->Hide(); diff --git a/soh/soh/OTRGlobals.h b/soh/soh/OTRGlobals.h index 6945d8339..f056cad5e 100644 --- a/soh/soh/OTRGlobals.h +++ b/soh/soh/OTRGlobals.h @@ -28,7 +28,7 @@ struct ExtensionEntry { }; extern std::unordered_map ExtensionCache; -#include "Enhancements/randomizer/context.h" +#include "Enhancements/randomizer/settings.h" const std::string customMessageTableID = "BaseGameOverrides"; const std::string appShortName = "soh"; diff --git a/soh/soh/SaveManager.cpp b/soh/soh/SaveManager.cpp index 36de01199..f91696191 100644 --- a/soh/soh/SaveManager.cpp +++ b/soh/soh/SaveManager.cpp @@ -15,7 +15,7 @@ #include "macros.h" #include #include -#include "SohGui.hpp" +#include "soh/SohGui/SohGui.hpp" #define NOGDI // avoid various windows defines that conflict with things in z64.h #include @@ -180,7 +180,7 @@ void SaveManager::LoadRandomizerVersion1() { int key, value; SaveManager::Instance->LoadData("sk" + std::to_string(i), key); SaveManager::Instance->LoadData("sv" + std::to_string(i), value); - randoContext->GetOption(RandomizerSettingKey(key)).SetContextIndex(value); + randoContext->GetOption(RandomizerSettingKey(key)).Set(value); } for (int i = 0; i < 50; i++) { @@ -218,11 +218,11 @@ void SaveManager::LoadRandomizerVersion1() { } randoContext->AddHint(RH_GANONDORF_JOKE, Rando::Hint(RH_GANONDORF_JOKE, {CustomMessage(ganonText)})); - SaveManager::Instance->LoadData("adultTradeItems", gSaveContext.adultTradeItems); + SaveManager::Instance->LoadData("adultTradeItems", gSaveContext.ship.quest.data.randomizer.adultTradeItems); - SaveManager::Instance->LoadData("triforcePiecesCollected", gSaveContext.triforcePiecesCollected); + SaveManager::Instance->LoadData("triforcePiecesCollected", gSaveContext.ship.quest.data.randomizer.triforcePiecesCollected); - SaveManager::Instance->LoadData("pendingIceTrapCount", gSaveContext.pendingIceTrapCount); + SaveManager::Instance->LoadData("pendingIceTrapCount", gSaveContext.ship.pendingIceTrapCount); size_t merchantPricesSize = 0; @@ -277,16 +277,16 @@ void SaveManager::LoadRandomizerVersion2() { std::string inputSeed; SaveManager::Instance->LoadData("inputSeed", inputSeed); - randoContext->GetSettings()->SetSeedString(inputSeed); + randoContext->SetSeedString(inputSeed); uint32_t finalSeed; SaveManager::Instance->LoadData("finalSeed", finalSeed); - randoContext->GetSettings()->SetSeed(finalSeed); + randoContext->SetSeed(finalSeed); SaveManager::Instance->LoadArray("randoSettings", RSK_MAX, [&](size_t i) { int value = 0; SaveManager::Instance->LoadData("", value); - randoContext->GetOption(RandomizerSettingKey(i)).SetContextIndex(value); + randoContext->GetOption(RandomizerSettingKey(i)).Set(value); }); SaveManager::Instance->LoadArray("hintLocations", RH_ZR_OPEN_GROTTO_GOSSIP_STONE + 1, [&](size_t i) { @@ -348,11 +348,11 @@ void SaveManager::LoadRandomizerVersion2() { SaveManager::Instance->LoadData("warpPreludeText", warpPreludeText); randoContext->AddHint(RH_PRELUDE_WARP_LOC, Rando::Hint(RH_PRELUDE_WARP_LOC, {CustomMessage(warpPreludeText)})); - SaveManager::Instance->LoadData("adultTradeItems", gSaveContext.adultTradeItems); + SaveManager::Instance->LoadData("adultTradeItems", gSaveContext.ship.quest.data.randomizer.adultTradeItems); - SaveManager::Instance->LoadData("triforcePiecesCollected", gSaveContext.triforcePiecesCollected); + SaveManager::Instance->LoadData("triforcePiecesCollected", gSaveContext.ship.quest.data.randomizer.triforcePiecesCollected); - SaveManager::Instance->LoadData("pendingIceTrapCount", gSaveContext.pendingIceTrapCount); + SaveManager::Instance->LoadData("pendingIceTrapCount", gSaveContext.ship.pendingIceTrapCount); std::shared_ptr randomizer = OTRGlobals::Instance->gRandomizer; @@ -426,16 +426,16 @@ void SaveManager::LoadRandomizerVersion3() { std::string inputSeed; SaveManager::Instance->LoadData("inputSeed", inputSeed); - randoContext->GetSettings()->SetSeedString(inputSeed); + randoContext->SetSeedString(inputSeed); uint32_t finalSeed; SaveManager::Instance->LoadData("finalSeed", finalSeed); - randoContext->GetSettings()->SetSeed(finalSeed); + randoContext->SetSeed(finalSeed); SaveManager::Instance->LoadArray("randoSettings", RSK_MAX, [&](size_t i) { int value = 0; SaveManager::Instance->LoadData("", value); - randoContext->GetOption(RandomizerSettingKey(i)).SetContextIndex(value); + randoContext->GetOption(RandomizerSettingKey(i)).Set(value); }); SaveManager::Instance->LoadArray("hintLocations", RH_MAX, [&](size_t i) { @@ -445,11 +445,11 @@ void SaveManager::LoadRandomizerVersion3() { randoContext->AddHint(hint, Rando::Hint(hint, json)); }); - SaveManager::Instance->LoadData("adultTradeItems", gSaveContext.adultTradeItems); + SaveManager::Instance->LoadData("adultTradeItems", gSaveContext.ship.quest.data.randomizer.adultTradeItems); - SaveManager::Instance->LoadData("triforcePiecesCollected", gSaveContext.triforcePiecesCollected); + SaveManager::Instance->LoadData("triforcePiecesCollected", gSaveContext.ship.quest.data.randomizer.triforcePiecesCollected); - SaveManager::Instance->LoadData("pendingIceTrapCount", gSaveContext.pendingIceTrapCount); + SaveManager::Instance->LoadData("pendingIceTrapCount", gSaveContext.ship.pendingIceTrapCount); std::shared_ptr randomizer = OTRGlobals::Instance->gRandomizer; @@ -464,7 +464,7 @@ void SaveManager::LoadRandomizerVersion3() { }); randoContext->GetTrials()->SkipAll(); - SaveManager::Instance->LoadArray("requiredTrials", randoContext->GetOption(RSK_TRIAL_COUNT).GetContextOptionIndex() + 1, [&](size_t i) { + SaveManager::Instance->LoadArray("requiredTrials", randoContext->GetOption(RSK_TRIAL_COUNT).Get() + 1, [&](size_t i) { size_t trialId; SaveManager::Instance->LoadData("", trialId); randoContext->GetTrial(trialId)->SetAsRequired(); @@ -473,7 +473,7 @@ void SaveManager::LoadRandomizerVersion3() { void SaveManager::SaveRandomizer(SaveContext* saveContext, int sectionID, bool fullSave) { - if(saveContext->questId != QUEST_RANDOMIZER) return; + if(saveContext->ship.quest.id != QUEST_RANDOMIZER) return; auto randoContext = Rando::Context::GetInstance(); SaveManager::Instance->SaveArray("itemLocations", RC_MAX, [&](size_t i) { @@ -508,12 +508,12 @@ void SaveManager::SaveRandomizer(SaveContext* saveContext, int sectionID, bool f SaveManager::Instance->SaveData("", randoContext->hashIconIndexes[i]); }); - SaveManager::Instance->SaveData("inputSeed", randoContext->GetSettings()->GetSeedString()); + SaveManager::Instance->SaveData("inputSeed", randoContext->GetSeedString()); - SaveManager::Instance->SaveData("finalSeed", randoContext->GetSettings()->GetSeed()); + SaveManager::Instance->SaveData("finalSeed", randoContext->GetSeed()); SaveManager::Instance->SaveArray("randoSettings", RSK_MAX, [&](size_t i) { - SaveManager::Instance->SaveData("", randoContext->GetOption((RandomizerSettingKey(i))).GetContextOptionIndex()); + SaveManager::Instance->SaveData("", randoContext->GetOption((RandomizerSettingKey(i))).Get()); }); SaveManager::Instance->SaveArray("hintLocations", RH_MAX, [&](size_t i) { @@ -582,11 +582,11 @@ void SaveManager::SaveRandomizer(SaveContext* saveContext, int sectionID, bool f }); }); - SaveManager::Instance->SaveData("adultTradeItems", saveContext->adultTradeItems); + SaveManager::Instance->SaveData("adultTradeItems", saveContext->ship.quest.data.randomizer.adultTradeItems); - SaveManager::Instance->SaveData("triforcePiecesCollected", saveContext->triforcePiecesCollected); + SaveManager::Instance->SaveData("triforcePiecesCollected", saveContext->ship.quest.data.randomizer.triforcePiecesCollected); - SaveManager::Instance->SaveData("pendingIceTrapCount", saveContext->pendingIceTrapCount); + SaveManager::Instance->SaveData("pendingIceTrapCount", saveContext->ship.pendingIceTrapCount); std::shared_ptr randomizer = OTRGlobals::Instance->gRandomizer; @@ -662,8 +662,6 @@ void SaveManager::Init() { OTRGlobals::Instance->gRandoContext->ClearItemLocations(); } } - auto ctx = Rando::Context::GetInstance(); - ctx->GetSettings()->CreateOptions(); } void SaveManager::InitMeta(int fileNum) { @@ -701,10 +699,10 @@ void SaveManager::InitMeta(int fileNum) { // we don't actually require a vanilla OTR. fileMetaInfo[fileNum].requiresOriginal = !IS_MASTER_QUEST && (!IS_RANDO || randoContext->GetDungeons()->CountMQ() < 12); - fileMetaInfo[fileNum].buildVersionMajor = gSaveContext.sohStats.buildVersionMajor; - fileMetaInfo[fileNum].buildVersionMinor = gSaveContext.sohStats.buildVersionMinor; - fileMetaInfo[fileNum].buildVersionPatch = gSaveContext.sohStats.buildVersionPatch; - SohUtils::CopyStringToCharArray(fileMetaInfo[fileNum].buildVersion, gSaveContext.sohStats.buildVersion, + fileMetaInfo[fileNum].buildVersionMajor = gSaveContext.ship.stats.buildVersionMajor; + fileMetaInfo[fileNum].buildVersionMinor = gSaveContext.ship.stats.buildVersionMinor; + fileMetaInfo[fileNum].buildVersionPatch = gSaveContext.ship.stats.buildVersionPatch; + SohUtils::CopyStringToCharArray(fileMetaInfo[fileNum].buildVersion, gSaveContext.ship.stats.buildVersion, ARRAY_COUNT(fileMetaInfo[fileNum].buildVersion)); } @@ -821,8 +819,9 @@ void SaveManager::InitFileNormal() { for (int flag = 0; flag < ARRAY_COUNT(gSaveContext.infTable); flag++) { gSaveContext.infTable[flag] = 0; } - for (int flag = 0; flag < ARRAY_COUNT(gSaveContext.randomizerInf); flag++) { - gSaveContext.randomizerInf[flag] = 0; + // Currently randomizer flags are accessible from all quests + for (int flag = 0; flag < ARRAY_COUNT(gSaveContext.ship.randomizerInf); flag++) { + gSaveContext.ship.randomizerInf[flag] = 0; } gSaveContext.worldMapAreaData = 0; gSaveContext.scarecrowLongSongSet = 0; @@ -856,15 +855,14 @@ void SaveManager::InitFileNormal() { gSaveContext.sceneFlags[5].swch = 0x40000000; // SoH specific - gSaveContext.backupFW = gSaveContext.fw; - gSaveContext.pendingSale = ITEM_NONE; - gSaveContext.pendingSaleMod = MOD_NONE; - gSaveContext.isBossRushPaused = 0; - gSaveContext.pendingIceTrapCount = 0; - gSaveContext.maskMemory = PLAYER_MASK_NONE; + gSaveContext.ship.backupFW = gSaveContext.fw; + gSaveContext.ship.pendingSale = ITEM_NONE; + gSaveContext.ship.pendingSaleMod = MOD_NONE; + gSaveContext.ship.pendingIceTrapCount = 0; + gSaveContext.ship.maskMemory = PLAYER_MASK_NONE; // Init with normal quest unless only an MQ rom is provided - gSaveContext.questId = OTRGlobals::Instance->HasOriginal() ? QUEST_NORMAL : QUEST_MASTER; + gSaveContext.ship.quest.id = OTRGlobals::Instance->HasOriginal() ? QUEST_NORMAL : QUEST_MASTER; //RANDOTODO (ADD ITEMLOCATIONS TO GSAVECONTEXT) } @@ -1436,7 +1434,7 @@ void SaveManager::LoadBaseVersion1() { int isRando = 0; SaveManager::Instance->LoadData("n64ddFlag", isRando); if (isRando) { - gSaveContext.questId = QUEST_RANDOMIZER; + gSaveContext.ship.quest.id = QUEST_RANDOMIZER; } SaveManager::Instance->LoadData("healthCapacity", gSaveContext.healthCapacity); SaveManager::Instance->LoadData("health", gSaveContext.health); @@ -1561,8 +1559,8 @@ void SaveManager::LoadBaseVersion1() { SaveManager::Instance->LoadData("angle", gSaveContext.horseData.angle); }); - SaveManager::Instance->LoadArray("randomizerInf", ARRAY_COUNT(gSaveContext.randomizerInf), [](size_t i) { - SaveManager::Instance->LoadData("", gSaveContext.randomizerInf[i]); + SaveManager::Instance->LoadArray("randomizerInf", ARRAY_COUNT(gSaveContext.ship.randomizerInf), [](size_t i) { + SaveManager::Instance->LoadData("", gSaveContext.ship.randomizerInf[i]); }); } @@ -1581,7 +1579,7 @@ void SaveManager::LoadBaseVersion2() { int isRando = 0; SaveManager::Instance->LoadData("n64ddFlag", isRando); if (isRando) { - gSaveContext.questId = QUEST_RANDOMIZER; + gSaveContext.ship.quest.id = QUEST_RANDOMIZER; } SaveManager::Instance->LoadData("healthCapacity", gSaveContext.healthCapacity); SaveManager::Instance->LoadData("health", gSaveContext.health); @@ -1648,26 +1646,26 @@ void SaveManager::LoadBaseVersion2() { SaveManager::Instance->LoadData("gsTokens", gSaveContext.inventory.gsTokens); }); SaveManager::Instance->LoadStruct("sohStats", []() { - SaveManager::Instance->LoadData("heartPieces", gSaveContext.sohStats.heartPieces); - SaveManager::Instance->LoadData("heartContainers", gSaveContext.sohStats.heartContainers); - SaveManager::Instance->LoadArray("dungeonKeys", ARRAY_COUNT(gSaveContext.sohStats.dungeonKeys), [](size_t i) { - SaveManager::Instance->LoadData("", gSaveContext.sohStats.dungeonKeys[i]); + SaveManager::Instance->LoadData("heartPieces", gSaveContext.ship.stats.heartPieces); + SaveManager::Instance->LoadData("heartContainers", gSaveContext.ship.stats.heartContainers); + SaveManager::Instance->LoadArray("dungeonKeys", ARRAY_COUNT(gSaveContext.ship.stats.dungeonKeys), [](size_t i) { + SaveManager::Instance->LoadData("", gSaveContext.ship.stats.dungeonKeys[i]); }); - SaveManager::Instance->LoadData("rtaTiming", gSaveContext.sohStats.rtaTiming); - SaveManager::Instance->LoadData("fileCreatedAt", gSaveContext.sohStats.fileCreatedAt); - SaveManager::Instance->LoadData("playTimer", gSaveContext.sohStats.playTimer); - SaveManager::Instance->LoadData("pauseTimer", gSaveContext.sohStats.pauseTimer); - SaveManager::Instance->LoadArray("timestamps", ARRAY_COUNT(gSaveContext.sohStats.itemTimestamp), [](size_t i) { - SaveManager::Instance->LoadData("", gSaveContext.sohStats.itemTimestamp[i]); + SaveManager::Instance->LoadData("rtaTiming", gSaveContext.ship.stats.rtaTiming); + SaveManager::Instance->LoadData("fileCreatedAt", gSaveContext.ship.stats.fileCreatedAt); + SaveManager::Instance->LoadData("playTimer", gSaveContext.ship.stats.playTimer); + SaveManager::Instance->LoadData("pauseTimer", gSaveContext.ship.stats.pauseTimer); + SaveManager::Instance->LoadArray("timestamps", ARRAY_COUNT(gSaveContext.ship.stats.itemTimestamp), [](size_t i) { + SaveManager::Instance->LoadData("", gSaveContext.ship.stats.itemTimestamp[i]); }); - SaveManager::Instance->LoadArray("counts", ARRAY_COUNT(gSaveContext.sohStats.count), [](size_t i) { - SaveManager::Instance->LoadData("", gSaveContext.sohStats.count[i]); + SaveManager::Instance->LoadArray("counts", ARRAY_COUNT(gSaveContext.ship.stats.count), [](size_t i) { + SaveManager::Instance->LoadData("", gSaveContext.ship.stats.count[i]); }); - SaveManager::Instance->LoadArray("scenesDiscovered", ARRAY_COUNT(gSaveContext.sohStats.scenesDiscovered), [](size_t i) { - SaveManager::Instance->LoadData("", gSaveContext.sohStats.scenesDiscovered[i]); + SaveManager::Instance->LoadArray("scenesDiscovered", ARRAY_COUNT(gSaveContext.ship.stats.scenesDiscovered), [](size_t i) { + SaveManager::Instance->LoadData("", gSaveContext.ship.stats.scenesDiscovered[i]); }); - SaveManager::Instance->LoadArray("entrancesDiscovered", ARRAY_COUNT(gSaveContext.sohStats.entrancesDiscovered), [](size_t i) { - SaveManager::Instance->LoadData("", gSaveContext.sohStats.entrancesDiscovered[i]); + SaveManager::Instance->LoadArray("entrancesDiscovered", ARRAY_COUNT(gSaveContext.ship.stats.entrancesDiscovered), [](size_t i) { + SaveManager::Instance->LoadData("", gSaveContext.ship.stats.entrancesDiscovered[i]); }); }); SaveManager::Instance->LoadArray("sceneFlags", ARRAY_COUNT(gSaveContext.sceneFlags), [](size_t i) { @@ -1745,13 +1743,13 @@ void SaveManager::LoadBaseVersion2() { SaveManager::Instance->LoadData("angle", gSaveContext.horseData.angle); }); - SaveManager::Instance->LoadArray("randomizerInf", ARRAY_COUNT(gSaveContext.randomizerInf), [](size_t i) { - SaveManager::Instance->LoadData("", gSaveContext.randomizerInf[i]); + SaveManager::Instance->LoadArray("randomizerInf", ARRAY_COUNT(gSaveContext.ship.randomizerInf), [](size_t i) { + SaveManager::Instance->LoadData("", gSaveContext.ship.randomizerInf[i]); }); int isMQ = 0; SaveManager::Instance->LoadData("isMasterQuest", isMQ); if (isMQ) { - gSaveContext.questId = QUEST_MASTER; + gSaveContext.ship.quest.id = QUEST_MASTER; } // Workaround for breaking save compatibility from 5.0.2 -> 5.1.0 in commit d7c35221421bf712b5ead56a360f81f624aca4bc @@ -1797,7 +1795,7 @@ void SaveManager::LoadBaseVersion3() { int isRando = 0; SaveManager::Instance->LoadData("n64ddFlag", isRando); if (isRando) { - gSaveContext.questId = QUEST_RANDOMIZER; + gSaveContext.ship.quest.id = QUEST_RANDOMIZER; } SaveManager::Instance->LoadData("healthCapacity", gSaveContext.healthCapacity); SaveManager::Instance->LoadData("health", gSaveContext.health); @@ -1864,43 +1862,43 @@ void SaveManager::LoadBaseVersion3() { SaveManager::Instance->LoadData("gsTokens", gSaveContext.inventory.gsTokens); }); SaveManager::Instance->LoadStruct("sohStats", []() { - SaveManager::Instance->LoadCharArray("buildVersion", gSaveContext.sohStats.buildVersion, - ARRAY_COUNT(gSaveContext.sohStats.buildVersion)); - SaveManager::Instance->LoadData("buildVersionMajor", gSaveContext.sohStats.buildVersionMajor); - SaveManager::Instance->LoadData("buildVersionMinor", gSaveContext.sohStats.buildVersionMinor); - SaveManager::Instance->LoadData("buildVersionPatch", gSaveContext.sohStats.buildVersionPatch); + SaveManager::Instance->LoadCharArray("buildVersion", gSaveContext.ship.stats.buildVersion, + ARRAY_COUNT(gSaveContext.ship.stats.buildVersion)); + SaveManager::Instance->LoadData("buildVersionMajor", gSaveContext.ship.stats.buildVersionMajor); + SaveManager::Instance->LoadData("buildVersionMinor", gSaveContext.ship.stats.buildVersionMinor); + SaveManager::Instance->LoadData("buildVersionPatch", gSaveContext.ship.stats.buildVersionPatch); - SaveManager::Instance->LoadData("heartPieces", gSaveContext.sohStats.heartPieces); - SaveManager::Instance->LoadData("heartContainers", gSaveContext.sohStats.heartContainers); - SaveManager::Instance->LoadArray("dungeonKeys", ARRAY_COUNT(gSaveContext.sohStats.dungeonKeys), [](size_t i) { - SaveManager::Instance->LoadData("", gSaveContext.sohStats.dungeonKeys[i]); + SaveManager::Instance->LoadData("heartPieces", gSaveContext.ship.stats.heartPieces); + SaveManager::Instance->LoadData("heartContainers", gSaveContext.ship.stats.heartContainers); + SaveManager::Instance->LoadArray("dungeonKeys", ARRAY_COUNT(gSaveContext.ship.stats.dungeonKeys), [](size_t i) { + SaveManager::Instance->LoadData("", gSaveContext.ship.stats.dungeonKeys[i]); }); - SaveManager::Instance->LoadData("rtaTiming", gSaveContext.sohStats.rtaTiming); - SaveManager::Instance->LoadData("fileCreatedAt", gSaveContext.sohStats.fileCreatedAt); - SaveManager::Instance->LoadData("playTimer", gSaveContext.sohStats.playTimer); - SaveManager::Instance->LoadData("pauseTimer", gSaveContext.sohStats.pauseTimer); - SaveManager::Instance->LoadArray("itemTimestamps", ARRAY_COUNT(gSaveContext.sohStats.itemTimestamp), [](size_t i) { - SaveManager::Instance->LoadData("", gSaveContext.sohStats.itemTimestamp[i]); + SaveManager::Instance->LoadData("rtaTiming", gSaveContext.ship.stats.rtaTiming); + SaveManager::Instance->LoadData("fileCreatedAt", gSaveContext.ship.stats.fileCreatedAt); + SaveManager::Instance->LoadData("playTimer", gSaveContext.ship.stats.playTimer); + SaveManager::Instance->LoadData("pauseTimer", gSaveContext.ship.stats.pauseTimer); + SaveManager::Instance->LoadArray("itemTimestamps", ARRAY_COUNT(gSaveContext.ship.stats.itemTimestamp), [](size_t i) { + SaveManager::Instance->LoadData("", gSaveContext.ship.stats.itemTimestamp[i]); }); - SaveManager::Instance->LoadArray("sceneTimestamps", ARRAY_COUNT(gSaveContext.sohStats.sceneTimestamps), [](size_t i) { + SaveManager::Instance->LoadArray("sceneTimestamps", ARRAY_COUNT(gSaveContext.ship.stats.sceneTimestamps), [](size_t i) { SaveManager::Instance->LoadStruct("", [&i]() { - SaveManager::Instance->LoadData("scene", gSaveContext.sohStats.sceneTimestamps[i].scene); - SaveManager::Instance->LoadData("room", gSaveContext.sohStats.sceneTimestamps[i].room); - SaveManager::Instance->LoadData("sceneTime", gSaveContext.sohStats.sceneTimestamps[i].sceneTime); - SaveManager::Instance->LoadData("roomTime", gSaveContext.sohStats.sceneTimestamps[i].roomTime); - SaveManager::Instance->LoadData("isRoom", gSaveContext.sohStats.sceneTimestamps[i].isRoom); + SaveManager::Instance->LoadData("scene", gSaveContext.ship.stats.sceneTimestamps[i].scene); + SaveManager::Instance->LoadData("room", gSaveContext.ship.stats.sceneTimestamps[i].room); + SaveManager::Instance->LoadData("sceneTime", gSaveContext.ship.stats.sceneTimestamps[i].sceneTime); + SaveManager::Instance->LoadData("roomTime", gSaveContext.ship.stats.sceneTimestamps[i].roomTime); + SaveManager::Instance->LoadData("isRoom", gSaveContext.ship.stats.sceneTimestamps[i].isRoom); }); }); - SaveManager::Instance->LoadData("tsIdx", gSaveContext.sohStats.tsIdx); - SaveManager::Instance->LoadArray("counts", ARRAY_COUNT(gSaveContext.sohStats.count), [](size_t i) { - SaveManager::Instance->LoadData("", gSaveContext.sohStats.count[i]); + SaveManager::Instance->LoadData("tsIdx", gSaveContext.ship.stats.tsIdx); + SaveManager::Instance->LoadArray("counts", ARRAY_COUNT(gSaveContext.ship.stats.count), [](size_t i) { + SaveManager::Instance->LoadData("", gSaveContext.ship.stats.count[i]); }); - SaveManager::Instance->LoadArray("scenesDiscovered", ARRAY_COUNT(gSaveContext.sohStats.scenesDiscovered), [](size_t i) { - SaveManager::Instance->LoadData("", gSaveContext.sohStats.scenesDiscovered[i]); + SaveManager::Instance->LoadArray("scenesDiscovered", ARRAY_COUNT(gSaveContext.ship.stats.scenesDiscovered), [](size_t i) { + SaveManager::Instance->LoadData("", gSaveContext.ship.stats.scenesDiscovered[i]); }); - SaveManager::Instance->LoadArray("entrancesDiscovered", ARRAY_COUNT(gSaveContext.sohStats.entrancesDiscovered), [](size_t i) { - SaveManager::Instance->LoadData("", gSaveContext.sohStats.entrancesDiscovered[i]); + SaveManager::Instance->LoadArray("entrancesDiscovered", ARRAY_COUNT(gSaveContext.ship.stats.entrancesDiscovered), [](size_t i) { + SaveManager::Instance->LoadData("", gSaveContext.ship.stats.entrancesDiscovered[i]); }); }); SaveManager::Instance->LoadArray("sceneFlags", ARRAY_COUNT(gSaveContext.sceneFlags), [](size_t i) { @@ -1978,27 +1976,27 @@ void SaveManager::LoadBaseVersion3() { SaveManager::Instance->LoadData("angle", gSaveContext.horseData.angle); }); - SaveManager::Instance->LoadArray("randomizerInf", ARRAY_COUNT(gSaveContext.randomizerInf), [](size_t i) { - SaveManager::Instance->LoadData("", gSaveContext.randomizerInf[i]); + SaveManager::Instance->LoadArray("randomizerInf", ARRAY_COUNT(gSaveContext.ship.randomizerInf), [](size_t i) { + SaveManager::Instance->LoadData("", gSaveContext.ship.randomizerInf[i]); }); int isMQ = 0; SaveManager::Instance->LoadData("isMasterQuest", isMQ); if (isMQ) { - gSaveContext.questId = QUEST_MASTER; + gSaveContext.ship.quest.id = QUEST_MASTER; } SaveManager::Instance->LoadStruct("backupFW", []() { SaveManager::Instance->LoadStruct("pos", []() { - SaveManager::Instance->LoadData("x", gSaveContext.backupFW.pos.x); - SaveManager::Instance->LoadData("y", gSaveContext.backupFW.pos.y); - SaveManager::Instance->LoadData("z", gSaveContext.backupFW.pos.z); + SaveManager::Instance->LoadData("x", gSaveContext.ship.backupFW.pos.x); + SaveManager::Instance->LoadData("y", gSaveContext.ship.backupFW.pos.y); + SaveManager::Instance->LoadData("z", gSaveContext.ship.backupFW.pos.z); }); - SaveManager::Instance->LoadData("yaw", gSaveContext.backupFW.yaw); - SaveManager::Instance->LoadData("playerParams", gSaveContext.backupFW.playerParams); - SaveManager::Instance->LoadData("entranceIndex", gSaveContext.backupFW.entranceIndex); - SaveManager::Instance->LoadData("roomIndex", gSaveContext.backupFW.roomIndex); - SaveManager::Instance->LoadData("set", gSaveContext.backupFW.set); - SaveManager::Instance->LoadData("tempSwchFlags", gSaveContext.backupFW.tempSwchFlags); - SaveManager::Instance->LoadData("tempCollectFlags", gSaveContext.backupFW.tempCollectFlags); + SaveManager::Instance->LoadData("yaw", gSaveContext.ship.backupFW.yaw); + SaveManager::Instance->LoadData("playerParams", gSaveContext.ship.backupFW.playerParams); + SaveManager::Instance->LoadData("entranceIndex", gSaveContext.ship.backupFW.entranceIndex); + SaveManager::Instance->LoadData("roomIndex", gSaveContext.ship.backupFW.roomIndex); + SaveManager::Instance->LoadData("set", gSaveContext.ship.backupFW.set); + SaveManager::Instance->LoadData("tempSwchFlags", gSaveContext.ship.backupFW.tempSwchFlags); + SaveManager::Instance->LoadData("tempCollectFlags", gSaveContext.ship.backupFW.tempCollectFlags); }); SaveManager::Instance->LoadData("dogParams", gSaveContext.dogParams); } @@ -2018,7 +2016,7 @@ void SaveManager::LoadBaseVersion4() { int isRando = 0; SaveManager::Instance->LoadData("n64ddFlag", isRando); if (isRando) { - gSaveContext.questId = QUEST_RANDOMIZER; + gSaveContext.ship.quest.id = QUEST_RANDOMIZER; } SaveManager::Instance->LoadData("healthCapacity", gSaveContext.healthCapacity); SaveManager::Instance->LoadData("health", gSaveContext.health); @@ -2159,30 +2157,30 @@ void SaveManager::LoadBaseVersion4() { SaveManager::Instance->LoadData("angle", gSaveContext.horseData.angle); }); - SaveManager::Instance->LoadArray("randomizerInf", ARRAY_COUNT(gSaveContext.randomizerInf), [](size_t i) { - SaveManager::Instance->LoadData("", gSaveContext.randomizerInf[i]); + SaveManager::Instance->LoadArray("randomizerInf", ARRAY_COUNT(gSaveContext.ship.randomizerInf), [](size_t i) { + SaveManager::Instance->LoadData("", gSaveContext.ship.randomizerInf[i]); }); int isMQ = 0; SaveManager::Instance->LoadData("isMasterQuest", isMQ); if (isMQ) { - gSaveContext.questId = QUEST_MASTER; + gSaveContext.ship.quest.id = QUEST_MASTER; } SaveManager::Instance->LoadStruct("backupFW", []() { SaveManager::Instance->LoadStruct("pos", []() { - SaveManager::Instance->LoadData("x", gSaveContext.backupFW.pos.x); - SaveManager::Instance->LoadData("y", gSaveContext.backupFW.pos.y); - SaveManager::Instance->LoadData("z", gSaveContext.backupFW.pos.z); + SaveManager::Instance->LoadData("x", gSaveContext.ship.backupFW.pos.x); + SaveManager::Instance->LoadData("y", gSaveContext.ship.backupFW.pos.y); + SaveManager::Instance->LoadData("z", gSaveContext.ship.backupFW.pos.z); }); - SaveManager::Instance->LoadData("yaw", gSaveContext.backupFW.yaw); - SaveManager::Instance->LoadData("playerParams", gSaveContext.backupFW.playerParams); - SaveManager::Instance->LoadData("entranceIndex", gSaveContext.backupFW.entranceIndex); - SaveManager::Instance->LoadData("roomIndex", gSaveContext.backupFW.roomIndex); - SaveManager::Instance->LoadData("set", gSaveContext.backupFW.set); - SaveManager::Instance->LoadData("tempSwchFlags", gSaveContext.backupFW.tempSwchFlags); - SaveManager::Instance->LoadData("tempCollectFlags", gSaveContext.backupFW.tempCollectFlags); + SaveManager::Instance->LoadData("yaw", gSaveContext.ship.backupFW.yaw); + SaveManager::Instance->LoadData("playerParams", gSaveContext.ship.backupFW.playerParams); + SaveManager::Instance->LoadData("entranceIndex", gSaveContext.ship.backupFW.entranceIndex); + SaveManager::Instance->LoadData("roomIndex", gSaveContext.ship.backupFW.roomIndex); + SaveManager::Instance->LoadData("set", gSaveContext.ship.backupFW.set); + SaveManager::Instance->LoadData("tempSwchFlags", gSaveContext.ship.backupFW.tempSwchFlags); + SaveManager::Instance->LoadData("tempCollectFlags", gSaveContext.ship.backupFW.tempCollectFlags); }); SaveManager::Instance->LoadData("dogParams", gSaveContext.dogParams); - SaveManager::Instance->LoadData("maskMemory", gSaveContext.maskMemory); + SaveManager::Instance->LoadData("maskMemory", gSaveContext.ship.maskMemory); } void SaveManager::SaveBase(SaveContext* saveContext, int sectionID, bool fullSave) { @@ -2197,7 +2195,7 @@ void SaveManager::SaveBase(SaveContext* saveContext, int sectionID, bool fullSav SaveManager::Instance->SaveArray("playerName", ARRAY_COUNT(saveContext->playerName), [&](size_t i) { SaveManager::Instance->SaveData("", saveContext->playerName[i]); }); - SaveManager::Instance->SaveData("n64ddFlag", saveContext->questId == QUEST_RANDOMIZER); + SaveManager::Instance->SaveData("n64ddFlag", saveContext->ship.quest.id == QUEST_RANDOMIZER); SaveManager::Instance->SaveData("healthCapacity", saveContext->healthCapacity); SaveManager::Instance->SaveData("health", saveContext->health); SaveManager::Instance->SaveData("magicLevel", saveContext->magicLevel); @@ -2333,26 +2331,26 @@ void SaveManager::SaveBase(SaveContext* saveContext, int sectionID, bool fullSav SaveManager::Instance->SaveData("angle", saveContext->horseData.angle); }); - SaveManager::Instance->SaveArray("randomizerInf", ARRAY_COUNT(saveContext->randomizerInf), [&](size_t i) { - SaveManager::Instance->SaveData("", saveContext->randomizerInf[i]); + SaveManager::Instance->SaveArray("randomizerInf", ARRAY_COUNT(saveContext->ship.randomizerInf), [&](size_t i) { + SaveManager::Instance->SaveData("", saveContext->ship.randomizerInf[i]); }); - SaveManager::Instance->SaveData("isMasterQuest", saveContext->questId == QUEST_MASTER); + SaveManager::Instance->SaveData("isMasterQuest", saveContext->ship.quest.id == QUEST_MASTER); SaveManager::Instance->SaveStruct("backupFW", [&]() { SaveManager::Instance->SaveStruct("pos", [&]() { - SaveManager::Instance->SaveData("x", saveContext->backupFW.pos.x); - SaveManager::Instance->SaveData("y", saveContext->backupFW.pos.y); - SaveManager::Instance->SaveData("z", saveContext->backupFW.pos.z); + SaveManager::Instance->SaveData("x", saveContext->ship.backupFW.pos.x); + SaveManager::Instance->SaveData("y", saveContext->ship.backupFW.pos.y); + SaveManager::Instance->SaveData("z", saveContext->ship.backupFW.pos.z); }); - SaveManager::Instance->SaveData("yaw", saveContext->backupFW.yaw); - SaveManager::Instance->SaveData("playerParams", saveContext->backupFW.playerParams); - SaveManager::Instance->SaveData("entranceIndex", saveContext->backupFW.entranceIndex); - SaveManager::Instance->SaveData("roomIndex", saveContext->backupFW.roomIndex); - SaveManager::Instance->SaveData("set", saveContext->backupFW.set); - SaveManager::Instance->SaveData("tempSwchFlags", saveContext->backupFW.tempSwchFlags); - SaveManager::Instance->SaveData("tempCollectFlags", saveContext->backupFW.tempCollectFlags); + SaveManager::Instance->SaveData("yaw", saveContext->ship.backupFW.yaw); + SaveManager::Instance->SaveData("playerParams", saveContext->ship.backupFW.playerParams); + SaveManager::Instance->SaveData("entranceIndex", saveContext->ship.backupFW.entranceIndex); + SaveManager::Instance->SaveData("roomIndex", saveContext->ship.backupFW.roomIndex); + SaveManager::Instance->SaveData("set", saveContext->ship.backupFW.set); + SaveManager::Instance->SaveData("tempSwchFlags", saveContext->ship.backupFW.tempSwchFlags); + SaveManager::Instance->SaveData("tempCollectFlags", saveContext->ship.backupFW.tempCollectFlags); }); SaveManager::Instance->SaveData("dogParams", saveContext->dogParams); - SaveManager::Instance->SaveData("maskMemory", saveContext->maskMemory); + SaveManager::Instance->SaveData("maskMemory", saveContext->ship.maskMemory); } // Load a string into a char array based on size and ensuring it is null terminated when overflowed @@ -2846,14 +2844,11 @@ extern "C" void Save_SaveGlobal(void) { extern "C" void Save_LoadFile(void) { // Handle vanilla context reset OTRGlobals::Instance->gRandoContext->GetLogic()->SetContext(nullptr); + Rando::Settings::GetInstance()->ClearContext(); OTRGlobals::Instance->gRandoContext.reset(); OTRGlobals::Instance->gRandoContext = Rando::Context::CreateInstance(); OTRGlobals::Instance->gRandoContext->GetLogic()->SetSaveContext(&gSaveContext); - - if (SaveManager::Instance->fileMetaInfo[gSaveContext.fileNum].randoSave) { - OTRGlobals::Instance->gRandoContext->AddExcludedOptions(); - OTRGlobals::Instance->gRandoContext->GetSettings()->CreateOptions(); - } + Rando::Settings::GetInstance()->AssignContext(OTRGlobals::Instance->gRandoContext); SaveManager::Instance->LoadFile(gSaveContext.fileNum); } diff --git a/soh/soh/SohGui.hpp b/soh/soh/SohGui.hpp deleted file mode 100644 index 3f9d616db..000000000 --- a/soh/soh/SohGui.hpp +++ /dev/null @@ -1,49 +0,0 @@ -// -// SohGui.hpp -// soh -// -// Created by David Chavez on 24.08.22. -// - -#ifndef SohGui_hpp -#define SohGui_hpp - -#include -#include "SohMenuBar.h" -#include "Enhancements/audio/AudioEditor.h" -#include "Enhancements/controls/InputViewer.h" -#include "Enhancements/cosmetics/CosmeticsEditor.h" -#include "Enhancements/debugger/actorViewer.h" -#include "Enhancements/debugger/colViewer.h" -#include "Enhancements/debugger/debugSaveEditor.h" -#include "Enhancements/debugger/hookDebugger.h" -#include "Enhancements/debugger/dlViewer.h" -#include "Enhancements/debugger/valueViewer.h" -#include "Enhancements/gameplaystatswindow.h" -#include "Enhancements/randomizer/randomizer_check_tracker.h" -#include "Enhancements/randomizer/randomizer_entrance_tracker.h" -#include "Enhancements/randomizer/randomizer_item_tracker.h" -#include "Enhancements/randomizer/randomizer_settings_window.h" -#include "Enhancements/timesplits/TimeSplits.h" -#include "Enhancements/randomizer/Plandomizer.h" -#include "SohModals.h" - -#ifdef __cplusplus -extern "C" { -#endif - void enableBetaQuest(); - void disableBetaQuest(); -#ifdef __cplusplus -} -#endif - -namespace SohGui { - void SetupHooks(); - void SetupGuiElements(); - void Draw(); - void Destroy(); - void RegisterPopup(std::string title, std::string message, std::string button1 = "OK", std::string button2 = "", std::function button1callback = nullptr, std::function button2callback = nullptr); - void ShowRandomizerSettingsMenu(); -} - -#endif /* SohGui_hpp */ diff --git a/soh/soh/ImGuiUtils.cpp b/soh/soh/SohGui/ImGuiUtils.cpp similarity index 86% rename from soh/soh/ImGuiUtils.cpp rename to soh/soh/SohGui/ImGuiUtils.cpp index bfe1293d5..ebedf6b59 100644 --- a/soh/soh/ImGuiUtils.cpp +++ b/soh/soh/SohGui/ImGuiUtils.cpp @@ -136,6 +136,18 @@ std::map triforcePieceMapping = { {RG_TRIFORCE_PIECE, {RG_TRIFORCE_PIECE, "RG_TRIFORCE_PIECE", "RG_TRIFORCE_PIECE_Faded", gTriforcePieceTex}} }; +std::map bossSoulMapping = { + { RG_GOHMA_SOUL, { RG_GOHMA_SOUL, "RG_GOHMA_SOUL", "RG_GOHMA_SOUL_Faded", gBossSoulTex } }, + { RG_KING_DODONGO_SOUL, { RG_KING_DODONGO_SOUL, "RG_KING_DODONGO_SOUL", "RG_KING_DODONGO_SOUL_Faded", gBossSoulTex } }, + { RG_BARINADE_SOUL, { RG_BARINADE_SOUL, "RG_BARINADE_SOUL", "RG_BARINADE_SOUL_Faded", gBossSoulTex } }, + { RG_PHANTOM_GANON_SOUL,{ RG_PHANTOM_GANON_SOUL,"RG_PHANTOM_GANON_SOUL","RG_PHANTOM_GANON_SOUL_Faded", gBossSoulTex } }, + { RG_VOLVAGIA_SOUL, { RG_VOLVAGIA_SOUL, "RG_VOLVAGIA_SOUL", "RG_VOLVAGIA_SOUL_Faded", gBossSoulTex } }, + { RG_MORPHA_SOUL, { RG_MORPHA_SOUL, "RG_MORPHA_SOUL", "RG_MORPHA_SOUL_Faded", gBossSoulTex } }, + { RG_BONGO_BONGO_SOUL, { RG_BONGO_BONGO_SOUL, "RG_BONGO_BONGO_SOUL", "RG_BONGO_BONGO_SOUL_Faded", gBossSoulTex } }, + { RG_TWINROVA_SOUL, { RG_TWINROVA_SOUL, "RG_TWINROVA_SOUL", "RG_TWINROVA_SOUL_Faded", gBossSoulTex } }, + { RG_GANON_SOUL, { RG_GANON_SOUL, "RG_GANON_SOUL", "RG_GANON_SOUL_Faded", gBossSoulTex } }, +}; + std::map questMapping = { QUEST_MAP_ENTRY(QUEST_MEDALLION_FOREST, dgQuestIconMedallionForestTex), QUEST_MAP_ENTRY(QUEST_MEDALLION_FIRE, dgQuestIconMedallionFireTex), @@ -208,6 +220,11 @@ void RegisterImGuiItemIcons() { Ship::Context::GetInstance()->GetWindow()->GetGui()->LoadGuiTexture(entry.second.nameFaded, entry.second.texturePath, ImVec4(1, 1, 1, 0.3f)); } + for (const auto& entry : bossSoulMapping) { + Ship::Context::GetInstance()->GetWindow()->GetGui()->LoadGuiTexture(entry.second.name, entry.second.texturePath, ImVec4(1, 1, 1, 1)); + Ship::Context::GetInstance()->GetWindow()->GetGui()->LoadGuiTexture(entry.second.nameFaded, entry.second.texturePath, ImVec4(1, 1, 1, 0.3f)); + } + for (const auto& entry : questMapping) { Ship::Context::GetInstance()->GetWindow()->GetGui()->LoadGuiTexture(entry.second.name, entry.second.texturePath, ImVec4(1, 1, 1, 1)); Ship::Context::GetInstance()->GetWindow()->GetGui()->LoadGuiTexture(entry.second.nameFaded, entry.second.texturePath, ImVec4(1, 1, 1, 0.3f)); diff --git a/soh/soh/ImGuiUtils.h b/soh/soh/SohGui/ImGuiUtils.h similarity index 97% rename from soh/soh/ImGuiUtils.h rename to soh/soh/SohGui/ImGuiUtils.h index 763bae49b..fde8ec6a4 100644 --- a/soh/soh/ImGuiUtils.h +++ b/soh/soh/SohGui/ImGuiUtils.h @@ -7,7 +7,7 @@ #include #include #include -#include "Enhancements/randomizer/randomizerTypes.h" +#include "soh/Enhancements/randomizer/randomizerTypes.h" #include "variables.h" //only for gItemIcons extern "C" { diff --git a/soh/soh/SohGui.cpp b/soh/soh/SohGui/SohGui.cpp similarity index 96% rename from soh/soh/SohGui.cpp rename to soh/soh/SohGui/SohGui.cpp index 6cc4e1de6..84a44b052 100644 --- a/soh/soh/SohGui.cpp +++ b/soh/soh/SohGui/SohGui.cpp @@ -25,15 +25,15 @@ #include "include/global.h" #include "include/z64audio.h" #include "soh/SaveManager.h" -#include "OTRGlobals.h" +#include "soh/OTRGlobals.h" #include "soh/Enhancements/presets.h" #include "soh/resource/type/Skeleton.h" #include "libultraship/libultraship.h" -#include "Enhancements/game-interactor/GameInteractor.h" -#include "Enhancements/cosmetics/authenticGfxPatches.h" -#include "Enhancements/resolution-editor/ResolutionEditor.h" -#include "Enhancements/debugger/MessageViewer.h" +#include "soh/Enhancements/game-interactor/GameInteractor.h" +#include "soh/Enhancements/cosmetics/authenticGfxPatches.h" +#include "soh/Enhancements/resolution-editor/ResolutionEditor.h" +#include "soh/Enhancements/debugger/MessageViewer.h" #include "soh/Notification/Notification.h" #include "soh/Enhancements/TimeDisplay/TimeDisplay.h" @@ -65,7 +65,6 @@ namespace SohGui { static const char* subSubPowers[7] = { allPowers[0], allPowers[1], allPowers[2], allPowers[3], allPowers[4], allPowers[5], allPowers[6] }; static const char* zFightingOptions[3] = { "Disabled", "Consistent Vanish", "No Vanish" }; static const char* autosaveLabels[6] = { "Off", "New Location + Major Item", "New Location + Any Item", "New Location", "Major Item", "Any Item" }; - static const char* FastFileSelect[5] = { "File N.1", "File N.2", "File N.3", "Zelda Map Select (require OoT Debug Mode)", "File select" }; static const char* bonkDamageValues[8] = { "No Damage", "0.25 Heart", @@ -135,6 +134,7 @@ namespace SohGui { std::shared_ptr mModalWindow; std::shared_ptr mNotificationWindow; std::shared_ptr mTimeDisplayWindow; + std::shared_ptr mAboutWindow; void SetupGuiElements() { auto gui = Ship::Context::GetInstance()->GetWindow()->GetGui(); @@ -222,6 +222,8 @@ namespace SohGui { mNotificationWindow->Show(); mTimeDisplayWindow = std::make_shared(CVAR_WINDOW("TimeDisplayEnabled"), "Additional Timers"); gui->AddGuiWindow(mTimeDisplayWindow); + mAboutWindow = std::make_shared(CVAR_WINDOW("AboutWindow"), "About"); + gui->AddGuiWindow(mAboutWindow); } void Destroy() { @@ -258,6 +260,7 @@ namespace SohGui { mTimeSplitWindow = nullptr; mPlandomizerWindow = nullptr; mTimeDisplayWindow = nullptr; + mAboutWindow = nullptr; } void RegisterPopup(std::string title, std::string message, std::string button1, std::string button2, std::function button1callback, std::function button2callback) { diff --git a/soh/soh/SohGui/SohGui.hpp b/soh/soh/SohGui/SohGui.hpp new file mode 100644 index 000000000..4544c13e9 --- /dev/null +++ b/soh/soh/SohGui/SohGui.hpp @@ -0,0 +1,50 @@ +// +// SohGui.hpp +// soh +// +// Created by David Chavez on 24.08.22. +// + +#ifndef SohGui_hpp +#define SohGui_hpp + +#include +#include "SohMenuBar.h" +#include "soh/Enhancements/audio/AudioEditor.h" +#include "soh/Enhancements/controls/InputViewer.h" +#include "soh/Enhancements/cosmetics/CosmeticsEditor.h" +#include "soh/Enhancements/debugger/actorViewer.h" +#include "soh/Enhancements/debugger/colViewer.h" +#include "soh/Enhancements/debugger/debugSaveEditor.h" +#include "soh/Enhancements/debugger/hookDebugger.h" +#include "soh/Enhancements/debugger/dlViewer.h" +#include "soh/Enhancements/debugger/valueViewer.h" +#include "soh/Enhancements/gameplaystatswindow.h" +#include "soh/Enhancements/randomizer/randomizer_check_tracker.h" +#include "soh/Enhancements/randomizer/randomizer_entrance_tracker.h" +#include "soh/Enhancements/randomizer/randomizer_item_tracker.h" +#include "soh/Enhancements/randomizer/randomizer_settings_window.h" +#include "soh/Enhancements/timesplits/TimeSplits.h" +#include "soh/Enhancements/randomizer/Plandomizer.h" +#include "soh/AboutWindow.h" +#include "SohModals.h" + +#ifdef __cplusplus +extern "C" { +#endif + void enableBetaQuest(); + void disableBetaQuest(); +#ifdef __cplusplus +} +#endif + +namespace SohGui { + void SetupHooks(); + void SetupGuiElements(); + void Draw(); + void Destroy(); + void RegisterPopup(std::string title, std::string message, std::string button1 = "OK", std::string button2 = "", std::function button1callback = nullptr, std::function button2callback = nullptr); + void ShowRandomizerSettingsMenu(); +} + +#endif /* SohGui_hpp */ diff --git a/soh/soh/SohMenuBar.cpp b/soh/soh/SohGui/SohMenuBar.cpp similarity index 96% rename from soh/soh/SohMenuBar.cpp rename to soh/soh/SohGui/SohMenuBar.cpp index a55007de9..2330a1f04 100644 --- a/soh/soh/SohMenuBar.cpp +++ b/soh/soh/SohGui/SohMenuBar.cpp @@ -6,44 +6,45 @@ #include "UIWidgets.hpp" #include "include/z64audio.h" #include "graphic/Fast3D/gfx_rendering_api.h" -#include "OTRGlobals.h" -#include "SaveManager.h" +#include "soh/OTRGlobals.h" +#include "soh/SaveManager.h" #include "z64.h" -#include "cvar_prefixes.h" +#include "soh/cvar_prefixes.h" #include "macros.h" #include "functions.h" #include "variables.h" -#include "Enhancements/game-interactor/GameInteractor.h" +#include "soh/Enhancements/game-interactor/GameInteractor.h" #include "soh/Enhancements/presets.h" #include "soh/Enhancements/mods.h" #include "soh/Notification/Notification.h" -#include "Enhancements/cosmetics/authenticGfxPatches.h" +#include "soh/Enhancements/cosmetics/authenticGfxPatches.h" #ifdef ENABLE_REMOTE_CONTROL #include "soh/Network/CrowdControl/CrowdControl.h" #include "soh/Network/Sail/Sail.h" #endif -#include "Enhancements/audio/AudioEditor.h" -#include "Enhancements/controls/InputViewer.h" -#include "Enhancements/cosmetics/CosmeticsEditor.h" -#include "Enhancements/debugger/actorViewer.h" -#include "Enhancements/debugger/colViewer.h" -#include "Enhancements/debugger/debugSaveEditor.h" -#include "Enhancements/debugger/hookDebugger.h" -#include "Enhancements/debugger/dlViewer.h" -#include "Enhancements/debugger/valueViewer.h" -#include "Enhancements/gameplaystatswindow.h" -#include "Enhancements/debugger/MessageViewer.h" -#include "Enhancements/randomizer/randomizer_check_tracker.h" -#include "Enhancements/randomizer/randomizer_entrance_tracker.h" -#include "Enhancements/randomizer/randomizer_item_tracker.h" -#include "Enhancements/randomizer/randomizer_settings_window.h" -#include "Enhancements/resolution-editor/ResolutionEditor.h" -#include "Enhancements/enemyrandomizer.h" -#include "Enhancements/timesplits/TimeSplits.h" -#include "Enhancements/randomizer/Plandomizer.h" -#include "Enhancements/TimeDisplay/TimeDisplay.h" +#include "soh/Enhancements/audio/AudioEditor.h" +#include "soh/Enhancements/controls/InputViewer.h" +#include "soh/Enhancements/cosmetics/CosmeticsEditor.h" +#include "soh/Enhancements/debugger/actorViewer.h" +#include "soh/Enhancements/debugger/colViewer.h" +#include "soh/Enhancements/debugger/debugSaveEditor.h" +#include "soh/Enhancements/debugger/hookDebugger.h" +#include "soh/Enhancements/debugger/dlViewer.h" +#include "soh/Enhancements/debugger/valueViewer.h" +#include "soh/Enhancements/gameplaystatswindow.h" +#include "soh/Enhancements/debugger/MessageViewer.h" +#include "soh/Enhancements/randomizer/randomizer_check_tracker.h" +#include "soh/Enhancements/randomizer/randomizer_entrance_tracker.h" +#include "soh/Enhancements/randomizer/randomizer_item_tracker.h" +#include "soh/Enhancements/randomizer/randomizer_settings_window.h" +#include "soh/Enhancements/resolution-editor/ResolutionEditor.h" +#include "soh/Enhancements/enemyrandomizer.h" +#include "soh/Enhancements/timesplits/TimeSplits.h" +#include "soh/Enhancements/randomizer/Plandomizer.h" +#include "soh/Enhancements/TimeDisplay/TimeDisplay.h" +#include "soh/AboutWindow.h" // FA icons are kind of wonky, if they worked how I expected them to the "+ 2.0f" wouldn't be needed, but // they don't work how I expect them to so I added that because it looked good when I eyeballed it @@ -104,8 +105,8 @@ static const char* imguiScaleOptions[4] = { "Small", "Normal", "Large", "X-Large static const char* subSubPowers[7] = { allPowers[0], allPowers[1], allPowers[2], allPowers[3], allPowers[4], allPowers[5], allPowers[6] }; static const char* zFightingOptions[3] = { "Disabled", "Consistent Vanish", "No Vanish" }; static const char* autosaveLabels[6] = { "Off", "New Location + Major Item", "New Location + Any Item", "New Location", "Major Item", "Any Item" }; + static const char* bootSequenceLabels[3] = { "Default", "Authentic", "File Select" }; static const char* DebugSaveFileModes[3] = { "Off", "Vanilla", "Maxed" }; - static const char* FastFileSelect[5] = { "File N.1", "File N.2", "File N.3", "Zelda Map Select (require OoT Debug Mode)", "File select" }; static const char* DekuStickCheat[3] = { "Normal", "Unbreakable", "Unbreakable + Always on Fire" }; static const char* bonkDamageValues[8] = { "No Damage", @@ -177,8 +178,18 @@ void DrawMenuBarIcon() { } } +extern std::shared_ptr mAboutWindow; + void DrawShipMenu() { if (ImGui::BeginMenu("Ship")) { + if (mAboutWindow) { + if (ImGui::MenuItem("About...")) { + mAboutWindow->Show(); + } + } + + UIWidgets::Spacer(0); + if (ImGui::MenuItem("Hide Menu Bar", #if !defined(__SWITCH__) && !defined(__WIIU__) "F1" @@ -310,9 +321,6 @@ void DrawSettingsMenu() { ImGui::PopStyleColor(1); ImGui::PopStyleVar(3); - UIWidgets::PaddedEnhancementSliderInt("Simulated Input Lag: %d frames", "##SimulatedInputLag", CVAR_SIMULATED_INPUT_LAG, 0, 6, "", 0, true, true, false); - UIWidgets::Tooltip("Buffers your inputs to be executed a specified amount of frames later"); - ImGui::EndMenu(); } @@ -773,7 +781,9 @@ void DrawEnhancementsMenu() { UIWidgets::Tooltip("The default response to Kaepora Gaebora is always that you understood what he said"); UIWidgets::PaddedEnhancementCheckbox("Exit Market at Night", CVAR_ENHANCEMENT("MarketSneak"), true, false); UIWidgets::Tooltip("Allows exiting Hyrule Castle Market Town to Hyrule Field at night by speaking to the guard next to the gate."); - UIWidgets::PaddedEnhancementCheckbox("Shops and Games Always Open", CVAR_ENHANCEMENT("OpenAllHours"), true, false); + bool randoLockedOverworldDoors = IS_RANDO && OTRGlobals::Instance->gRandomizer->GetRandoSettingValue(RSK_LOCK_OVERWORLD_DOORS); + UIWidgets::PaddedEnhancementCheckbox("Shops and Games Always Open", CVAR_ENHANCEMENT("OpenAllHours"), true, false, randoLockedOverworldDoors, + "This is not compatible with the Locked Overworld Doors Randomizer option", UIWidgets::CheckboxGraphics::Checkmark); UIWidgets::Tooltip("Shops and minigames are open both day and night. Requires scene reload to take effect."); UIWidgets::PaddedEnhancementCheckbox("Link as default file name", CVAR_ENHANCEMENT("LinkDefaultName"), true, false); UIWidgets::Tooltip("Allows you to have \"Link\" as a premade file name"); @@ -1550,8 +1560,6 @@ void DrawEnhancementsMenu() { if (ImGui::BeginMenu("Restoration")) { - UIWidgets::EnhancementCheckbox("Authentic Logo Screen", CVAR_ENHANCEMENT("AuthenticLogo")); - UIWidgets::Tooltip("Hide the game version and build details and display the authentic model and texture on the boot logo start screen"); UIWidgets::PaddedEnhancementCheckbox("Red Ganon blood", CVAR_ENHANCEMENT("RedGanonBlood"), true, false); UIWidgets::Tooltip("Restore the original red blood from NTSC 1.0/1.1. Disable for green blood"); UIWidgets::PaddedEnhancementCheckbox("Fish while hovering", CVAR_ENHANCEMENT("HoverFishing"), true, false); @@ -1572,7 +1580,11 @@ void DrawEnhancementsMenu() { UIWidgets::Tooltip("Restores a bug from NTSC 1.0/1.1 that allows you to obtain the eyeball frog from King Zora instead of the Zora Tunic by holding shield."); UIWidgets::PaddedEnhancementCheckbox("Pulsate boss icon", CVAR_ENHANCEMENT("PulsateBossIcon"), true, false); UIWidgets::Tooltip("Restores an unfinished feature to pulsate the boss room icon when you are in the boss room."); - + UIWidgets::PaddedEnhancementSliderInt("Pause Buffer Input Window: %d", "##PauseBufferWindow", CVAR_ENHANCEMENT("PauseBufferWindow"), 0, 40, "", 0, true, true, false); + UIWidgets::PaddedEnhancementCheckbox("Include held inputs at start of Buffer Input Window", CVAR_ENHANCEMENT("IncludeHeldInputsBufferWindow"), true, false); + UIWidgets::Tooltip("Typically, inputs that are held prior to the buffer window are not included in the buffer. This setting changes that behavior to include them. This may cause some inputs to be re-triggered undesireably, for instance Z-Targetting something you might not want to."); + UIWidgets::PaddedEnhancementSliderInt("Simulated Input Lag: %d frames", "##SimulatedInputLag", CVAR_SIMULATED_INPUT_LAG, 0, 6, "", 0, true, true, false); + UIWidgets::Tooltip("Buffers your inputs to be executed a specified amount of frames later"); ImGui::EndMenu(); } @@ -1712,6 +1724,16 @@ void DrawEnhancementsMenu() { UIWidgets::PaddedSeparator(true, true, 2.0f, 2.0f); + UIWidgets::PaddedText("Boot Sequence", false, true); + UIWidgets::EnhancementCombobox(CVAR_ENHANCEMENT("BootSequence"), bootSequenceLabels, BOOTSEQUENCE_DEFAULT); + UIWidgets::Tooltip("Configure what happens when starting or resetting the game\n\n" + "Default: LUS logo -> N64 logo\n" + "Authentic: N64 logo only\n" + "File Select: Skip to file select menu" + ); + + UIWidgets::PaddedSeparator(true, true, 2.0f, 2.0f); + ImGui::EndDisabled(); ImGui::PushStyleVar(ImGuiStyleVar_FramePadding, ImVec2(12.0f, 6.0f)); @@ -1886,11 +1908,8 @@ void DrawCheatsMenu() { UIWidgets::Tooltip("Makes every surface in the game climbable"); UIWidgets::PaddedEnhancementCheckbox("Moon Jump on L", CVAR_CHEAT("MoonJumpOnL"), true, false); UIWidgets::Tooltip("Holding L makes you float into the air"); - UIWidgets::PaddedEnhancementCheckbox("Easy Frame Advancing", CVAR_CHEAT("EasyPauseBuffer"), true, false); - UIWidgets::Tooltip("Continue holding START button when unpausing to only advance a single frame and then re-pause"); - const bool bEasyFrameAdvanceEnabled = CVarGetInteger(CVAR_CHEAT("EasyPauseBuffer"), 0); - UIWidgets::PaddedEnhancementCheckbox("Easy Input Buffering", CVAR_CHEAT("EasyInputBuffer"), true, false, bEasyFrameAdvanceEnabled, "Forced enabled when Easy Frame Advancing is enabled", UIWidgets::CheckboxGraphics::Checkmark); - UIWidgets::Tooltip("Inputs that are held down while the Subscreen is closing will be pressed when the game is resumed"); + UIWidgets::PaddedEnhancementCheckbox("New Easy Frame Advancing", CVAR_CHEAT("EasyFrameAdvance"), true, false); + UIWidgets::Tooltip("Continue holding START button when unpausing to only advance a single frame and then re-pause."); UIWidgets::PaddedEnhancementCheckbox("Drops Don't Despawn", CVAR_CHEAT("DropsDontDie"), true, false); UIWidgets::Tooltip("Drops from enemies, grass, etc. don't disappear after a set amount of time"); UIWidgets::PaddedEnhancementCheckbox("Fish Don't despawn", CVAR_CHEAT("NoFishDespawn"), true, false); @@ -2004,12 +2023,6 @@ void DrawDeveloperToolsMenu() { } UIWidgets::PaddedEnhancementCheckbox("OoT Skulltula Debug", CVAR_DEVELOPER_TOOLS("SkulltulaDebugEnabled"), true, false); UIWidgets::Tooltip("Enables Skulltula Debug, when moving the cursor in the menu above various map icons (boss key, compass, map screen locations, etc) will set the GS bits in that area.\nUSE WITH CAUTION AS IT DOES NOT UPDATE THE GS COUNT."); - UIWidgets::PaddedEnhancementCheckbox("Fast File Select", CVAR_DEVELOPER_TOOLS("SkipLogoTitle"), true, false); - UIWidgets::Tooltip("Load the game to the selected menu or file\n\"Zelda Map Select\" require debug mode else you will fallback to File choose menu\nUsing a file number that don't have save will create a save file only if you toggle on \"Create a new save if none ?\" else it will bring you to the File choose menu"); - if (CVarGetInteger(CVAR_DEVELOPER_TOOLS("SkipLogoTitle"), 0)) { - ImGui::Text("Loading:"); - UIWidgets::EnhancementCombobox(CVAR_DEVELOPER_TOOLS("SaveFileID"), FastFileSelect, 0); - }; UIWidgets::PaddedEnhancementCheckbox("Better Debug Warp Screen", CVAR_DEVELOPER_TOOLS("BetterDebugWarpScreen"), true, false); UIWidgets::Tooltip("Optimized debug warp screen, with the added ability to chose entrances and time of day"); UIWidgets::PaddedEnhancementCheckbox("Debug Warp Screen Translation", CVAR_DEVELOPER_TOOLS("DebugWarpScreenTranslation"), true, false, false, "", UIWidgets::CheckboxGraphics::Cross, true); @@ -2239,34 +2252,9 @@ void DrawRandomizerMenu() { UIWidgets::Tooltip( "When obtaining rupees, randomize what the rupee is called in the textbox." ); - - // Only disable the key colors checkbox when none of the keysanity settings are set to "Any Dungeon", "Overworld" or "Anywhere" - bool disableKeyColors = true; - - if (OTRGlobals::Instance->gRandomizer->GetRandoSettingValue(RSK_KEYSANITY) == RO_DUNGEON_ITEM_LOC_ANY_DUNGEON || - OTRGlobals::Instance->gRandomizer->GetRandoSettingValue(RSK_KEYSANITY) == RO_DUNGEON_ITEM_LOC_OVERWORLD || - OTRGlobals::Instance->gRandomizer->GetRandoSettingValue(RSK_KEYSANITY) == RO_DUNGEON_ITEM_LOC_ANYWHERE || - OTRGlobals::Instance->gRandomizer->GetRandoSettingValue(RSK_GERUDO_KEYS) != RO_GERUDO_KEYS_VANILLA || - OTRGlobals::Instance->gRandomizer->GetRandoSettingValue(RSK_BOSS_KEYSANITY) == RO_DUNGEON_ITEM_LOC_ANY_DUNGEON || - OTRGlobals::Instance->gRandomizer->GetRandoSettingValue(RSK_BOSS_KEYSANITY) == RO_DUNGEON_ITEM_LOC_OVERWORLD || - OTRGlobals::Instance->gRandomizer->GetRandoSettingValue(RSK_BOSS_KEYSANITY) == RO_DUNGEON_ITEM_LOC_ANYWHERE || - (OTRGlobals::Instance->gRandomizer->GetRandoSettingValue(RSK_GANONS_BOSS_KEY) != RO_GANON_BOSS_KEY_VANILLA && - OTRGlobals::Instance->gRandomizer->GetRandoSettingValue(RSK_GANONS_BOSS_KEY) != RO_GANON_BOSS_KEY_OWN_DUNGEON && - OTRGlobals::Instance->gRandomizer->GetRandoSettingValue(RSK_GANONS_BOSS_KEY) != RO_GANON_BOSS_KEY_STARTWITH) || - !IS_RANDO) { - disableKeyColors = false; - } - - static const char* disableKeyColorsText = - "This setting is disabled because a savefile is loaded without any key\n" - "shuffle settings set to \"Any Dungeon\", \"Overworld\" or \"Anywhere\""; - - UIWidgets::PaddedEnhancementCheckbox("Key Colors Match Dungeon", CVAR_RANDOMIZER_ENHANCEMENT("MatchKeyColors"), true, false, - disableKeyColors, disableKeyColorsText, UIWidgets::CheckboxGraphics::Cross, true); - UIWidgets::Tooltip( - "Matches the color of small keys and boss keys to the dungeon they belong to. " - "This helps identify keys from afar and adds a little bit of flair.\n\nThis only " - "applies to seeds with keys and boss keys shuffled to \"Any Dungeon\", \"Overworld\", or \"Anywhere\"."); + + UIWidgets::PaddedEnhancementCheckbox("Use Custom Key Models", CVAR_RANDOMIZER_ENHANCEMENT("CustomKeyModels"), true, false); + UIWidgets::Tooltip("Use Custom graphics for dungeon keys, Big and Small, so that they can be easily told apart"); bool disableCompassColors = !DUNGEON_ITEMS_CAN_BE_OUTSIDE_DUNGEON(RSK_SHUFFLE_MAPANDCOMPASS); @@ -2293,6 +2281,12 @@ void DrawRandomizerMenu() { "Displays a \"Mystery Item\" model in place of any freestanding/GS/shop items that were shuffled, " "and replaces item names for them and scrubs and merchants, regardless of hint settings, " "so you never know what you're getting."); + UIWidgets::PaddedEnhancementCheckbox("Simpler Boss Soul Models", + CVAR_RANDOMIZER_ENHANCEMENT("SimplerBossSoulModels"), true, false); + UIWidgets::Tooltip( + "When shuffling boss souls, they'll appear as a simpler model instead of showing the boss' models." + "This might make boss souls more distinguishable from a distance, and can help with performance." + ); ImGui::EndMenu(); } diff --git a/soh/soh/SohMenuBar.h b/soh/soh/SohGui/SohMenuBar.h similarity index 100% rename from soh/soh/SohMenuBar.h rename to soh/soh/SohGui/SohMenuBar.h diff --git a/soh/soh/SohModals.cpp b/soh/soh/SohGui/SohModals.cpp similarity index 98% rename from soh/soh/SohModals.cpp rename to soh/soh/SohGui/SohModals.cpp index 576df50f7..642fedf15 100644 --- a/soh/soh/SohModals.cpp +++ b/soh/soh/SohGui/SohModals.cpp @@ -5,7 +5,7 @@ #include #include #include "UIWidgets.hpp" -#include "OTRGlobals.h" +#include "soh/OTRGlobals.h" #include "z64.h" extern "C" PlayState* gPlayState; diff --git a/soh/soh/SohModals.h b/soh/soh/SohGui/SohModals.h similarity index 100% rename from soh/soh/SohModals.h rename to soh/soh/SohGui/SohModals.h diff --git a/soh/soh/UIWidgets.cpp b/soh/soh/SohGui/UIWidgets.cpp similarity index 99% rename from soh/soh/UIWidgets.cpp rename to soh/soh/SohGui/UIWidgets.cpp index 050c6714c..6d9ca7a65 100644 --- a/soh/soh/UIWidgets.cpp +++ b/soh/soh/SohGui/UIWidgets.cpp @@ -400,6 +400,7 @@ namespace UIWidgets { if (changed && (oldVal != val)) { CVarSetInteger(cvarName, val); Ship::Context::GetInstance()->GetWindow()->GetGui()->SaveConsoleVariablesNextFrame(); + ShipInit::Init(cvarName); } else { changed = false; } diff --git a/soh/soh/UIWidgets.hpp b/soh/soh/SohGui/UIWidgets.hpp similarity index 100% rename from soh/soh/UIWidgets.hpp rename to soh/soh/SohGui/UIWidgets.hpp diff --git a/soh/soh/config/ConfigMigrators.h b/soh/soh/config/ConfigMigrators.h index abfe9a6b1..48e1e708b 100644 --- a/soh/soh/config/ConfigMigrators.h +++ b/soh/soh/config/ConfigMigrators.h @@ -1319,7 +1319,6 @@ namespace SOH { { MigrationAction::Rename, "gRandomizeDoorOfTime", "gRandoSettings.DoorOfTime" }, { MigrationAction::Rename, "gRandomizeDungeonCount", "gRandoSettings.DungeonCount" }, { MigrationAction::Rename, "gRandomizeEnableBombchuDrops", "gRandoSettings.EnableBombchuDrops" }, - { MigrationAction::Rename, "gRandomizeEnableGlitchCutscenes", "gRandoSettings.EnableGlitchCutscenes" }, { MigrationAction::Rename, "gRandomizeEnabledTricks", "gRandoSettings.EnabledTricks" }, { MigrationAction::Rename, "gRandomizeForest", "gRandoSettings.ClosedForest" }, { MigrationAction::Rename, "gRandomizeFrogsHint", "gRandoSettings.FrogsHint" }, diff --git a/soh/src/code/code_800430A0.c b/soh/src/code/code_800430A0.c index 6047b2fc0..d1ccacc0d 100644 --- a/soh/src/code/code_800430A0.c +++ b/soh/src/code/code_800430A0.c @@ -62,7 +62,7 @@ void func_80043334(CollisionContext* colCtx, Actor* actor, s32 bgId) { if (dynaActor != NULL) { DynaPolyActor_SetActorOnTop(dynaActor); - if (CHECK_FLAG_ALL(actor->flags, ACTOR_FLAG_CAN_PRESS_SWITCH)) { + if (CHECK_FLAG_ALL(actor->flags, ACTOR_FLAG_CAN_PRESS_SWITCHES)) { DynaPolyActor_SetSwitchPressed(dynaActor); } } diff --git a/soh/src/code/game.c b/soh/src/code/game.c index a14266719..d7524009b 100644 --- a/soh/src/code/game.c +++ b/soh/src/code/game.c @@ -255,6 +255,8 @@ void GameState_Update(GameState* gameState) { GameState_SetFrameBuffer(gfxCtx); + GameInteractor_ExecuteOnGameStateMainStart(); + gameState->main(gameState); func_800C4344(gameState); diff --git a/soh/src/code/padmgr.c b/soh/src/code/padmgr.c index 8665fb448..a8bf778af 100644 --- a/soh/src/code/padmgr.c +++ b/soh/src/code/padmgr.c @@ -286,13 +286,6 @@ void PadMgr_ProcessInputs(PadMgr* padMgr) { Fault_AddHungupAndCrash(__FILE__, __LINE__); } - // When 3 frames are left on easy pause buffer, re-apply the last held inputs to the prev inputs - // to compute the pressed difference. This makes it so previously held inputs are continued as "held", - // but new inputs when unpausing are "pressed" out of the pause menu. - if (CVarGetInteger(CVAR_GENERAL("CheatEasyPauseBufferTimer"), 0) == 3) { - input->prev.button = CVarGetInteger(CVAR_GENERAL("CheatEasyPauseBufferLastInputs"), 0); - } - buttonDiff = input->prev.button ^ input->cur.button; input->press.button |= (u16)(buttonDiff & input->cur.button); input->rel.button |= (u16)(buttonDiff & input->prev.button); diff --git a/soh/src/code/z_actor.c b/soh/src/code/z_actor.c index 70c7a3233..5a5dc328e 100644 --- a/soh/src/code/z_actor.c +++ b/soh/src/code/z_actor.c @@ -529,7 +529,7 @@ void func_8002C124(TargetContext* targetCtx, PlayState* play) { } actor = targetCtx->unk_94; - if ((actor != NULL) && !(actor->flags & ACTOR_FLAG_NO_LOCKON)) { + if ((actor != NULL) && !(actor->flags & ACTOR_FLAG_LOCK_ON_DISABLED)) { FrameInterpolation_RecordOpenChild(actor, 1); NaviColor* naviColor = &sNaviColorList[actor->category]; @@ -624,7 +624,7 @@ void func_8002C7BC(TargetContext* targetCtx, Player* player, Actor* actorArg, Pl targetCtx->unk_48 = 0; } - lockOnSfxId = CHECK_FLAG_ALL(actorArg->flags, ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_HOSTILE) ? NA_SE_SY_LOCK_ON + lockOnSfxId = CHECK_FLAG_ALL(actorArg->flags, ACTOR_FLAG_ATTENTION_ENABLED | ACTOR_FLAG_HOSTILE) ? NA_SE_SY_LOCK_ON : NA_SE_SY_LOCK_ON_HUMAN; Sfx_PlaySfxCentered(lockOnSfxId); } @@ -1178,7 +1178,7 @@ void Actor_Kill(Actor* actor) { GameInteractor_ExecuteOnActorKill(actor); actor->draw = NULL; actor->update = NULL; - actor->flags &= ~ACTOR_FLAG_TARGETABLE; + actor->flags &= ~ACTOR_FLAG_ATTENTION_ENABLED; } void Actor_SetWorldToHome(Actor* actor) { @@ -1854,7 +1854,7 @@ f32 func_8002EFC0(Actor* actor, Player* player, s16 arg2) { s16 yawTempAbs = ABS(yawTemp); if (player->focusActor != NULL) { - if ((yawTempAbs > 0x4000) || (actor->flags & ACTOR_FLAG_NO_LOCKON)) { + if ((yawTempAbs > 0x4000) || (actor->flags & ACTOR_FLAG_LOCK_ON_DISABLED)) { return FLT_MAX; } else { f32 ret = @@ -1890,7 +1890,7 @@ u32 func_8002F090(Actor* actor, f32 arg1) { } s32 func_8002F0C8(Actor* actor, Player* player, s32 flag) { - if ((actor->update == NULL) || !(actor->flags & ACTOR_FLAG_TARGETABLE)) { + if ((actor->update == NULL) || !(actor->flags & ACTOR_FLAG_ATTENTION_ENABLED)) { return true; } @@ -1912,8 +1912,8 @@ s32 func_8002F0C8(Actor* actor, Player* player, s32 flag) { } u32 Actor_ProcessTalkRequest(Actor* actor, PlayState* play) { - if (actor->flags & ACTOR_FLAG_PLAYER_TALKED_TO) { - actor->flags &= ~ACTOR_FLAG_PLAYER_TALKED_TO; + if (actor->flags & ACTOR_FLAG_TALK) { + actor->flags &= ~ACTOR_FLAG_TALK; return true; } @@ -1924,7 +1924,7 @@ s32 func_8002F1C4(Actor* actor, PlayState* play, f32 arg2, f32 arg3, u32 exchang Player* player = GET_PLAYER(play); // This is convoluted but it seems like it must be a single if statement to match - if ((player->actor.flags & ACTOR_FLAG_PLAYER_TALKED_TO) || ((exchangeItemId != EXCH_ITEM_NONE) && Player_InCsMode(play)) || + if ((player->actor.flags & ACTOR_FLAG_TALK) || ((exchangeItemId != EXCH_ITEM_NONE) && Player_InCsMode(play)) || (!actor->isTargeted && ((arg3 < fabsf(actor->yDistToPlayer)) || (player->talkActorDistance < actor->xzDistToPlayer) || (arg2 < actor->xzDistToPlayer)))) { @@ -2235,30 +2235,30 @@ void func_8002F850(PlayState* play, Actor* actor) { void func_8002F8F0(Actor* actor, u16 sfxId) { actor->sfx = sfxId; - actor->flags |= ACTOR_FLAG_SFX_AT_POS; - actor->flags &= ~(ACTOR_FLAG_SFX_AT_CENTER | ACTOR_FLAG_SFX_AT_CENTER2 | ACTOR_FLAG_SFX_AS_TIMER); + actor->flags |= ACTOR_FLAG_SFX_ACTOR_POS_2; + actor->flags &= ~(ACTOR_AUDIO_FLAG_SFX_CENTERED_1 | ACTOR_AUDIO_FLAG_SFX_CENTERED_2 | ACTOR_FLAG_SFX_TIMER); } void func_8002F91C(Actor* actor, u16 sfxId) { actor->sfx = sfxId; - actor->flags |= ACTOR_FLAG_SFX_AT_CENTER; - actor->flags &= ~(ACTOR_FLAG_SFX_AT_POS | ACTOR_FLAG_SFX_AT_CENTER2 | ACTOR_FLAG_SFX_AS_TIMER); + actor->flags |= ACTOR_AUDIO_FLAG_SFX_CENTERED_1; + actor->flags &= ~(ACTOR_FLAG_SFX_ACTOR_POS_2 | ACTOR_AUDIO_FLAG_SFX_CENTERED_2 | ACTOR_FLAG_SFX_TIMER); } void func_8002F948(Actor* actor, u16 sfxId) { actor->sfx = sfxId; - actor->flags |= ACTOR_FLAG_SFX_AT_CENTER2; - actor->flags &= ~(ACTOR_FLAG_SFX_AT_POS | ACTOR_FLAG_SFX_AT_CENTER | ACTOR_FLAG_SFX_AS_TIMER); + actor->flags |= ACTOR_AUDIO_FLAG_SFX_CENTERED_2; + actor->flags &= ~(ACTOR_FLAG_SFX_ACTOR_POS_2 | ACTOR_AUDIO_FLAG_SFX_CENTERED_1 | ACTOR_FLAG_SFX_TIMER); } void func_8002F974(Actor* actor, u16 sfxId) { - actor->flags &= ~(ACTOR_FLAG_SFX_AT_POS | ACTOR_FLAG_SFX_AT_CENTER | ACTOR_FLAG_SFX_AT_CENTER2 | ACTOR_FLAG_SFX_AS_TIMER); + actor->flags &= ~(ACTOR_FLAG_SFX_ACTOR_POS_2 | ACTOR_AUDIO_FLAG_SFX_CENTERED_1 | ACTOR_AUDIO_FLAG_SFX_CENTERED_2 | ACTOR_FLAG_SFX_TIMER); actor->sfx = sfxId; } void func_8002F994(Actor* actor, s32 arg1) { - actor->flags |= ACTOR_FLAG_SFX_AS_TIMER; - actor->flags &= ~(ACTOR_FLAG_SFX_AT_POS | ACTOR_FLAG_SFX_AT_CENTER | ACTOR_FLAG_SFX_AT_CENTER2); + actor->flags |= ACTOR_FLAG_SFX_TIMER; + actor->flags &= ~(ACTOR_FLAG_SFX_ACTOR_POS_2 | ACTOR_AUDIO_FLAG_SFX_CENTERED_1 | ACTOR_AUDIO_FLAG_SFX_CENTERED_2); if (arg1 < 40) { actor->sfx = NA_SE_PL_WALK_DIRT - SFX_FLAG; } else if (arg1 < 100) { @@ -2567,7 +2567,7 @@ void Actor_UpdateAll(PlayState* play, ActorContext* actorCtx) { sp80 = &D_80116068[0]; if (player->stateFlags2 & PLAYER_STATE2_OCARINA_PLAYING) { - unkFlag = ACTOR_FLAG_NO_FREEZE_OCARINA; + unkFlag = ACTOR_FLAG_UPDATE_DURING_OCARINA; } if ((player->stateFlags1 & PLAYER_STATE1_TALKING) && ((player->actor.textId & 0xFF00) != 0x600)) { @@ -2622,9 +2622,9 @@ void Actor_UpdateAll(PlayState* play, ActorContext* actorCtx) { actor->xyzDistToPlayerSq = SQ(actor->xzDistToPlayer) + SQ(actor->yDistToPlayer); actor->yawTowardsPlayer = Actor_WorldYawTowardActor(actor, &player->actor); - actor->flags &= ~ACTOR_FLAG_PLAY_HIT_SFX; + actor->flags &= ~ACTOR_FLAG_SFX_FOR_PLAYER_BODY_HIT; - if ((DECR(actor->freezeTimer) == 0) && (actor->flags & (ACTOR_FLAG_UPDATE_WHILE_CULLED | ACTOR_FLAG_ACTIVE))) { + if ((DECR(actor->freezeTimer) == 0) && (actor->flags & (ACTOR_FLAG_UPDATE_CULLING_DISABLED | ACTOR_FLAG_INSIDE_CULLING_VOLUME))) { if (actor == player->focusActor) { actor->isTargeted = true; } else { @@ -2766,13 +2766,13 @@ void Actor_Draw(PlayState* play, Actor* actor) { } void func_80030ED8(Actor* actor) { - if (actor->flags & ACTOR_FLAG_SFX_AT_POS) { + if (actor->flags & ACTOR_FLAG_SFX_ACTOR_POS_2) { Audio_PlaySoundGeneral(actor->sfx, &actor->projectedPos, 4, &gSfxDefaultFreqAndVolScale, &gSfxDefaultFreqAndVolScale, &gSfxDefaultReverb); - } else if (actor->flags & ACTOR_FLAG_SFX_AT_CENTER) { + } else if (actor->flags & ACTOR_AUDIO_FLAG_SFX_CENTERED_1) { Sfx_PlaySfxCentered(actor->sfx); - } else if (actor->flags & ACTOR_FLAG_SFX_AT_CENTER2) { + } else if (actor->flags & ACTOR_AUDIO_FLAG_SFX_CENTERED_2) { Sfx_PlaySfxCentered2(actor->sfx); - } else if (actor->flags & ACTOR_FLAG_SFX_AS_TIMER) { + } else if (actor->flags & ACTOR_FLAG_SFX_TIMER) { func_800F4C58(&gSfxDefaultPos, NA_SE_SY_TIMER - SFX_FLAG, (s8)(actor->sfx - 1)); } else { Sfx_PlaySfxAtPos(&actor->projectedPos, actor->sfx); @@ -3032,15 +3032,15 @@ void func_800315AC(PlayState* play, ActorContext* actorCtx) { &shipShouldUpdate); if (shipShouldUpdate) { - actor->flags |= ACTOR_FLAG_ACTIVE; + actor->flags |= ACTOR_FLAG_INSIDE_CULLING_VOLUME; } else { - actor->flags &= ~ACTOR_FLAG_ACTIVE; + actor->flags &= ~ACTOR_FLAG_INSIDE_CULLING_VOLUME; } } else { if (func_800314B0(play, actor)) { - actor->flags |= ACTOR_FLAG_ACTIVE; + actor->flags |= ACTOR_FLAG_INSIDE_CULLING_VOLUME; } else { - actor->flags &= ~ACTOR_FLAG_ACTIVE; + actor->flags &= ~ACTOR_FLAG_INSIDE_CULLING_VOLUME; } } } @@ -3049,9 +3049,9 @@ void func_800315AC(PlayState* play, ActorContext* actorCtx) { if ((HREG(64) != 1) || ((HREG(65) != -1) && (HREG(65) != HREG(66))) || (HREG(71) == 0)) { if ((actor->init == NULL) && (actor->draw != NULL) && - ((actor->flags & (ACTOR_FLAG_DRAW_WHILE_CULLED | ACTOR_FLAG_ACTIVE)) || shipShouldDraw)) { + ((actor->flags & (ACTOR_FLAG_DRAW_CULLING_DISABLED | ACTOR_FLAG_INSIDE_CULLING_VOLUME)) || shipShouldDraw)) { // #endregion - if ((actor->flags & ACTOR_FLAG_LENS) && + if ((actor->flags & ACTOR_FLAG_REACT_TO_LENS) && ((play->roomCtx.curRoom.lensMode == LENS_MODE_HIDE_ACTORS) || play->actorCtx.lensActive || (actor->room != play->roomCtx.curRoom.num))) { assert(invisibleActorCounter < INVISIBLE_ACTOR_MAX); @@ -3499,11 +3499,11 @@ void func_800328D4(PlayState* play, ActorContext* actorCtx, Player* player, u32 sp84 = player->focusActor; while (actor != NULL) { - if ((actor->update != NULL) && ((Player*)actor != player) && CHECK_FLAG_ALL(actor->flags, ACTOR_FLAG_TARGETABLE)) { + if ((actor->update != NULL) && ((Player*)actor != player) && CHECK_FLAG_ALL(actor->flags, ACTOR_FLAG_ATTENTION_ENABLED)) { // This block below is for determining the closest actor to player in determining the volume // used while playing enemy bgm music - if ((actorCategory == ACTORCAT_ENEMY) && CHECK_FLAG_ALL(actor->flags, ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_HOSTILE) && + if ((actorCategory == ACTORCAT_ENEMY) && CHECK_FLAG_ALL(actor->flags, ACTOR_FLAG_ATTENTION_ENABLED | ACTOR_FLAG_HOSTILE) && (actor->xyzDistToPlayerSq < SQ(500.0f)) && (actor->xyzDistToPlayerSq < sbgmEnemyDistSq)) { actorCtx->targetCtx.bgmEnemy = actor; sbgmEnemyDistSq = actor->xyzDistToPlayerSq; @@ -4557,10 +4557,10 @@ s16 Actor_UpdateAlphaByDistance(Actor* actor, PlayState* play, s16 alpha, f32 ra } if (radius < distance) { - actor->flags &= ~ACTOR_FLAG_TARGETABLE; + actor->flags &= ~ACTOR_FLAG_ATTENTION_ENABLED; Math_SmoothStepToS(&alpha, 0, 6, 0x14, 1); } else { - actor->flags |= ACTOR_FLAG_TARGETABLE; + actor->flags |= ACTOR_FLAG_ATTENTION_ENABLED; Math_SmoothStepToS(&alpha, 0xFF, 6, 0x14, 1); } @@ -4982,15 +4982,33 @@ void Flags_UnsetEventInf(s32 flag) { * Tests if "randomizerInf" flag is set. */ s32 Flags_GetRandomizerInf(RandomizerInf flag) { - return gSaveContext.randomizerInf[flag >> 4] & (1 << (flag & 0xF)); + // Randomizer flags are currently accessible from any quest (boss rush as an example) + /* + if (!IS_RANDO) { + LUSLOG_ERROR("Tried to get randomizerInf flag \"%d\" outside of rando", flag); + assert(false); + return 0; + } + */ + + return gSaveContext.ship.randomizerInf[flag >> 4] & (1 << (flag & 0xF)); } /** * Sets "randomizerInf" flag. */ void Flags_SetRandomizerInf(RandomizerInf flag) { + // Randomizer flags are currently accessible from any quest (boss rush as an example) + /* + if (!IS_RANDO) { + LUSLOG_ERROR("Tried to set randomizerInf flag \"%d\" outside of rando", flag); + assert(false); + return; + } + */ + s32 previouslyOff = !Flags_GetRandomizerInf(flag); - gSaveContext.randomizerInf[flag >> 4] |= (1 << (flag & 0xF)); + gSaveContext.ship.randomizerInf[flag >> 4] |= (1 << (flag & 0xF)); if (previouslyOff) { LUSLOG_INFO("RandomizerInf Flag Set - %#x", flag); GameInteractor_ExecuteOnFlagSet(FLAG_RANDOMIZER_INF, flag); @@ -5001,8 +5019,17 @@ void Flags_SetRandomizerInf(RandomizerInf flag) { * Unsets "randomizerInf" flag. */ void Flags_UnsetRandomizerInf(RandomizerInf flag) { + // Randomizer flags are currently accessible from any quest (boss rush as an example) + /* + if (!IS_RANDO) { + LUSLOG_ERROR("Tried to unset randomizerInf flag \"%d\" outside of rando", flag); + assert(false); + return; + } + */ + s32 previouslyOn = Flags_GetRandomizerInf(flag); - gSaveContext.randomizerInf[flag >> 4] &= ~(1 << (flag & 0xF)); + gSaveContext.ship.randomizerInf[flag >> 4] &= ~(1 << (flag & 0xF)); if (previouslyOn) { LUSLOG_INFO("RandomizerInf Flag Unset - %#x", flag); GameInteractor_ExecuteOnFlagUnset(FLAG_RANDOMIZER_INF, flag); diff --git a/soh/src/code/z_demo.c b/soh/src/code/z_demo.c index 4943b8390..9821b8d26 100644 --- a/soh/src/code/z_demo.c +++ b/soh/src/code/z_demo.c @@ -626,8 +626,8 @@ void Cutscene_Command_Terminator(PlayState* play, CutsceneContext* csCtx, CsCmdB break; case 8: if (CVarGetInteger(CVAR_ENHANCEMENT("BetterFarore"), 0)) { - FaroresWindData tempFW = gSaveContext.backupFW; - gSaveContext.backupFW = gSaveContext.fw; + FaroresWindData tempFW = gSaveContext.ship.backupFW; + gSaveContext.ship.backupFW = gSaveContext.fw; gSaveContext.fw = tempFW; } else { gSaveContext.fw.set = 0; diff --git a/soh/src/code/z_draw.c b/soh/src/code/z_draw.c index e27f230b1..523f65bbd 100644 --- a/soh/src/code/z_draw.c +++ b/soh/src/code/z_draw.c @@ -1046,7 +1046,7 @@ void GetItem_DrawTriforcePiece(PlayState* play, s16 drawId) { Matrix_Scale(0.035f, 0.035f, 0.035f, MTXMODE_APPLY); - uint8_t index = gSaveContext.triforcePiecesCollected % 3; + uint8_t index = gSaveContext.ship.quest.data.randomizer.triforcePiecesCollected % 3; Gfx* triforcePieceDL; switch (index) { diff --git a/soh/src/code/z_en_a_keep.c b/soh/src/code/z_en_a_keep.c index 9b29b666e..128b214fc 100644 --- a/soh/src/code/z_en_a_keep.c +++ b/soh/src/code/z_en_a_keep.c @@ -3,7 +3,7 @@ #include "objects/gameplay_keep/gameplay_keep.h" #include -#define FLAGS ACTOR_FLAG_UPDATE_WHILE_CULLED +#define FLAGS ACTOR_FLAG_UPDATE_CULLING_DISABLED void EnAObj_Init(Actor* thisx, PlayState* play); void EnAObj_Destroy(Actor* thisx, PlayState* play); @@ -142,7 +142,7 @@ void EnAObj_Init(Actor* thisx, PlayState* play) { break; case A_OBJ_UNKNOWN_6: // clang-format off - thisx->flags |= ACTOR_FLAG_TARGETABLE; this->dyna.bgId = 5; this->focusYoffset = 10.0f; + thisx->flags |= ACTOR_FLAG_ATTENTION_ENABLED; this->dyna.bgId = 5; this->focusYoffset = 10.0f; // clang-format on thisx->gravity = -2.0f; EnAObj_SetupWaitTalk(this, thisx->params); @@ -156,7 +156,7 @@ void EnAObj_Init(Actor* thisx, PlayState* play) { case A_OBJ_SIGNPOST_ARROW: thisx->textId = (this->textId & 0xFF) | 0x300; // clang-format off - thisx->flags |= ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_FRIENDLY; thisx->targetArrowOffset = 500.0f; + thisx->flags |= ACTOR_FLAG_ATTENTION_ENABLED | ACTOR_FLAG_FRIENDLY; thisx->targetArrowOffset = 500.0f; // clang-format on this->focusYoffset = 45.0f; EnAObj_SetupWaitTalk(this, thisx->params); diff --git a/soh/src/code/z_en_item00.c b/soh/src/code/z_en_item00.c index 05e5785b9..ecdf89316 100644 --- a/soh/src/code/z_en_item00.c +++ b/soh/src/code/z_en_item00.c @@ -1197,24 +1197,6 @@ void EnItem00_CustomItemsParticles(Actor* Parent, PlayState* play, GetItemEntry switch (giEntry.drawModIndex) { case MOD_NONE: switch (giEntry.drawItemId) { - case ITEM_SONG_MINUET: - colorIndex = PARTICLE_BRIGHT_GREEN; - break; - case ITEM_SONG_BOLERO: - colorIndex = PARTICLE_RED; - break; - case ITEM_SONG_SERENADE: - colorIndex = PARTICLE_CYAN; - break; - case ITEM_SONG_REQUIEM: - colorIndex = PARTICLE_ORANGE; - break; - case ITEM_SONG_NOCTURNE: - colorIndex = PARTICLE_VIOLET; - break; - case ITEM_SONG_PRELUDE: - colorIndex = PARTICLE_YELLOW; - break; case ITEM_STICK_UPGRADE_20: case ITEM_STICK_UPGRADE_30: colorIndex = PARTICLE_GREEN; @@ -1234,6 +1216,7 @@ void EnItem00_CustomItemsParticles(Actor* Parent, PlayState* play, GetItemEntry break; case MOD_RANDOMIZER: switch (giEntry.drawItemId) { + case RG_MINUET_OF_FOREST: case RG_MAGIC_SINGLE: case RG_MAGIC_DOUBLE: case RG_MAGIC_BEAN_PACK: @@ -1242,19 +1225,30 @@ void EnItem00_CustomItemsParticles(Actor* Parent, PlayState* play, GetItemEntry case RG_GREG_RUPEE: colorIndex = PARTICLE_BRIGHT_GREEN; break; + case RG_BOLERO_OF_FIRE: + colorIndex = PARTICLE_RED; + break; + case RG_SERENADE_OF_WATER: case RG_BOTTLE_WITH_FISH: colorIndex = PARTICLE_CYAN; break; + case RG_REQUIEM_OF_SPIRIT: + colorIndex = PARTICLE_ORANGE; + break; + case RG_NOCTURNE_OF_SHADOW: case RG_BOTTLE_WITH_POE: colorIndex = PARTICLE_VIOLET; break; + case RG_PRELUDE_OF_LIGHT: case RG_BOTTLE_WITH_BIG_POE: colorIndex = PARTICLE_YELLOW; break; case RG_DEKU_STICK_BAG: + case RG_STICK_UPGRADE_INF: colorIndex = PARTICLE_GREEN; break; case RG_DEKU_NUT_BAG: + case RG_NUT_UPGRADE_INF: colorIndex = PARTICLE_GOLD; break; case RG_DOUBLE_DEFENSE: @@ -1556,7 +1550,7 @@ s16 func_8001F404(s16 dropId) { if ((CVarGetInteger(CVAR_ENHANCEMENT("EnableBombchuDrops"), 0) || (IS_RANDO && Randomizer_GetSettingValue(RSK_ENABLE_BOMBCHU_DROPS) == 1)) && (dropId == ITEM00_BOMBS_A || dropId == ITEM00_BOMBS_B || dropId == ITEM00_BOMBS_SPECIAL) && - (!IS_RANDO || Randomizer_GetSettingValue(RSK_BOMBCHUS_IN_LOGIC) || INV_CONTENT(ITEM_BOMB) != ITEM_NONE)) { + (!IS_RANDO || Randomizer_GetSettingValue(RSK_BOMBCHU_BAG) || INV_CONTENT(ITEM_BOMB) != ITEM_NONE)) { dropId = EnItem00_ConvertBombDropToBombchu(dropId); } // #endregion @@ -1618,7 +1612,7 @@ EnItem00* Item_DropCollectible(PlayState* play, Vec3f* spawnPos, s16 params) { (spawnedActor->actor.params != ITEM00_HEART_CONTAINER)) { spawnedActor->actor.room = -1; } - spawnedActor->actor.flags |= ACTOR_FLAG_UPDATE_WHILE_CULLED; + spawnedActor->actor.flags |= ACTOR_FLAG_UPDATE_CULLING_DISABLED; } } } @@ -1652,7 +1646,7 @@ EnItem00* Item_DropCollectible2(PlayState* play, Vec3f* spawnPos, s16 params) { spawnedActor->actor.speedXZ = 0.0f; spawnedActor->actor.gravity = param4000 ? 0.0f : -0.9f; spawnedActor->actor.world.rot.y = Rand_CenteredFloat(65536.0f); - spawnedActor->actor.flags |= ACTOR_FLAG_UPDATE_WHILE_CULLED; + spawnedActor->actor.flags |= ACTOR_FLAG_UPDATE_CULLING_DISABLED; } } } @@ -1766,7 +1760,7 @@ void Item_DropCollectibleRandom(PlayState* play, Actor* fromActor, Vec3f* spawnP spawnedActor->actor.world.rot.y = Rand_ZeroOne() * 40000.0f; Actor_SetScale(&spawnedActor->actor, 0.0f); EnItem00_SetupAction(spawnedActor, func_8001E304); - spawnedActor->actor.flags |= ACTOR_FLAG_UPDATE_WHILE_CULLED; + spawnedActor->actor.flags |= ACTOR_FLAG_UPDATE_CULLING_DISABLED; if ((spawnedActor->actor.params != ITEM00_SMALL_KEY) && (spawnedActor->actor.params != ITEM00_HEART_PIECE) && (spawnedActor->actor.params != ITEM00_HEART_CONTAINER)) { diff --git a/soh/src/code/z_kaleido_scope_call.c b/soh/src/code/z_kaleido_scope_call.c index 196e20041..bc21b9b55 100644 --- a/soh/src/code/z_kaleido_scope_call.c +++ b/soh/src/code/z_kaleido_scope_call.c @@ -59,9 +59,9 @@ void KaleidoScopeCall_Update(PlayState* play) { GameInteractor_ExecuteOnKaleidoUpdate(); - if (!gSaveContext.sohStats.gameComplete && - (!IS_BOSS_RUSH || !gSaveContext.isBossRushPaused)) { - gSaveContext.sohStats.pauseTimer++; + if (!gSaveContext.ship.stats.gameComplete && + (!IS_BOSS_RUSH || !gSaveContext.ship.quest.data.bossRush.isPaused)) { + gSaveContext.ship.stats.pauseTimer++; } if ((pauseCtx->state != 0) || (pauseCtx->debugState != 0)) { @@ -73,7 +73,7 @@ void KaleidoScopeCall_Update(PlayState* play) { pauseCtx->unk_1E4 = 0; pauseCtx->unk_1EC = 0; pauseCtx->state = (pauseCtx->state & 0xFFFF) + 1; - gSaveContext.sohStats.count[COUNT_PAUSES]++; + gSaveContext.ship.stats.count[COUNT_PAUSES]++; } } else if (pauseCtx->state == 8) { HREG(80) = 7; diff --git a/soh/src/code/z_kaleido_setup.c b/soh/src/code/z_kaleido_setup.c index 69ea3030f..45992279d 100644 --- a/soh/src/code/z_kaleido_setup.c +++ b/soh/src/code/z_kaleido_setup.c @@ -18,23 +18,11 @@ void KaleidoSetup_Update(PlayState* play) { play->shootingGalleryStatus <= 1 && gSaveContext.magicState != MAGIC_STATE_STEP_CAPACITY && gSaveContext.magicState != MAGIC_STATE_FILL && (play->sceneNum != SCENE_BOMBCHU_BOWLING_ALLEY || !Flags_GetSwitch(play, 0x38))) { - u8 easyPauseBufferEnabled = CVarGetInteger(CVAR_CHEAT("EasyPauseBuffer"), 0); - u8 easyPauseBufferTimer = CVarGetInteger(CVAR_GENERAL("CheatEasyPauseBufferTimer"), 0); - - // If start is not seen as pressed on the 2nd to last frame then we should end the easy frame advance flow - if (easyPauseBufferEnabled && easyPauseBufferTimer == 2 && - !CHECK_BTN_ALL(input->press.button, BTN_START)) { - CVarSetInteger(CVAR_GENERAL("CheatEasyPauseBufferTimer"), 0); - } - if (CHECK_BTN_ALL(input->cur.button, BTN_L) && CHECK_BTN_ALL(input->press.button, BTN_CUP)) { if (BREG(0)) { pauseCtx->debugState = 3; } - } else if ((CHECK_BTN_ALL(input->press.button, BTN_START) && (!easyPauseBufferEnabled || !easyPauseBufferTimer)) || - (easyPauseBufferEnabled && easyPauseBufferTimer == 1)) { // Force Kaleido open when easy pause buffer reaches 0 - // Remember last held buttons for pause buffer cheat (minus start so easy frame advance works) - CVarSetInteger(CVAR_GENERAL("CheatEasyPauseBufferLastInputs"), input->cur.button & ~(BTN_START)); + } else if (CHECK_BTN_ALL(input->press.button, BTN_START)) { gSaveContext.unk_13EE = gSaveContext.unk_13EA; diff --git a/soh/src/code/z_lifemeter.c b/soh/src/code/z_lifemeter.c index 52742bc62..5f09e6b3f 100644 --- a/soh/src/code/z_lifemeter.c +++ b/soh/src/code/z_lifemeter.c @@ -2,6 +2,7 @@ #include "textures/parameter_static/parameter_static.h" #include "soh/frame_interpolation.h" #include "soh/OTRGlobals.h" +#include "soh/Enhancements/game-interactor/GameInteractor_Hooks.h" s16 Top_LM_Margin = 0; s16 Left_LM_Margin = 0; @@ -674,7 +675,7 @@ u32 HealthMeter_IsCritical(void) { var = 0x2C; } - if ((var >= gSaveContext.health) && (gSaveContext.health > 0)) { + if (GameInteractor_Should(VB_HEALTH_METER_BE_CRITICAL, var >= gSaveContext.health && gSaveContext.health > 0)) { return true; } else { return false; diff --git a/soh/src/code/z_parameter.c b/soh/src/code/z_parameter.c index 396188b48..39c6e111d 100644 --- a/soh/src/code/z_parameter.c +++ b/soh/src/code/z_parameter.c @@ -1812,7 +1812,7 @@ void func_80084BF4(PlayState* play, u16 flag) { void GameplayStats_SetTimestamp(PlayState* play, u8 item) { // If we already have a timestamp for this item, do nothing - if (gSaveContext.sohStats.itemTimestamp[item] != 0){ + if (gSaveContext.ship.stats.itemTimestamp[item] != 0){ return; } // Use ITEM_KEY_BOSS only for Ganon's boss key - not any other boss keys @@ -1831,20 +1831,20 @@ void GameplayStats_SetTimestamp(PlayState* play, u8 item) { // Count any bottled item as a bottle if (item >= ITEM_BOTTLE && item <= ITEM_POE) { - if (gSaveContext.sohStats.itemTimestamp[ITEM_BOTTLE] == 0) { - gSaveContext.sohStats.itemTimestamp[ITEM_BOTTLE] = time; + if (gSaveContext.ship.stats.itemTimestamp[ITEM_BOTTLE] == 0) { + gSaveContext.ship.stats.itemTimestamp[ITEM_BOTTLE] = time; } return; } // Count any bombchu pack as bombchus if (item == ITEM_BOMBCHU || (item >= ITEM_BOMBCHUS_5 && item <= ITEM_BOMBCHUS_20)) { - if (gSaveContext.sohStats.itemTimestamp[ITEM_BOMBCHU] == 0) { - gSaveContext.sohStats.itemTimestamp[ITEM_BOMBCHU] = time; + if (gSaveContext.ship.stats.itemTimestamp[ITEM_BOMBCHU] == 0) { + gSaveContext.ship.stats.itemTimestamp[ITEM_BOMBCHU] = time; } return; } - gSaveContext.sohStats.itemTimestamp[item] = time; + gSaveContext.ship.stats.itemTimestamp[item] = time; GameInteractor_ExecuteOnTimestamp(item); } @@ -2338,7 +2338,7 @@ u8 Item_Give(PlayState* play, u8 item) { return Return_Item(item, MOD_NONE, ITEM_NONE); } else if ((item == ITEM_HEART_PIECE_2) || (item == ITEM_HEART_PIECE)) { gSaveContext.inventory.questItems += 1 << (QUEST_HEART_PIECE + 4); - gSaveContext.sohStats.heartPieces++; + gSaveContext.ship.stats.heartPieces++; return Return_Item(item, MOD_NONE, ITEM_NONE); } else if (item == ITEM_HEART_CONTAINER) { if (!CVarGetInteger(CVAR_ENHANCEMENT("HurtContainer"), 0)) { @@ -2348,7 +2348,7 @@ u8 Item_Give(PlayState* play, u8 item) { gSaveContext.healthCapacity -= 0x10; gSaveContext.health -= 0x10; } - gSaveContext.sohStats.heartContainers++; + gSaveContext.ship.stats.heartContainers++; return Return_Item(item, MOD_NONE, ITEM_NONE); } else if (item == ITEM_HEART) { osSyncPrintf("回復ハート回復ハート回復ハート\n"); // "Recovery Heart" @@ -2447,7 +2447,7 @@ u8 Item_Give(PlayState* play, u8 item) { } if (item >= ITEM_POCKET_EGG) { - gSaveContext.adultTradeItems |= ADULT_TRADE_FLAG(item); + gSaveContext.ship.quest.data.randomizer.adultTradeItems |= ADULT_TRADE_FLAG(item); } temp = INV_CONTENT(item); @@ -2763,8 +2763,8 @@ bool Inventory_HatchPocketCucco(PlayState* play) { return 0; } - gSaveContext.adultTradeItems &= ~ADULT_TRADE_FLAG(ITEM_POCKET_EGG); - gSaveContext.adultTradeItems |= ADULT_TRADE_FLAG(ITEM_POCKET_CUCCO); + gSaveContext.ship.quest.data.randomizer.adultTradeItems &= ~ADULT_TRADE_FLAG(ITEM_POCKET_EGG); + gSaveContext.ship.quest.data.randomizer.adultTradeItems |= ADULT_TRADE_FLAG(ITEM_POCKET_CUCCO); Inventory_ReplaceItem(play, ITEM_POCKET_EGG, ITEM_POCKET_CUCCO); return 1; } @@ -2882,7 +2882,7 @@ s32 Health_ChangeBy(PlayState* play, s16 healthChange) { gSaveContext.healthCapacity); if (healthChange < 0) { - gSaveContext.sohStats.count[COUNT_DAMAGE_TAKEN] += -healthChange; + gSaveContext.ship.stats.count[COUNT_DAMAGE_TAKEN] += -healthChange; } // If one-hit ko mode is on, any damage kills you and you cannot gain health. @@ -2952,10 +2952,10 @@ void Rupees_ChangeBy(s16 rupeeChange) { } if (rupeeChange > 0) { - gSaveContext.sohStats.count[COUNT_RUPEES_COLLECTED] += rupeeChange; + gSaveContext.ship.stats.count[COUNT_RUPEES_COLLECTED] += rupeeChange; } if (rupeeChange < 0) { - gSaveContext.sohStats.count[COUNT_RUPEES_SPENT] += -rupeeChange; + gSaveContext.ship.stats.count[COUNT_RUPEES_SPENT] += -rupeeChange; } } @@ -2963,25 +2963,25 @@ void GameplayStats_UpdateAmmoUsed(s16 item, s16 ammoUsed) { switch (item) { case ITEM_STICK: - gSaveContext.sohStats.count[COUNT_AMMO_USED_STICK] += ammoUsed; + gSaveContext.ship.stats.count[COUNT_AMMO_USED_STICK] += ammoUsed; break; case ITEM_NUT: - gSaveContext.sohStats.count[COUNT_AMMO_USED_NUT] += ammoUsed; + gSaveContext.ship.stats.count[COUNT_AMMO_USED_NUT] += ammoUsed; break; case ITEM_BOMB: - gSaveContext.sohStats.count[COUNT_AMMO_USED_BOMB] += ammoUsed; + gSaveContext.ship.stats.count[COUNT_AMMO_USED_BOMB] += ammoUsed; break; case ITEM_BOW: - gSaveContext.sohStats.count[COUNT_AMMO_USED_ARROW] += ammoUsed; + gSaveContext.ship.stats.count[COUNT_AMMO_USED_ARROW] += ammoUsed; break; case ITEM_SLINGSHOT: - gSaveContext.sohStats.count[COUNT_AMMO_USED_SEED] += ammoUsed; + gSaveContext.ship.stats.count[COUNT_AMMO_USED_SEED] += ammoUsed; break; case ITEM_BOMBCHU: - gSaveContext.sohStats.count[COUNT_AMMO_USED_BOMBCHU] += ammoUsed; + gSaveContext.ship.stats.count[COUNT_AMMO_USED_BOMBCHU] += ammoUsed; break; case ITEM_BEAN: - gSaveContext.sohStats.count[COUNT_AMMO_USED_BEAN] += ammoUsed; + gSaveContext.ship.stats.count[COUNT_AMMO_USED_BEAN] += ammoUsed; break; default: break; @@ -6122,7 +6122,7 @@ void Interface_Draw(PlayState* play) { void Interface_DrawTotalGameplayTimer(PlayState* play) { // Draw timer based on the Gameplay Stats total time. - if ((IS_BOSS_RUSH && gSaveContext.bossRushOptions[BR_OPTIONS_TIMER] == BR_CHOICE_TIMER_YES) || + if ((IS_BOSS_RUSH && gSaveContext.ship.quest.data.bossRush.options[BR_OPTIONS_TIMER] == BR_CHOICE_TIMER_YES) || (CVarGetInteger(CVAR_ENHANCEMENT("GameplayStats.ShowIngameTimer"), 0) && gSaveContext.fileNum >= 0 && gSaveContext.fileNum <= 2)) { s32 X_Margins_Timer = 0; @@ -6202,9 +6202,9 @@ void Interface_DrawTotalGameplayTimer(PlayState* play) { (rectTop + rectHeight) << 2, G_TX_RENDERTILE, 0, 0, 1 << 10, 1 << 10); // Draw regular text. Change color based on if the timer is paused, running or the game is completed. - if (gSaveContext.sohStats.gameComplete) { + if (gSaveContext.ship.stats.gameComplete) { gDPSetPrimColor(OVERLAY_DISP++, 0, 0, 120, 255, 0, 255); - } else if (gSaveContext.isBossRushPaused && !gSaveContext.sohStats.rtaTiming) { + } else if (IS_BOSS_RUSH && gSaveContext.ship.quest.data.bossRush.isPaused && !gSaveContext.ship.stats.rtaTiming) { gDPSetPrimColor(OVERLAY_DISP++, 0, 0, 150, 150, 150, 255); } else { gDPSetPrimColor(OVERLAY_DISP++, 0, 0, 255, 255, 255, 255); @@ -6429,11 +6429,11 @@ void Interface_Update(PlayState* play) { } else { gSaveContext.rupeeAccumulator = 0; } - if (gSaveContext.rupeeAccumulator == 0 && gSaveContext.pendingSale != ITEM_NONE) { - u16 tempSaleItem = gSaveContext.pendingSale; - u16 tempSaleMod = gSaveContext.pendingSaleMod; - gSaveContext.pendingSale = ITEM_NONE; - gSaveContext.pendingSaleMod = MOD_NONE; + if (gSaveContext.rupeeAccumulator == 0 && gSaveContext.ship.pendingSale != ITEM_NONE) { + u16 tempSaleItem = gSaveContext.ship.pendingSale; + u16 tempSaleMod = gSaveContext.ship.pendingSaleMod; + gSaveContext.ship.pendingSale = ITEM_NONE; + gSaveContext.ship.pendingSaleMod = MOD_NONE; if (tempSaleMod == MOD_NONE) { GetItemID getItemID = RetrieveGetItemIDFromItemID(tempSaleItem); RandomizerGet randomizerGet = RetrieveRandomizerGetFromItemID(tempSaleItem); diff --git a/soh/src/code/z_play.c b/soh/src/code/z_play.c index df1314e71..2b4743417 100644 --- a/soh/src/code/z_play.c +++ b/soh/src/code/z_play.c @@ -646,32 +646,32 @@ void Play_Init(GameState* thisx) { gSaveContext.respawnFlag = 0; // #region SOH [Stats] - if (gSaveContext.sohStats.sceneNum != gPlayState->sceneNum) { - u16 idx = gSaveContext.sohStats.tsIdx; - gSaveContext.sohStats.sceneTimestamps[idx].sceneTime = gSaveContext.sohStats.sceneTimer / 2; - gSaveContext.sohStats.sceneTimestamps[idx].roomTime = gSaveContext.sohStats.roomTimer / 2; - gSaveContext.sohStats.sceneTimestamps[idx].scene = gSaveContext.sohStats.sceneNum; - gSaveContext.sohStats.sceneTimestamps[idx].room = gSaveContext.sohStats.roomNum; - gSaveContext.sohStats.sceneTimestamps[idx].isRoom = - gPlayState->sceneNum == gSaveContext.sohStats.sceneTimestamps[idx].scene && - gPlayState->roomCtx.curRoom.num != gSaveContext.sohStats.sceneTimestamps[idx].room; - gSaveContext.sohStats.tsIdx++; - gSaveContext.sohStats.sceneTimer = 0; - gSaveContext.sohStats.roomTimer = 0; - } else if (gSaveContext.sohStats.roomNum != gPlayState->roomCtx.curRoom.num) { - u16 idx = gSaveContext.sohStats.tsIdx; - gSaveContext.sohStats.sceneTimestamps[idx].roomTime = gSaveContext.sohStats.roomTimer / 2; - gSaveContext.sohStats.sceneTimestamps[idx].scene = gSaveContext.sohStats.sceneNum; - gSaveContext.sohStats.sceneTimestamps[idx].room = gSaveContext.sohStats.roomNum; - gSaveContext.sohStats.sceneTimestamps[idx].isRoom = - gPlayState->sceneNum == gSaveContext.sohStats.sceneTimestamps[idx].scene && - gPlayState->roomCtx.curRoom.num != gSaveContext.sohStats.sceneTimestamps[idx].room; - gSaveContext.sohStats.tsIdx++; - gSaveContext.sohStats.roomTimer = 0; + if (gSaveContext.ship.stats.sceneNum != gPlayState->sceneNum) { + u16 idx = gSaveContext.ship.stats.tsIdx; + gSaveContext.ship.stats.sceneTimestamps[idx].sceneTime = gSaveContext.ship.stats.sceneTimer / 2; + gSaveContext.ship.stats.sceneTimestamps[idx].roomTime = gSaveContext.ship.stats.roomTimer / 2; + gSaveContext.ship.stats.sceneTimestamps[idx].scene = gSaveContext.ship.stats.sceneNum; + gSaveContext.ship.stats.sceneTimestamps[idx].room = gSaveContext.ship.stats.roomNum; + gSaveContext.ship.stats.sceneTimestamps[idx].isRoom = + gPlayState->sceneNum == gSaveContext.ship.stats.sceneTimestamps[idx].scene && + gPlayState->roomCtx.curRoom.num != gSaveContext.ship.stats.sceneTimestamps[idx].room; + gSaveContext.ship.stats.tsIdx++; + gSaveContext.ship.stats.sceneTimer = 0; + gSaveContext.ship.stats.roomTimer = 0; + } else if (gSaveContext.ship.stats.roomNum != gPlayState->roomCtx.curRoom.num) { + u16 idx = gSaveContext.ship.stats.tsIdx; + gSaveContext.ship.stats.sceneTimestamps[idx].roomTime = gSaveContext.ship.stats.roomTimer / 2; + gSaveContext.ship.stats.sceneTimestamps[idx].scene = gSaveContext.ship.stats.sceneNum; + gSaveContext.ship.stats.sceneTimestamps[idx].room = gSaveContext.ship.stats.roomNum; + gSaveContext.ship.stats.sceneTimestamps[idx].isRoom = + gPlayState->sceneNum == gSaveContext.ship.stats.sceneTimestamps[idx].scene && + gPlayState->roomCtx.curRoom.num != gSaveContext.ship.stats.sceneTimestamps[idx].room; + gSaveContext.ship.stats.tsIdx++; + gSaveContext.ship.stats.roomTimer = 0; } - gSaveContext.sohStats.sceneNum = gPlayState->sceneNum; - gSaveContext.sohStats.roomNum = gPlayState->roomCtx.curRoom.num; + gSaveContext.ship.stats.sceneNum = gPlayState->sceneNum; + gSaveContext.ship.stats.roomNum = gPlayState->roomCtx.curRoom.num; // #endregion #if 0 @@ -741,28 +741,28 @@ void Play_Update(PlayState* play) { } // #region SOH [Stats] Gameplay stats: Count button presses - if (!gSaveContext.sohStats.gameComplete) { - if (CHECK_BTN_ALL(input[0].press.button, BTN_A)) {gSaveContext.sohStats.count[COUNT_BUTTON_PRESSES_A]++;} - if (CHECK_BTN_ALL(input[0].press.button, BTN_B)) {gSaveContext.sohStats.count[COUNT_BUTTON_PRESSES_B]++;} - if (CHECK_BTN_ALL(input[0].press.button, BTN_CUP)) {gSaveContext.sohStats.count[COUNT_BUTTON_PRESSES_CUP]++;} - if (CHECK_BTN_ALL(input[0].press.button, BTN_CRIGHT)) {gSaveContext.sohStats.count[COUNT_BUTTON_PRESSES_CRIGHT]++;} - if (CHECK_BTN_ALL(input[0].press.button, BTN_CLEFT)) {gSaveContext.sohStats.count[COUNT_BUTTON_PRESSES_CLEFT]++;} - if (CHECK_BTN_ALL(input[0].press.button, BTN_CDOWN)) {gSaveContext.sohStats.count[COUNT_BUTTON_PRESSES_CDOWN]++;} - if (CHECK_BTN_ALL(input[0].press.button, BTN_DUP)) {gSaveContext.sohStats.count[COUNT_BUTTON_PRESSES_DUP]++;} - if (CHECK_BTN_ALL(input[0].press.button, BTN_DRIGHT)) {gSaveContext.sohStats.count[COUNT_BUTTON_PRESSES_DRIGHT]++;} - if (CHECK_BTN_ALL(input[0].press.button, BTN_DDOWN)) {gSaveContext.sohStats.count[COUNT_BUTTON_PRESSES_DDOWN]++;} - if (CHECK_BTN_ALL(input[0].press.button, BTN_DLEFT)) {gSaveContext.sohStats.count[COUNT_BUTTON_PRESSES_DLEFT]++;} - if (CHECK_BTN_ALL(input[0].press.button, BTN_L)) {gSaveContext.sohStats.count[COUNT_BUTTON_PRESSES_L]++;} - if (CHECK_BTN_ALL(input[0].press.button, BTN_R)) {gSaveContext.sohStats.count[COUNT_BUTTON_PRESSES_R]++;} - if (CHECK_BTN_ALL(input[0].press.button, BTN_Z)) {gSaveContext.sohStats.count[COUNT_BUTTON_PRESSES_Z]++;} - if (CHECK_BTN_ALL(input[0].press.button, BTN_START)) {gSaveContext.sohStats.count[COUNT_BUTTON_PRESSES_START]++;} + if (!gSaveContext.ship.stats.gameComplete) { + if (CHECK_BTN_ALL(input[0].press.button, BTN_A)) {gSaveContext.ship.stats.count[COUNT_BUTTON_PRESSES_A]++;} + if (CHECK_BTN_ALL(input[0].press.button, BTN_B)) {gSaveContext.ship.stats.count[COUNT_BUTTON_PRESSES_B]++;} + if (CHECK_BTN_ALL(input[0].press.button, BTN_CUP)) {gSaveContext.ship.stats.count[COUNT_BUTTON_PRESSES_CUP]++;} + if (CHECK_BTN_ALL(input[0].press.button, BTN_CRIGHT)) {gSaveContext.ship.stats.count[COUNT_BUTTON_PRESSES_CRIGHT]++;} + if (CHECK_BTN_ALL(input[0].press.button, BTN_CLEFT)) {gSaveContext.ship.stats.count[COUNT_BUTTON_PRESSES_CLEFT]++;} + if (CHECK_BTN_ALL(input[0].press.button, BTN_CDOWN)) {gSaveContext.ship.stats.count[COUNT_BUTTON_PRESSES_CDOWN]++;} + if (CHECK_BTN_ALL(input[0].press.button, BTN_DUP)) {gSaveContext.ship.stats.count[COUNT_BUTTON_PRESSES_DUP]++;} + if (CHECK_BTN_ALL(input[0].press.button, BTN_DRIGHT)) {gSaveContext.ship.stats.count[COUNT_BUTTON_PRESSES_DRIGHT]++;} + if (CHECK_BTN_ALL(input[0].press.button, BTN_DDOWN)) {gSaveContext.ship.stats.count[COUNT_BUTTON_PRESSES_DDOWN]++;} + if (CHECK_BTN_ALL(input[0].press.button, BTN_DLEFT)) {gSaveContext.ship.stats.count[COUNT_BUTTON_PRESSES_DLEFT]++;} + if (CHECK_BTN_ALL(input[0].press.button, BTN_L)) {gSaveContext.ship.stats.count[COUNT_BUTTON_PRESSES_L]++;} + if (CHECK_BTN_ALL(input[0].press.button, BTN_R)) {gSaveContext.ship.stats.count[COUNT_BUTTON_PRESSES_R]++;} + if (CHECK_BTN_ALL(input[0].press.button, BTN_Z)) {gSaveContext.ship.stats.count[COUNT_BUTTON_PRESSES_Z]++;} + if (CHECK_BTN_ALL(input[0].press.button, BTN_START)) {gSaveContext.ship.stats.count[COUNT_BUTTON_PRESSES_START]++;} // Start RTA timing on first non-c-up input after intro cutscene if ( - !gSaveContext.sohStats.fileCreatedAt && !Player_InCsMode(play) && + !gSaveContext.ship.stats.fileCreatedAt && !Player_InCsMode(play) && ((input[0].press.button && input[0].press.button != 0x8) || input[0].rel.stick_x != 0 || input[0].rel.stick_y != 0) ) { - gSaveContext.sohStats.fileCreatedAt = GetUnixTimestamp(); + gSaveContext.ship.stats.fileCreatedAt = GetUnixTimestamp(); } } // #endregion @@ -1146,14 +1146,14 @@ void Play_Update(PlayState* play) { func_800AA178(true); // Gameplay stat tracking - if (!gSaveContext.sohStats.gameComplete && - (!IS_BOSS_RUSH || !gSaveContext.isBossRushPaused)) { - gSaveContext.sohStats.playTimer++; - gSaveContext.sohStats.sceneTimer++; - gSaveContext.sohStats.roomTimer++; + if (!gSaveContext.ship.stats.gameComplete && + (!IS_BOSS_RUSH || !gSaveContext.ship.quest.data.bossRush.isPaused)) { + gSaveContext.ship.stats.playTimer++; + gSaveContext.ship.stats.sceneTimer++; + gSaveContext.ship.stats.roomTimer++; if (CVarGetInteger(CVAR_ENHANCEMENT("MMBunnyHood"), BUNNY_HOOD_VANILLA) != BUNNY_HOOD_VANILLA && Player_GetMask(play) == PLAYER_MASK_BUNNY) { - gSaveContext.sohStats.count[COUNT_TIME_BUNNY_HOOD]++; + gSaveContext.ship.stats.count[COUNT_TIME_BUNNY_HOOD]++; } } @@ -1668,11 +1668,6 @@ time_t Play_GetRealTime() { void Play_Main(GameState* thisx) { PlayState* play = (PlayState*)thisx; - // Decrease the easy pause buffer timer every frame - if (CVarGetInteger(CVAR_GENERAL("CheatEasyPauseBufferTimer"), 0) > 0) { - CVarSetInteger(CVAR_GENERAL("CheatEasyPauseBufferTimer"), CVarGetInteger(CVAR_GENERAL("CheatEasyPauseBufferTimer"), 0) - 1); - } - if (play->envCtx.unk_EE[2] == 0 && CVarGetInteger(CVAR_GENERAL("LetItSnow"), 0)) { play->envCtx.unk_EE[3] = 64; Actor_Spawn(&gPlayState->actorCtx, gPlayState, ACTOR_OBJECT_KANKYO, 0, 0, 0, 0, 0, 0, 3, 0); @@ -2220,7 +2215,7 @@ void Play_PerformSave(PlayState* play) { uint8_t triforceHuntCompleted = IS_RANDO && - gSaveContext.triforcePiecesCollected == (Randomizer_GetSettingValue(RSK_TRIFORCE_HUNT_PIECES_REQUIRED) + 1) && + gSaveContext.ship.quest.data.randomizer.triforcePiecesCollected == (Randomizer_GetSettingValue(RSK_TRIFORCE_HUNT_PIECES_REQUIRED) + 1) && Randomizer_GetSettingValue(RSK_TRIFORCE_HUNT); if (CVarGetInteger(CVAR_ENHANCEMENT("Autosave"), AUTOSAVE_OFF) != AUTOSAVE_OFF || triforceHuntCompleted) { Overlay_DisplayText(3.0f, "Game Saved"); diff --git a/soh/src/code/z_player_call.c b/soh/src/code/z_player_call.c index 89d093383..3b17c7acf 100644 --- a/soh/src/code/z_player_call.c +++ b/soh/src/code/z_player_call.c @@ -1,6 +1,6 @@ #include "global.h" -#define FLAGS (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_HOSTILE | ACTOR_FLAG_UPDATE_WHILE_CULLED | ACTOR_FLAG_DRAW_WHILE_CULLED | ACTOR_FLAG_NO_FREEZE_OCARINA | ACTOR_FLAG_CAN_PRESS_SWITCH) +#define FLAGS (ACTOR_FLAG_ATTENTION_ENABLED | ACTOR_FLAG_HOSTILE | ACTOR_FLAG_UPDATE_CULLING_DISABLED | ACTOR_FLAG_DRAW_CULLING_DISABLED | ACTOR_FLAG_UPDATE_DURING_OCARINA | ACTOR_FLAG_CAN_PRESS_SWITCHES) void (*sPlayerCallInitFunc)(Actor* thisx, PlayState* play); void (*sPlayerCallDestroyFunc)(Actor* thisx, PlayState* play); diff --git a/soh/src/code/z_player_lib.c b/soh/src/code/z_player_lib.c index 3207abaf6..33a8c5bb5 100644 --- a/soh/src/code/z_player_lib.c +++ b/soh/src/code/z_player_lib.c @@ -1876,7 +1876,7 @@ void Player_PostLimbDrawGameplay(PlayState* play, s32 limbIndex, Gfx** dList, Ve Matrix_Get(&sp14C); Matrix_MtxFToYXZRotS(&sp14C, &spB8, 0); - if (hookedActor->flags & ACTOR_FLAG_PILLAR_PICKUP) { + if (hookedActor->flags & ACTOR_FLAG_CARRY_X_ROT_INFLUENCE) { hookedActor->world.rot.x = hookedActor->shape.rot.x = spB8.x - this->unk_3BC.x; } else { hookedActor->world.rot.y = hookedActor->shape.rot.y = this->actor.shape.rot.y + this->unk_3BC.y; diff --git a/soh/src/code/z_room.c b/soh/src/code/z_room.c index 2e8cdc655..fdd8f78f8 100644 --- a/soh/src/code/z_room.c +++ b/soh/src/code/z_room.c @@ -653,14 +653,14 @@ void func_80097534(PlayState* play, RoomContext* roomCtx) { Map_SavePlayerInitialInfo(play); } Audio_SetEnvReverb(play->roomCtx.curRoom.echo); - u8 idx = gSaveContext.sohStats.tsIdx; - gSaveContext.sohStats.sceneTimestamps[idx].scene = gSaveContext.sohStats.sceneNum; - gSaveContext.sohStats.sceneTimestamps[idx].room = gSaveContext.sohStats.roomNum; - gSaveContext.sohStats.sceneTimestamps[idx].roomTime = gSaveContext.sohStats.roomTimer / 2; - gSaveContext.sohStats.sceneTimestamps[idx].isRoom = - gPlayState->sceneNum == gSaveContext.sohStats.sceneTimestamps[idx].scene && - gPlayState->roomCtx.curRoom.num != gSaveContext.sohStats.sceneTimestamps[idx].room; - gSaveContext.sohStats.tsIdx++; - gSaveContext.sohStats.roomNum = roomCtx->curRoom.num; - gSaveContext.sohStats.roomTimer = 0; + u8 idx = gSaveContext.ship.stats.tsIdx; + gSaveContext.ship.stats.sceneTimestamps[idx].scene = gSaveContext.ship.stats.sceneNum; + gSaveContext.ship.stats.sceneTimestamps[idx].room = gSaveContext.ship.stats.roomNum; + gSaveContext.ship.stats.sceneTimestamps[idx].roomTime = gSaveContext.ship.stats.roomTimer / 2; + gSaveContext.ship.stats.sceneTimestamps[idx].isRoom = + gPlayState->sceneNum == gSaveContext.ship.stats.sceneTimestamps[idx].scene && + gPlayState->roomCtx.curRoom.num != gSaveContext.ship.stats.sceneTimestamps[idx].room; + gSaveContext.ship.stats.tsIdx++; + gSaveContext.ship.stats.roomNum = roomCtx->curRoom.num; + gSaveContext.ship.stats.roomTimer = 0; } diff --git a/soh/src/code/z_sram.c b/soh/src/code/z_sram.c index adea0cbbf..d6141d78b 100644 --- a/soh/src/code/z_sram.c +++ b/soh/src/code/z_sram.c @@ -142,7 +142,7 @@ void Sram_OpenSave() { } if (!CVarGetInteger(CVAR_ENHANCEMENT("PersistentMasks"), 0)) { - gSaveContext.maskMemory = PLAYER_MASK_NONE; + gSaveContext.ship.maskMemory = PLAYER_MASK_NONE; } osSyncPrintf("scene_no = %d\n", gSaveContext.entranceIndex); @@ -252,11 +252,11 @@ void Sram_InitSave(FileChooseContext* fileChooseCtx) { u8 currentQuest = fileChooseCtx->questType[fileChooseCtx->buttonIndex]; if (currentQuest == QUEST_RANDOMIZER && (Randomizer_IsSeedGenerated() || Randomizer_IsSpoilerLoaded())) { - gSaveContext.questId = QUEST_RANDOMIZER; + gSaveContext.ship.quest.id = QUEST_RANDOMIZER; Randomizer_InitSaveFile(); } else { - gSaveContext.questId = currentQuest; + gSaveContext.ship.quest.id = currentQuest; } Save_SaveFile(); diff --git a/soh/src/overlays/actors/ovl_Arms_Hook/z_arms_hook.c b/soh/src/overlays/actors/ovl_Arms_Hook/z_arms_hook.c index ea1b6f0d6..d2103f9b5 100644 --- a/soh/src/overlays/actors/ovl_Arms_Hook/z_arms_hook.c +++ b/soh/src/overlays/actors/ovl_Arms_Hook/z_arms_hook.c @@ -1,7 +1,7 @@ #include "z_arms_hook.h" #include "objects/object_link_boy/object_link_boy.h" -#define FLAGS (ACTOR_FLAG_UPDATE_WHILE_CULLED | ACTOR_FLAG_DRAW_WHILE_CULLED) +#define FLAGS (ACTOR_FLAG_UPDATE_CULLING_DISABLED | ACTOR_FLAG_DRAW_CULLING_DISABLED) void ArmsHook_Init(Actor* thisx, PlayState* play); void ArmsHook_Destroy(Actor* thisx, PlayState* play); @@ -121,7 +121,7 @@ s32 ArmsHook_CheckForCancel(ArmsHook* this) { Player* player = (Player*)this->actor.parent; if (Player_HoldsHookshot(player)) { - if ((player->itemAction != player->heldItemAction) || (player->actor.flags & ACTOR_FLAG_PLAYER_TALKED_TO) || + if ((player->itemAction != player->heldItemAction) || (player->actor.flags & ACTOR_FLAG_TALK) || ((player->stateFlags1 & (PLAYER_STATE1_DEAD | PLAYER_STATE1_DAMAGED)))) { this->timer = 0; ArmsHook_DetachHookFromActor(this); @@ -172,10 +172,10 @@ void ArmsHook_Shoot(ArmsHook* this, PlayState* play) { if ((this->timer != 0) && (this->collider.base.atFlags & AT_HIT) && (this->collider.info.atHitInfo->elemType != ELEMTYPE_UNK4)) { touchedActor = this->collider.base.at; - if ((touchedActor->update != NULL) && (touchedActor->flags & (ACTOR_FLAG_HOOKSHOT_DRAGS | ACTOR_FLAG_DRAGGED_BY_HOOKSHOT))) { + if ((touchedActor->update != NULL) && (touchedActor->flags & (ACTOR_FLAG_HOOKSHOT_PULLS_ACTOR | ACTOR_FLAG_HOOKSHOT_PULLS_PLAYER))) { if (this->collider.info.atHitInfo->bumperFlags & BUMP_HOOKABLE) { ArmsHook_AttachHookToActor(this, touchedActor); - if (CHECK_FLAG_ALL(touchedActor->flags, ACTOR_FLAG_DRAGGED_BY_HOOKSHOT)) { + if (CHECK_FLAG_ALL(touchedActor->flags, ACTOR_FLAG_HOOKSHOT_PULLS_PLAYER)) { func_80865044(this); } } diff --git a/soh/src/overlays/actors/ovl_Arrow_Fire/z_arrow_fire.c b/soh/src/overlays/actors/ovl_Arrow_Fire/z_arrow_fire.c index 984bf8ecd..ae9aff6b3 100644 --- a/soh/src/overlays/actors/ovl_Arrow_Fire/z_arrow_fire.c +++ b/soh/src/overlays/actors/ovl_Arrow_Fire/z_arrow_fire.c @@ -7,7 +7,7 @@ #include "z_arrow_fire.h" #include "overlays/actors/ovl_En_Arrow/z_en_arrow.h" -#define FLAGS (ACTOR_FLAG_UPDATE_WHILE_CULLED | ACTOR_FLAG_NO_FREEZE_OCARINA) +#define FLAGS (ACTOR_FLAG_UPDATE_CULLING_DISABLED | ACTOR_FLAG_UPDATE_DURING_OCARINA) void ArrowFire_Init(Actor* thisx, PlayState* play); void ArrowFire_Destroy(Actor* thisx, PlayState* play); diff --git a/soh/src/overlays/actors/ovl_Arrow_Ice/z_arrow_ice.c b/soh/src/overlays/actors/ovl_Arrow_Ice/z_arrow_ice.c index 64ea63131..38f49e40f 100644 --- a/soh/src/overlays/actors/ovl_Arrow_Ice/z_arrow_ice.c +++ b/soh/src/overlays/actors/ovl_Arrow_Ice/z_arrow_ice.c @@ -8,7 +8,7 @@ #include "overlays/actors/ovl_En_Arrow/z_en_arrow.h" -#define FLAGS (ACTOR_FLAG_UPDATE_WHILE_CULLED | ACTOR_FLAG_NO_FREEZE_OCARINA) +#define FLAGS (ACTOR_FLAG_UPDATE_CULLING_DISABLED | ACTOR_FLAG_UPDATE_DURING_OCARINA) void ArrowIce_Init(Actor* thisx, PlayState* play); void ArrowIce_Destroy(Actor* thisx, PlayState* play); diff --git a/soh/src/overlays/actors/ovl_Arrow_Light/z_arrow_light.c b/soh/src/overlays/actors/ovl_Arrow_Light/z_arrow_light.c index f42a0bcef..6fa6a7002 100644 --- a/soh/src/overlays/actors/ovl_Arrow_Light/z_arrow_light.c +++ b/soh/src/overlays/actors/ovl_Arrow_Light/z_arrow_light.c @@ -8,7 +8,7 @@ #include "overlays/actors/ovl_En_Arrow/z_en_arrow.h" -#define FLAGS (ACTOR_FLAG_UPDATE_WHILE_CULLED | ACTOR_FLAG_NO_FREEZE_OCARINA) +#define FLAGS (ACTOR_FLAG_UPDATE_CULLING_DISABLED | ACTOR_FLAG_UPDATE_DURING_OCARINA) void ArrowLight_Init(Actor* thisx, PlayState* play); void ArrowLight_Destroy(Actor* thisx, PlayState* play); diff --git a/soh/src/overlays/actors/ovl_Bg_Bdan_Objects/z_bg_bdan_objects.c b/soh/src/overlays/actors/ovl_Bg_Bdan_Objects/z_bg_bdan_objects.c index e46758bd0..7b8932432 100644 --- a/soh/src/overlays/actors/ovl_Bg_Bdan_Objects/z_bg_bdan_objects.c +++ b/soh/src/overlays/actors/ovl_Bg_Bdan_Objects/z_bg_bdan_objects.c @@ -7,7 +7,7 @@ #include "z_bg_bdan_objects.h" #include "objects/object_bdan_objects/object_bdan_objects.h" -#define FLAGS ACTOR_FLAG_UPDATE_WHILE_CULLED +#define FLAGS ACTOR_FLAG_UPDATE_CULLING_DISABLED void BgBdanObjects_Init(Actor* thisx, PlayState* play); void BgBdanObjects_Destroy(Actor* thisx, PlayState* play); @@ -115,7 +115,7 @@ void BgBdanObjects_Init(Actor* thisx, PlayState* play) { this->switchFlag = (thisx->params >> 8) & 0x3F; thisx->params &= 0xFF; if (thisx->params == 2) { - thisx->flags |= ACTOR_FLAG_UPDATE_WHILE_CULLED | ACTOR_FLAG_DRAW_WHILE_CULLED; + thisx->flags |= ACTOR_FLAG_UPDATE_CULLING_DISABLED | ACTOR_FLAG_DRAW_CULLING_DISABLED; play->colCtx.colHeader->waterBoxes[7].ySurface = thisx->world.pos.y; this->actionFunc = func_8086C9A8; return; diff --git a/soh/src/overlays/actors/ovl_Bg_Bdan_Switch/z_bg_bdan_switch.c b/soh/src/overlays/actors/ovl_Bg_Bdan_Switch/z_bg_bdan_switch.c index 13ecc51bb..d2b896c24 100644 --- a/soh/src/overlays/actors/ovl_Bg_Bdan_Switch/z_bg_bdan_switch.c +++ b/soh/src/overlays/actors/ovl_Bg_Bdan_Switch/z_bg_bdan_switch.c @@ -8,7 +8,7 @@ #include "objects/object_bdan_objects/object_bdan_objects.h" #include "soh/Enhancements/game-interactor/GameInteractor_Hooks.h" -#define FLAGS ACTOR_FLAG_UPDATE_WHILE_CULLED +#define FLAGS ACTOR_FLAG_UPDATE_CULLING_DISABLED void BgBdanSwitch_Init(Actor* thisx, PlayState* play); void BgBdanSwitch_Destroy(Actor* thisx, PlayState* play); @@ -162,7 +162,7 @@ void BgBdanSwitch_Init(Actor* thisx, PlayState* play) { case YELLOW_TALL_1: case YELLOW_TALL_2: BgBdanSwitch_InitCollision(this, play); - this->dyna.actor.flags |= ACTOR_FLAG_TARGETABLE; + this->dyna.actor.flags |= ACTOR_FLAG_ATTENTION_ENABLED; this->dyna.actor.targetMode = 4; break; } diff --git a/soh/src/overlays/actors/ovl_Bg_Bom_Guard/z_bg_bom_guard.c b/soh/src/overlays/actors/ovl_Bg_Bom_Guard/z_bg_bom_guard.c index ed84bbc1c..323816674 100644 --- a/soh/src/overlays/actors/ovl_Bg_Bom_Guard/z_bg_bom_guard.c +++ b/soh/src/overlays/actors/ovl_Bg_Bom_Guard/z_bg_bom_guard.c @@ -9,7 +9,7 @@ #include "objects/object_bowl/object_bowl.h" #include "vt.h" -#define FLAGS ACTOR_FLAG_UPDATE_WHILE_CULLED +#define FLAGS ACTOR_FLAG_UPDATE_CULLING_DISABLED void BgBomGuard_Init(Actor* thisx, PlayState* play); void BgBomGuard_Destroy(Actor* thisx, PlayState* play); diff --git a/soh/src/overlays/actors/ovl_Bg_Bowl_Wall/z_bg_bowl_wall.c b/soh/src/overlays/actors/ovl_Bg_Bowl_Wall/z_bg_bowl_wall.c index 0f5436b28..45e4a330a 100644 --- a/soh/src/overlays/actors/ovl_Bg_Bowl_Wall/z_bg_bowl_wall.c +++ b/soh/src/overlays/actors/ovl_Bg_Bowl_Wall/z_bg_bowl_wall.c @@ -10,7 +10,7 @@ #include "objects/object_bowl/object_bowl.h" #include "vt.h" -#define FLAGS (ACTOR_FLAG_UPDATE_WHILE_CULLED | ACTOR_FLAG_DRAW_WHILE_CULLED) +#define FLAGS (ACTOR_FLAG_UPDATE_CULLING_DISABLED | ACTOR_FLAG_DRAW_CULLING_DISABLED) void BgBowlWall_Init(Actor* thisx, PlayState* play); void BgBowlWall_Destroy(Actor* thisx, PlayState* play); diff --git a/soh/src/overlays/actors/ovl_Bg_Breakwall/z_bg_breakwall.c b/soh/src/overlays/actors/ovl_Bg_Breakwall/z_bg_breakwall.c index 621fe3901..95d12046a 100644 --- a/soh/src/overlays/actors/ovl_Bg_Breakwall/z_bg_breakwall.c +++ b/soh/src/overlays/actors/ovl_Bg_Breakwall/z_bg_breakwall.c @@ -12,7 +12,7 @@ #include "soh/Enhancements/game-interactor/GameInteractor.h" #include "soh/Enhancements/game-interactor/GameInteractor_Hooks.h" -#define FLAGS ACTOR_FLAG_UPDATE_WHILE_CULLED +#define FLAGS ACTOR_FLAG_UPDATE_CULLING_DISABLED typedef struct { /* 0x00 */ CollisionHeader* colHeader; @@ -245,7 +245,7 @@ void BgBreakwall_WaitForObject(BgBreakwall* this, PlayState* play) { this->dyna.actor.objBankIndex = this->bankIndex; Actor_SetObjectDependency(play, &this->dyna.actor); - this->dyna.actor.flags &= ~ACTOR_FLAG_UPDATE_WHILE_CULLED; + this->dyna.actor.flags &= ~ACTOR_FLAG_UPDATE_CULLING_DISABLED; this->dyna.actor.draw = BgBreakwall_Draw; CollisionHeader_GetVirtual(sBombableWallInfo[wallType].colHeader, &colHeader); this->dyna.bgId = DynaPoly_SetBgActor(play, &play->colCtx.dyna, &this->dyna.actor, colHeader); diff --git a/soh/src/overlays/actors/ovl_Bg_Ddan_Jd/z_bg_ddan_jd.c b/soh/src/overlays/actors/ovl_Bg_Ddan_Jd/z_bg_ddan_jd.c index 70f055e6d..f27caa933 100644 --- a/soh/src/overlays/actors/ovl_Bg_Ddan_Jd/z_bg_ddan_jd.c +++ b/soh/src/overlays/actors/ovl_Bg_Ddan_Jd/z_bg_ddan_jd.c @@ -7,7 +7,7 @@ #include "z_bg_ddan_jd.h" #include "objects/object_ddan_objects/object_ddan_objects.h" -#define FLAGS (ACTOR_FLAG_UPDATE_WHILE_CULLED | ACTOR_FLAG_DRAW_WHILE_CULLED) +#define FLAGS (ACTOR_FLAG_UPDATE_CULLING_DISABLED | ACTOR_FLAG_DRAW_CULLING_DISABLED) void BgDdanJd_Init(Actor* thisx, PlayState* play); void BgDdanJd_Destroy(Actor* thisx, PlayState* play); diff --git a/soh/src/overlays/actors/ovl_Bg_Ddan_Kd/z_bg_ddan_kd.c b/soh/src/overlays/actors/ovl_Bg_Ddan_Kd/z_bg_ddan_kd.c index 20334c893..2fbad32cb 100644 --- a/soh/src/overlays/actors/ovl_Bg_Ddan_Kd/z_bg_ddan_kd.c +++ b/soh/src/overlays/actors/ovl_Bg_Ddan_Kd/z_bg_ddan_kd.c @@ -7,7 +7,7 @@ #include "z_bg_ddan_kd.h" #include "objects/object_ddan_objects/object_ddan_objects.h" -#define FLAGS ACTOR_FLAG_UPDATE_WHILE_CULLED +#define FLAGS ACTOR_FLAG_UPDATE_CULLING_DISABLED void BgDdanKd_Init(Actor* thisx, PlayState* play); void BgDdanKd_Destroy(Actor* thisx, PlayState* play); diff --git a/soh/src/overlays/actors/ovl_Bg_Dy_Yoseizo/z_bg_dy_yoseizo.c b/soh/src/overlays/actors/ovl_Bg_Dy_Yoseizo/z_bg_dy_yoseizo.c index 83a9e3d3e..ce8cebd01 100644 --- a/soh/src/overlays/actors/ovl_Bg_Dy_Yoseizo/z_bg_dy_yoseizo.c +++ b/soh/src/overlays/actors/ovl_Bg_Dy_Yoseizo/z_bg_dy_yoseizo.c @@ -15,7 +15,7 @@ #include "soh/ResourceManagerHelpers.h" #include "soh/Enhancements/game-interactor/GameInteractor_Hooks.h" -#define FLAGS (ACTOR_FLAG_UPDATE_WHILE_CULLED | ACTOR_FLAG_DRAW_WHILE_CULLED | ACTOR_FLAG_NO_FREEZE_OCARINA) +#define FLAGS (ACTOR_FLAG_UPDATE_CULLING_DISABLED | ACTOR_FLAG_DRAW_CULLING_DISABLED | ACTOR_FLAG_UPDATE_DURING_OCARINA) typedef enum { /* 0 */ FAIRY_UPGRADE_MAGIC, diff --git a/soh/src/overlays/actors/ovl_Bg_Ganon_Otyuka/z_bg_ganon_otyuka.c b/soh/src/overlays/actors/ovl_Bg_Ganon_Otyuka/z_bg_ganon_otyuka.c index 48362c49d..ae2067e64 100644 --- a/soh/src/overlays/actors/ovl_Bg_Ganon_Otyuka/z_bg_ganon_otyuka.c +++ b/soh/src/overlays/actors/ovl_Bg_Ganon_Otyuka/z_bg_ganon_otyuka.c @@ -10,7 +10,7 @@ #include "soh/frame_interpolation.h" -#define FLAGS (ACTOR_FLAG_UPDATE_WHILE_CULLED | ACTOR_FLAG_DRAW_WHILE_CULLED) +#define FLAGS (ACTOR_FLAG_UPDATE_CULLING_DISABLED | ACTOR_FLAG_DRAW_CULLING_DISABLED) typedef enum { /* 0x00 */ FLASH_NONE, diff --git a/soh/src/overlays/actors/ovl_Bg_Gnd_Darkmeiro/z_bg_gnd_darkmeiro.c b/soh/src/overlays/actors/ovl_Bg_Gnd_Darkmeiro/z_bg_gnd_darkmeiro.c index 9c14562e2..c2ad6c164 100644 --- a/soh/src/overlays/actors/ovl_Bg_Gnd_Darkmeiro/z_bg_gnd_darkmeiro.c +++ b/soh/src/overlays/actors/ovl_Bg_Gnd_Darkmeiro/z_bg_gnd_darkmeiro.c @@ -7,7 +7,7 @@ #include "z_bg_gnd_darkmeiro.h" #include "objects/object_demo_kekkai/object_demo_kekkai.h" -#define FLAGS (ACTOR_FLAG_UPDATE_WHILE_CULLED | ACTOR_FLAG_DRAW_WHILE_CULLED) +#define FLAGS (ACTOR_FLAG_UPDATE_CULLING_DISABLED | ACTOR_FLAG_DRAW_CULLING_DISABLED) void BgGndDarkmeiro_Init(Actor* thisx, PlayState* play); void BgGndDarkmeiro_Destroy(Actor* thisx, PlayState* play); @@ -56,7 +56,7 @@ void BgGndDarkmeiro_Init(Actor* thisx, PlayState* play2) { switch (this->dyna.actor.params & 0xFF) { case DARKMEIRO_INVISIBLE_PATH: this->dyna.actor.draw = BgGndDarkmeiro_DrawInvisiblePath; - this->dyna.actor.flags |= ACTOR_FLAG_LENS; + this->dyna.actor.flags |= ACTOR_FLAG_REACT_TO_LENS; break; case DARKMEIRO_CLEAR_BLOCK: CollisionHeader_GetVirtual(&gClearBlockCol, &colHeader); diff --git a/soh/src/overlays/actors/ovl_Bg_Gnd_Firemeiro/z_bg_gnd_firemeiro.c b/soh/src/overlays/actors/ovl_Bg_Gnd_Firemeiro/z_bg_gnd_firemeiro.c index e838191ae..b136c995a 100644 --- a/soh/src/overlays/actors/ovl_Bg_Gnd_Firemeiro/z_bg_gnd_firemeiro.c +++ b/soh/src/overlays/actors/ovl_Bg_Gnd_Firemeiro/z_bg_gnd_firemeiro.c @@ -7,7 +7,7 @@ #include "z_bg_gnd_firemeiro.h" #include "objects/object_demo_kekkai/object_demo_kekkai.h" -#define FLAGS (ACTOR_FLAG_UPDATE_WHILE_CULLED | ACTOR_FLAG_DRAW_WHILE_CULLED) +#define FLAGS (ACTOR_FLAG_UPDATE_CULLING_DISABLED | ACTOR_FLAG_DRAW_CULLING_DISABLED) void BgGndFiremeiro_Init(Actor* thisx, PlayState* play); void BgGndFiremeiro_Destroy(Actor* thisx, PlayState* play); diff --git a/soh/src/overlays/actors/ovl_Bg_Gnd_Iceblock/z_bg_gnd_iceblock.c b/soh/src/overlays/actors/ovl_Bg_Gnd_Iceblock/z_bg_gnd_iceblock.c index 37ff09efc..7e90818ed 100644 --- a/soh/src/overlays/actors/ovl_Bg_Gnd_Iceblock/z_bg_gnd_iceblock.c +++ b/soh/src/overlays/actors/ovl_Bg_Gnd_Iceblock/z_bg_gnd_iceblock.c @@ -8,7 +8,7 @@ #include "objects/object_demo_kekkai/object_demo_kekkai.h" #include -#define FLAGS (ACTOR_FLAG_UPDATE_WHILE_CULLED | ACTOR_FLAG_DRAW_WHILE_CULLED) +#define FLAGS (ACTOR_FLAG_UPDATE_CULLING_DISABLED | ACTOR_FLAG_DRAW_CULLING_DISABLED) typedef enum { /* 0 */ GNDICE_IDLE, diff --git a/soh/src/overlays/actors/ovl_Bg_Gnd_Nisekabe/z_bg_gnd_nisekabe.c b/soh/src/overlays/actors/ovl_Bg_Gnd_Nisekabe/z_bg_gnd_nisekabe.c index 2ffb8a98e..b710bdbd8 100644 --- a/soh/src/overlays/actors/ovl_Bg_Gnd_Nisekabe/z_bg_gnd_nisekabe.c +++ b/soh/src/overlays/actors/ovl_Bg_Gnd_Nisekabe/z_bg_gnd_nisekabe.c @@ -7,7 +7,7 @@ #include "z_bg_gnd_nisekabe.h" #include "objects/object_demo_kekkai/object_demo_kekkai.h" -#define FLAGS ACTOR_FLAG_UPDATE_WHILE_CULLED +#define FLAGS ACTOR_FLAG_UPDATE_CULLING_DISABLED void BgGndNisekabe_Init(Actor* thisx, PlayState* play); void BgGndNisekabe_Destroy(Actor* thisx, PlayState* play); @@ -41,9 +41,9 @@ void BgGndNisekabe_Update(Actor* thisx, PlayState* play) { BgGndNisekabe* this = (BgGndNisekabe*)thisx; if (play->actorCtx.lensActive) { - this->actor.flags |= ACTOR_FLAG_LENS; + this->actor.flags |= ACTOR_FLAG_REACT_TO_LENS; } else { - this->actor.flags &= ~ACTOR_FLAG_LENS; + this->actor.flags &= ~ACTOR_FLAG_REACT_TO_LENS; } } @@ -56,7 +56,7 @@ void BgGndNisekabe_Draw(Actor* thisx, PlayState* play) { BgGndNisekabe* this = (BgGndNisekabe*)thisx; u32 index = this->actor.params & 0xFF; - if (CHECK_FLAG_ALL(this->actor.flags, ACTOR_FLAG_LENS)) { + if (CHECK_FLAG_ALL(this->actor.flags, ACTOR_FLAG_REACT_TO_LENS)) { Gfx_DrawDListXlu(play, dLists[index]); } else { Gfx_DrawDListOpa(play, dLists[index]); diff --git a/soh/src/overlays/actors/ovl_Bg_Haka_Gate/z_bg_haka_gate.c b/soh/src/overlays/actors/ovl_Bg_Haka_Gate/z_bg_haka_gate.c index fb6e77efc..ed60cfe3d 100644 --- a/soh/src/overlays/actors/ovl_Bg_Haka_Gate/z_bg_haka_gate.c +++ b/soh/src/overlays/actors/ovl_Bg_Haka_Gate/z_bg_haka_gate.c @@ -99,7 +99,7 @@ void BgHakaGate_Init(Actor* thisx, PlayState* play) { this->actionFunc = BgHakaGate_FalseSkull; } this->vScrollTimer = Rand_ZeroOne() * 20.0f; - thisx->flags |= ACTOR_FLAG_UPDATE_WHILE_CULLED; + thisx->flags |= ACTOR_FLAG_UPDATE_CULLING_DISABLED; if (Flags_GetSwitch(play, this->switchFlag)) { this->vFlameScale = 350; } @@ -126,7 +126,7 @@ void BgHakaGate_Init(Actor* thisx, PlayState* play) { this->actionFunc = BgHakaGate_DoNothing; thisx->world.pos.y += 80.0f; } else { - thisx->flags |= ACTOR_FLAG_UPDATE_WHILE_CULLED; + thisx->flags |= ACTOR_FLAG_UPDATE_CULLING_DISABLED; Actor_SetFocus(thisx, 30.0f); this->actionFunc = BgHakaGate_GateWait; } @@ -276,7 +276,7 @@ void BgHakaGate_GateWait(BgHakaGate* this, PlayState* play) { void BgHakaGate_GateOpen(BgHakaGate* this, PlayState* play) { if (Math_StepToF(&this->dyna.actor.world.pos.y, this->dyna.actor.home.pos.y + 80.0f, 1.0f)) { Audio_PlayActorSound2(&this->dyna.actor, NA_SE_EV_METALDOOR_STOP); - this->dyna.actor.flags &= ~ACTOR_FLAG_UPDATE_WHILE_CULLED; + this->dyna.actor.flags &= ~ACTOR_FLAG_UPDATE_CULLING_DISABLED; this->actionFunc = BgHakaGate_DoNothing; } else { func_8002F974(&this->dyna.actor, NA_SE_EV_METALDOOR_SLIDE - SFX_FLAG); @@ -294,9 +294,9 @@ void BgHakaGate_FalseSkull(BgHakaGate* this, PlayState* play) { Math_StepToS(&this->vFlameScale, 350, 20); } if (play->actorCtx.lensActive) { - this->dyna.actor.flags |= ACTOR_FLAG_LENS; + this->dyna.actor.flags |= ACTOR_FLAG_REACT_TO_LENS; } else { - this->dyna.actor.flags &= ~ACTOR_FLAG_LENS; + this->dyna.actor.flags &= ~ACTOR_FLAG_REACT_TO_LENS; } } @@ -345,7 +345,7 @@ void BgHakaGate_Draw(Actor* thisx, PlayState* play) { BgHakaGate* this = (BgHakaGate*)thisx; MtxF currentMtxF; - if (CHECK_FLAG_ALL(thisx->flags, ACTOR_FLAG_LENS)) { + if (CHECK_FLAG_ALL(thisx->flags, ACTOR_FLAG_REACT_TO_LENS)) { Gfx_DrawDListXlu(play, object_haka_objects_DL_00F1B0); } else { Gfx_SetupDL_25Opa(play->state.gfxCtx); diff --git a/soh/src/overlays/actors/ovl_Bg_Haka_Huta/z_bg_haka_huta.c b/soh/src/overlays/actors/ovl_Bg_Haka_Huta/z_bg_haka_huta.c index 9845b91d5..ae2fc37f0 100644 --- a/soh/src/overlays/actors/ovl_Bg_Haka_Huta/z_bg_haka_huta.c +++ b/soh/src/overlays/actors/ovl_Bg_Haka_Huta/z_bg_haka_huta.c @@ -7,7 +7,7 @@ #include "z_bg_haka_huta.h" #include "objects/object_hakach_objects/object_hakach_objects.h" -#define FLAGS ACTOR_FLAG_UPDATE_WHILE_CULLED +#define FLAGS ACTOR_FLAG_UPDATE_CULLING_DISABLED void BgHakaHuta_Init(Actor* thisx, PlayState* play); void BgHakaHuta_Destroy(Actor* thisx, PlayState* play); diff --git a/soh/src/overlays/actors/ovl_Bg_Haka_Megane/z_bg_haka_megane.c b/soh/src/overlays/actors/ovl_Bg_Haka_Megane/z_bg_haka_megane.c index 5e43aa62f..3bfce6c2a 100644 --- a/soh/src/overlays/actors/ovl_Bg_Haka_Megane/z_bg_haka_megane.c +++ b/soh/src/overlays/actors/ovl_Bg_Haka_Megane/z_bg_haka_megane.c @@ -8,7 +8,7 @@ #include "objects/object_hakach_objects/object_hakach_objects.h" #include "objects/object_haka_objects/object_haka_objects.h" -#define FLAGS (ACTOR_FLAG_UPDATE_WHILE_CULLED | ACTOR_FLAG_DRAW_WHILE_CULLED | ACTOR_FLAG_LENS) +#define FLAGS (ACTOR_FLAG_UPDATE_CULLING_DISABLED | ACTOR_FLAG_DRAW_CULLING_DISABLED | ACTOR_FLAG_REACT_TO_LENS) void BgHakaMegane_Init(Actor* thisx, PlayState* play); void BgHakaMegane_Destroy(Actor* thisx, PlayState* play); @@ -110,10 +110,10 @@ void func_8087DBF0(BgHakaMegane* this, PlayState* play) { Actor* thisx = &this->dyna.actor; if (play->actorCtx.lensActive) { - thisx->flags |= ACTOR_FLAG_LENS; + thisx->flags |= ACTOR_FLAG_REACT_TO_LENS; func_8003EBF8(play, &play->colCtx.dyna, this->dyna.bgId); } else { - thisx->flags &= ~ACTOR_FLAG_LENS; + thisx->flags &= ~ACTOR_FLAG_REACT_TO_LENS; func_8003EC50(play, &play->colCtx.dyna, this->dyna.bgId); } } @@ -130,7 +130,7 @@ void BgHakaMegane_Update(Actor* thisx, PlayState* play) { void BgHakaMegane_Draw(Actor* thisx, PlayState* play) { BgHakaMegane* this = (BgHakaMegane*)thisx; - if (CHECK_FLAG_ALL(thisx->flags, ACTOR_FLAG_LENS)) { + if (CHECK_FLAG_ALL(thisx->flags, ACTOR_FLAG_REACT_TO_LENS)) { Gfx_DrawDListXlu(play, sDLists[thisx->params]); } else { Gfx_DrawDListOpa(play, sDLists[thisx->params]); diff --git a/soh/src/overlays/actors/ovl_Bg_Haka_MeganeBG/z_bg_haka_meganebg.c b/soh/src/overlays/actors/ovl_Bg_Haka_MeganeBG/z_bg_haka_meganebg.c index 28e012fae..49b6e5f7c 100644 --- a/soh/src/overlays/actors/ovl_Bg_Haka_MeganeBG/z_bg_haka_meganebg.c +++ b/soh/src/overlays/actors/ovl_Bg_Haka_MeganeBG/z_bg_haka_meganebg.c @@ -65,7 +65,7 @@ void BgHakaMeganeBG_Init(Actor* thisx, PlayState* play) { if (thisx->params == 2) { DynaPolyActor_Init(&this->dyna, DPM_UNK3); - thisx->flags |= ACTOR_FLAG_UPDATE_WHILE_CULLED; + thisx->flags |= ACTOR_FLAG_UPDATE_CULLING_DISABLED; CollisionHeader_GetVirtual(&object_haka_objects_Col_005334, &colHeader); this->actionFunc = func_8087E258; } else { @@ -73,7 +73,7 @@ void BgHakaMeganeBG_Init(Actor* thisx, PlayState* play) { if (thisx->params == 0) { CollisionHeader_GetVirtual(&object_haka_objects_Col_009168, &colHeader); - thisx->flags |= ACTOR_FLAG_LENS; + thisx->flags |= ACTOR_FLAG_REACT_TO_LENS; this->unk_16A = 20; this->actionFunc = func_8087DFF8; } else if (thisx->params == 3) { @@ -84,7 +84,7 @@ void BgHakaMeganeBG_Init(Actor* thisx, PlayState* play) { this->actionFunc = func_8087E34C; thisx->world.pos.y = thisx->home.pos.y; } else { - thisx->flags |= ACTOR_FLAG_UPDATE_WHILE_CULLED; + thisx->flags |= ACTOR_FLAG_UPDATE_CULLING_DISABLED; this->actionFunc = func_8087E288; } } else { diff --git a/soh/src/overlays/actors/ovl_Bg_Haka_Sgami/z_bg_haka_sgami.c b/soh/src/overlays/actors/ovl_Bg_Haka_Sgami/z_bg_haka_sgami.c index 59eabd941..31adbca41 100644 --- a/soh/src/overlays/actors/ovl_Bg_Haka_Sgami/z_bg_haka_sgami.c +++ b/soh/src/overlays/actors/ovl_Bg_Haka_Sgami/z_bg_haka_sgami.c @@ -8,7 +8,7 @@ #include "objects/object_haka_objects/object_haka_objects.h" #include "objects/object_ice_objects/object_ice_objects.h" -#define FLAGS (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_UPDATE_WHILE_CULLED) +#define FLAGS (ACTOR_FLAG_ATTENTION_ENABLED | ACTOR_FLAG_UPDATE_CULLING_DISABLED) typedef enum { /* 0 */ SCYTHE_TRAP_SHADOW_TEMPLE, @@ -143,7 +143,7 @@ void BgHakaSgami_Init(Actor* thisx, PlayState* play) { thisx->params = (thisx->params >> 8) & 0xFF; if (this->unk_151 != 0) { - thisx->flags |= ACTOR_FLAG_LENS; + thisx->flags |= ACTOR_FLAG_REACT_TO_LENS; } Collider_InitTris(play, colliderScythe); @@ -171,7 +171,7 @@ void BgHakaSgami_Init(Actor* thisx, PlayState* play) { if (thisx->params == SCYTHE_TRAP_SHADOW_TEMPLE) { this->requiredObjBankIndex = Object_GetIndex(&play->objectCtx, OBJECT_HAKA_OBJECTS); - thisx->flags &= ~ACTOR_FLAG_TARGETABLE; + thisx->flags &= ~ACTOR_FLAG_ATTENTION_ENABLED; } else { this->requiredObjBankIndex = Object_GetIndex(&play->objectCtx, OBJECT_ICE_OBJECTS); this->colliderScytheCenter.dim.radius = 30; @@ -201,7 +201,7 @@ void BgHakaSgami_SetupSpin(BgHakaSgami* this, PlayState* play) { this->actor.objBankIndex = this->requiredObjBankIndex; this->actor.draw = BgHakaSgami_Draw; this->timer = SCYTHE_SPIN_TIME; - this->actor.flags &= ~ACTOR_FLAG_UPDATE_WHILE_CULLED; + this->actor.flags &= ~ACTOR_FLAG_UPDATE_CULLING_DISABLED; this->actionFunc = BgHakaSgami_Spin; } } diff --git a/soh/src/overlays/actors/ovl_Bg_Haka_Ship/z_bg_haka_ship.c b/soh/src/overlays/actors/ovl_Bg_Haka_Ship/z_bg_haka_ship.c index b47a85590..aef728cdb 100644 --- a/soh/src/overlays/actors/ovl_Bg_Haka_Ship/z_bg_haka_ship.c +++ b/soh/src/overlays/actors/ovl_Bg_Haka_Ship/z_bg_haka_ship.c @@ -7,7 +7,7 @@ #include "z_bg_haka_ship.h" #include "objects/object_haka_objects/object_haka_objects.h" -#define FLAGS (ACTOR_FLAG_UPDATE_WHILE_CULLED | ACTOR_FLAG_DRAW_WHILE_CULLED) +#define FLAGS (ACTOR_FLAG_UPDATE_CULLING_DISABLED | ACTOR_FLAG_DRAW_CULLING_DISABLED) void BgHakaShip_Init(Actor* thisx, PlayState* play); void BgHakaShip_Destroy(Actor* thisx, PlayState* play); diff --git a/soh/src/overlays/actors/ovl_Bg_Haka_Trap/z_bg_haka_trap.c b/soh/src/overlays/actors/ovl_Bg_Haka_Trap/z_bg_haka_trap.c index faf78019d..d16c19049 100644 --- a/soh/src/overlays/actors/ovl_Bg_Haka_Trap/z_bg_haka_trap.c +++ b/soh/src/overlays/actors/ovl_Bg_Haka_Trap/z_bg_haka_trap.c @@ -133,7 +133,7 @@ void BgHakaTrap_Init(Actor* thisx, PlayState* play) { this->actionFunc = func_80880484; } else { DynaPolyActor_Init(&this->dyna, DPM_PLAYER); - thisx->flags |= ACTOR_FLAG_UPDATE_WHILE_CULLED; + thisx->flags |= ACTOR_FLAG_UPDATE_CULLING_DISABLED; if (thisx->params == HAKA_TRAP_SPIKED_BOX) { CollisionHeader_GetVirtual(&object_haka_objects_Col_009CD0, &colHeader); diff --git a/soh/src/overlays/actors/ovl_Bg_Haka_Tubo/z_bg_haka_tubo.c b/soh/src/overlays/actors/ovl_Bg_Haka_Tubo/z_bg_haka_tubo.c index 080d50814..e0316097b 100644 --- a/soh/src/overlays/actors/ovl_Bg_Haka_Tubo/z_bg_haka_tubo.c +++ b/soh/src/overlays/actors/ovl_Bg_Haka_Tubo/z_bg_haka_tubo.c @@ -8,7 +8,7 @@ #include "objects/gameplay_keep/gameplay_keep.h" #include "objects/object_haka_objects/object_haka_objects.h" -#define FLAGS ACTOR_FLAG_UPDATE_WHILE_CULLED +#define FLAGS ACTOR_FLAG_UPDATE_CULLING_DISABLED void BgHakaTubo_Init(Actor* thisx, PlayState* play); void BgHakaTubo_Destroy(Actor* thisx, PlayState* play); diff --git a/soh/src/overlays/actors/ovl_Bg_Haka_Water/z_bg_haka_water.c b/soh/src/overlays/actors/ovl_Bg_Haka_Water/z_bg_haka_water.c index 72730cdf0..08a03bcdc 100644 --- a/soh/src/overlays/actors/ovl_Bg_Haka_Water/z_bg_haka_water.c +++ b/soh/src/overlays/actors/ovl_Bg_Haka_Water/z_bg_haka_water.c @@ -7,7 +7,7 @@ #include "z_bg_haka_water.h" #include "objects/object_hakach_objects/object_hakach_objects.h" -#define FLAGS (ACTOR_FLAG_UPDATE_WHILE_CULLED | ACTOR_FLAG_DRAW_WHILE_CULLED) +#define FLAGS (ACTOR_FLAG_UPDATE_CULLING_DISABLED | ACTOR_FLAG_DRAW_CULLING_DISABLED) void BgHakaWater_Init(Actor* thisx, PlayState* play); void BgHakaWater_Destroy(Actor* thisx, PlayState* play); diff --git a/soh/src/overlays/actors/ovl_Bg_Haka_Zou/z_bg_haka_zou.c b/soh/src/overlays/actors/ovl_Bg_Haka_Zou/z_bg_haka_zou.c index f41964603..577584ed0 100644 --- a/soh/src/overlays/actors/ovl_Bg_Haka_Zou/z_bg_haka_zou.c +++ b/soh/src/overlays/actors/ovl_Bg_Haka_Zou/z_bg_haka_zou.c @@ -8,7 +8,7 @@ #include "objects/object_hakach_objects/object_hakach_objects.h" #include "objects/object_haka_objects/object_haka_objects.h" -#define FLAGS ACTOR_FLAG_UPDATE_WHILE_CULLED +#define FLAGS ACTOR_FLAG_UPDATE_CULLING_DISABLED typedef enum { /* 0x0 */ STA_GIANT_BIRD_STATUE, diff --git a/soh/src/overlays/actors/ovl_Bg_Heavy_Block/z_bg_heavy_block.c b/soh/src/overlays/actors/ovl_Bg_Heavy_Block/z_bg_heavy_block.c index 474764d7f..e4c6157b6 100644 --- a/soh/src/overlays/actors/ovl_Bg_Heavy_Block/z_bg_heavy_block.c +++ b/soh/src/overlays/actors/ovl_Bg_Heavy_Block/z_bg_heavy_block.c @@ -77,7 +77,7 @@ void BgHeavyBlock_InitPiece(BgHeavyBlock* this, f32 scale) { void BgHeavyBlock_SetupDynapoly(BgHeavyBlock* this, PlayState* play) { s32 pad[2]; CollisionHeader* colHeader = NULL; - this->dyna.actor.flags |= ACTOR_FLAG_UPDATE_WHILE_CULLED | ACTOR_FLAG_DRAW_WHILE_CULLED | ACTOR_FLAG_PILLAR_PICKUP; + this->dyna.actor.flags |= ACTOR_FLAG_UPDATE_CULLING_DISABLED | ACTOR_FLAG_DRAW_CULLING_DISABLED | ACTOR_FLAG_CARRY_X_ROT_INFLUENCE; DynaPolyActor_Init(&this->dyna, DPM_UNK); CollisionHeader_GetVirtual(&gHeavyBlockCol, &colHeader); this->dyna.bgId = DynaPoly_SetBgActor(play, &play->colCtx.dyna, &this->dyna.actor, colHeader); @@ -101,7 +101,7 @@ void BgHeavyBlock_Init(Actor* thisx, PlayState* play) { this->actionFunc = BgHeavyBlock_MovePiece; BgHeavyBlock_InitPiece(this, 1.0f); this->timer = 120; - thisx->flags |= ACTOR_FLAG_UPDATE_WHILE_CULLED; + thisx->flags |= ACTOR_FLAG_UPDATE_CULLING_DISABLED; this->unk_164.y = -50.0f; break; case HEAVYBLOCK_SMALL_PIECE: @@ -109,7 +109,7 @@ void BgHeavyBlock_Init(Actor* thisx, PlayState* play) { this->actionFunc = BgHeavyBlock_MovePiece; BgHeavyBlock_InitPiece(this, 2.0f); this->timer = 120; - thisx->flags |= ACTOR_FLAG_UPDATE_WHILE_CULLED; + thisx->flags |= ACTOR_FLAG_UPDATE_CULLING_DISABLED; this->unk_164.y = -20.0f; break; case HEAVYBLOCK_BREAKABLE: @@ -474,7 +474,7 @@ void BgHeavyBlock_Land(BgHeavyBlock* this, PlayState* play) { break; } } else { - this->dyna.actor.flags &= ~(ACTOR_FLAG_UPDATE_WHILE_CULLED | ACTOR_FLAG_DRAW_WHILE_CULLED); + this->dyna.actor.flags &= ~(ACTOR_FLAG_UPDATE_CULLING_DISABLED | ACTOR_FLAG_DRAW_CULLING_DISABLED); this->actionFunc = BgHeavyBlock_DoNothing; } } diff --git a/soh/src/overlays/actors/ovl_Bg_Hidan_Curtain/z_bg_hidan_curtain.c b/soh/src/overlays/actors/ovl_Bg_Hidan_Curtain/z_bg_hidan_curtain.c index 2b4849643..10e3c6a83 100644 --- a/soh/src/overlays/actors/ovl_Bg_Hidan_Curtain/z_bg_hidan_curtain.c +++ b/soh/src/overlays/actors/ovl_Bg_Hidan_Curtain/z_bg_hidan_curtain.c @@ -7,7 +7,7 @@ #include "z_bg_hidan_curtain.h" #include "objects/gameplay_keep/gameplay_keep.h" -#define FLAGS ACTOR_FLAG_UPDATE_WHILE_CULLED +#define FLAGS ACTOR_FLAG_UPDATE_CULLING_DISABLED void BgHidanCurtain_Init(Actor* thisx, PlayState* play); void BgHidanCurtain_Destroy(Actor* thisx, PlayState* play); diff --git a/soh/src/overlays/actors/ovl_Bg_Hidan_Dalm/z_bg_hidan_dalm.c b/soh/src/overlays/actors/ovl_Bg_Hidan_Dalm/z_bg_hidan_dalm.c index c1d402188..725bfacd6 100644 --- a/soh/src/overlays/actors/ovl_Bg_Hidan_Dalm/z_bg_hidan_dalm.c +++ b/soh/src/overlays/actors/ovl_Bg_Hidan_Dalm/z_bg_hidan_dalm.c @@ -139,7 +139,7 @@ void BgHidanDalm_Wait(BgHidanDalm* this, PlayState* play) { this->dyna.actor.world.pos.z += 32.5f * Math_CosS(this->dyna.actor.world.rot.y); Player_SetCsActionWithHaltedActors(play, &this->dyna.actor, 8); - this->dyna.actor.flags |= ACTOR_FLAG_UPDATE_WHILE_CULLED; + this->dyna.actor.flags |= ACTOR_FLAG_UPDATE_CULLING_DISABLED; this->actionFunc = BgHidanDalm_Shrink; this->dyna.actor.bgCheckFlags &= ~2; this->dyna.actor.bgCheckFlags &= ~8; diff --git a/soh/src/overlays/actors/ovl_Bg_Hidan_Fslift/z_bg_hidan_fslift.c b/soh/src/overlays/actors/ovl_Bg_Hidan_Fslift/z_bg_hidan_fslift.c index 9ff062dd7..b25089215 100644 --- a/soh/src/overlays/actors/ovl_Bg_Hidan_Fslift/z_bg_hidan_fslift.c +++ b/soh/src/overlays/actors/ovl_Bg_Hidan_Fslift/z_bg_hidan_fslift.c @@ -7,7 +7,7 @@ #include "z_bg_hidan_fslift.h" #include "objects/object_hidan_objects/object_hidan_objects.h" -#define FLAGS ACTOR_FLAG_UPDATE_WHILE_CULLED +#define FLAGS ACTOR_FLAG_UPDATE_CULLING_DISABLED void BgHidanFslift_Init(Actor* thisx, PlayState* play); void BgHidanFslift_Destroy(Actor* thisx, PlayState* play); diff --git a/soh/src/overlays/actors/ovl_Bg_Hidan_Fwbig/z_bg_hidan_fwbig.c b/soh/src/overlays/actors/ovl_Bg_Hidan_Fwbig/z_bg_hidan_fwbig.c index 5f128bda9..11f3e9a60 100644 --- a/soh/src/overlays/actors/ovl_Bg_Hidan_Fwbig/z_bg_hidan_fwbig.c +++ b/soh/src/overlays/actors/ovl_Bg_Hidan_Fwbig/z_bg_hidan_fwbig.c @@ -9,7 +9,7 @@ #include "objects/gameplay_keep/gameplay_keep.h" #include "objects/object_hidan_objects/object_hidan_objects.h" -#define FLAGS ACTOR_FLAG_UPDATE_WHILE_CULLED +#define FLAGS ACTOR_FLAG_UPDATE_CULLING_DISABLED typedef enum { /* 0 */ FWBIG_MOVE, @@ -95,7 +95,7 @@ void BgHidanFwbig_Init(Actor* thisx, PlayState* play2) { BgHidanFwbig_UpdatePosition(this); Actor_SetScale(&this->actor, 0.15f); this->collider.dim.height = 230; - this->actor.flags |= ACTOR_FLAG_UPDATE_WHILE_CULLED; + this->actor.flags |= ACTOR_FLAG_UPDATE_CULLING_DISABLED; this->moveState = FWBIG_MOVE; this->actionFunc = BgHidanFwbig_WaitForPlayer; this->actor.world.pos.y = this->actor.home.pos.y - (2400.0f * this->actor.scale.y); diff --git a/soh/src/overlays/actors/ovl_Bg_Hidan_Hrock/z_bg_hidan_hrock.c b/soh/src/overlays/actors/ovl_Bg_Hidan_Hrock/z_bg_hidan_hrock.c index fecd9451a..e0a1d87c4 100644 --- a/soh/src/overlays/actors/ovl_Bg_Hidan_Hrock/z_bg_hidan_hrock.c +++ b/soh/src/overlays/actors/ovl_Bg_Hidan_Hrock/z_bg_hidan_hrock.c @@ -126,7 +126,7 @@ void BgHidanHrock_Init(Actor* thisx, PlayState* play) { } } else { if (thisx->params == 0) { - thisx->flags |= ACTOR_FLAG_UPDATE_WHILE_CULLED | ACTOR_FLAG_DRAW_WHILE_CULLED; + thisx->flags |= ACTOR_FLAG_UPDATE_CULLING_DISABLED | ACTOR_FLAG_DRAW_CULLING_DISABLED; thisx->uncullZoneForward = 3000.0f; } this->actionFunc = func_808896B8; @@ -185,7 +185,7 @@ void func_8088960C(BgHidanHrock* this, PlayState* play) { this->dyna.actor.velocity.y++; if (Math_StepToF(&this->dyna.actor.world.pos.y, this->dyna.actor.home.pos.y, this->dyna.actor.velocity.y)) { - this->dyna.actor.flags &= ~(ACTOR_FLAG_UPDATE_WHILE_CULLED | ACTOR_FLAG_DRAW_WHILE_CULLED); + this->dyna.actor.flags &= ~(ACTOR_FLAG_UPDATE_CULLING_DISABLED | ACTOR_FLAG_DRAW_CULLING_DISABLED); Audio_PlayActorSound2(&this->dyna.actor, NA_SE_EV_BLOCK_BOUND); if (this->dyna.actor.params == 0) { @@ -204,7 +204,7 @@ void func_808896B8(BgHidanHrock* this, PlayState* play) { if (this->collider.base.acFlags & 2) { this->collider.base.acFlags &= ~2; this->actionFunc = func_808894B0; - this->dyna.actor.flags |= ACTOR_FLAG_UPDATE_WHILE_CULLED; + this->dyna.actor.flags |= ACTOR_FLAG_UPDATE_CULLING_DISABLED; if (this->dyna.actor.params == 0) { this->dyna.actor.room = -1; diff --git a/soh/src/overlays/actors/ovl_Bg_Hidan_Kousi/z_bg_hidan_kousi.c b/soh/src/overlays/actors/ovl_Bg_Hidan_Kousi/z_bg_hidan_kousi.c index 4d01df395..39d642c39 100644 --- a/soh/src/overlays/actors/ovl_Bg_Hidan_Kousi/z_bg_hidan_kousi.c +++ b/soh/src/overlays/actors/ovl_Bg_Hidan_Kousi/z_bg_hidan_kousi.c @@ -7,7 +7,7 @@ #include "z_bg_hidan_kousi.h" #include "objects/object_hidan_objects/object_hidan_objects.h" -#define FLAGS ACTOR_FLAG_UPDATE_WHILE_CULLED +#define FLAGS ACTOR_FLAG_UPDATE_CULLING_DISABLED void BgHidanKousi_Init(Actor* thisx, PlayState* play); void BgHidanKousi_Destroy(Actor* thisx, PlayState* play); diff --git a/soh/src/overlays/actors/ovl_Bg_Hidan_Rock/z_bg_hidan_rock.c b/soh/src/overlays/actors/ovl_Bg_Hidan_Rock/z_bg_hidan_rock.c index 108378185..aaebd9f3c 100644 --- a/soh/src/overlays/actors/ovl_Bg_Hidan_Rock/z_bg_hidan_rock.c +++ b/soh/src/overlays/actors/ovl_Bg_Hidan_Rock/z_bg_hidan_rock.c @@ -93,7 +93,7 @@ void BgHidanRock_Init(Actor* thisx, PlayState* play) { } else { this->actionFunc = func_8088B268; } - thisx->flags |= ACTOR_FLAG_UPDATE_WHILE_CULLED | ACTOR_FLAG_DRAW_WHILE_CULLED; + thisx->flags |= ACTOR_FLAG_UPDATE_CULLING_DISABLED | ACTOR_FLAG_DRAW_CULLING_DISABLED; CollisionHeader_GetVirtual(&gFireTempleStoneBlock1Col, &colHeader); } else { CollisionHeader_GetVirtual(&gFireTempleStoneBlock2Col, &colHeader); @@ -116,7 +116,7 @@ void BgHidanRock_Destroy(Actor* thisx, PlayState* play) { } void func_8088B24C(BgHidanRock* this) { - this->dyna.actor.flags |= ACTOR_FLAG_UPDATE_WHILE_CULLED | ACTOR_FLAG_DRAW_WHILE_CULLED; + this->dyna.actor.flags |= ACTOR_FLAG_UPDATE_CULLING_DISABLED | ACTOR_FLAG_DRAW_CULLING_DISABLED; this->actionFunc = func_8088B990; } @@ -250,7 +250,7 @@ void func_8088B79C(BgHidanRock* this, PlayState* play) { } else { this->dyna.actor.world.pos.y = this->dyna.actor.home.pos.y - 15.0f; this->actionFunc = func_8088B90C; - this->dyna.actor.flags &= ~(ACTOR_FLAG_UPDATE_WHILE_CULLED | ACTOR_FLAG_DRAW_WHILE_CULLED); + this->dyna.actor.flags &= ~(ACTOR_FLAG_UPDATE_CULLING_DISABLED | ACTOR_FLAG_DRAW_CULLING_DISABLED); } Audio_PlayActorSound2(&this->dyna.actor, NA_SE_EV_BLOCK_BOUND); diff --git a/soh/src/overlays/actors/ovl_Bg_Hidan_Syoku/z_bg_hidan_syoku.c b/soh/src/overlays/actors/ovl_Bg_Hidan_Syoku/z_bg_hidan_syoku.c index ae8e5b530..67176037b 100644 --- a/soh/src/overlays/actors/ovl_Bg_Hidan_Syoku/z_bg_hidan_syoku.c +++ b/soh/src/overlays/actors/ovl_Bg_Hidan_Syoku/z_bg_hidan_syoku.c @@ -7,7 +7,7 @@ #include "z_bg_hidan_syoku.h" #include "objects/object_hidan_objects/object_hidan_objects.h" -#define FLAGS ACTOR_FLAG_UPDATE_WHILE_CULLED +#define FLAGS ACTOR_FLAG_UPDATE_CULLING_DISABLED void BgHidanSyoku_Init(Actor* thisx, PlayState* play); void BgHidanSyoku_Destroy(Actor* thisx, PlayState* play); diff --git a/soh/src/overlays/actors/ovl_Bg_Ice_Objects/z_bg_ice_objects.c b/soh/src/overlays/actors/ovl_Bg_Ice_Objects/z_bg_ice_objects.c index 7193d3659..a35af8227 100644 --- a/soh/src/overlays/actors/ovl_Bg_Ice_Objects/z_bg_ice_objects.c +++ b/soh/src/overlays/actors/ovl_Bg_Ice_Objects/z_bg_ice_objects.c @@ -142,7 +142,7 @@ void BgIceObjects_Idle(BgIceObjects* this, PlayState* play) { if ((this->dyna.unk_150 > 0.0f) && !Player_InCsMode(play)) { BgIceObjects_SetNextTarget(this, play); if (Actor_WorldDistXZToPoint(thisx, &this->targetPos) > 1.0f) { - thisx->flags |= ACTOR_FLAG_UPDATE_WHILE_CULLED; + thisx->flags |= ACTOR_FLAG_UPDATE_CULLING_DISABLED; Player_SetCsActionWithHaltedActors(play, thisx, 8); thisx->params = 1; this->actionFunc = BgIceObjects_Slide; @@ -170,7 +170,7 @@ void BgIceObjects_Slide(BgIceObjects* this, PlayState* play) { this->targetPos.x = thisx->world.pos.x; this->targetPos.z = thisx->world.pos.z; if (thisx->velocity.y <= 0.0f) { - thisx->flags &= ~ACTOR_FLAG_UPDATE_WHILE_CULLED; + thisx->flags &= ~ACTOR_FLAG_UPDATE_CULLING_DISABLED; } thisx->params = 0; Player_SetCsActionWithHaltedActors(play, thisx, 7); @@ -207,7 +207,7 @@ void BgIceObjects_Reset(BgIceObjects* this, PlayState* play) { this->dyna.unk_150 = 0.0f; } if (Math_StepToF(&thisx->world.pos.y, thisx->home.pos.y, 1.0f)) { - thisx->flags &= ~ACTOR_FLAG_UPDATE_WHILE_CULLED; + thisx->flags &= ~ACTOR_FLAG_UPDATE_CULLING_DISABLED; Math_Vec3f_Copy(&this->targetPos, &thisx->home.pos); this->actionFunc = BgIceObjects_Idle; thisx->speedXZ = 0.0f; diff --git a/soh/src/overlays/actors/ovl_Bg_Ice_Shutter/z_bg_ice_shutter.c b/soh/src/overlays/actors/ovl_Bg_Ice_Shutter/z_bg_ice_shutter.c index de469fd17..5c0011b21 100644 --- a/soh/src/overlays/actors/ovl_Bg_Ice_Shutter/z_bg_ice_shutter.c +++ b/soh/src/overlays/actors/ovl_Bg_Ice_Shutter/z_bg_ice_shutter.c @@ -7,7 +7,7 @@ #include "z_bg_ice_shutter.h" #include "objects/object_ice_objects/object_ice_objects.h" -#define FLAGS ACTOR_FLAG_UPDATE_WHILE_CULLED +#define FLAGS ACTOR_FLAG_UPDATE_CULLING_DISABLED void BgIceShutter_Init(Actor* thisx, PlayState* play); void BgIceShutter_Destroy(Actor* thisx, PlayState* play); diff --git a/soh/src/overlays/actors/ovl_Bg_Jya_1flift/z_bg_jya_1flift.c b/soh/src/overlays/actors/ovl_Bg_Jya_1flift/z_bg_jya_1flift.c index 270bcd9ff..8a7e364a8 100644 --- a/soh/src/overlays/actors/ovl_Bg_Jya_1flift/z_bg_jya_1flift.c +++ b/soh/src/overlays/actors/ovl_Bg_Jya_1flift/z_bg_jya_1flift.c @@ -7,7 +7,7 @@ #include "z_bg_jya_1flift.h" #include "objects/object_jya_obj/object_jya_obj.h" -#define FLAGS ACTOR_FLAG_UPDATE_WHILE_CULLED +#define FLAGS ACTOR_FLAG_UPDATE_CULLING_DISABLED void BgJya1flift_Init(Actor* thisx, PlayState* play); void BgJya1flift_Destroy(Actor* thisx, PlayState* play); diff --git a/soh/src/overlays/actors/ovl_Bg_Jya_Bigmirror/z_bg_jya_bigmirror.c b/soh/src/overlays/actors/ovl_Bg_Jya_Bigmirror/z_bg_jya_bigmirror.c index 51dc19a09..34d87f269 100644 --- a/soh/src/overlays/actors/ovl_Bg_Jya_Bigmirror/z_bg_jya_bigmirror.c +++ b/soh/src/overlays/actors/ovl_Bg_Jya_Bigmirror/z_bg_jya_bigmirror.c @@ -7,7 +7,7 @@ #include "z_bg_jya_bigmirror.h" #include "objects/object_jya_obj/object_jya_obj.h" -#define FLAGS (ACTOR_FLAG_UPDATE_WHILE_CULLED | ACTOR_FLAG_DRAW_WHILE_CULLED) +#define FLAGS (ACTOR_FLAG_UPDATE_CULLING_DISABLED | ACTOR_FLAG_DRAW_CULLING_DISABLED) void BgJyaBigmirror_Init(Actor* thisx, PlayState* play); void BgJyaBigmirror_Destroy(Actor* thisx, PlayState* play); diff --git a/soh/src/overlays/actors/ovl_Bg_Jya_Bombchuiwa/z_bg_jya_bombchuiwa.c b/soh/src/overlays/actors/ovl_Bg_Jya_Bombchuiwa/z_bg_jya_bombchuiwa.c index cb36b743d..faae8e194 100644 --- a/soh/src/overlays/actors/ovl_Bg_Jya_Bombchuiwa/z_bg_jya_bombchuiwa.c +++ b/soh/src/overlays/actors/ovl_Bg_Jya_Bombchuiwa/z_bg_jya_bombchuiwa.c @@ -1,7 +1,7 @@ #include "z_bg_jya_bombchuiwa.h" #include "overlays/effects/ovl_Effect_Ss_Kakera/z_eff_ss_kakera.h" #include "objects/object_jya_obj/object_jya_obj.h" -#define FLAGS ACTOR_FLAG_TARGETABLE +#define FLAGS ACTOR_FLAG_ATTENTION_ENABLED void BgJyaBombchuiwa_Init(Actor* thisx, PlayState* play); void BgJyaBombchuiwa_Destroy(Actor* thisx, PlayState* play); @@ -163,7 +163,7 @@ void BgJyaBombchuiwa_CleanUpAfterExplosion(BgJyaBombchuiwa* this, PlayState* pla BgJyaBombchuiwa_SetDrawFlags(this, 4); this->lightRayIntensity = 0.3f; this->timer = 0; - this->actor.flags &= ~ACTOR_FLAG_TARGETABLE; + this->actor.flags &= ~ACTOR_FLAG_ATTENTION_ENABLED; } void func_808949B8(BgJyaBombchuiwa* this, PlayState* play) { diff --git a/soh/src/overlays/actors/ovl_Bg_Jya_Cobra/z_bg_jya_cobra.c b/soh/src/overlays/actors/ovl_Bg_Jya_Cobra/z_bg_jya_cobra.c index f2c821929..32961f1b8 100644 --- a/soh/src/overlays/actors/ovl_Bg_Jya_Cobra/z_bg_jya_cobra.c +++ b/soh/src/overlays/actors/ovl_Bg_Jya_Cobra/z_bg_jya_cobra.c @@ -7,7 +7,7 @@ #include "objects/object_jya_obj/object_jya_obj.h" #include "vt.h" -#define FLAGS ACTOR_FLAG_UPDATE_WHILE_CULLED +#define FLAGS ACTOR_FLAG_UPDATE_CULLING_DISABLED void BgJyaCobra_Init(Actor* thisx, PlayState* play); void BgJyaCobra_Destroy(Actor* thisx, PlayState* play); diff --git a/soh/src/overlays/actors/ovl_Bg_Jya_Goroiwa/z_bg_jya_goroiwa.c b/soh/src/overlays/actors/ovl_Bg_Jya_Goroiwa/z_bg_jya_goroiwa.c index 3af46683c..74e81c0e0 100644 --- a/soh/src/overlays/actors/ovl_Bg_Jya_Goroiwa/z_bg_jya_goroiwa.c +++ b/soh/src/overlays/actors/ovl_Bg_Jya_Goroiwa/z_bg_jya_goroiwa.c @@ -8,7 +8,7 @@ #include "z_bg_jya_goroiwa.h" #include "objects/object_goroiwa/object_goroiwa.h" -#define FLAGS ACTOR_FLAG_UPDATE_WHILE_CULLED +#define FLAGS ACTOR_FLAG_UPDATE_CULLING_DISABLED void BgJyaGoroiwa_Init(Actor* thisx, PlayState* play); void BgJyaGoroiwa_Destroy(Actor* thisx, PlayState* play); diff --git a/soh/src/overlays/actors/ovl_Bg_Jya_Haheniron/z_bg_jya_haheniron.c b/soh/src/overlays/actors/ovl_Bg_Jya_Haheniron/z_bg_jya_haheniron.c index 1fb0d4a50..cfe9f115b 100644 --- a/soh/src/overlays/actors/ovl_Bg_Jya_Haheniron/z_bg_jya_haheniron.c +++ b/soh/src/overlays/actors/ovl_Bg_Jya_Haheniron/z_bg_jya_haheniron.c @@ -8,7 +8,7 @@ #include "overlays/effects/ovl_Effect_Ss_Kakera/z_eff_ss_kakera.h" #include "objects/object_jya_iron/object_jya_iron.h" -#define FLAGS ACTOR_FLAG_UPDATE_WHILE_CULLED +#define FLAGS ACTOR_FLAG_UPDATE_CULLING_DISABLED void BgJyaHaheniron_Init(Actor* thisx, PlayState* play); void BgJyaHaheniron_Destroy(Actor* thisx, PlayState* play); diff --git a/soh/src/overlays/actors/ovl_Bg_Jya_Lift/z_bg_jya_lift.c b/soh/src/overlays/actors/ovl_Bg_Jya_Lift/z_bg_jya_lift.c index bc7b756d8..9df861735 100644 --- a/soh/src/overlays/actors/ovl_Bg_Jya_Lift/z_bg_jya_lift.c +++ b/soh/src/overlays/actors/ovl_Bg_Jya_Lift/z_bg_jya_lift.c @@ -8,7 +8,7 @@ #include "objects/object_jya_obj/object_jya_obj.h" #include "soh/OTRGlobals.h" -#define FLAGS ACTOR_FLAG_UPDATE_WHILE_CULLED +#define FLAGS ACTOR_FLAG_UPDATE_CULLING_DISABLED void BgJyaLift_Init(Actor* thisx, PlayState* play); void BgJyaLift_Destroy(Actor* thisx, PlayState* play); diff --git a/soh/src/overlays/actors/ovl_Bg_Jya_Zurerukabe/z_bg_jya_zurerukabe.c b/soh/src/overlays/actors/ovl_Bg_Jya_Zurerukabe/z_bg_jya_zurerukabe.c index 1b0f52ae8..b667dd92a 100644 --- a/soh/src/overlays/actors/ovl_Bg_Jya_Zurerukabe/z_bg_jya_zurerukabe.c +++ b/soh/src/overlays/actors/ovl_Bg_Jya_Zurerukabe/z_bg_jya_zurerukabe.c @@ -8,7 +8,7 @@ #include "objects/object_jya_obj/object_jya_obj.h" #include "vt.h" -#define FLAGS ACTOR_FLAG_UPDATE_WHILE_CULLED +#define FLAGS ACTOR_FLAG_UPDATE_CULLING_DISABLED void BgJyaZurerukabe_Init(Actor* thisx, PlayState* play); void BgJyaZurerukabe_Destroy(Actor* thisx, PlayState* play); diff --git a/soh/src/overlays/actors/ovl_Bg_Menkuri_Eye/z_bg_menkuri_eye.c b/soh/src/overlays/actors/ovl_Bg_Menkuri_Eye/z_bg_menkuri_eye.c index a2610fac6..808a71fa4 100644 --- a/soh/src/overlays/actors/ovl_Bg_Menkuri_Eye/z_bg_menkuri_eye.c +++ b/soh/src/overlays/actors/ovl_Bg_Menkuri_Eye/z_bg_menkuri_eye.c @@ -7,7 +7,7 @@ #include "z_bg_menkuri_eye.h" #include "objects/object_menkuri_objects/object_menkuri_objects.h" -#define FLAGS ACTOR_FLAG_DRAW_WHILE_CULLED +#define FLAGS ACTOR_FLAG_DRAW_CULLING_DISABLED void BgMenkuriEye_Init(Actor* thisx, PlayState* play); void BgMenkuriEye_Destroy(Actor* thisx, PlayState* play); diff --git a/soh/src/overlays/actors/ovl_Bg_Menkuri_Kaiten/z_bg_menkuri_kaiten.c b/soh/src/overlays/actors/ovl_Bg_Menkuri_Kaiten/z_bg_menkuri_kaiten.c index 90a3cbee1..3052494a5 100644 --- a/soh/src/overlays/actors/ovl_Bg_Menkuri_Kaiten/z_bg_menkuri_kaiten.c +++ b/soh/src/overlays/actors/ovl_Bg_Menkuri_Kaiten/z_bg_menkuri_kaiten.c @@ -7,7 +7,7 @@ #include "z_bg_menkuri_kaiten.h" #include "objects/object_menkuri_objects/object_menkuri_objects.h" -#define FLAGS (ACTOR_FLAG_UPDATE_WHILE_CULLED | ACTOR_FLAG_DRAW_WHILE_CULLED) +#define FLAGS (ACTOR_FLAG_UPDATE_CULLING_DISABLED | ACTOR_FLAG_DRAW_CULLING_DISABLED) void BgMenkuriKaiten_Init(Actor* thisx, PlayState* play); void BgMenkuriKaiten_Destroy(Actor* thisx, PlayState* play); diff --git a/soh/src/overlays/actors/ovl_Bg_Menkuri_Nisekabe/z_bg_menkuri_nisekabe.c b/soh/src/overlays/actors/ovl_Bg_Menkuri_Nisekabe/z_bg_menkuri_nisekabe.c index ddaa5a153..47eb8bc92 100644 --- a/soh/src/overlays/actors/ovl_Bg_Menkuri_Nisekabe/z_bg_menkuri_nisekabe.c +++ b/soh/src/overlays/actors/ovl_Bg_Menkuri_Nisekabe/z_bg_menkuri_nisekabe.c @@ -42,9 +42,9 @@ void BgMenkuriNisekabe_Update(Actor* thisx, PlayState* play) { BgMenkuriNisekabe* this = (BgMenkuriNisekabe*)thisx; if (play->actorCtx.lensActive) { - this->actor.flags |= ACTOR_FLAG_LENS; + this->actor.flags |= ACTOR_FLAG_REACT_TO_LENS; } else { - this->actor.flags &= ~ACTOR_FLAG_LENS; + this->actor.flags &= ~ACTOR_FLAG_REACT_TO_LENS; } } @@ -52,7 +52,7 @@ void BgMenkuriNisekabe_Draw(Actor* thisx, PlayState* play) { BgMenkuriNisekabe* this = (BgMenkuriNisekabe*)thisx; u32 index = this->actor.params & 0xFF; - if (CHECK_FLAG_ALL(this->actor.flags, ACTOR_FLAG_LENS)) { + if (CHECK_FLAG_ALL(this->actor.flags, ACTOR_FLAG_REACT_TO_LENS)) { Gfx_DrawDListXlu(play, sDLists[index]); } else { Gfx_DrawDListOpa(play, sDLists[index]); diff --git a/soh/src/overlays/actors/ovl_Bg_Mizu_Bwall/z_bg_mizu_bwall.c b/soh/src/overlays/actors/ovl_Bg_Mizu_Bwall/z_bg_mizu_bwall.c index 89db58c0e..977025f62 100644 --- a/soh/src/overlays/actors/ovl_Bg_Mizu_Bwall/z_bg_mizu_bwall.c +++ b/soh/src/overlays/actors/ovl_Bg_Mizu_Bwall/z_bg_mizu_bwall.c @@ -8,7 +8,7 @@ #include "overlays/actors/ovl_Bg_Mizu_Water/z_bg_mizu_water.h" #include "objects/object_mizu_objects/object_mizu_objects.h" -#define FLAGS ACTOR_FLAG_UPDATE_WHILE_CULLED +#define FLAGS ACTOR_FLAG_UPDATE_CULLING_DISABLED void BgMizuBwall_Init(Actor* thisx, PlayState* play); void BgMizuBwall_Destroy(Actor* thisx, PlayState* play); diff --git a/soh/src/overlays/actors/ovl_Bg_Mizu_Movebg/z_bg_mizu_movebg.c b/soh/src/overlays/actors/ovl_Bg_Mizu_Movebg/z_bg_mizu_movebg.c index 539b72eee..fb6af1b01 100644 --- a/soh/src/overlays/actors/ovl_Bg_Mizu_Movebg/z_bg_mizu_movebg.c +++ b/soh/src/overlays/actors/ovl_Bg_Mizu_Movebg/z_bg_mizu_movebg.c @@ -8,7 +8,7 @@ #include "overlays/actors/ovl_Bg_Mizu_Water/z_bg_mizu_water.h" #include "objects/object_mizu_objects/object_mizu_objects.h" -#define FLAGS ACTOR_FLAG_UPDATE_WHILE_CULLED +#define FLAGS ACTOR_FLAG_UPDATE_CULLING_DISABLED #define MOVEBG_TYPE(params) (((u16)(params) >> 0xC) & 0xF) #define MOVEBG_FLAGS(params) ((u16)(params)&0x3F) @@ -311,7 +311,7 @@ void func_8089E318(BgMizuMovebg* this, PlayState* play) { this->dyna.actor.child->world.pos.x = this->dyna.actor.world.pos.x + sp28.x; this->dyna.actor.child->world.pos.y = this->dyna.actor.world.pos.y + sp28.y; this->dyna.actor.child->world.pos.z = this->dyna.actor.world.pos.z + sp28.z; - this->dyna.actor.child->flags &= ~ACTOR_FLAG_TARGETABLE; + this->dyna.actor.child->flags &= ~ACTOR_FLAG_ATTENTION_ENABLED; } break; } diff --git a/soh/src/overlays/actors/ovl_Bg_Mizu_Shutter/z_bg_mizu_shutter.c b/soh/src/overlays/actors/ovl_Bg_Mizu_Shutter/z_bg_mizu_shutter.c index 4a2d78fa0..bfd569fba 100644 --- a/soh/src/overlays/actors/ovl_Bg_Mizu_Shutter/z_bg_mizu_shutter.c +++ b/soh/src/overlays/actors/ovl_Bg_Mizu_Shutter/z_bg_mizu_shutter.c @@ -1,7 +1,7 @@ #include "z_bg_mizu_shutter.h" #include "objects/object_mizu_objects/object_mizu_objects.h" -#define FLAGS ACTOR_FLAG_UPDATE_WHILE_CULLED +#define FLAGS ACTOR_FLAG_UPDATE_CULLING_DISABLED #define SIZE_PARAM (((u16)this->dyna.actor.params >> 0xC) & 0xF) #define TIMER_PARAM (((u16)this->dyna.actor.params >> 6) & 0x3F) diff --git a/soh/src/overlays/actors/ovl_Bg_Mizu_Water/z_bg_mizu_water.c b/soh/src/overlays/actors/ovl_Bg_Mizu_Water/z_bg_mizu_water.c index dbf5e5503..a06890d07 100644 --- a/soh/src/overlays/actors/ovl_Bg_Mizu_Water/z_bg_mizu_water.c +++ b/soh/src/overlays/actors/ovl_Bg_Mizu_Water/z_bg_mizu_water.c @@ -7,7 +7,7 @@ #include "z_bg_mizu_water.h" #include "objects/object_mizu_objects/object_mizu_objects.h" -#define FLAGS (ACTOR_FLAG_UPDATE_WHILE_CULLED | ACTOR_FLAG_DRAW_WHILE_CULLED) +#define FLAGS (ACTOR_FLAG_UPDATE_CULLING_DISABLED | ACTOR_FLAG_DRAW_CULLING_DISABLED) void BgMizuWater_Init(Actor* thisx, PlayState* play); void BgMizuWater_Destroy(Actor* thisx, PlayState* play); diff --git a/soh/src/overlays/actors/ovl_Bg_Mjin/z_bg_mjin.c b/soh/src/overlays/actors/ovl_Bg_Mjin/z_bg_mjin.c index bd6b89301..493c6d950 100644 --- a/soh/src/overlays/actors/ovl_Bg_Mjin/z_bg_mjin.c +++ b/soh/src/overlays/actors/ovl_Bg_Mjin/z_bg_mjin.c @@ -14,7 +14,7 @@ #include "objects/object_mjin_flash/object_mjin_flash.h" #include "objects/object_mjin_oka/object_mjin_oka.h" -#define FLAGS ACTOR_FLAG_UPDATE_WHILE_CULLED +#define FLAGS ACTOR_FLAG_UPDATE_CULLING_DISABLED void BgMjin_Init(Actor* thisx, PlayState* play); void BgMjin_Destroy(Actor* thisx, PlayState* play); @@ -82,7 +82,7 @@ void func_808A0850(BgMjin* this, PlayState* play) { if (Object_IsLoaded(&play->objectCtx, this->objBankIndex)) { colHeader = NULL; - this->dyna.actor.flags &= ~ACTOR_FLAG_UPDATE_WHILE_CULLED; + this->dyna.actor.flags &= ~ACTOR_FLAG_UPDATE_CULLING_DISABLED; this->dyna.actor.objBankIndex = this->objBankIndex; Actor_SetObjectDependency(play, &this->dyna.actor); DynaPolyActor_Init(&this->dyna, 0); diff --git a/soh/src/overlays/actors/ovl_Bg_Mori_Bigst/z_bg_mori_bigst.c b/soh/src/overlays/actors/ovl_Bg_Mori_Bigst/z_bg_mori_bigst.c index c95fe6fd8..86403392f 100644 --- a/soh/src/overlays/actors/ovl_Bg_Mori_Bigst/z_bg_mori_bigst.c +++ b/soh/src/overlays/actors/ovl_Bg_Mori_Bigst/z_bg_mori_bigst.c @@ -9,7 +9,7 @@ #include "soh/Enhancements/game-interactor/GameInteractor.h" #include "soh/Enhancements/game-interactor/GameInteractor_Hooks.h" -#define FLAGS ACTOR_FLAG_UPDATE_WHILE_CULLED +#define FLAGS ACTOR_FLAG_UPDATE_CULLING_DISABLED void BgMoriBigst_Init(Actor* thisx, PlayState* play); void BgMoriBigst_Destroy(Actor* thisx, PlayState* play); diff --git a/soh/src/overlays/actors/ovl_Bg_Mori_Elevator/z_bg_mori_elevator.c b/soh/src/overlays/actors/ovl_Bg_Mori_Elevator/z_bg_mori_elevator.c index f0ca8d96c..e120916a6 100644 --- a/soh/src/overlays/actors/ovl_Bg_Mori_Elevator/z_bg_mori_elevator.c +++ b/soh/src/overlays/actors/ovl_Bg_Mori_Elevator/z_bg_mori_elevator.c @@ -1,7 +1,7 @@ #include "z_bg_mori_elevator.h" #include "objects/object_mori_objects/object_mori_objects.h" -#define FLAGS ACTOR_FLAG_UPDATE_WHILE_CULLED +#define FLAGS ACTOR_FLAG_UPDATE_CULLING_DISABLED void BgMoriElevator_Init(Actor* thisx, PlayState* play); void BgMoriElevator_Destroy(Actor* thisx, PlayState* play); diff --git a/soh/src/overlays/actors/ovl_Bg_Mori_Hashigo/z_bg_mori_hashigo.c b/soh/src/overlays/actors/ovl_Bg_Mori_Hashigo/z_bg_mori_hashigo.c index 76ffcdc33..f53ece25a 100644 --- a/soh/src/overlays/actors/ovl_Bg_Mori_Hashigo/z_bg_mori_hashigo.c +++ b/soh/src/overlays/actors/ovl_Bg_Mori_Hashigo/z_bg_mori_hashigo.c @@ -135,7 +135,7 @@ s32 BgMoriHashigo_SpawnLadder(BgMoriHashigo* this, PlayState* play) { s32 BgMoriHashigo_InitClasp(BgMoriHashigo* this, PlayState* play) { Actor_ProcessInitChain(&this->dyna.actor, sInitChainClasp); - this->dyna.actor.flags |= ACTOR_FLAG_TARGETABLE; + this->dyna.actor.flags |= ACTOR_FLAG_ATTENTION_ENABLED; Actor_SetFocus(&this->dyna.actor, 55.0f); BgMoriHashigo_InitCollider(this, play); if ((this->dyna.actor.params == HASHIGO_CLASP) && !BgMoriHashigo_SpawnLadder(this, play)) { diff --git a/soh/src/overlays/actors/ovl_Bg_Mori_Hashira4/z_bg_mori_hashira4.c b/soh/src/overlays/actors/ovl_Bg_Mori_Hashira4/z_bg_mori_hashira4.c index 79bad2257..4baac6b30 100644 --- a/soh/src/overlays/actors/ovl_Bg_Mori_Hashira4/z_bg_mori_hashira4.c +++ b/soh/src/overlays/actors/ovl_Bg_Mori_Hashira4/z_bg_mori_hashira4.c @@ -7,7 +7,7 @@ #include "z_bg_mori_hashira4.h" #include "objects/object_mori_objects/object_mori_objects.h" -#define FLAGS ACTOR_FLAG_UPDATE_WHILE_CULLED +#define FLAGS ACTOR_FLAG_UPDATE_CULLING_DISABLED void BgMoriHashira4_Init(Actor* thisx, PlayState* play); void BgMoriHashira4_Destroy(Actor* thisx, PlayState* play); diff --git a/soh/src/overlays/actors/ovl_Bg_Mori_Hineri/z_bg_mori_hineri.c b/soh/src/overlays/actors/ovl_Bg_Mori_Hineri/z_bg_mori_hineri.c index 61bec679b..972dc1dd7 100644 --- a/soh/src/overlays/actors/ovl_Bg_Mori_Hineri/z_bg_mori_hineri.c +++ b/soh/src/overlays/actors/ovl_Bg_Mori_Hineri/z_bg_mori_hineri.c @@ -13,7 +13,7 @@ #include "objects/object_mori_hineri2a/object_mori_hineri2a.h" #include "objects/object_mori_tex/object_mori_tex.h" -#define FLAGS (ACTOR_FLAG_UPDATE_WHILE_CULLED | ACTOR_FLAG_DRAW_WHILE_CULLED) +#define FLAGS (ACTOR_FLAG_UPDATE_CULLING_DISABLED | ACTOR_FLAG_DRAW_CULLING_DISABLED) void BgMoriHineri_Init(Actor* thisx, PlayState* play); void BgMoriHineri_Destroy(Actor* thisx, PlayState* play); diff --git a/soh/src/overlays/actors/ovl_Bg_Mori_Idomizu/z_bg_mori_idomizu.c b/soh/src/overlays/actors/ovl_Bg_Mori_Idomizu/z_bg_mori_idomizu.c index 0324c43cb..fc7fc0a6a 100644 --- a/soh/src/overlays/actors/ovl_Bg_Mori_Idomizu/z_bg_mori_idomizu.c +++ b/soh/src/overlays/actors/ovl_Bg_Mori_Idomizu/z_bg_mori_idomizu.c @@ -7,7 +7,7 @@ #include "z_bg_mori_idomizu.h" #include "objects/object_mori_objects/object_mori_objects.h" -#define FLAGS (ACTOR_FLAG_UPDATE_WHILE_CULLED | ACTOR_FLAG_DRAW_WHILE_CULLED) +#define FLAGS (ACTOR_FLAG_UPDATE_CULLING_DISABLED | ACTOR_FLAG_DRAW_CULLING_DISABLED) void BgMoriIdomizu_Init(Actor* thisx, PlayState* play); void BgMoriIdomizu_Destroy(Actor* thisx, PlayState* play); diff --git a/soh/src/overlays/actors/ovl_Bg_Mori_Rakkatenjo/z_bg_mori_rakkatenjo.c b/soh/src/overlays/actors/ovl_Bg_Mori_Rakkatenjo/z_bg_mori_rakkatenjo.c index 4202768a4..860b12c6d 100644 --- a/soh/src/overlays/actors/ovl_Bg_Mori_Rakkatenjo/z_bg_mori_rakkatenjo.c +++ b/soh/src/overlays/actors/ovl_Bg_Mori_Rakkatenjo/z_bg_mori_rakkatenjo.c @@ -7,7 +7,7 @@ #include "z_bg_mori_rakkatenjo.h" #include "objects/object_mori_objects/object_mori_objects.h" -#define FLAGS (ACTOR_FLAG_UPDATE_WHILE_CULLED | ACTOR_FLAG_DRAW_WHILE_CULLED) +#define FLAGS (ACTOR_FLAG_UPDATE_CULLING_DISABLED | ACTOR_FLAG_DRAW_CULLING_DISABLED) void BgMoriRakkatenjo_Init(Actor* thisx, PlayState* play); void BgMoriRakkatenjo_Destroy(Actor* thisx, PlayState* play); diff --git a/soh/src/overlays/actors/ovl_Bg_Po_Event/z_bg_po_event.c b/soh/src/overlays/actors/ovl_Bg_Po_Event/z_bg_po_event.c index c706b68a7..06f3c8aad 100644 --- a/soh/src/overlays/actors/ovl_Bg_Po_Event/z_bg_po_event.c +++ b/soh/src/overlays/actors/ovl_Bg_Po_Event/z_bg_po_event.c @@ -156,7 +156,7 @@ void BgPoEvent_InitBlocks(BgPoEvent* this, PlayState* play) { CollisionHeader* colHeader = NULL; s32 bgId; - this->dyna.actor.flags |= ACTOR_FLAG_UPDATE_WHILE_CULLED | ACTOR_FLAG_DRAW_WHILE_CULLED; + this->dyna.actor.flags |= ACTOR_FLAG_UPDATE_CULLING_DISABLED | ACTOR_FLAG_DRAW_CULLING_DISABLED; CollisionHeader_GetVirtual(&gPoSistersAmyBlockCol, &colHeader); this->dyna.bgId = DynaPoly_SetBgActor(play, &play->colCtx.dyna, &this->dyna.actor, colHeader); if ((this->type == 0) && (this->index != 3)) { @@ -309,7 +309,7 @@ void BgPoEvent_BlockFall(BgPoEvent* this, PlayState* play) { this->dyna.actor.velocity.y++; if (Math_StepToF(&this->dyna.actor.world.pos.y, 433.0f, this->dyna.actor.velocity.y)) { - this->dyna.actor.flags &= ~ACTOR_FLAG_DRAW_WHILE_CULLED; + this->dyna.actor.flags &= ~ACTOR_FLAG_DRAW_CULLING_DISABLED; this->dyna.actor.velocity.y = 0.0f; sBgPoEventBlocksAtRest++; if (this->type != 1) { diff --git a/soh/src/overlays/actors/ovl_Bg_Relay_Objects/z_bg_relay_objects.c b/soh/src/overlays/actors/ovl_Bg_Relay_Objects/z_bg_relay_objects.c index 58458fd1c..2b0802e00 100644 --- a/soh/src/overlays/actors/ovl_Bg_Relay_Objects/z_bg_relay_objects.c +++ b/soh/src/overlays/actors/ovl_Bg_Relay_Objects/z_bg_relay_objects.c @@ -7,7 +7,7 @@ #include "z_bg_relay_objects.h" #include "objects/object_relay_objects/object_relay_objects.h" -#define FLAGS ACTOR_FLAG_UPDATE_WHILE_CULLED +#define FLAGS ACTOR_FLAG_UPDATE_CULLING_DISABLED typedef enum { /* 0 */ WINDMILL_ROTATING_GEAR, @@ -64,7 +64,7 @@ void BgRelayObjects_Init(Actor* thisx, PlayState* play) { } func_800F5718(); thisx->room = -1; - thisx->flags |= ACTOR_FLAG_DRAW_WHILE_CULLED; + thisx->flags |= ACTOR_FLAG_DRAW_CULLING_DISABLED; if (D_808A9508 & 2) { thisx->params = 0xFF; Actor_Kill(thisx); @@ -156,7 +156,7 @@ void func_808A9234(BgRelayObjects* this, PlayState* play) { return; } Flags_UnsetSwitch(play, this->switchFlag); - this->dyna.actor.flags &= ~ACTOR_FLAG_UPDATE_WHILE_CULLED; + this->dyna.actor.flags &= ~ACTOR_FLAG_UPDATE_CULLING_DISABLED; if (play->roomCtx.curRoom.num == 4) { gSaveContext.timer1State = 0xF; } diff --git a/soh/src/overlays/actors/ovl_Bg_Spot00_Hanebasi/z_bg_spot00_hanebasi.c b/soh/src/overlays/actors/ovl_Bg_Spot00_Hanebasi/z_bg_spot00_hanebasi.c index 2d0263afd..37d038cb6 100644 --- a/soh/src/overlays/actors/ovl_Bg_Spot00_Hanebasi/z_bg_spot00_hanebasi.c +++ b/soh/src/overlays/actors/ovl_Bg_Spot00_Hanebasi/z_bg_spot00_hanebasi.c @@ -9,7 +9,7 @@ #include "objects/gameplay_keep/gameplay_keep.h" #include "soh/frame_interpolation.h" -#define FLAGS ACTOR_FLAG_UPDATE_WHILE_CULLED +#define FLAGS ACTOR_FLAG_UPDATE_CULLING_DISABLED typedef enum { /* -1 */ DT_DRAWBRIDGE = -1, diff --git a/soh/src/overlays/actors/ovl_Bg_Spot01_Fusya/z_bg_spot01_fusya.c b/soh/src/overlays/actors/ovl_Bg_Spot01_Fusya/z_bg_spot01_fusya.c index 3a18e3650..7fd5974bb 100644 --- a/soh/src/overlays/actors/ovl_Bg_Spot01_Fusya/z_bg_spot01_fusya.c +++ b/soh/src/overlays/actors/ovl_Bg_Spot01_Fusya/z_bg_spot01_fusya.c @@ -7,7 +7,7 @@ #include "z_bg_spot01_fusya.h" #include "objects/object_spot01_objects/object_spot01_objects.h" -#define FLAGS ACTOR_FLAG_UPDATE_WHILE_CULLED +#define FLAGS ACTOR_FLAG_UPDATE_CULLING_DISABLED void BgSpot01Fusya_Init(Actor* thisx, PlayState* play); void BgSpot01Fusya_Destroy(Actor* thisx, PlayState* play); diff --git a/soh/src/overlays/actors/ovl_Bg_Spot01_Idohashira/z_bg_spot01_idohashira.c b/soh/src/overlays/actors/ovl_Bg_Spot01_Idohashira/z_bg_spot01_idohashira.c index 59ef31c4f..13ab5563b 100644 --- a/soh/src/overlays/actors/ovl_Bg_Spot01_Idohashira/z_bg_spot01_idohashira.c +++ b/soh/src/overlays/actors/ovl_Bg_Spot01_Idohashira/z_bg_spot01_idohashira.c @@ -8,7 +8,7 @@ #include "objects/object_spot01_objects/object_spot01_objects.h" #include "vt.h" -#define FLAGS ACTOR_FLAG_UPDATE_WHILE_CULLED +#define FLAGS ACTOR_FLAG_UPDATE_CULLING_DISABLED void BgSpot01Idohashira_Init(Actor* thisx, PlayState* play); void BgSpot01Idohashira_Destroy(Actor* thisx, PlayState* play); diff --git a/soh/src/overlays/actors/ovl_Bg_Spot01_Idomizu/z_bg_spot01_idomizu.c b/soh/src/overlays/actors/ovl_Bg_Spot01_Idomizu/z_bg_spot01_idomizu.c index b287a5da6..579edda22 100644 --- a/soh/src/overlays/actors/ovl_Bg_Spot01_Idomizu/z_bg_spot01_idomizu.c +++ b/soh/src/overlays/actors/ovl_Bg_Spot01_Idomizu/z_bg_spot01_idomizu.c @@ -7,7 +7,7 @@ #include "z_bg_spot01_idomizu.h" #include "objects/object_spot01_objects/object_spot01_objects.h" -#define FLAGS ACTOR_FLAG_DRAW_WHILE_CULLED +#define FLAGS ACTOR_FLAG_DRAW_CULLING_DISABLED void BgSpot01Idomizu_Init(Actor* thisx, PlayState* play); void BgSpot01Idomizu_Destroy(Actor* thisx, PlayState* play); diff --git a/soh/src/overlays/actors/ovl_Bg_Spot01_Idosoko/z_bg_spot01_idosoko.c b/soh/src/overlays/actors/ovl_Bg_Spot01_Idosoko/z_bg_spot01_idosoko.c index a914c204c..d4aa6b076 100644 --- a/soh/src/overlays/actors/ovl_Bg_Spot01_Idosoko/z_bg_spot01_idosoko.c +++ b/soh/src/overlays/actors/ovl_Bg_Spot01_Idosoko/z_bg_spot01_idosoko.c @@ -8,7 +8,7 @@ #include "objects/object_spot01_matoya/object_spot01_matoya.h" #include "soh/OTRGlobals.h" -#define FLAGS ACTOR_FLAG_UPDATE_WHILE_CULLED +#define FLAGS ACTOR_FLAG_UPDATE_CULLING_DISABLED void BgSpot01Idosoko_Init(Actor* thisx, PlayState* play); void BgSpot01Idosoko_Destroy(Actor* thisx, PlayState* play); diff --git a/soh/src/overlays/actors/ovl_Bg_Spot01_Objects2/z_bg_spot01_objects2.c b/soh/src/overlays/actors/ovl_Bg_Spot01_Objects2/z_bg_spot01_objects2.c index 61a9e5d18..0cced2389 100644 --- a/soh/src/overlays/actors/ovl_Bg_Spot01_Objects2/z_bg_spot01_objects2.c +++ b/soh/src/overlays/actors/ovl_Bg_Spot01_Objects2/z_bg_spot01_objects2.c @@ -8,7 +8,7 @@ #include "objects/object_spot01_matoya/object_spot01_matoya.h" #include "objects/object_spot01_matoyab/object_spot01_matoyab.h" -#define FLAGS ACTOR_FLAG_UPDATE_WHILE_CULLED +#define FLAGS ACTOR_FLAG_UPDATE_CULLING_DISABLED void BgSpot01Objects2_Init(Actor* thisx, PlayState* play); void BgSpot01Objects2_Destroy(Actor* thisx, PlayState* play); diff --git a/soh/src/overlays/actors/ovl_Bg_Spot02_Objects/z_bg_spot02_objects.c b/soh/src/overlays/actors/ovl_Bg_Spot02_Objects/z_bg_spot02_objects.c index cebaa088c..0cd3bc51d 100644 --- a/soh/src/overlays/actors/ovl_Bg_Spot02_Objects/z_bg_spot02_objects.c +++ b/soh/src/overlays/actors/ovl_Bg_Spot02_Objects/z_bg_spot02_objects.c @@ -8,7 +8,7 @@ #include "objects/object_spot02_objects/object_spot02_objects.h" #include "soh/Enhancements/game-interactor/GameInteractor_Hooks.h" -#define FLAGS (ACTOR_FLAG_UPDATE_WHILE_CULLED | ACTOR_FLAG_DRAW_WHILE_CULLED) +#define FLAGS (ACTOR_FLAG_UPDATE_CULLING_DISABLED | ACTOR_FLAG_DRAW_CULLING_DISABLED) void BgSpot02Objects_Init(Actor* thisx, PlayState* play); void BgSpot02Objects_Destroy(Actor* thisx, PlayState* play); diff --git a/soh/src/overlays/actors/ovl_Bg_Spot03_Taki/z_bg_spot03_taki.c b/soh/src/overlays/actors/ovl_Bg_Spot03_Taki/z_bg_spot03_taki.c index 979a0eb0d..499a0d11a 100644 --- a/soh/src/overlays/actors/ovl_Bg_Spot03_Taki/z_bg_spot03_taki.c +++ b/soh/src/overlays/actors/ovl_Bg_Spot03_Taki/z_bg_spot03_taki.c @@ -8,7 +8,7 @@ #include "objects/object_spot03_object/object_spot03_object.h" #include "soh/ResourceManagerHelpers.h" -#define FLAGS (ACTOR_FLAG_UPDATE_WHILE_CULLED | ACTOR_FLAG_DRAW_WHILE_CULLED) +#define FLAGS (ACTOR_FLAG_UPDATE_CULLING_DISABLED | ACTOR_FLAG_DRAW_CULLING_DISABLED) void BgSpot03Taki_Init(Actor* thisx, PlayState* play); void BgSpot03Taki_Destroy(Actor* thisx, PlayState* play); diff --git a/soh/src/overlays/actors/ovl_Bg_Spot05_Soko/z_bg_spot05_soko.c b/soh/src/overlays/actors/ovl_Bg_Spot05_Soko/z_bg_spot05_soko.c index 9f5c01218..5f0b37a35 100644 --- a/soh/src/overlays/actors/ovl_Bg_Spot05_Soko/z_bg_spot05_soko.c +++ b/soh/src/overlays/actors/ovl_Bg_Spot05_Soko/z_bg_spot05_soko.c @@ -62,7 +62,7 @@ void BgSpot05Soko_Init(Actor* thisx, PlayState* play) { Actor_Kill(thisx); } else { this->actionFunc = func_808AE5B4; - thisx->flags |= ACTOR_FLAG_UPDATE_WHILE_CULLED; + thisx->flags |= ACTOR_FLAG_UPDATE_CULLING_DISABLED; } } this->dyna.bgId = DynaPoly_SetBgActor(play, &play->colCtx.dyna, thisx, colHeader); diff --git a/soh/src/overlays/actors/ovl_Bg_Spot06_Objects/z_bg_spot06_objects.c b/soh/src/overlays/actors/ovl_Bg_Spot06_Objects/z_bg_spot06_objects.c index 823a65040..ce8ce0ea8 100644 --- a/soh/src/overlays/actors/ovl_Bg_Spot06_Objects/z_bg_spot06_objects.c +++ b/soh/src/overlays/actors/ovl_Bg_Spot06_Objects/z_bg_spot06_objects.c @@ -8,7 +8,7 @@ #include "objects/object_spot06_objects/object_spot06_objects.h" #include "soh/Enhancements/custom-message/CustomMessageTypes.h" -#define FLAGS ACTOR_FLAG_HOOKSHOT_DRAGS +#define FLAGS ACTOR_FLAG_HOOKSHOT_PULLS_ACTOR typedef enum { /* 0x0 */ LHO_WATER_TEMPLE_ENTRACE_GATE, @@ -154,7 +154,7 @@ void BgSpot06Objects_Init(Actor* thisx, PlayState* play) { break; case LHO_WATER_PLANE: Actor_ProcessInitChain(thisx, sInitChainWaterPlane); - thisx->flags = ACTOR_FLAG_UPDATE_WHILE_CULLED | ACTOR_FLAG_DRAW_WHILE_CULLED; + thisx->flags = ACTOR_FLAG_UPDATE_CULLING_DISABLED | ACTOR_FLAG_DRAW_CULLING_DISABLED; if (LINK_IS_ADULT && !Flags_GetEventChkInf(EVENTCHKINF_RAISED_LAKE_HYLIA_WATER)) { if (gSaveContext.sceneSetupIndex < 4) { @@ -322,7 +322,7 @@ void BgSpot06Objects_LockWait(BgSpot06Objects* this, PlayState* play) { if (this->collider.base.acFlags & 2) { this->timer = 130; - this->dyna.actor.flags |= ACTOR_FLAG_UPDATE_WHILE_CULLED; + this->dyna.actor.flags |= ACTOR_FLAG_UPDATE_CULLING_DISABLED; sin = Math_SinS(this->dyna.actor.world.rot.y); cos = Math_CosS(this->dyna.actor.world.rot.y); this->dyna.actor.world.pos.x += (3.0f * sin); @@ -395,7 +395,7 @@ void BgSpot06Objects_LockSwimToSurface(BgSpot06Objects* this, PlayState* play) { this->dyna.actor.world.pos.z - (Math_CosS(this->dyna.actor.shape.rot.y) * 16.0f); this->dyna.actor.world.pos.y = -1993.0f; this->timer = 32; - this->dyna.actor.flags &= ~ACTOR_FLAG_UPDATE_WHILE_CULLED; + this->dyna.actor.flags &= ~ACTOR_FLAG_UPDATE_CULLING_DISABLED; this->collider.elements[0].dim.worldSphere.radius = this->collider.elements[0].dim.modelSphere.radius * 2; this->actionFunc = BgSpot06Objects_LockFloat; } diff --git a/soh/src/overlays/actors/ovl_Bg_Spot07_Taki/z_bg_spot07_taki.c b/soh/src/overlays/actors/ovl_Bg_Spot07_Taki/z_bg_spot07_taki.c index 5de544a4e..769bcfcc9 100644 --- a/soh/src/overlays/actors/ovl_Bg_Spot07_Taki/z_bg_spot07_taki.c +++ b/soh/src/overlays/actors/ovl_Bg_Spot07_Taki/z_bg_spot07_taki.c @@ -7,7 +7,7 @@ #include "z_bg_spot07_taki.h" #include "objects/object_spot07_object/object_spot07_object.h" -#define FLAGS (ACTOR_FLAG_UPDATE_WHILE_CULLED | ACTOR_FLAG_DRAW_WHILE_CULLED) +#define FLAGS (ACTOR_FLAG_UPDATE_CULLING_DISABLED | ACTOR_FLAG_DRAW_CULLING_DISABLED) void BgSpot07Taki_Init(Actor* thisx, PlayState* play); void BgSpot07Taki_Destroy(Actor* thisx, PlayState* play); diff --git a/soh/src/overlays/actors/ovl_Bg_Spot11_Bakudankabe/z_bg_spot11_bakudankabe.c b/soh/src/overlays/actors/ovl_Bg_Spot11_Bakudankabe/z_bg_spot11_bakudankabe.c index 3b7f7c7e4..635fff4e9 100644 --- a/soh/src/overlays/actors/ovl_Bg_Spot11_Bakudankabe/z_bg_spot11_bakudankabe.c +++ b/soh/src/overlays/actors/ovl_Bg_Spot11_Bakudankabe/z_bg_spot11_bakudankabe.c @@ -9,7 +9,7 @@ #include "objects/object_spot11_obj/object_spot11_obj.h" #include "objects/gameplay_field_keep/gameplay_field_keep.h" -#define FLAGS (ACTOR_FLAG_UPDATE_WHILE_CULLED | ACTOR_FLAG_DRAW_WHILE_CULLED) +#define FLAGS (ACTOR_FLAG_UPDATE_CULLING_DISABLED | ACTOR_FLAG_DRAW_CULLING_DISABLED) void BgSpot11Bakudankabe_Init(Actor* thisx, PlayState* play); void BgSpot11Bakudankabe_Destroy(Actor* thisx, PlayState* play); diff --git a/soh/src/overlays/actors/ovl_Bg_Spot11_Oasis/z_bg_spot11_oasis.c b/soh/src/overlays/actors/ovl_Bg_Spot11_Oasis/z_bg_spot11_oasis.c index 65e70a4b6..0305fd652 100644 --- a/soh/src/overlays/actors/ovl_Bg_Spot11_Oasis/z_bg_spot11_oasis.c +++ b/soh/src/overlays/actors/ovl_Bg_Spot11_Oasis/z_bg_spot11_oasis.c @@ -8,7 +8,7 @@ #include "overlays/actors/ovl_En_Elf/z_en_elf.h" #include "objects/object_spot11_obj/object_spot11_obj.h" -#define FLAGS ACTOR_FLAG_UPDATE_WHILE_CULLED +#define FLAGS ACTOR_FLAG_UPDATE_CULLING_DISABLED void BgSpot11Oasis_Init(Actor* thisx, PlayState* play); void BgSpot11Oasis_Update(Actor* thisx, PlayState* play); diff --git a/soh/src/overlays/actors/ovl_Bg_Spot16_Bombstone/z_bg_spot16_bombstone.c b/soh/src/overlays/actors/ovl_Bg_Spot16_Bombstone/z_bg_spot16_bombstone.c index 5f24d06e8..503aa1d66 100644 --- a/soh/src/overlays/actors/ovl_Bg_Spot16_Bombstone/z_bg_spot16_bombstone.c +++ b/soh/src/overlays/actors/ovl_Bg_Spot16_Bombstone/z_bg_spot16_bombstone.c @@ -4,7 +4,7 @@ #include "overlays/actors/ovl_En_Bombf/z_en_bombf.h" #include "overlays/effects/ovl_Effect_Ss_Kakera/z_eff_ss_kakera.h" -#define FLAGS ACTOR_FLAG_UPDATE_WHILE_CULLED +#define FLAGS ACTOR_FLAG_UPDATE_CULLING_DISABLED void BgSpot16Bombstone_Init(Actor* thisx, PlayState* play); void BgSpot16Bombstone_Destroy(Actor* thisx, PlayState* play); diff --git a/soh/src/overlays/actors/ovl_Bg_Spot17_Funen/z_bg_spot17_funen.c b/soh/src/overlays/actors/ovl_Bg_Spot17_Funen/z_bg_spot17_funen.c index d919b300d..5c6e55c7c 100644 --- a/soh/src/overlays/actors/ovl_Bg_Spot17_Funen/z_bg_spot17_funen.c +++ b/soh/src/overlays/actors/ovl_Bg_Spot17_Funen/z_bg_spot17_funen.c @@ -7,7 +7,7 @@ #include "z_bg_spot17_funen.h" #include "objects/object_spot17_obj/object_spot17_obj.h" -#define FLAGS (ACTOR_FLAG_UPDATE_WHILE_CULLED | ACTOR_FLAG_DRAW_WHILE_CULLED) +#define FLAGS (ACTOR_FLAG_UPDATE_CULLING_DISABLED | ACTOR_FLAG_DRAW_CULLING_DISABLED) void BgSpot17Funen_Init(Actor* thisx, PlayState* play); void BgSpot17Funen_Destroy(Actor* thisx, PlayState* play); diff --git a/soh/src/overlays/actors/ovl_Bg_Spot18_Basket/z_bg_spot18_basket.c b/soh/src/overlays/actors/ovl_Bg_Spot18_Basket/z_bg_spot18_basket.c index 9e31efbdd..994c18d44 100644 --- a/soh/src/overlays/actors/ovl_Bg_Spot18_Basket/z_bg_spot18_basket.c +++ b/soh/src/overlays/actors/ovl_Bg_Spot18_Basket/z_bg_spot18_basket.c @@ -2,7 +2,7 @@ #include "objects/object_spot18_obj/object_spot18_obj.h" #include "vt.h" -#define FLAGS ACTOR_FLAG_UPDATE_WHILE_CULLED +#define FLAGS ACTOR_FLAG_UPDATE_CULLING_DISABLED void BgSpot18Basket_Init(Actor* thisx, PlayState* play); void BgSpot18Basket_Destroy(Actor* thisx, PlayState* play); diff --git a/soh/src/overlays/actors/ovl_Bg_Spot18_Shutter/z_bg_spot18_shutter.c b/soh/src/overlays/actors/ovl_Bg_Spot18_Shutter/z_bg_spot18_shutter.c index d2a9c9899..2ee80beee 100644 --- a/soh/src/overlays/actors/ovl_Bg_Spot18_Shutter/z_bg_spot18_shutter.c +++ b/soh/src/overlays/actors/ovl_Bg_Spot18_Shutter/z_bg_spot18_shutter.c @@ -7,7 +7,7 @@ #include "z_bg_spot18_shutter.h" #include "objects/object_spot18_obj/object_spot18_obj.h" -#define FLAGS (ACTOR_FLAG_UPDATE_WHILE_CULLED | ACTOR_FLAG_DRAW_WHILE_CULLED) +#define FLAGS (ACTOR_FLAG_UPDATE_CULLING_DISABLED | ACTOR_FLAG_DRAW_CULLING_DISABLED) void BgSpot18Shutter_Init(Actor* thisx, PlayState* play); void BgSpot18Shutter_Destroy(Actor* thisx, PlayState* play); diff --git a/soh/src/overlays/actors/ovl_Bg_Sst_Floor/z_bg_sst_floor.c b/soh/src/overlays/actors/ovl_Bg_Sst_Floor/z_bg_sst_floor.c index bf4d7c934..6a8ed3e0d 100644 --- a/soh/src/overlays/actors/ovl_Bg_Sst_Floor/z_bg_sst_floor.c +++ b/soh/src/overlays/actors/ovl_Bg_Sst_Floor/z_bg_sst_floor.c @@ -8,7 +8,7 @@ #include "objects/object_sst/object_sst.h" #include "soh/ResourceManagerHelpers.h" -#define FLAGS (ACTOR_FLAG_UPDATE_WHILE_CULLED | ACTOR_FLAG_DRAW_WHILE_CULLED) +#define FLAGS (ACTOR_FLAG_UPDATE_CULLING_DISABLED | ACTOR_FLAG_DRAW_CULLING_DISABLED) void BgSstFloor_Init(BgSstFloor* this, PlayState* play); void BgSstFloor_Destroy(BgSstFloor* this, PlayState* play); diff --git a/soh/src/overlays/actors/ovl_Bg_Toki_Hikari/z_bg_toki_hikari.c b/soh/src/overlays/actors/ovl_Bg_Toki_Hikari/z_bg_toki_hikari.c index 98904f138..f08d10fd5 100644 --- a/soh/src/overlays/actors/ovl_Bg_Toki_Hikari/z_bg_toki_hikari.c +++ b/soh/src/overlays/actors/ovl_Bg_Toki_Hikari/z_bg_toki_hikari.c @@ -7,7 +7,7 @@ #include "z_bg_toki_hikari.h" #include "objects/object_toki_objects/object_toki_objects.h" -#define FLAGS ACTOR_FLAG_DRAW_WHILE_CULLED +#define FLAGS ACTOR_FLAG_DRAW_CULLING_DISABLED void BgTokiHikari_Init(Actor* thisx, PlayState* play); void BgTokiHikari_Destroy(Actor* thisx, PlayState* play); diff --git a/soh/src/overlays/actors/ovl_Bg_Toki_Swd/z_bg_toki_swd.c b/soh/src/overlays/actors/ovl_Bg_Toki_Swd/z_bg_toki_swd.c index d8edfd736..b4158aced 100644 --- a/soh/src/overlays/actors/ovl_Bg_Toki_Swd/z_bg_toki_swd.c +++ b/soh/src/overlays/actors/ovl_Bg_Toki_Swd/z_bg_toki_swd.c @@ -9,7 +9,7 @@ #include "soh/OTRGlobals.h" #include "soh/Enhancements/game-interactor/GameInteractor_Hooks.h" -#define FLAGS ACTOR_FLAG_UPDATE_WHILE_CULLED +#define FLAGS ACTOR_FLAG_UPDATE_CULLING_DISABLED void BgTokiSwd_Init(Actor* thisx, PlayState* play); void BgTokiSwd_Destroy(Actor* thisx, PlayState* play); diff --git a/soh/src/overlays/actors/ovl_Bg_Treemouth/z_bg_treemouth.c b/soh/src/overlays/actors/ovl_Bg_Treemouth/z_bg_treemouth.c index 334161c2d..a86329cdc 100644 --- a/soh/src/overlays/actors/ovl_Bg_Treemouth/z_bg_treemouth.c +++ b/soh/src/overlays/actors/ovl_Bg_Treemouth/z_bg_treemouth.c @@ -10,7 +10,7 @@ #include "soh/OTRGlobals.h" #include "soh/Enhancements/game-interactor/GameInteractor_Hooks.h" -#define FLAGS (ACTOR_FLAG_UPDATE_WHILE_CULLED | ACTOR_FLAG_DRAW_WHILE_CULLED) +#define FLAGS (ACTOR_FLAG_UPDATE_CULLING_DISABLED | ACTOR_FLAG_DRAW_CULLING_DISABLED) void BgTreemouth_Init(Actor* thisx, PlayState* play); void BgTreemouth_Destroy(Actor* thisx, PlayState* play); @@ -145,9 +145,9 @@ void func_808BC8B8(BgTreemouth* this, PlayState* play) { if (!LINK_IS_ADULT) { if (Flags_GetEventChkInf(EVENTCHKINF_MET_DEKU_TREE)) { if (Actor_IsFacingAndNearPlayer(&this->dyna.actor, 1658.0f, 0x7530)) { - this->dyna.actor.flags |= ACTOR_FLAG_TARGETABLE; + this->dyna.actor.flags |= ACTOR_FLAG_ATTENTION_ENABLED; if (this->dyna.actor.isTargeted) { - this->dyna.actor.flags &= ~ACTOR_FLAG_TARGETABLE; + this->dyna.actor.flags &= ~ACTOR_FLAG_ATTENTION_ENABLED; play->csCtx.segment = D_808BD2A0; gSaveContext.cutsceneTrigger = 1; BgTreemouth_SetupAction(this, func_808BC9EC); diff --git a/soh/src/overlays/actors/ovl_Bg_Umajump/z_bg_umajump.c b/soh/src/overlays/actors/ovl_Bg_Umajump/z_bg_umajump.c index a19ef2338..a1fb12329 100644 --- a/soh/src/overlays/actors/ovl_Bg_Umajump/z_bg_umajump.c +++ b/soh/src/overlays/actors/ovl_Bg_Umajump/z_bg_umajump.c @@ -46,7 +46,7 @@ void BgUmaJump_Init(Actor* thisx, PlayState* play) { Actor_Kill(&this->dyna.actor); return; } - this->dyna.actor.flags |= ACTOR_FLAG_UPDATE_WHILE_CULLED | ACTOR_FLAG_DRAW_WHILE_CULLED; + this->dyna.actor.flags |= ACTOR_FLAG_UPDATE_CULLING_DISABLED | ACTOR_FLAG_DRAW_CULLING_DISABLED; } } diff --git a/soh/src/overlays/actors/ovl_Bg_Ydan_Hasi/z_bg_ydan_hasi.c b/soh/src/overlays/actors/ovl_Bg_Ydan_Hasi/z_bg_ydan_hasi.c index 16ea4e0e7..ddd05391b 100644 --- a/soh/src/overlays/actors/ovl_Bg_Ydan_Hasi/z_bg_ydan_hasi.c +++ b/soh/src/overlays/actors/ovl_Bg_Ydan_Hasi/z_bg_ydan_hasi.c @@ -7,7 +7,7 @@ #include "z_bg_ydan_hasi.h" #include "objects/object_ydan_objects/object_ydan_objects.h" -#define FLAGS (ACTOR_FLAG_UPDATE_WHILE_CULLED | ACTOR_FLAG_DRAW_WHILE_CULLED) +#define FLAGS (ACTOR_FLAG_UPDATE_CULLING_DISABLED | ACTOR_FLAG_DRAW_CULLING_DISABLED) void BgYdanHasi_Init(Actor* thisx, PlayState* play); void BgYdanHasi_Destroy(Actor* thisx, PlayState* play); diff --git a/soh/src/overlays/actors/ovl_Bg_Ydan_Sp/z_bg_ydan_sp.c b/soh/src/overlays/actors/ovl_Bg_Ydan_Sp/z_bg_ydan_sp.c index 1307971c7..18d659dce 100644 --- a/soh/src/overlays/actors/ovl_Bg_Ydan_Sp/z_bg_ydan_sp.c +++ b/soh/src/overlays/actors/ovl_Bg_Ydan_Sp/z_bg_ydan_sp.c @@ -298,7 +298,7 @@ void BgYdanSp_FloorWebIdle(BgYdanSp* this, PlayState* play) { if (this->dyna.actor.xzDistToPlayer < 80.0f) { this->unk_16C = 200.0f; this->dyna.actor.room = -1; - this->dyna.actor.flags |= ACTOR_FLAG_UPDATE_WHILE_CULLED; + this->dyna.actor.flags |= ACTOR_FLAG_UPDATE_CULLING_DISABLED; this->timer = 40; Audio_PlayActorSound2(&this->dyna.actor, NA_SE_EV_WEB_BROKEN); this->actionFunc = BgYdanSp_FloorWebBreaking; diff --git a/soh/src/overlays/actors/ovl_Bg_Zg/z_bg_zg.c b/soh/src/overlays/actors/ovl_Bg_Zg/z_bg_zg.c index b0e6779cc..0f6355ed4 100644 --- a/soh/src/overlays/actors/ovl_Bg_Zg/z_bg_zg.c +++ b/soh/src/overlays/actors/ovl_Bg_Zg/z_bg_zg.c @@ -8,7 +8,7 @@ #include "objects/object_zg/object_zg.h" #include "vt.h" -#define FLAGS ACTOR_FLAG_UPDATE_WHILE_CULLED +#define FLAGS ACTOR_FLAG_UPDATE_CULLING_DISABLED void BgZg_Init(Actor* thisx, PlayState* play); void BgZg_Destroy(Actor* thisx, PlayState* play); diff --git a/soh/src/overlays/actors/ovl_Boss_Dodongo/z_boss_dodongo.c b/soh/src/overlays/actors/ovl_Boss_Dodongo/z_boss_dodongo.c index 4702d8376..679f472b6 100644 --- a/soh/src/overlays/actors/ovl_Boss_Dodongo/z_boss_dodongo.c +++ b/soh/src/overlays/actors/ovl_Boss_Dodongo/z_boss_dodongo.c @@ -11,7 +11,7 @@ #include // malloc #include // memcpy -#define FLAGS (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_HOSTILE | ACTOR_FLAG_UPDATE_WHILE_CULLED | ACTOR_FLAG_DRAW_WHILE_CULLED) +#define FLAGS (ACTOR_FLAG_ATTENTION_ENABLED | ACTOR_FLAG_HOSTILE | ACTOR_FLAG_UPDATE_CULLING_DISABLED | ACTOR_FLAG_DRAW_CULLING_DISABLED) #define LAVA_TEX_WIDTH 32 #define LAVA_TEX_HEIGHT 64 @@ -347,7 +347,7 @@ void BossDodongo_Init(Actor* thisx, PlayState* play) { } } - this->actor.flags &= ~ACTOR_FLAG_TARGETABLE; + this->actor.flags &= ~ACTOR_FLAG_ATTENTION_ENABLED; // #region SOH [General] // Init mask values for all KD blended textures @@ -652,7 +652,7 @@ void BossDodongo_SetupWalk(BossDodongo* this) { this->unk_1AA = 0; this->actionFunc = BossDodongo_Walk; this->unk_1DA = 0; - this->actor.flags |= ACTOR_FLAG_TARGETABLE; + this->actor.flags |= ACTOR_FLAG_ATTENTION_ENABLED; this->unk_1E4 = 0.0f; } @@ -907,7 +907,7 @@ void BossDodongo_Roll(BossDodongo* this, PlayState* play) { f32 sp4C; f32 sp48; - this->actor.flags |= ACTOR_FLAG_PLAY_HIT_SFX; + this->actor.flags |= ACTOR_FLAG_SFX_FOR_PLAYER_BODY_HIT; SkelAnime_Update(&this->skelAnime); if (this->unk_1DA == 10) { @@ -1528,7 +1528,7 @@ void BossDodongo_SetupDeathCutscene(BossDodongo* this) { Audio_PlayActorSound2(&this->actor, NA_SE_EN_DODO_K_DEAD); this->unk_1DA = 0; this->csState = 0; - this->actor.flags &= ~(ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_HOSTILE); + this->actor.flags &= ~(ACTOR_FLAG_ATTENTION_ENABLED | ACTOR_FLAG_HOSTILE); this->unk_1BC = 1; Audio_QueueSeqCmd(0x1 << 28 | SEQ_PLAYER_BGM_MAIN << 24 | 0x100FF); } diff --git a/soh/src/overlays/actors/ovl_Boss_Fd/z_boss_fd.c b/soh/src/overlays/actors/ovl_Boss_Fd/z_boss_fd.c index c44810f0b..f350ac308 100644 --- a/soh/src/overlays/actors/ovl_Boss_Fd/z_boss_fd.c +++ b/soh/src/overlays/actors/ovl_Boss_Fd/z_boss_fd.c @@ -17,7 +17,7 @@ #include "soh/Enhancements/game-interactor/GameInteractor.h" #include "soh/Enhancements/game-interactor/GameInteractor_Hooks.h" -#define FLAGS (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_HOSTILE | ACTOR_FLAG_UPDATE_WHILE_CULLED | ACTOR_FLAG_DRAW_WHILE_CULLED) +#define FLAGS (ACTOR_FLAG_ATTENTION_ENABLED | ACTOR_FLAG_HOSTILE | ACTOR_FLAG_UPDATE_CULLING_DISABLED | ACTOR_FLAG_DRAW_CULLING_DISABLED) typedef enum { /* 0 */ INTRO_FLY_EMERGE, @@ -699,7 +699,7 @@ void BossFd_Fly(BossFd* this, PlayState* play) { } break; case BOSSFD_FLY_CHASE: - this->actor.flags |= ACTOR_FLAG_PLAY_HIT_SFX; + this->actor.flags |= ACTOR_FLAG_SFX_FOR_PLAYER_BODY_HIT; temp_y = Math_SinS(this->work[BFD_MOVE_TIMER] * 2396.0f) * 30.0f + this->fwork[BFD_TARGET_Y_OFFSET]; this->targetPosition.x = player->actor.world.pos.x; this->targetPosition.y = player->actor.world.pos.y + temp_y + 30.0f; @@ -1279,9 +1279,9 @@ void BossFd_Effects(BossFd* this, PlayState* play) { } if ((this->actor.world.pos.y < 90.0f) || (700.0f < this->actor.world.pos.y) || (this->actionFunc == BossFd_Wait)) { - this->actor.flags &= ~ACTOR_FLAG_TARGETABLE; + this->actor.flags &= ~ACTOR_FLAG_ATTENTION_ENABLED; } else { - this->actor.flags |= ACTOR_FLAG_TARGETABLE; + this->actor.flags |= ACTOR_FLAG_ATTENTION_ENABLED; } } diff --git a/soh/src/overlays/actors/ovl_Boss_Fd2/z_boss_fd2.c b/soh/src/overlays/actors/ovl_Boss_Fd2/z_boss_fd2.c index a30091ad3..ec25be184 100644 --- a/soh/src/overlays/actors/ovl_Boss_Fd2/z_boss_fd2.c +++ b/soh/src/overlays/actors/ovl_Boss_Fd2/z_boss_fd2.c @@ -12,7 +12,7 @@ #include "soh/frame_interpolation.h" #include "soh/Enhancements/game-interactor/GameInteractor_Hooks.h" -#define FLAGS (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_HOSTILE | ACTOR_FLAG_UPDATE_WHILE_CULLED | ACTOR_FLAG_DRAW_WHILE_CULLED) +#define FLAGS (ACTOR_FLAG_ATTENTION_ENABLED | ACTOR_FLAG_HOSTILE | ACTOR_FLAG_UPDATE_CULLING_DISABLED | ACTOR_FLAG_DRAW_CULLING_DISABLED) typedef enum { /* 0 */ DEATH_START, @@ -531,7 +531,7 @@ void BossFd2_Vulnerable(BossFd2* this, PlayState* play) { s16 i; this->disableAT = true; - this->actor.flags |= ACTOR_FLAG_DRAGGED_BY_HOOKSHOT; + this->actor.flags |= ACTOR_FLAG_HOOKSHOT_PULLS_PLAYER; SkelAnime_Update(&this->skelAnime); switch (this->work[FD2_ACTION_STATE]) { case 0: @@ -619,7 +619,7 @@ void BossFd2_SetupDeath(BossFd2* this, PlayState* play) { Animation_Change(&this->skelAnime, &gHoleVolvagiaDamagedAnim, 1.0f, 0.0f, this->fwork[FD2_END_FRAME], ANIMMODE_ONCE_INTERP, -3.0f); this->actionFunc = BossFd2_Death; - this->actor.flags &= ~ACTOR_FLAG_TARGETABLE; + this->actor.flags &= ~ACTOR_FLAG_ATTENTION_ENABLED; this->deathState = DEATH_START; } @@ -968,7 +968,7 @@ void BossFd2_Update(Actor* thisx, PlayState* play2) { osSyncPrintf("FD2 move start \n"); this->disableAT = false; - this->actor.flags &= ~ACTOR_FLAG_DRAGGED_BY_HOOKSHOT; + this->actor.flags &= ~ACTOR_FLAG_HOOKSHOT_PULLS_PLAYER; this->work[FD2_VAR_TIMER]++; this->work[FD2_UNK_TIMER]++; @@ -1003,9 +1003,9 @@ void BossFd2_Update(Actor* thisx, PlayState* play2) { this->fwork[FD2_TEX2_SCROLL_X] += 3.0f; this->fwork[FD2_TEX2_SCROLL_Y] -= 2.0f; if (this->actor.focus.pos.y < 90.0f) { - this->actor.flags &= ~ACTOR_FLAG_TARGETABLE; + this->actor.flags &= ~ACTOR_FLAG_ATTENTION_ENABLED; } else { - this->actor.flags |= ACTOR_FLAG_TARGETABLE; + this->actor.flags |= ACTOR_FLAG_ATTENTION_ENABLED; } } diff --git a/soh/src/overlays/actors/ovl_Boss_Ganon/z_boss_ganon.c b/soh/src/overlays/actors/ovl_Boss_Ganon/z_boss_ganon.c index a418ced3a..4c6e0f841 100644 --- a/soh/src/overlays/actors/ovl_Boss_Ganon/z_boss_ganon.c +++ b/soh/src/overlays/actors/ovl_Boss_Ganon/z_boss_ganon.c @@ -16,7 +16,7 @@ #include -#define FLAGS (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_HOSTILE | ACTOR_FLAG_UPDATE_WHILE_CULLED | ACTOR_FLAG_DRAW_WHILE_CULLED) +#define FLAGS (ACTOR_FLAG_ATTENTION_ENABLED | ACTOR_FLAG_HOSTILE | ACTOR_FLAG_UPDATE_CULLING_DISABLED | ACTOR_FLAG_DRAW_CULLING_DISABLED) void BossGanon_Init(Actor* thisx, PlayState* play); void BossGanon_Destroy(Actor* thisx, PlayState* play); @@ -383,7 +383,7 @@ void BossGanon_Init(Actor* thisx, PlayState* play2) { 0.0f, 0.0f, 0, 0, 0, 1); Actor_ChangeCategory(play, &play->actorCtx, thisx, ACTORCAT_BOSS); } else { - thisx->flags &= ~ACTOR_FLAG_TARGETABLE; + thisx->flags &= ~ACTOR_FLAG_ATTENTION_ENABLED; this->fwork[GDF_FWORK_1] = 255.0f; if (thisx->params >= 0xC8) { @@ -2582,7 +2582,7 @@ void BossGanon_Vulnerable(BossGanon* this, PlayState* play) { Vec3f sp40; if (this->timers[3] == 0) { - this->actor.flags |= ACTOR_FLAG_TARGETABLE; + this->actor.flags |= ACTOR_FLAG_ATTENTION_ENABLED; } SkelAnime_Update(&this->skelAnime); @@ -2631,7 +2631,7 @@ void BossGanon_Vulnerable(BossGanon* this, PlayState* play) { this->fwork[GDF_FWORK_1] = Animation_GetLastFrame(&gGanondorfLandAnim); Animation_MorphToPlayOnce(&this->skelAnime, &gGanondorfLandAnim, 0.0f); this->timers[0] = 70; - this->actor.flags |= ACTOR_FLAG_DRAGGED_BY_HOOKSHOT; + this->actor.flags |= ACTOR_FLAG_HOOKSHOT_PULLS_PLAYER; } break; @@ -2664,7 +2664,7 @@ void BossGanon_Vulnerable(BossGanon* this, PlayState* play) { this->unk_2E6 = 80; this->unk_2E8 = 0; - this->actor.flags &= ~ACTOR_FLAG_DRAGGED_BY_HOOKSHOT; + this->actor.flags &= ~ACTOR_FLAG_HOOKSHOT_PULLS_PLAYER; } break; @@ -2732,7 +2732,7 @@ void BossGanon_SetupDamaged(BossGanon* this, PlayState* play) { } void BossGanon_Damaged(BossGanon* this, PlayState* play) { - this->actor.flags |= ACTOR_FLAG_TARGETABLE; + this->actor.flags |= ACTOR_FLAG_ATTENTION_ENABLED; SkelAnime_Update(&this->skelAnime); @@ -2894,7 +2894,7 @@ void BossGanon_Update(Actor* thisx, PlayState* play2) { this->collider.base.colType = 3; sBossGanonCape->gravity = -3.0f; this->shockGlow = false; - this->actor.flags &= ~ACTOR_FLAG_TARGETABLE; + this->actor.flags &= ~ACTOR_FLAG_ATTENTION_ENABLED; this->unk_1A2++; this->unk_1A4++; diff --git a/soh/src/overlays/actors/ovl_Boss_Ganon2/z_boss_ganon2.c b/soh/src/overlays/actors/ovl_Boss_Ganon2/z_boss_ganon2.c index 5270402fe..611b008c6 100644 --- a/soh/src/overlays/actors/ovl_Boss_Ganon2/z_boss_ganon2.c +++ b/soh/src/overlays/actors/ovl_Boss_Ganon2/z_boss_ganon2.c @@ -13,7 +13,7 @@ #include -#define FLAGS (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_HOSTILE | ACTOR_FLAG_UPDATE_WHILE_CULLED | ACTOR_FLAG_DRAW_WHILE_CULLED) +#define FLAGS (ACTOR_FLAG_ATTENTION_ENABLED | ACTOR_FLAG_HOSTILE | ACTOR_FLAG_UPDATE_CULLING_DISABLED | ACTOR_FLAG_DRAW_CULLING_DISABLED) void BossGanon2_Init(Actor* thisx, PlayState* play); void BossGanon2_Destroy(Actor* thisx, PlayState* play); @@ -209,7 +209,7 @@ void func_808FD4D4(BossGanon2* this, PlayState* play, s16 arg2, s16 arg3) { void func_808FD5C4(BossGanon2* this, PlayState* play) { this->actionFunc = func_808FD5F4; - this->actor.flags &= ~ACTOR_FLAG_TARGETABLE; + this->actor.flags &= ~ACTOR_FLAG_ATTENTION_ENABLED; this->actor.world.pos.y = -3000.0f; } @@ -926,7 +926,7 @@ void func_808FD5F4(BossGanon2* this, PlayState* play) { this->unk_337 = 1; func_808FFDB0(this, play); this->unk_1A2[1] = 50; - this->actor.flags |= ACTOR_FLAG_TARGETABLE; + this->actor.flags |= ACTOR_FLAG_ATTENTION_ENABLED; sBossGanon2Zelda->unk_3C8 = 7; } break; @@ -1097,7 +1097,7 @@ void func_808FFDB0(BossGanon2* this, PlayState* play) { } this->unk_336 = 1; - this->actor.flags |= ACTOR_FLAG_TARGETABLE; + this->actor.flags |= ACTOR_FLAG_ATTENTION_ENABLED; this->unk_228 = 1.0f; this->unk_224 = 1.0f; } else { diff --git a/soh/src/overlays/actors/ovl_Boss_Ganondrof/z_boss_ganondrof.c b/soh/src/overlays/actors/ovl_Boss_Ganondrof/z_boss_ganondrof.c index 1ac0d2c90..cf34863c0 100644 --- a/soh/src/overlays/actors/ovl_Boss_Ganondrof/z_boss_ganondrof.c +++ b/soh/src/overlays/actors/ovl_Boss_Ganondrof/z_boss_ganondrof.c @@ -14,7 +14,7 @@ #include "soh/OTRGlobals.h" #include "soh/Enhancements/game-interactor/GameInteractor_Hooks.h" -#define FLAGS (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_HOSTILE | ACTOR_FLAG_UPDATE_WHILE_CULLED | ACTOR_FLAG_DRAW_WHILE_CULLED) +#define FLAGS (ACTOR_FLAG_ATTENTION_ENABLED | ACTOR_FLAG_HOSTILE | ACTOR_FLAG_UPDATE_CULLING_DISABLED | ACTOR_FLAG_DRAW_CULLING_DISABLED) typedef enum { /* 0 */ THROW_NORMAL, @@ -231,7 +231,7 @@ void BossGanondrof_Init(Actor* thisx, PlayState* play) { Collider_InitCylinder(play, &this->colliderSpear); Collider_SetCylinder(play, &this->colliderBody, &this->actor, &sCylinderInitBody); Collider_SetCylinder(play, &this->colliderSpear, &this->actor, &sCylinderInitSpear); - this->actor.flags &= ~ACTOR_FLAG_TARGETABLE; + this->actor.flags &= ~ACTOR_FLAG_ATTENTION_ENABLED; if (Flags_GetClear(play, play->roomCtx.curRoom.num)) { Actor_Kill(&this->actor); if (GameInteractor_Should(VB_SPAWN_BLUE_WARP, true, this)) { @@ -397,7 +397,7 @@ void BossGanondrof_Paintings(BossGanondrof* this, PlayState* play) { EnfHG* horseTemp; Animation_MorphToPlayOnce(&this->skelAnime, &gPhantomGanonRideSpearRaiseAnim, -2.0f); - this->actor.flags |= ACTOR_FLAG_TARGETABLE; + this->actor.flags |= ACTOR_FLAG_ATTENTION_ENABLED; horseTemp = (EnfHG*)this->actor.child; Actor_SpawnAsChild(&play->actorCtx, &this->actor, play, ACTOR_EN_FHG_FIRE, this->spearTip.x, this->spearTip.y, this->spearTip.z, 30, FHGFIRE_LIGHT_GREEN, 0, FHGFIRE_SPEAR_LIGHT); @@ -408,7 +408,7 @@ void BossGanondrof_Paintings(BossGanondrof* this, PlayState* play) { Animation_MorphToPlayOnce(&this->skelAnime, &gPhantomGanonRideSpearResetAnim, -2.0f); } else if (horse->bossGndSignal == FHG_RIDE) { Animation_MorphToLoop(&this->skelAnime, &gPhantomGanonRideAnim, -2.0f); - this->actor.flags &= ~ACTOR_FLAG_TARGETABLE; + this->actor.flags &= ~ACTOR_FLAG_ATTENTION_ENABLED; } osSyncPrintf("RUN 3\n"); @@ -435,7 +435,7 @@ void BossGanondrof_Paintings(BossGanondrof* this, PlayState* play) { void BossGanondrof_SetupNeutral(BossGanondrof* this, f32 arg1) { Animation_MorphToLoop(&this->skelAnime, &gPhantomGanonNeutralAnim, arg1); this->actionFunc = BossGanondrof_Neutral; - this->actor.flags |= ACTOR_FLAG_TARGETABLE; + this->actor.flags |= ACTOR_FLAG_ATTENTION_ENABLED; this->fwork[GND_FLOAT_SPEED] = 0.0f; this->timers[0] = (s16)(Rand_ZeroOne() * 64.0f) + 30; } @@ -707,7 +707,7 @@ void BossGanondrof_Stunned(BossGanondrof* this, PlayState* play) { Audio_PlayActorSound2(&this->actor, NA_SE_EN_FANTOM_DAMAGE2); } - this->actor.flags |= ACTOR_FLAG_DRAGGED_BY_HOOKSHOT; + this->actor.flags |= ACTOR_FLAG_HOOKSHOT_PULLS_PLAYER; } osSyncPrintf("TIME0 %d ********************************************\n", this->timers[0]); @@ -890,7 +890,7 @@ void BossGanondrof_SetupDeath(BossGanondrof* this, PlayState* play) { Audio_QueueSeqCmd(0x1 << 28 | SEQ_PLAYER_BGM_MAIN << 24 | 0x100FF); Audio_PlayActorSound2(&this->actor, NA_SE_EN_FANTOM_DEAD); this->deathState = DEATH_START; - this->actor.flags &= ~ACTOR_FLAG_TARGETABLE; + this->actor.flags &= ~ACTOR_FLAG_ATTENTION_ENABLED; this->work[GND_VARIANCE_TIMER] = 0; this->shockTimer = 50; } @@ -1263,7 +1263,7 @@ void BossGanondrof_Update(Actor* thisx, PlayState* play) { EnfHG* horse; osSyncPrintf("MOVE START %d\n", this->actor.params); - this->actor.flags &= ~ACTOR_FLAG_DRAGGED_BY_HOOKSHOT; + this->actor.flags &= ~ACTOR_FLAG_HOOKSHOT_PULLS_PLAYER; this->colliderBody.base.colType = COLTYPE_HIT3; if (this->killActor) { Actor_Kill(&this->actor); diff --git a/soh/src/overlays/actors/ovl_Boss_Goma/z_boss_goma.c b/soh/src/overlays/actors/ovl_Boss_Goma/z_boss_goma.c index fdc16fd1e..e4ce76cdc 100644 --- a/soh/src/overlays/actors/ovl_Boss_Goma/z_boss_goma.c +++ b/soh/src/overlays/actors/ovl_Boss_Goma/z_boss_goma.c @@ -8,7 +8,7 @@ #include "soh/Enhancements/game-interactor/GameInteractor.h" #include "soh/Enhancements/game-interactor/GameInteractor_Hooks.h" -#define FLAGS (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_HOSTILE | ACTOR_FLAG_UPDATE_WHILE_CULLED | ACTOR_FLAG_DRAW_WHILE_CULLED) +#define FLAGS (ACTOR_FLAG_ATTENTION_ENABLED | ACTOR_FLAG_HOSTILE | ACTOR_FLAG_UPDATE_CULLING_DISABLED | ACTOR_FLAG_DRAW_CULLING_DISABLED) // IRIS_FOLLOW: gohma looks towards the player (iris rotation) // BONUS_IFRAMES: gain invincibility frames when the player does something (throwing things?), or @@ -403,7 +403,7 @@ void BossGoma_SetupDefeated(BossGoma* this, PlayState* play) { this->noBackfaceCulling = false; this->framesUntilNextAction = 1200; this->actionState = 0; - this->actor.flags &= ~(ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_HOSTILE); + this->actor.flags &= ~(ACTOR_FLAG_ATTENTION_ENABLED | ACTOR_FLAG_HOSTILE); this->actor.speedXZ = 0.0f; this->actor.shape.shadowScale = 0.0f; Audio_QueueSeqCmd(0x1 << 28 | SEQ_PLAYER_BGM_MAIN << 24 | 0x100FF); @@ -632,7 +632,7 @@ void BossGoma_SetupEncounterState4(BossGoma* this, PlayState* play) { camera = Play_GetCamera(play, 0); player = GET_PLAYER(play); this->actionState = 4; - this->actor.flags |= ACTOR_FLAG_TARGETABLE; + this->actor.flags |= ACTOR_FLAG_ATTENTION_ENABLED; func_80064520(play, &play->csCtx); Player_SetCsActionWithHaltedActors(play, &this->actor, 1); this->subCameraId = Play_CreateSubCamera(play); @@ -722,7 +722,7 @@ void BossGoma_Encounter(BossGoma* this, PlayState* play) { this->framesUntilNextAction = 50; this->timer = 80; this->frameCount = 0; - this->actor.flags &= ~ACTOR_FLAG_TARGETABLE; + this->actor.flags &= ~ACTOR_FLAG_ATTENTION_ENABLED; // fall-through case 2: // zoom on player from room center // room entrance, towards center @@ -1306,7 +1306,7 @@ void BossGoma_FloorPrepareAttack(BossGoma* this, PlayState* play) { void BossGoma_FloorAttack(BossGoma* this, PlayState* play) { s16 i; - this->actor.flags |= ACTOR_FLAG_PLAY_HIT_SFX; + this->actor.flags |= ACTOR_FLAG_SFX_FOR_PLAYER_BODY_HIT; SkelAnime_Update(&this->skelanime); switch (this->actionState) { diff --git a/soh/src/overlays/actors/ovl_Boss_Mo/z_boss_mo.c b/soh/src/overlays/actors/ovl_Boss_Mo/z_boss_mo.c index c1d0f7bae..717922d60 100644 --- a/soh/src/overlays/actors/ovl_Boss_Mo/z_boss_mo.c +++ b/soh/src/overlays/actors/ovl_Boss_Mo/z_boss_mo.c @@ -17,7 +17,7 @@ #include -#define FLAGS (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_HOSTILE | ACTOR_FLAG_UPDATE_WHILE_CULLED | ACTOR_FLAG_DRAW_WHILE_CULLED) +#define FLAGS (ACTOR_FLAG_ATTENTION_ENABLED | ACTOR_FLAG_HOSTILE | ACTOR_FLAG_UPDATE_CULLING_DISABLED | ACTOR_FLAG_DRAW_CULLING_DISABLED) #define MO_WATER_LEVEL(play) play->colCtx.colHeader->waterBoxes[0].ySurface @@ -577,7 +577,7 @@ void BossMo_Tentacle(BossMo* this, PlayState* play) { } switch (this->work[MO_TENT_ACTION_STATE]) { case MO_TENT_WAIT: - this->actor.flags &= ~ACTOR_FLAG_TARGETABLE; + this->actor.flags &= ~ACTOR_FLAG_ATTENTION_ENABLED; if (this == sMorphaTent2) { this->work[MO_TENT_ACTION_STATE] = MO_TENT_SPAWN; this->timers[0] = 70; @@ -671,7 +671,7 @@ void BossMo_Tentacle(BossMo* this, PlayState* play) { } break; case MO_TENT_ATTACK: - this->actor.flags |= ACTOR_FLAG_PLAY_HIT_SFX; + this->actor.flags |= ACTOR_FLAG_SFX_FOR_PLAYER_BODY_HIT; Sfx_PlaySfxAtPos(&this->tentTipPos, NA_SE_EN_MOFER_ATTACK - SFX_FLAG); Math_ApproachF(&this->waterLevelMod, -5.0f, 0.1f, 0.4f); for (indS1 = 0; indS1 < 41; indS1++) { @@ -941,7 +941,7 @@ void BossMo_Tentacle(BossMo* this, PlayState* play) { Math_ApproachF(&this->tentMaxAngle, 0.5f, 1.0f, 0.01); Math_ApproachF(&this->tentSpeed, 320.0f, 1.0f, 50.0f); if (this->timers[0] == 0) { - this->actor.flags &= ~ACTOR_FLAG_TARGETABLE; + this->actor.flags &= ~ACTOR_FLAG_ATTENTION_ENABLED; Math_ApproachF(&this->baseAlpha, 0.0, 1.0f, 5.0f); for (indS1 = 0; indS1 < 40; indS1++) { if (sMorphaTent2 && sMorphaTent2->tentSpawnPos) {} @@ -986,7 +986,7 @@ void BossMo_Tentacle(BossMo* this, PlayState* play) { } break; case MO_TENT_DESPAWN: - this->actor.flags &= ~ACTOR_FLAG_TARGETABLE; + this->actor.flags &= ~ACTOR_FLAG_ATTENTION_ENABLED; Math_ApproachF(&this->baseAlpha, 0, 1.0f, 5.0f); if ((this->baseAlpha <= 0.5f) && (this->timers[0] == 0)) { this->meltIndex = 0; @@ -1013,7 +1013,7 @@ void BossMo_Tentacle(BossMo* this, PlayState* play) { case MO_TENT_DEATH_3: this->baseBubblesTimer = 20; Math_ApproachF(&sMorphaCore->waterLevel, -300.0f, 0.1f, 0.8f); - this->actor.flags &= ~ACTOR_FLAG_TARGETABLE; + this->actor.flags &= ~ACTOR_FLAG_ATTENTION_ENABLED; for (indS1 = 0; indS1 < 41; indS1++) { sin = Math_SinS(((s16)this->fwork[MO_TENT_SWING_LAG_X] * indS1) + this->xSwing); tempf1 = this->fwork[MO_TENT_SWING_SIZE_X] * (indS1 * 0.025f * sin); @@ -1380,8 +1380,8 @@ void BossMo_IntroCs(BossMo* this, PlayState* play) { this->cameraZoom = 60.0f; this->actor.world.pos = sMorphaTent1->actor.world.pos; this->work[MO_TENT_ACTION_STATE] = MO_CORE_INTRO_REVEAL; - this->actor.flags &= ~ACTOR_FLAG_TARGETABLE; - sMorphaTent1->actor.flags |= ACTOR_FLAG_TARGETABLE; + this->actor.flags &= ~ACTOR_FLAG_ATTENTION_ENABLED; + sMorphaTent1->actor.flags |= ACTOR_FLAG_ATTENTION_ENABLED; } else { sMorphaTent1->xSwing = 0xCEC; sMorphaTent1->fwork[MO_TENT_SWING_RATE_X] = 0.0f; @@ -1588,7 +1588,7 @@ void BossMo_DeathCs(BossMo* this, PlayState* play) { Rand_ZeroFloat(0.08f) + 0.13f); } this->drawActor = false; - this->actor.flags &= ~ACTOR_FLAG_TARGETABLE; + this->actor.flags &= ~ACTOR_FLAG_ATTENTION_ENABLED; Audio_PlayActorSound2(&this->actor, NA_SE_EN_MOFER_CORE_JUMP); SoundSource_PlaySfxAtFixedWorldPos(play, &this->actor.world.pos, 70, NA_SE_EN_MOFER_LASTVOICE); } @@ -1826,7 +1826,7 @@ void BossMo_CoreCollisionCheck(BossMo* this, PlayState* play) { sMorphaTent1->cutScale = 1.0f; sMorphaTent1->work[MO_TENT_ACTION_STATE] = MO_TENT_CUT; sMorphaTent1->timers[0] = 40; - sMorphaTent1->actor.flags &= ~ACTOR_FLAG_TARGETABLE; + sMorphaTent1->actor.flags &= ~ACTOR_FLAG_ATTENTION_ENABLED; if (player->actor.parent == &sMorphaTent1->actor) { player->av2.actionVar2 = 0x65; player->actor.parent = NULL; @@ -1900,7 +1900,7 @@ void BossMo_Core(BossMo* this, PlayState* play) { if ((this->csState != MO_BATTLE) && (this->csState < MO_DEATH_START)) { BossMo_IntroCs(this, play); if (this->work[MO_TENT_ACTION_STATE] == MO_CORE_INTRO_WAIT) { - this->actor.flags &= ~ACTOR_FLAG_TARGETABLE; + this->actor.flags &= ~ACTOR_FLAG_ATTENTION_ENABLED; return; } } else if (this->csState >= MO_DEATH_START) { @@ -1933,7 +1933,7 @@ void BossMo_Core(BossMo* this, PlayState* play) { } switch (this->work[MO_TENT_ACTION_STATE]) { case MO_CORE_MOVE: - this->actor.flags |= ACTOR_FLAG_TARGETABLE; + this->actor.flags |= ACTOR_FLAG_ATTENTION_ENABLED; if ((this->timers[0] == 0) && ((sMorphaTent1->work[MO_TENT_ACTION_STATE] == MO_TENT_WAIT) || (sMorphaTent1->work[MO_TENT_ACTION_STATE] == MO_TENT_READY)) && @@ -1972,7 +1972,7 @@ void BossMo_Core(BossMo* this, PlayState* play) { } break; case MO_CORE_STUNNED: - this->actor.flags |= ACTOR_FLAG_TARGETABLE; + this->actor.flags |= ACTOR_FLAG_ATTENTION_ENABLED; if (this->timers[0] == 0) { this->work[MO_TENT_ACTION_STATE] = MO_CORE_MOVE; this->timers[0] = 30; @@ -1989,7 +1989,7 @@ void BossMo_Core(BossMo* this, PlayState* play) { if (this->timers[0] == 0) { switch (this->work[MO_TENT_ACTION_STATE]) { case MO_CORE_ATTACK: - this->actor.flags |= ACTOR_FLAG_TARGETABLE; + this->actor.flags |= ACTOR_FLAG_ATTENTION_ENABLED; this->work[MO_CORE_POS_IN_TENT]++; if (sMorphaTent1->work[MO_TENT_ACTION_STATE] == MO_TENT_ATTACK) { temp = (s16)(Math_SinS(this->work[MO_TENT_MOVE_TIMER] * 0x300) * 10.0f) + 15; @@ -2014,7 +2014,7 @@ void BossMo_Core(BossMo* this, PlayState* play) { this->timers[0] = 0; break; case MO_CORE_INTRO_REVEAL: - this->actor.flags &= ~ACTOR_FLAG_TARGETABLE; + this->actor.flags &= ~ACTOR_FLAG_ATTENTION_ENABLED; this->work[MO_CORE_POS_IN_TENT]++; temp = (s16)(Math_SinS(this->work[MO_TENT_MOVE_TIMER] * 0x500) * 10.0f) + 15; if (this->work[MO_CORE_POS_IN_TENT] >= temp) { @@ -2242,7 +2242,7 @@ void BossMo_UpdateCore(Actor* thisx, PlayState* play) { } else { MO_WATER_LEVEL(play) = sMorphaTent2->waterLevelMod + ((s16)this->waterLevel + sMorphaTent1->waterLevelMod); } - this->actor.flags |= ACTOR_FLAG_HOOKSHOT_DRAGS; + this->actor.flags |= ACTOR_FLAG_HOOKSHOT_PULLS_ACTOR; this->actor.focus.pos = this->actor.world.pos; this->work[MO_TENT_VAR_TIMER]++; @@ -2271,7 +2271,7 @@ void BossMo_UpdateCore(Actor* thisx, PlayState* play) { } BossMo_UpdateEffects(this, play); if (player->actor.parent != NULL) { - this->actor.flags &= ~ACTOR_FLAG_TARGETABLE; + this->actor.flags &= ~ACTOR_FLAG_ATTENTION_ENABLED; } BossMo_Unknown(); } diff --git a/soh/src/overlays/actors/ovl_Boss_Sst/z_boss_sst.c b/soh/src/overlays/actors/ovl_Boss_Sst/z_boss_sst.c index edd5c032f..3e3aadfcf 100644 --- a/soh/src/overlays/actors/ovl_Boss_Sst/z_boss_sst.c +++ b/soh/src/overlays/actors/ovl_Boss_Sst/z_boss_sst.c @@ -15,7 +15,7 @@ #include "soh/Enhancements/game-interactor/GameInteractor.h" #include "soh/Enhancements/game-interactor/GameInteractor_Hooks.h" -#define FLAGS (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_HOSTILE | ACTOR_FLAG_UPDATE_WHILE_CULLED | ACTOR_FLAG_DRAW_WHILE_CULLED | ACTOR_FLAG_DRAGGED_BY_HOOKSHOT) +#define FLAGS (ACTOR_FLAG_ATTENTION_ENABLED | ACTOR_FLAG_HOSTILE | ACTOR_FLAG_UPDATE_CULLING_DISABLED | ACTOR_FLAG_DRAW_CULLING_DISABLED | ACTOR_FLAG_HOOKSHOT_PULLS_PLAYER) #define vParity actionVar #define vVanish actionVar @@ -316,7 +316,7 @@ void BossSst_Init(Actor* thisx, PlayState* play2) { sHands[LEFT]->actor.child = &sHands[RIGHT]->actor; sHands[RIGHT]->actor.child = &sHands[LEFT]->actor; - this->actor.flags &= ~ACTOR_FLAG_TARGETABLE; + this->actor.flags &= ~ACTOR_FLAG_ATTENTION_ENABLED; this->actor.update = BossSst_UpdateHead; this->actor.draw = BossSst_DrawHead; this->radius = -650.0f; @@ -341,7 +341,7 @@ void BossSst_Init(Actor* thisx, PlayState* play2) { ActorShape_Init(&this->actor.shape, 0.0f, ActorShadow_DrawCircle, 95.0f); this->handZPosMod = -3500; this->actor.targetArrowOffset = 5000.0f; - this->actor.flags &= ~ACTOR_FLAG_TARGETABLE; + this->actor.flags &= ~ACTOR_FLAG_ATTENTION_ENABLED; BossSst_HandSetupWait(this); } } @@ -425,8 +425,8 @@ void BossSst_HeadIntro(BossSst* this, PlayState* play) { } if (this->timer == 0) { - sHands[RIGHT]->actor.flags |= ACTOR_FLAG_TARGETABLE; - sHands[LEFT]->actor.flags |= ACTOR_FLAG_TARGETABLE; + sHands[RIGHT]->actor.flags |= ACTOR_FLAG_ATTENTION_ENABLED; + sHands[LEFT]->actor.flags |= ACTOR_FLAG_ATTENTION_ENABLED; player->stateFlags1 &= ~PLAYER_STATE1_INPUT_DISABLED; func_80064534(play, &play->csCtx); Player_SetCsActionWithHaltedActors(play, &this->actor, 7); @@ -600,7 +600,7 @@ void BossSst_HeadIntro(BossSst* this, PlayState* play) { sCameraEye.y += 400.0f * 0.01f; sCameraEye.z += 1550.0f * 0.01f; this->vVanish = true; - this->actor.flags |= ACTOR_FLAG_LENS; + this->actor.flags |= ACTOR_FLAG_REACT_TO_LENS; } else if (revealStateTimer < 40) { sCameraAt.x += 125.0f * 0.01f; sCameraAt.y += 350.0f * 0.01f; @@ -836,7 +836,7 @@ void BossSst_HeadSetupStunned(BossSst* this) { this->colliderJntSph.base.atFlags &= ~(AT_ON | AT_HIT); this->colliderCyl.base.acFlags &= ~AC_ON; this->vVanish = false; - this->actor.flags &= ~ACTOR_FLAG_LENS; + this->actor.flags &= ~ACTOR_FLAG_REACT_TO_LENS; BossSst_HeadSfx(this, NA_SE_EN_SHADEST_FREEZE); this->actionFunc = BossSst_HeadStunned; } @@ -1412,7 +1412,7 @@ void BossSst_HandSetupRetreat(BossSst* this) { Animation_MorphToPlayOnce(&this->skelAnime, sHandHangPoses[this->actor.params], 10.0f); this->colliderJntSph.base.atFlags &= ~(AT_ON | AT_HIT); this->colliderJntSph.base.acFlags |= AC_ON; - this->actor.flags |= ACTOR_FLAG_TARGETABLE; + this->actor.flags |= ACTOR_FLAG_ATTENTION_ENABLED; BossSst_HandSetInvulnerable(this, false); this->timer = 0; this->actionFunc = BossSst_HandRetreat; @@ -2065,7 +2065,7 @@ void BossSst_HandShake(BossSst* this, PlayState* play) { this->timer = 80; } } else if (this->timer == 0) { - this->actor.flags |= ACTOR_FLAG_TARGETABLE; + this->actor.flags |= ACTOR_FLAG_ATTENTION_ENABLED; BossSst_HandSetupSlam(this); } } @@ -2545,7 +2545,7 @@ void BossSst_HandCollisionCheck(BossSst* this, PlayState* play) { BossSst_HandSetupRetreat(OTHER_HAND(this)); } - this->actor.flags &= ~ACTOR_FLAG_TARGETABLE; + this->actor.flags &= ~ACTOR_FLAG_ATTENTION_ENABLED; if (this->actor.colChkInfo.damageEffect == 3) { BossSst_HandSetupFrozen(this); } else { @@ -2662,9 +2662,9 @@ void BossSst_UpdateHead(Actor* thisx, PlayState* play) { this->actionFunc(this, play); if (this->vVanish) { if (!play->actorCtx.lensActive || (thisx->colorFilterTimer != 0)) { - this->actor.flags &= ~ACTOR_FLAG_LENS; + this->actor.flags &= ~ACTOR_FLAG_REACT_TO_LENS; } else { - this->actor.flags |= ACTOR_FLAG_LENS; + this->actor.flags |= ACTOR_FLAG_REACT_TO_LENS; } } @@ -2684,13 +2684,13 @@ void BossSst_UpdateHead(Actor* thisx, PlayState* play) { } BossSst_MoveAround(this); - if ((!this->vVanish || CHECK_FLAG_ALL(this->actor.flags, ACTOR_FLAG_LENS)) && + if ((!this->vVanish || CHECK_FLAG_ALL(this->actor.flags, ACTOR_FLAG_REACT_TO_LENS)) && ((this->actionFunc == BossSst_HeadReadyCharge) || (this->actionFunc == BossSst_HeadCharge) || (this->actionFunc == BossSst_HeadFrozenHand) || (this->actionFunc == BossSst_HeadStunned) || (this->actionFunc == BossSst_HeadVulnerable) || (this->actionFunc == BossSst_HeadDamage))) { - this->actor.flags |= ACTOR_FLAG_TARGETABLE; + this->actor.flags |= ACTOR_FLAG_ATTENTION_ENABLED; } else { - this->actor.flags &= ~ACTOR_FLAG_TARGETABLE; + this->actor.flags &= ~ACTOR_FLAG_ATTENTION_ENABLED; } if (this->actionFunc == BossSst_HeadCharge) { @@ -2797,7 +2797,7 @@ s32 BossSst_OverrideHeadDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3f* s32 timer12; f32 shakeMod; - if (!CHECK_FLAG_ALL(this->actor.flags, ACTOR_FLAG_LENS) && this->vVanish) { + if (!CHECK_FLAG_ALL(this->actor.flags, ACTOR_FLAG_REACT_TO_LENS) && this->vVanish) { *dList = NULL; } else if (this->actionFunc == BossSst_HeadThrash) { // Animation modifications for death cutscene shakeAmp = (this->timer / 10) + 1; @@ -2888,7 +2888,7 @@ void BossSst_DrawHead(Actor* thisx, PlayState* play) { OPEN_DISPS(play->state.gfxCtx); - if (!CHECK_FLAG_ALL(this->actor.flags, ACTOR_FLAG_LENS)) { + if (!CHECK_FLAG_ALL(this->actor.flags, ACTOR_FLAG_REACT_TO_LENS)) { Gfx_SetupDL_25Opa(play->state.gfxCtx); gDPSetPrimColor(POLY_OPA_DISP++, 0x00, 0x80, sBodyColor.r, sBodyColor.g, sBodyColor.b, 255); if (!sBodyStatic) { @@ -2915,7 +2915,7 @@ void BossSst_DrawHead(Actor* thisx, PlayState* play) { Matrix_RotateY(-randYaw, MTXMODE_APPLY); } - if (!CHECK_FLAG_ALL(this->actor.flags, ACTOR_FLAG_LENS)) { + if (!CHECK_FLAG_ALL(this->actor.flags, ACTOR_FLAG_REACT_TO_LENS)) { POLY_OPA_DISP = SkelAnime_DrawFlex(play, this->skelAnime.skeleton, this->skelAnime.jointTable, this->skelAnime.dListCount, BossSst_OverrideHeadDraw, BossSst_PostHeadDraw, this, POLY_OPA_DISP); diff --git a/soh/src/overlays/actors/ovl_Boss_Tw/z_boss_tw.c b/soh/src/overlays/actors/ovl_Boss_Tw/z_boss_tw.c index a0df96d42..a70d972ae 100644 --- a/soh/src/overlays/actors/ovl_Boss_Tw/z_boss_tw.c +++ b/soh/src/overlays/actors/ovl_Boss_Tw/z_boss_tw.c @@ -9,7 +9,7 @@ #include -#define FLAGS (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_HOSTILE | ACTOR_FLAG_UPDATE_WHILE_CULLED | ACTOR_FLAG_DRAW_WHILE_CULLED) +#define FLAGS (ACTOR_FLAG_ATTENTION_ENABLED | ACTOR_FLAG_HOSTILE | ACTOR_FLAG_UPDATE_CULLING_DISABLED | ACTOR_FLAG_DRAW_CULLING_DISABLED) typedef enum { /* 0x00 */ TW_KOTAKE, @@ -423,7 +423,7 @@ void BossTw_Init(Actor* thisx, PlayState* play2) { Actor_SetScale(&this->actor, 0.01f); this->actor.update = BossTw_BlastUpdate; this->actor.draw = BossTw_BlastDraw; - this->actor.flags &= ~ACTOR_FLAG_TARGETABLE; + this->actor.flags &= ~ACTOR_FLAG_ATTENTION_ENABLED; Collider_InitCylinder(play, &this->collider); Collider_SetCylinder(play, &this->collider, &this->actor, &sCylinderInitBlasts); @@ -618,7 +618,7 @@ void BossTw_SetupFlyTo(BossTw* this, PlayState* play) { BossTw* otherTw = (BossTw*)this->actor.parent; this->unk_5F8 = 1; - this->actor.flags |= ACTOR_FLAG_TARGETABLE; + this->actor.flags |= ACTOR_FLAG_ATTENTION_ENABLED; this->actionFunc = BossTw_FlyTo; this->rotateSpeed = 0.0f; Animation_MorphToLoop(&this->skelAnime, &gTwinrovaKotakeKoumeFlyAnim, -10.0f); @@ -1442,7 +1442,7 @@ void BossTw_SetupWait(BossTw* this, PlayState* play) { this->actionFunc = BossTw_Wait; this->visible = false; this->actor.world.pos.y = -2000.0f; - this->actor.flags &= ~ACTOR_FLAG_TARGETABLE; + this->actor.flags &= ~ACTOR_FLAG_ATTENTION_ENABLED; } void BossTw_Wait(BossTw* this, PlayState* play) { @@ -1604,7 +1604,7 @@ void BossTw_TwinrovaMergeCS(BossTw* this, PlayState* play) { this->csState1 = 1; this->visible = true; - this->actor.flags |= ACTOR_FLAG_TARGETABLE; + this->actor.flags |= ACTOR_FLAG_ATTENTION_ENABLED; this->actor.shape.rot.y = 0; BossTw_SetupWait(sKotakePtr, play); BossTw_SetupWait(sKoumePtr, play); @@ -1725,7 +1725,7 @@ void BossTw_SetupCSWait(BossTw* this, PlayState* play) { this->actionFunc = BossTw_CSWait; this->visible = false; this->actor.world.pos.y = -2000.0f; - this->actor.flags &= ~ACTOR_FLAG_TARGETABLE; + this->actor.flags &= ~ACTOR_FLAG_ATTENTION_ENABLED; } /** @@ -1738,7 +1738,7 @@ void BossTw_TwinrovaSetupIntroCS(BossTw* this, PlayState* play) { this->actionFunc = BossTw_TwinrovaIntroCS; this->visible = false; this->actor.world.pos.y = -2000.0f; - this->actor.flags &= ~ACTOR_FLAG_TARGETABLE; + this->actor.flags &= ~ACTOR_FLAG_ATTENTION_ENABLED; } void BossTw_TwinrovaIntroCS(BossTw* this, PlayState* play) { @@ -2344,7 +2344,7 @@ void BossTw_TwinrovaSetupDeathCS(BossTw* this, PlayState* play) { this->actionFunc = BossTw_TwinrovaDeathCS; Animation_MorphToLoop(&this->skelAnime, &gTwinrovaDamageAnim, -3.0f); this->actor.world.rot.y = this->actor.shape.rot.y; - this->actor.flags &= ~ACTOR_FLAG_TARGETABLE; + this->actor.flags &= ~ACTOR_FLAG_ATTENTION_ENABLED; this->csState2 = this->csState1 = 0; this->work[CS_TIMER_1] = this->work[CS_TIMER_2] = 0; this->work[INVINC_TIMER] = 10000; @@ -2659,7 +2659,7 @@ void BossTw_TwinrovaDeathCS(BossTw* this, PlayState* play) { Actor_SpawnAsChild(&play->actorCtx, &this->actor, play, ACTOR_BOSS_TW, this->actor.world.pos.x, this->actor.world.pos.y, this->actor.world.pos.z, 0, 0, 0, TW_DEATHBALL_KOTAKE); - this->actor.flags &= ~ACTOR_FLAG_TARGETABLE; + this->actor.flags &= ~ACTOR_FLAG_ATTENTION_ENABLED; } } Actor_SetScale(&this->actor, this->actor.scale.x); @@ -2712,7 +2712,7 @@ void BossTw_TwinrovaDeathCS(BossTw* this, PlayState* play) { sKoumePtr->work[YAW_TGT] = sKotakePtr->work[YAW_TGT] = sKoumePtr->actor.shape.rot.x = sKotakePtr->actor.shape.rot.x = sKoumePtr->actor.shape.rot.y = sKotakePtr->actor.shape.rot.y = 0; Player_SetCsActionWithHaltedActors(play, &sKoumePtr->actor, 1); - sKoumePtr->actor.flags |= ACTOR_FLAG_TARGETABLE; + sKoumePtr->actor.flags |= ACTOR_FLAG_ATTENTION_ENABLED; } break; case 2: @@ -2962,7 +2962,7 @@ void BossTw_TwinrovaUpdate(Actor* thisx, PlayState* play2) { BossTw* this = (BossTw*)thisx; Player* player = GET_PLAYER(play); - this->actor.flags &= ~ACTOR_FLAG_DRAGGED_BY_HOOKSHOT; + this->actor.flags &= ~ACTOR_FLAG_HOOKSHOT_PULLS_PLAYER; this->unk_5F8 = 0; this->collider.base.colType = COLTYPE_HIT3; @@ -5311,7 +5311,7 @@ void BossTw_TwinrovaStun(BossTw* this, PlayState* play) { s16 cloudType; this->unk_5F8 = 1; - this->actor.flags |= ACTOR_FLAG_DRAGGED_BY_HOOKSHOT; + this->actor.flags |= ACTOR_FLAG_HOOKSHOT_PULLS_PLAYER; cloudType = sTwinrovaBlastType == 0 ? 3 : 2; diff --git a/soh/src/overlays/actors/ovl_Boss_Va/z_boss_va.c b/soh/src/overlays/actors/ovl_Boss_Va/z_boss_va.c index 18bc927d5..045ee412c 100644 --- a/soh/src/overlays/actors/ovl_Boss_Va/z_boss_va.c +++ b/soh/src/overlays/actors/ovl_Boss_Va/z_boss_va.c @@ -19,7 +19,7 @@ #include "soh/Enhancements/game-interactor/GameInteractor.h" #include "soh/Enhancements/game-interactor/GameInteractor_Hooks.h" -#define FLAGS (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_HOSTILE | ACTOR_FLAG_UPDATE_WHILE_CULLED | ACTOR_FLAG_DRAW_WHILE_CULLED) +#define FLAGS (ACTOR_FLAG_ATTENTION_ENABLED | ACTOR_FLAG_HOSTILE | ACTOR_FLAG_UPDATE_CULLING_DISABLED | ACTOR_FLAG_DRAW_CULLING_DISABLED) #define GET_BODY(this) ((BossVa*)(this)->actor.parent) #define vaGorePulse offset.x @@ -602,7 +602,7 @@ void BossVa_Init(Actor* thisx, PlayState* play2) { //sFightPhase = 0; //sBodyState = 1; SkelAnime_Init(play, &this->skelAnime, &gBarinadeBodySkel, &gBarinadeBodyAnim, NULL, NULL, 0); - this->actor.flags |= ACTOR_FLAG_PLAY_HIT_SFX; + this->actor.flags |= ACTOR_FLAG_SFX_FOR_PLAYER_BODY_HIT; break; case BOSSVA_SUPPORT_1: case BOSSVA_SUPPORT_2: @@ -622,7 +622,7 @@ void BossVa_Init(Actor* thisx, PlayState* play2) { SkelAnime_InitFlex(play, &this->skelAnime, &gBarinadeStumpSkel, &gBarinadeStumpAnim, NULL, NULL, 0); break; default: - this->actor.flags |= ACTOR_FLAG_PLAY_HIT_SFX; + this->actor.flags |= ACTOR_FLAG_SFX_FOR_PLAYER_BODY_HIT; SkelAnime_Init(play, &this->skelAnime, &gBarinadeBariSkel, &gBarinadeBariAnim, NULL, NULL, 0); this->actor.shape.yOffset = 400.0f; break; @@ -781,7 +781,7 @@ void BossVa_SetupIntro(BossVa* this) { Animation_Change(&this->skelAnime, &gBarinadeBodyAnim, 1.0f, lastFrame, lastFrame, ANIMMODE_ONCE, 0.0f); this->actor.shape.yOffset = -450.0f; - this->actor.flags &= ~ACTOR_FLAG_TARGETABLE; + this->actor.flags &= ~ACTOR_FLAG_ATTENTION_ENABLED; BossVa_SetupAction(this, BossVa_BodyIntro); } @@ -1073,7 +1073,7 @@ void BossVa_SetupBodyPhase1(BossVa* this) { Animation_Change(&this->skelAnime, &gBarinadeBodyAnim, 1.0f, lastFrame, lastFrame, ANIMMODE_ONCE, 0.0f); this->actor.shape.yOffset = -450.0f; - this->actor.flags &= ~ACTOR_FLAG_TARGETABLE; + this->actor.flags &= ~ACTOR_FLAG_ATTENTION_ENABLED; this->timer = 25; sBodyState = 0x80; BossVa_SetupAction(this, BossVa_BodyPhase1); @@ -1140,7 +1140,7 @@ void BossVa_SetupBodyPhase2(BossVa* this, PlayState* play) { } this->invincibilityTimer = 0; - this->actor.flags |= ACTOR_FLAG_TARGETABLE; + this->actor.flags |= ACTOR_FLAG_ATTENTION_ENABLED; BossVa_SetupAction(this, BossVa_BodyPhase2); } @@ -1206,10 +1206,10 @@ void BossVa_BodyPhase2(BossVa* this, PlayState* play) { Math_SmoothStepToS(&this->actor.shape.rot.z, this->actor.world.rot.z, 1, 0xC8, 0); Math_SmoothStepToF(&this->actor.shape.yOffset, -1000.0f, 1.0f, 20.0f, 0.0f); if (!(sPhase2Timer & 0x100)) { - this->actor.flags |= ACTOR_FLAG_TARGETABLE; + this->actor.flags |= ACTOR_FLAG_ATTENTION_ENABLED; this->actor.speedXZ = 1.0f; } else { - this->actor.flags &= ~ACTOR_FLAG_TARGETABLE; + this->actor.flags &= ~ACTOR_FLAG_ATTENTION_ENABLED; this->actor.speedXZ = 0.0f; } @@ -1272,7 +1272,7 @@ void BossVa_BodyPhase3(BossVa* this, PlayState* play) { Audio_PlayActorSound2(&this->actor, NA_SE_EN_BALINADE_FAINT); sBodyState = 1; this->timer = 131; - this->actor.flags &= ~ACTOR_FLAG_TARGETABLE; + this->actor.flags &= ~ACTOR_FLAG_ATTENTION_ENABLED; } else { sBodyState = 0; if (this->timer == 0) { @@ -1282,7 +1282,7 @@ void BossVa_BodyPhase3(BossVa* this, PlayState* play) { } Math_SmoothStepToF(&this->actor.speedXZ, 3.0f, 1.0f, 0.15f, 0.0f); } - this->actor.flags |= ACTOR_FLAG_TARGETABLE; + this->actor.flags |= ACTOR_FLAG_ATTENTION_ENABLED; } else { this->timer--; if (this->timer < 35) { @@ -1357,7 +1357,7 @@ void BossVa_BodyPhase3(BossVa* this, PlayState* play) { void BossVa_SetupBodyPhase4(BossVa* this, PlayState* play) { this->unk_1AC = 0; - this->actor.flags |= ACTOR_FLAG_TARGETABLE; + this->actor.flags |= ACTOR_FLAG_ATTENTION_ENABLED; this->vaBodySpinRate = this->unk_1AC; this->actor.world.rot.y = this->actor.yawTowardsPlayer; this->timer2 = (s16)(Rand_ZeroOne() * 150.0f) + 300; @@ -1537,7 +1537,7 @@ void BossVa_BodyPhase4(BossVa* this, PlayState* play) { void BossVa_SetupBodyDeath(BossVa* this, PlayState* play) { func_800F436C(&this->actor.projectedPos, NA_SE_EN_BALINADE_LEVEL - SFX_FLAG, 1.0f); - this->actor.flags &= ~(ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_HOSTILE); + this->actor.flags &= ~(ACTOR_FLAG_ATTENTION_ENABLED | ACTOR_FLAG_HOSTILE); Audio_QueueSeqCmd(0x1 << 28 | SEQ_PLAYER_BGM_MAIN << 24 | 0x100FF); this->vaCamRotMod = 0xC31; sCsState = DEATH_START; @@ -1831,7 +1831,7 @@ void BossVa_SupportCut(BossVa* this, PlayState* play) { lastFrame = Animation_GetLastFrame(&gBarinadeSupportDetachedAnim); Animation_Change(&this->skelAnime, &gBarinadeSupportDetachedAnim, 1.0f, 0.0f, lastFrame, ANIMMODE_LOOP_INTERP, 0.0f); - this->actor.flags &= ~ACTOR_FLAG_TARGETABLE; + this->actor.flags &= ~ACTOR_FLAG_ATTENTION_ENABLED; } if ((this->timer == 0) && (sCsState < DEATH_START)) { @@ -1885,7 +1885,7 @@ void BossVa_SupportCut(BossVa* this, PlayState* play) { void BossVa_SetupStump(BossVa* this, PlayState* play) { Animation_Change(&this->skelAnime, &gBarinadeStumpAnim, 1.0f, 0.0f, Animation_GetLastFrame(&gBarinadeStumpAnim), ANIMMODE_ONCE, 0.0f); - this->actor.flags &= ~ACTOR_FLAG_TARGETABLE; + this->actor.flags &= ~ACTOR_FLAG_ATTENTION_ENABLED; BossVa_SetupAction(this, BossVa_Stump); } @@ -1904,7 +1904,7 @@ void BossVa_SetupZapperIntro(BossVa* this, PlayState* play) { Animation_Change(&this->skelAnime, &gBarinadeZapperIdleAnim, 1.0f, lastFrame - 1.0f, lastFrame, ANIMMODE_LOOP_INTERP, -6.0f); - this->actor.flags &= ~ACTOR_FLAG_TARGETABLE; + this->actor.flags &= ~ACTOR_FLAG_ATTENTION_ENABLED; BossVa_SetupAction(this, BossVa_ZapperIntro); } @@ -1931,7 +1931,7 @@ void BossVa_SetupZapperAttack(BossVa* this, PlayState* play) { Animation_Change(&this->skelAnime, &gBarinadeZapperIdleAnim, 1.0f, lastFrame - 1.0f, lastFrame, ANIMMODE_LOOP_INTERP, -6.0f); - this->actor.flags &= ~ACTOR_FLAG_TARGETABLE; + this->actor.flags &= ~ACTOR_FLAG_ATTENTION_ENABLED; BossVa_SetupAction(this, BossVa_ZapperAttack); } @@ -2428,7 +2428,7 @@ void BossVa_SetupBariIntro(BossVa* this, PlayState* play) { this->actor.world.pos.y = sInitPosOffsets[this->actor.params + 10].y + this->actor.home.pos.y; this->actor.world.pos.z = sInitPosOffsets[this->actor.params + 10].z + this->actor.home.pos.z; this->timer = 45; - this->actor.flags &= ~ACTOR_FLAG_TARGETABLE; + this->actor.flags &= ~ACTOR_FLAG_ATTENTION_ENABLED; BossVa_SetupAction(this, BossVa_BariIntro); } @@ -2549,7 +2549,7 @@ void BossVa_SetupBariPhase3Attack(BossVa* this, PlayState* play) { this->unk_1F0 = 0x78; this->unk_1A0 = 60.0f; this->unk_1A8 = 0.0f; - this->actor.flags &= ~ACTOR_FLAG_TARGETABLE; + this->actor.flags &= ~ACTOR_FLAG_ATTENTION_ENABLED; BossVa_SetupAction(this, BossVa_BariPhase3Attack); } @@ -2636,7 +2636,7 @@ void BossVa_SetupBariPhase2Attack(BossVa* this, PlayState* play) { this->unk_1F0 = 0x78; this->unk_1A0 = 60.0f; this->unk_1A8 = 0.0f; - this->actor.flags &= ~ACTOR_FLAG_TARGETABLE; + this->actor.flags &= ~ACTOR_FLAG_ATTENTION_ENABLED; BossVa_SetupAction(this, BossVa_BariPhase2Attack); } @@ -2686,7 +2686,7 @@ void BossVa_BariPhase2Attack(BossVa* this, PlayState* play) { if (!(sPhase2Timer & 0x100) && (GET_BODY(this)->actor.colorFilterTimer == 0)) { sp4C = 200.0f; BossVa_Spark(play, this, 1, 125, 15.0f, 7.0f, SPARK_TETHER, 1.0f, true); - this->actor.flags &= ~ACTOR_FLAG_TARGETABLE; + this->actor.flags &= ~ACTOR_FLAG_ATTENTION_ENABLED; if (this->actor.params & 1) { sp4C = -200.0f; } @@ -2709,7 +2709,7 @@ void BossVa_BariPhase2Attack(BossVa* this, PlayState* play) { CollisionCheck_SetAT(play, &play->colChkCtx, &this->colliderLightning.base); CollisionCheck_SetAT(play, &play->colChkCtx, &this->colliderSph.base); } else { - this->actor.flags |= ACTOR_FLAG_TARGETABLE; + this->actor.flags |= ACTOR_FLAG_ATTENTION_ENABLED; Math_SmoothStepToS(&this->unk_1AC, sp50 + 150, 1, 0x3C, 0); if (GET_BODY(this)->actor.colorFilterTimer == 0) { Math_SmoothStepToF(&this->unk_1A0, 180.0f, 1.0f, 1.5f, 0.0f); @@ -2749,7 +2749,7 @@ void BossVa_BariPhase2Attack(BossVa* this, PlayState* play) { } void BossVa_SetupBariPhase3Stunned(BossVa* this, PlayState* play) { - this->actor.flags |= ACTOR_FLAG_TARGETABLE; + this->actor.flags |= ACTOR_FLAG_ATTENTION_ENABLED; this->timer = GET_BODY(this)->timer; Actor_SetColorFilter(&this->actor, 0, 255, 0x2000, this->timer); BossVa_SetupAction(this, BossVa_BariPhase3Stunned); @@ -2782,7 +2782,7 @@ void BossVa_BariPhase3Stunned(BossVa* this, PlayState* play) { } else { BossVa_Spark(play, this, 1, 85, 15.0f, 0.0f, SPARK_TETHER, 1.0f, true); if (this->timer2 >= 0x10) { - this->actor.flags &= ~ACTOR_FLAG_TARGETABLE; + this->actor.flags &= ~ACTOR_FLAG_ATTENTION_ENABLED; this->timer2 = 0x80; BossVa_SetupAction(this, BossVa_BariPhase3Attack); } @@ -2791,7 +2791,7 @@ void BossVa_BariPhase3Stunned(BossVa* this, PlayState* play) { } void BossVa_SetupBariDeath(BossVa* this) { - this->actor.flags &= ~ACTOR_FLAG_TARGETABLE; + this->actor.flags &= ~ACTOR_FLAG_ATTENTION_ENABLED; this->timer = 30; Audio_PlayActorSound2(&this->actor, NA_SE_EN_BALINADE_BL_DEAD); this->isDead++; @@ -2809,7 +2809,7 @@ void BossVa_SetupDoor(BossVa* this, PlayState* play) { if (sCsState >= INTRO_SPAWN_BARI) { sDoorState = 100; } - this->actor.flags &= ~ACTOR_FLAG_TARGETABLE; + this->actor.flags &= ~ACTOR_FLAG_ATTENTION_ENABLED; BossVa_SetupAction(this, BossVa_Door); } diff --git a/soh/src/overlays/actors/ovl_Demo_6K/z_demo_6k.c b/soh/src/overlays/actors/ovl_Demo_6K/z_demo_6k.c index 8b68506f2..51963f5d0 100644 --- a/soh/src/overlays/actors/ovl_Demo_6K/z_demo_6k.c +++ b/soh/src/overlays/actors/ovl_Demo_6K/z_demo_6k.c @@ -14,7 +14,7 @@ #include #include "soh/ResourceManagerHelpers.h" -#define FLAGS ACTOR_FLAG_UPDATE_WHILE_CULLED +#define FLAGS ACTOR_FLAG_UPDATE_CULLING_DISABLED void Demo6K_Init(Actor* thisx, PlayState* play); void Demo6K_Destroy(Actor* thisx, PlayState* play); @@ -168,7 +168,7 @@ void Demo6K_Init(Actor* thisx, PlayState* play) { case 17: case 18: case 19: - this->actor.flags |= ACTOR_FLAG_DRAW_WHILE_CULLED; + this->actor.flags |= ACTOR_FLAG_DRAW_CULLING_DISABLED; this->drawFunc = func_8096865C; this->initActionFunc = func_80967410; this->flags |= 1; diff --git a/soh/src/overlays/actors/ovl_Demo_Du/z_demo_du.c b/soh/src/overlays/actors/ovl_Demo_Du/z_demo_du.c index dd1e97e05..273c30df4 100644 --- a/soh/src/overlays/actors/ovl_Demo_Du/z_demo_du.c +++ b/soh/src/overlays/actors/ovl_Demo_Du/z_demo_du.c @@ -5,7 +5,7 @@ #include "vt.h" #include "soh/Enhancements/game-interactor/GameInteractor_Hooks.h" -#define FLAGS ACTOR_FLAG_UPDATE_WHILE_CULLED +#define FLAGS ACTOR_FLAG_UPDATE_CULLING_DISABLED typedef void (*DemoDuActionFunc)(DemoDu*, PlayState*); typedef void (*DemoDuDrawFunc)(Actor*, PlayState*); diff --git a/soh/src/overlays/actors/ovl_Demo_Ec/z_demo_ec.c b/soh/src/overlays/actors/ovl_Demo_Ec/z_demo_ec.c index 1ce6aa7b8..b2772a9ec 100644 --- a/soh/src/overlays/actors/ovl_Demo_Ec/z_demo_ec.c +++ b/soh/src/overlays/actors/ovl_Demo_Ec/z_demo_ec.c @@ -37,7 +37,7 @@ #include "objects/object_bba/object_bba.h" #include "objects/object_ane/object_ane.h" -#define FLAGS ACTOR_FLAG_UPDATE_WHILE_CULLED +#define FLAGS ACTOR_FLAG_UPDATE_CULLING_DISABLED void DemoEc_Init(Actor* thisx, PlayState* play); void DemoEc_Destroy(Actor* thisx, PlayState* play); diff --git a/soh/src/overlays/actors/ovl_Demo_Effect/z_demo_effect.c b/soh/src/overlays/actors/ovl_Demo_Effect/z_demo_effect.c index b15b5b17e..b64d2bcde 100644 --- a/soh/src/overlays/actors/ovl_Demo_Effect/z_demo_effect.c +++ b/soh/src/overlays/actors/ovl_Demo_Effect/z_demo_effect.c @@ -13,7 +13,7 @@ #include "soh/OTRGlobals.h" #include "soh/ResourceManagerHelpers.h" -#define FLAGS (ACTOR_FLAG_UPDATE_WHILE_CULLED | ACTOR_FLAG_DRAW_WHILE_CULLED) +#define FLAGS (ACTOR_FLAG_UPDATE_CULLING_DISABLED | ACTOR_FLAG_DRAW_CULLING_DISABLED) void DemoEffect_Init(Actor* thisx, PlayState* play); void DemoEffect_Destroy(Actor* thisx, PlayState* play); @@ -464,7 +464,7 @@ void DemoEffect_Init(Actor* thisx, PlayState* play2) { case DEMO_EFFECT_TIMEWARP_TIMEBLOCK_LARGE: case DEMO_EFFECT_TIMEWARP_TIMEBLOCK_SMALL: - this->actor.flags |= ACTOR_FLAG_NO_FREEZE_OCARINA; + this->actor.flags |= ACTOR_FLAG_UPDATE_DURING_OCARINA; case DEMO_EFFECT_TIMEWARP_MASTERSWORD: this->initDrawFunc = DemoEffect_DrawTimeWarp; this->initUpdateFunc = DemoEffect_InitTimeWarp; diff --git a/soh/src/overlays/actors/ovl_Demo_Ext/z_demo_ext.c b/soh/src/overlays/actors/ovl_Demo_Ext/z_demo_ext.c index 175785126..333e279a4 100644 --- a/soh/src/overlays/actors/ovl_Demo_Ext/z_demo_ext.c +++ b/soh/src/overlays/actors/ovl_Demo_Ext/z_demo_ext.c @@ -8,7 +8,7 @@ #include "vt.h" #include "objects/object_fhg/object_fhg.h" -#define FLAGS ACTOR_FLAG_UPDATE_WHILE_CULLED +#define FLAGS ACTOR_FLAG_UPDATE_CULLING_DISABLED typedef enum { /* 0x00 */ EXT_WAIT, diff --git a/soh/src/overlays/actors/ovl_Demo_Geff/z_demo_geff.c b/soh/src/overlays/actors/ovl_Demo_Geff/z_demo_geff.c index 1f9ebe90d..5623e861b 100644 --- a/soh/src/overlays/actors/ovl_Demo_Geff/z_demo_geff.c +++ b/soh/src/overlays/actors/ovl_Demo_Geff/z_demo_geff.c @@ -8,7 +8,7 @@ #include "objects/object_geff/object_geff.h" #include "vt.h" -#define FLAGS (ACTOR_FLAG_UPDATE_WHILE_CULLED | ACTOR_FLAG_DRAW_WHILE_CULLED) +#define FLAGS (ACTOR_FLAG_UPDATE_CULLING_DISABLED | ACTOR_FLAG_DRAW_CULLING_DISABLED) void DemoGeff_Init(Actor* thisx, PlayState* play); void DemoGeff_Destroy(Actor* thisx, PlayState* play); diff --git a/soh/src/overlays/actors/ovl_Demo_Gj/z_demo_gj.c b/soh/src/overlays/actors/ovl_Demo_Gj/z_demo_gj.c index e678721ef..e07d8f0be 100644 --- a/soh/src/overlays/actors/ovl_Demo_Gj/z_demo_gj.c +++ b/soh/src/overlays/actors/ovl_Demo_Gj/z_demo_gj.c @@ -9,7 +9,7 @@ #include "objects/object_geff/object_geff.h" #include "vt.h" -#define FLAGS (ACTOR_FLAG_UPDATE_WHILE_CULLED | ACTOR_FLAG_DRAW_WHILE_CULLED) +#define FLAGS (ACTOR_FLAG_UPDATE_CULLING_DISABLED | ACTOR_FLAG_DRAW_CULLING_DISABLED) void DemoGj_Init(Actor* thisx, PlayState* play); void DemoGj_Destroy(Actor* thisx, PlayState* play); diff --git a/soh/src/overlays/actors/ovl_Demo_Go/z_demo_go.c b/soh/src/overlays/actors/ovl_Demo_Go/z_demo_go.c index 227ad7ed1..1ccf9f0c8 100644 --- a/soh/src/overlays/actors/ovl_Demo_Go/z_demo_go.c +++ b/soh/src/overlays/actors/ovl_Demo_Go/z_demo_go.c @@ -8,7 +8,7 @@ #include "objects/object_oF1d_map/object_oF1d_map.h" #include "vt.h" -#define FLAGS ACTOR_FLAG_UPDATE_WHILE_CULLED +#define FLAGS ACTOR_FLAG_UPDATE_CULLING_DISABLED void DemoGo_Init(Actor* thisx, PlayState* play); void DemoGo_Destroy(Actor* thisx, PlayState* play); diff --git a/soh/src/overlays/actors/ovl_Demo_Gt/z_demo_gt.c b/soh/src/overlays/actors/ovl_Demo_Gt/z_demo_gt.c index 083d74b88..e7138958e 100644 --- a/soh/src/overlays/actors/ovl_Demo_Gt/z_demo_gt.c +++ b/soh/src/overlays/actors/ovl_Demo_Gt/z_demo_gt.c @@ -4,7 +4,7 @@ #include "vt.h" #include "overlays/effects/ovl_Effect_Ss_Kakera/z_eff_ss_kakera.h" -#define FLAGS (ACTOR_FLAG_UPDATE_WHILE_CULLED | ACTOR_FLAG_DRAW_WHILE_CULLED) +#define FLAGS (ACTOR_FLAG_UPDATE_CULLING_DISABLED | ACTOR_FLAG_DRAW_CULLING_DISABLED) void DemoGt_Init(Actor* thisx, PlayState* play); void DemoGt_Destroy(Actor* thisx, PlayState* play); diff --git a/soh/src/overlays/actors/ovl_Demo_Ik/z_demo_ik.c b/soh/src/overlays/actors/ovl_Demo_Ik/z_demo_ik.c index c641f72bf..d5881b220 100644 --- a/soh/src/overlays/actors/ovl_Demo_Ik/z_demo_ik.c +++ b/soh/src/overlays/actors/ovl_Demo_Ik/z_demo_ik.c @@ -3,7 +3,7 @@ #include "objects/object_ik/object_ik.h" #include "soh/ResourceManagerHelpers.h" -#define FLAGS ACTOR_FLAG_UPDATE_WHILE_CULLED +#define FLAGS ACTOR_FLAG_UPDATE_CULLING_DISABLED void DemoIk_Init(Actor* thisx, PlayState* play); void DemoIk_Destroy(Actor* thisx, PlayState* play); diff --git a/soh/src/overlays/actors/ovl_Demo_Im/z_demo_im.c b/soh/src/overlays/actors/ovl_Demo_Im/z_demo_im.c index 9be309322..0b234a630 100644 --- a/soh/src/overlays/actors/ovl_Demo_Im/z_demo_im.c +++ b/soh/src/overlays/actors/ovl_Demo_Im/z_demo_im.c @@ -14,7 +14,7 @@ #include "soh/ResourceManagerHelpers.h" #include "soh/Enhancements/game-interactor/GameInteractor_Hooks.h" -#define FLAGS (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_UPDATE_WHILE_CULLED) +#define FLAGS (ACTOR_FLAG_ATTENTION_ENABLED | ACTOR_FLAG_UPDATE_CULLING_DISABLED) void DemoIm_Init(Actor* thisx, PlayState* play); void DemoIm_Destroy(Actor* thisx, PlayState* play); @@ -840,7 +840,7 @@ s32 func_809869F8(DemoIm* this, PlayState* play) { f32 playerPosX = player->actor.world.pos.x; f32 thisPosX = this->actor.world.pos.x; - if ((thisPosX - (kREG(16) + 30.0f) > playerPosX) && !(this->actor.flags & ACTOR_FLAG_ACTIVE)) { + if ((thisPosX - (kREG(16) + 30.0f) > playerPosX) && !(this->actor.flags & ACTOR_FLAG_INSIDE_CULLING_VOLUME)) { return true; } else { return false; @@ -860,7 +860,7 @@ s32 func_80986A5C(DemoIm* this, PlayState* play) { } s32 func_80986AD0(DemoIm* this, PlayState* play) { - this->actor.flags |= ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_FRIENDLY; + this->actor.flags |= ACTOR_FLAG_ATTENTION_ENABLED | ACTOR_FLAG_FRIENDLY; if (!Actor_ProcessTalkRequest(&this->actor, play)) { this->actor.textId = 0x708E; func_8002F2F4(&this->actor, play); @@ -958,7 +958,7 @@ void func_80986DC8(DemoIm* this, PlayState* play) { DemoIm_UpdateSkelAnime(this); func_80984BE0(this); func_80984E58(this, play); - this->actor.flags &= ~(ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_FRIENDLY); + this->actor.flags &= ~(ACTOR_FLAG_ATTENTION_ENABLED | ACTOR_FLAG_FRIENDLY); } void func_80986E20(DemoIm* this, PlayState* play) { @@ -1005,7 +1005,7 @@ void func_80986FA8(DemoIm* this, PlayState* play) { DemoIm_UpdateSkelAnime(this); func_80984BE0(this); func_80984E58(this, play); - this->actor.flags &= ~(ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_FRIENDLY); + this->actor.flags &= ~(ACTOR_FLAG_ATTENTION_ENABLED | ACTOR_FLAG_FRIENDLY); DemoIm_UpdateCollider(this, play); func_80986CFC(this, play); } @@ -1123,7 +1123,7 @@ void DemoIm_Init(Actor* thisx, PlayState* play) { ActorShape_Init(&this->actor.shape, 0.0f, ActorShadow_DrawCircle, 30.0f); DemoIm_InitCollider(thisx, play); SkelAnime_InitFlex(play, &this->skelAnime, &gImpaSkel, NULL, this->jointTable, this->morphTable, 17); - thisx->flags &= ~ACTOR_FLAG_TARGETABLE; + thisx->flags &= ~ACTOR_FLAG_ATTENTION_ENABLED; switch (this->actor.params) { case 2: diff --git a/soh/src/overlays/actors/ovl_Demo_Kankyo/z_demo_kankyo.c b/soh/src/overlays/actors/ovl_Demo_Kankyo/z_demo_kankyo.c index a7a637d3e..6dc694303 100644 --- a/soh/src/overlays/actors/ovl_Demo_Kankyo/z_demo_kankyo.c +++ b/soh/src/overlays/actors/ovl_Demo_Kankyo/z_demo_kankyo.c @@ -7,7 +7,7 @@ #include #include "soh/OTRGlobals.h" -#define FLAGS (ACTOR_FLAG_UPDATE_WHILE_CULLED | ACTOR_FLAG_DRAW_WHILE_CULLED) +#define FLAGS (ACTOR_FLAG_UPDATE_CULLING_DISABLED | ACTOR_FLAG_DRAW_CULLING_DISABLED) void DemoKankyo_Init(Actor* thisx, PlayState* play); void DemoKankyo_Destroy(Actor* thisx, PlayState* play); @@ -252,7 +252,7 @@ void DemoKankyo_Init(Actor* thisx, PlayState* play) { case DEMOKANKYO_WARP_OUT: case DEMOKANKYO_WARP_IN: Actor_ChangeCategory(play, &play->actorCtx, &this->actor, ACTORCAT_ITEMACTION); - this->actor.flags |= ACTOR_FLAG_NO_FREEZE_OCARINA; + this->actor.flags |= ACTOR_FLAG_UPDATE_DURING_OCARINA; this->actor.room = -1; this->warpTimer = 35; this->sparkleCounter = 0; diff --git a/soh/src/overlays/actors/ovl_Demo_Kekkai/z_demo_kekkai.c b/soh/src/overlays/actors/ovl_Demo_Kekkai/z_demo_kekkai.c index b85ccf744..411f294d4 100644 --- a/soh/src/overlays/actors/ovl_Demo_Kekkai/z_demo_kekkai.c +++ b/soh/src/overlays/actors/ovl_Demo_Kekkai/z_demo_kekkai.c @@ -9,7 +9,7 @@ #include "scenes/dungeons/ganontika/ganontika_scene.h" #include "soh/ResourceManagerHelpers.h" -#define FLAGS (ACTOR_FLAG_UPDATE_WHILE_CULLED | ACTOR_FLAG_DRAW_WHILE_CULLED) +#define FLAGS (ACTOR_FLAG_UPDATE_CULLING_DISABLED | ACTOR_FLAG_DRAW_CULLING_DISABLED) void DemoKekkai_Init(Actor* thisx, PlayState* play); void DemoKekkai_Destroy(Actor* thisx, PlayState* play); diff --git a/soh/src/overlays/actors/ovl_Demo_Sa/z_demo_sa.c b/soh/src/overlays/actors/ovl_Demo_Sa/z_demo_sa.c index c78c3a897..5b24dd416 100644 --- a/soh/src/overlays/actors/ovl_Demo_Sa/z_demo_sa.c +++ b/soh/src/overlays/actors/ovl_Demo_Sa/z_demo_sa.c @@ -12,7 +12,7 @@ #include "vt.h" -#define FLAGS ACTOR_FLAG_UPDATE_WHILE_CULLED +#define FLAGS ACTOR_FLAG_UPDATE_CULLING_DISABLED void DemoSa_Init(Actor* thisx, PlayState* play); void DemoSa_Destroy(Actor* thisx, PlayState* play); diff --git a/soh/src/overlays/actors/ovl_Demo_Shd/z_demo_shd.c b/soh/src/overlays/actors/ovl_Demo_Shd/z_demo_shd.c index 26ce36f95..41f6c1a0e 100644 --- a/soh/src/overlays/actors/ovl_Demo_Shd/z_demo_shd.c +++ b/soh/src/overlays/actors/ovl_Demo_Shd/z_demo_shd.c @@ -6,7 +6,7 @@ #include "z_demo_shd.h" -#define FLAGS (ACTOR_FLAG_UPDATE_WHILE_CULLED | ACTOR_FLAG_DRAW_WHILE_CULLED) +#define FLAGS (ACTOR_FLAG_UPDATE_CULLING_DISABLED | ACTOR_FLAG_DRAW_CULLING_DISABLED) void DemoShd_Init(Actor* thisx, PlayState* play); void DemoShd_Destroy(Actor* thisx, PlayState* play); diff --git a/soh/src/overlays/actors/ovl_Demo_Tre_Lgt/z_demo_tre_lgt.c b/soh/src/overlays/actors/ovl_Demo_Tre_Lgt/z_demo_tre_lgt.c index fa7cb0123..d4388e066 100644 --- a/soh/src/overlays/actors/ovl_Demo_Tre_Lgt/z_demo_tre_lgt.c +++ b/soh/src/overlays/actors/ovl_Demo_Tre_Lgt/z_demo_tre_lgt.c @@ -3,7 +3,7 @@ #include "objects/object_box/object_box.h" #include -#define FLAGS ACTOR_FLAG_UPDATE_WHILE_CULLED +#define FLAGS ACTOR_FLAG_UPDATE_CULLING_DISABLED void DemoTreLgt_Init(Actor* thisx, PlayState* play); void DemoTreLgt_Destroy(Actor* thisx, PlayState* play); diff --git a/soh/src/overlays/actors/ovl_Door_Ana/z_door_ana.c b/soh/src/overlays/actors/ovl_Door_Ana/z_door_ana.c index d4d3d8b60..01ff92184 100644 --- a/soh/src/overlays/actors/ovl_Door_Ana/z_door_ana.c +++ b/soh/src/overlays/actors/ovl_Door_Ana/z_door_ana.c @@ -10,7 +10,7 @@ #include "soh/Enhancements/randomizer/randomizer_grotto.h" #include "soh/OTRGlobals.h" -#define FLAGS ACTOR_FLAG_NO_FREEZE_OCARINA +#define FLAGS ACTOR_FLAG_UPDATE_DURING_OCARINA void DoorAna_Init(Actor* thisx, PlayState* play); void DoorAna_Destroy(Actor* thisx, PlayState* play); @@ -77,7 +77,7 @@ void DoorAna_Init(Actor* thisx, PlayState* play) { Collider_InitCylinder(play, &this->collider); Collider_SetCylinder(play, &this->collider, &this->actor, &sCylinderInit); } else { - this->actor.flags |= ACTOR_FLAG_UPDATE_WHILE_CULLED; + this->actor.flags |= ACTOR_FLAG_UPDATE_CULLING_DISABLED; } Actor_SetScale(&this->actor, 0); DoorAna_SetupAction(this, DoorAna_WaitClosed); @@ -104,7 +104,7 @@ void DoorAna_WaitClosed(DoorAna* this, PlayState* play) { // opening with song of storms if (this->actor.xyzDistToPlayerSq < 40000.0f && Flags_GetEnv(play, 5)) { openGrotto = true; - this->actor.flags &= ~ACTOR_FLAG_UPDATE_WHILE_CULLED; + this->actor.flags &= ~ACTOR_FLAG_UPDATE_CULLING_DISABLED; } } else { // bombing/hammering open a grotto diff --git a/soh/src/overlays/actors/ovl_Door_Killer/z_door_killer.c b/soh/src/overlays/actors/ovl_Door_Killer/z_door_killer.c index f29b23450..e3ba837b2 100644 --- a/soh/src/overlays/actors/ovl_Door_Killer/z_door_killer.c +++ b/soh/src/overlays/actors/ovl_Door_Killer/z_door_killer.c @@ -13,7 +13,7 @@ #include "soh/Enhancements/game-interactor/GameInteractor_Hooks.h" #include "soh/ResourceManagerHelpers.h" -#define FLAGS ACTOR_FLAG_UPDATE_WHILE_CULLED +#define FLAGS ACTOR_FLAG_UPDATE_CULLING_DISABLED typedef enum { /* 0 */ DOOR_KILLER_DOOR, diff --git a/soh/src/overlays/actors/ovl_Door_Shutter/z_door_shutter.c b/soh/src/overlays/actors/ovl_Door_Shutter/z_door_shutter.c index c842571e7..222b535c5 100644 --- a/soh/src/overlays/actors/ovl_Door_Shutter/z_door_shutter.c +++ b/soh/src/overlays/actors/ovl_Door_Shutter/z_door_shutter.c @@ -25,7 +25,7 @@ #include "objects/object_ouke_haka/object_ouke_haka.h" #include "soh/Enhancements/game-interactor/GameInteractor_Hooks.h" -#define FLAGS ACTOR_FLAG_UPDATE_WHILE_CULLED +#define FLAGS ACTOR_FLAG_UPDATE_CULLING_DISABLED void DoorShutter_Init(Actor* thisx, PlayState* play); void DoorShutter_Destroy(Actor* thisx, PlayState* play); diff --git a/soh/src/overlays/actors/ovl_Efc_Erupc/z_efc_erupc.c b/soh/src/overlays/actors/ovl_Efc_Erupc/z_efc_erupc.c index 77821cd33..d72388e0f 100644 --- a/soh/src/overlays/actors/ovl_Efc_Erupc/z_efc_erupc.c +++ b/soh/src/overlays/actors/ovl_Efc_Erupc/z_efc_erupc.c @@ -2,7 +2,7 @@ #include "objects/object_efc_erupc/object_efc_erupc.h" #include "soh/frame_interpolation.h" -#define FLAGS (ACTOR_FLAG_UPDATE_WHILE_CULLED | ACTOR_FLAG_DRAW_WHILE_CULLED) +#define FLAGS (ACTOR_FLAG_UPDATE_CULLING_DISABLED | ACTOR_FLAG_DRAW_CULLING_DISABLED) void EfcErupc_Init(Actor* thisx, PlayState* play); void EfcErupc_Destroy(Actor* thisx, PlayState* play); diff --git a/soh/src/overlays/actors/ovl_Eff_Dust/z_eff_dust.c b/soh/src/overlays/actors/ovl_Eff_Dust/z_eff_dust.c index a81ed473a..3b6896477 100644 --- a/soh/src/overlays/actors/ovl_Eff_Dust/z_eff_dust.c +++ b/soh/src/overlays/actors/ovl_Eff_Dust/z_eff_dust.c @@ -8,7 +8,7 @@ #include "objects/gameplay_keep/gameplay_keep.h" #include "soh/frame_interpolation.h" -#define FLAGS (ACTOR_FLAG_UPDATE_WHILE_CULLED | ACTOR_FLAG_DRAW_WHILE_CULLED) +#define FLAGS (ACTOR_FLAG_UPDATE_CULLING_DISABLED | ACTOR_FLAG_DRAW_CULLING_DISABLED) void EffDust_Init(Actor* thisx, PlayState* play); void EffDust_Destroy(Actor* thisx, PlayState* play); diff --git a/soh/src/overlays/actors/ovl_Elf_Msg/z_elf_msg.c b/soh/src/overlays/actors/ovl_Elf_Msg/z_elf_msg.c index 53a0d749c..7c7a2325e 100644 --- a/soh/src/overlays/actors/ovl_Elf_Msg/z_elf_msg.c +++ b/soh/src/overlays/actors/ovl_Elf_Msg/z_elf_msg.c @@ -9,7 +9,7 @@ #include "overlays/actors/ovl_En_Elf/z_en_elf.h" #include "soh/Enhancements/game-interactor/GameInteractor_Hooks.h" -#define FLAGS ACTOR_FLAG_UPDATE_WHILE_CULLED +#define FLAGS ACTOR_FLAG_UPDATE_CULLING_DISABLED void ElfMsg_Init(Actor* thisx, PlayState* play); void ElfMsg_Destroy(Actor* thisx, PlayState* play); diff --git a/soh/src/overlays/actors/ovl_Elf_Msg2/z_elf_msg2.c b/soh/src/overlays/actors/ovl_Elf_Msg2/z_elf_msg2.c index 5a291d249..9e3745622 100644 --- a/soh/src/overlays/actors/ovl_Elf_Msg2/z_elf_msg2.c +++ b/soh/src/overlays/actors/ovl_Elf_Msg2/z_elf_msg2.c @@ -7,7 +7,7 @@ #include "z_elf_msg2.h" #include "vt.h" -#define FLAGS ACTOR_FLAG_UPDATE_WHILE_CULLED +#define FLAGS ACTOR_FLAG_UPDATE_CULLING_DISABLED void ElfMsg2_Init(Actor* thisx, PlayState* play); void ElfMsg2_Destroy(Actor* thisx, PlayState* play); @@ -83,7 +83,7 @@ void ElfMsg2_Init(Actor* thisx, PlayState* play) { ElfMsg2_SetupAction(this, ElfMsg2_WaitUntilActivated); } else { ElfMsg2_SetupAction(this, ElfMsg2_WaitForTextRead); - this->actor.flags |= ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_NAVI_HAS_INFO; // Make actor targetable and Navi-checkable + this->actor.flags |= ACTOR_FLAG_ATTENTION_ENABLED | ACTOR_FLAG_TALK_WITH_C_UP; // Make actor targetable and Navi-checkable this->actor.textId = ElfMsg2_GetMessageId(this); } this->actor.shape.rot.x = this->actor.shape.rot.y = this->actor.shape.rot.z = 0; @@ -135,7 +135,7 @@ void ElfMsg2_WaitUntilActivated(ElfMsg2* this, PlayState* play) { if ((this->actor.world.rot.y >= 0x41) && (this->actor.world.rot.y <= 0x80) && (Flags_GetSwitch(play, (this->actor.world.rot.y - 0x41)))) { ElfMsg2_SetupAction(this, ElfMsg2_WaitForTextRead); - this->actor.flags |= ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_NAVI_HAS_INFO; // Make actor targetable and Navi-checkable + this->actor.flags |= ACTOR_FLAG_ATTENTION_ENABLED | ACTOR_FLAG_TALK_WITH_C_UP; // Make actor targetable and Navi-checkable this->actor.textId = ElfMsg2_GetMessageId(this); } } diff --git a/soh/src/overlays/actors/ovl_En_Am/z_en_am.c b/soh/src/overlays/actors/ovl_En_Am/z_en_am.c index 70a6ae5da..8ac02d7ab 100644 --- a/soh/src/overlays/actors/ovl_En_Am/z_en_am.c +++ b/soh/src/overlays/actors/ovl_En_Am/z_en_am.c @@ -10,7 +10,7 @@ #include "soh/Enhancements/game-interactor/GameInteractor_Hooks.h" #include "soh/ResourceManagerHelpers.h" -#define FLAGS (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_HOSTILE | ACTOR_FLAG_UPDATE_WHILE_CULLED | ACTOR_FLAG_CAN_PRESS_SWITCH) +#define FLAGS (ACTOR_FLAG_ATTENTION_ENABLED | ACTOR_FLAG_HOSTILE | ACTOR_FLAG_UPDATE_CULLING_DISABLED | ACTOR_FLAG_CAN_PRESS_SWITCHES) void EnAm_Init(Actor* thisx, PlayState* play); void EnAm_Destroy(Actor* thisx, PlayState* play); @@ -290,7 +290,7 @@ void EnAm_SetupStatue(EnAm* this) { f32 lastFrame = Animation_GetLastFrame(&gArmosRicochetAnim); Animation_Change(&this->skelAnime, &gArmosRicochetAnim, 0.0f, lastFrame, lastFrame, ANIMMODE_LOOP, 0.0f); - this->dyna.actor.flags &= ~ACTOR_FLAG_TARGETABLE; + this->dyna.actor.flags &= ~ACTOR_FLAG_ATTENTION_ENABLED; this->behavior = AM_BEHAVIOR_DO_NOTHING; this->dyna.actor.speedXZ = 0.0f; EnAm_SetupAction(this, EnAm_Statue); @@ -391,7 +391,7 @@ void EnAm_Sleep(EnAm* this, PlayState* play) { if (this->textureBlend >= 240) { this->attackTimer = 200; this->textureBlend = 255; - this->dyna.actor.flags |= ACTOR_FLAG_TARGETABLE; + this->dyna.actor.flags |= ACTOR_FLAG_ATTENTION_ENABLED; this->dyna.actor.shape.yOffset = 0.0f; EnAm_SetupLunge(this); } else { @@ -412,7 +412,7 @@ void EnAm_Sleep(EnAm* this, PlayState* play) { this->textureBlend -= 10; } else { this->textureBlend = 0; - this->dyna.actor.flags &= ~ACTOR_FLAG_TARGETABLE; + this->dyna.actor.flags &= ~ACTOR_FLAG_ATTENTION_ENABLED; if (this->dyna.bgId < 0) { this->unk_264 = 0; diff --git a/soh/src/overlays/actors/ovl_En_Ani/z_en_ani.c b/soh/src/overlays/actors/ovl_En_Ani/z_en_ani.c index 8126a1425..28eb43edd 100644 --- a/soh/src/overlays/actors/ovl_En_Ani/z_en_ani.c +++ b/soh/src/overlays/actors/ovl_En_Ani/z_en_ani.c @@ -10,7 +10,7 @@ #include "soh/ResourceManagerHelpers.h" #include "soh/Enhancements/game-interactor/GameInteractor_Hooks.h" -#define FLAGS (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_FRIENDLY) +#define FLAGS (ACTOR_FLAG_ATTENTION_ENABLED | ACTOR_FLAG_FRIENDLY) void EnAni_Init(Actor* thisx, PlayState* play); void EnAni_Destroy(Actor* thisx, PlayState* play); diff --git a/soh/src/overlays/actors/ovl_En_Anubice/z_en_anubice.c b/soh/src/overlays/actors/ovl_En_Anubice/z_en_anubice.c index 67d2b39a5..0fbef201b 100644 --- a/soh/src/overlays/actors/ovl_En_Anubice/z_en_anubice.c +++ b/soh/src/overlays/actors/ovl_En_Anubice/z_en_anubice.c @@ -12,7 +12,7 @@ #include "soh/Enhancements/game-interactor/GameInteractor_Hooks.h" #include "soh/ResourceManagerHelpers.h" -#define FLAGS (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_HOSTILE | ACTOR_FLAG_UPDATE_WHILE_CULLED) +#define FLAGS (ACTOR_FLAG_ATTENTION_ENABLED | ACTOR_FLAG_HOSTILE | ACTOR_FLAG_UPDATE_CULLING_DISABLED) void EnAnubice_Init(Actor* thisx, PlayState* play); void EnAnubice_Destroy(Actor* thisx, PlayState* play); @@ -149,7 +149,7 @@ void EnAnubice_Init(Actor* thisx, PlayState* play) { this->actor.colChkInfo.mass = MASS_IMMOVABLE; this->actor.shape.yOffset = -4230.0f; this->focusHeightOffset = 0.0f; - this->actor.flags &= ~ACTOR_FLAG_TARGETABLE; + this->actor.flags &= ~ACTOR_FLAG_ATTENTION_ENABLED; this->home = this->actor.world.pos; this->actor.targetMode = 3; this->actionFunc = EnAnubice_FindFlameCircles; @@ -198,7 +198,7 @@ void EnAnubice_FindFlameCircles(EnAnubice* this, PlayState* play) { } this->hasSearchedForFlameCircles = true; } - this->actor.flags |= ACTOR_FLAG_TARGETABLE; + this->actor.flags |= ACTOR_FLAG_ATTENTION_ENABLED; this->actionFunc = EnAnubice_SetupIdle; } } @@ -377,7 +377,7 @@ void EnAnubice_Update(Actor* thisx, PlayState* play) { (fabsf(this->flameCircles[i]->actor.world.pos.z - this->actor.world.pos.z) < 60.0f) && (flameCircle->timer != 0)) { Actor_ChangeCategory(play, &play->actorCtx, &this->actor, ACTORCAT_PROP); - this->actor.flags &= ~ACTOR_FLAG_TARGETABLE; + this->actor.flags &= ~ACTOR_FLAG_ATTENTION_ENABLED; Enemy_StartFinishingBlow(play, &this->actor); Audio_PlayActorSound2(&this->actor, NA_SE_EN_ANUBIS_DEAD); this->actionFunc = EnAnubice_SetupDie; @@ -389,7 +389,7 @@ void EnAnubice_Update(Actor* thisx, PlayState* play) { this->collider.base.acFlags &= ~AC_HIT; if (this->actor.colChkInfo.damageEffect == ANUBICE_DMGEFF_FIRE) { Actor_ChangeCategory(play, &play->actorCtx, &this->actor, ACTORCAT_PROP); - this->actor.flags &= ~ACTOR_FLAG_TARGETABLE; + this->actor.flags &= ~ACTOR_FLAG_ATTENTION_ENABLED; Enemy_StartFinishingBlow(play, &this->actor); Audio_PlayActorSound2(&this->actor, NA_SE_EN_ANUBIS_DEAD); this->actionFunc = EnAnubice_SetupDie; diff --git a/soh/src/overlays/actors/ovl_En_Anubice_Fire/z_en_anubice_fire.c b/soh/src/overlays/actors/ovl_En_Anubice_Fire/z_en_anubice_fire.c index 1f1934c64..2c142362b 100644 --- a/soh/src/overlays/actors/ovl_En_Anubice_Fire/z_en_anubice_fire.c +++ b/soh/src/overlays/actors/ovl_En_Anubice_Fire/z_en_anubice_fire.c @@ -9,7 +9,7 @@ #include "objects/object_anubice/object_anubice.h" #include "soh/frame_interpolation.h" -#define FLAGS ACTOR_FLAG_UPDATE_WHILE_CULLED +#define FLAGS ACTOR_FLAG_UPDATE_CULLING_DISABLED void EnAnubiceFire_Init(Actor* thisx, PlayState* play); void EnAnubiceFire_Destroy(Actor* thisx, PlayState* play); diff --git a/soh/src/overlays/actors/ovl_En_Anubice_Tag/z_en_anubice_tag.c b/soh/src/overlays/actors/ovl_En_Anubice_Tag/z_en_anubice_tag.c index 3b74c38ba..91ba3b918 100644 --- a/soh/src/overlays/actors/ovl_En_Anubice_Tag/z_en_anubice_tag.c +++ b/soh/src/overlays/actors/ovl_En_Anubice_Tag/z_en_anubice_tag.c @@ -7,7 +7,7 @@ #include "z_en_anubice_tag.h" #include "vt.h" -#define FLAGS ACTOR_FLAG_UPDATE_WHILE_CULLED +#define FLAGS ACTOR_FLAG_UPDATE_CULLING_DISABLED void EnAnubiceTag_Init(Actor* thisx, PlayState* play); void EnAnubiceTag_Destroy(Actor* thisx, PlayState* play); diff --git a/soh/src/overlays/actors/ovl_En_Arow_Trap/z_en_arow_trap.c b/soh/src/overlays/actors/ovl_En_Arow_Trap/z_en_arow_trap.c index 3622e5f5f..5a838c579 100644 --- a/soh/src/overlays/actors/ovl_En_Arow_Trap/z_en_arow_trap.c +++ b/soh/src/overlays/actors/ovl_En_Arow_Trap/z_en_arow_trap.c @@ -6,7 +6,7 @@ #include "z_en_arow_trap.h" #include "overlays/actors/ovl_En_Arrow/z_en_arrow.h" -#define FLAGS ACTOR_FLAG_UPDATE_WHILE_CULLED +#define FLAGS ACTOR_FLAG_UPDATE_CULLING_DISABLED void EnArowTrap_Init(Actor* thisx, PlayState* play); void EnArowTrap_Destroy(Actor* thisx, PlayState* play); diff --git a/soh/src/overlays/actors/ovl_En_Arrow/z_en_arrow.c b/soh/src/overlays/actors/ovl_En_Arrow/z_en_arrow.c index 0669d43d6..8a62ff4ba 100644 --- a/soh/src/overlays/actors/ovl_En_Arrow/z_en_arrow.c +++ b/soh/src/overlays/actors/ovl_En_Arrow/z_en_arrow.c @@ -8,7 +8,7 @@ #include "objects/gameplay_keep/gameplay_keep.h" #include "objects/object_gi_nuts/object_gi_nuts.h" -#define FLAGS (ACTOR_FLAG_UPDATE_WHILE_CULLED | ACTOR_FLAG_DRAW_WHILE_CULLED) +#define FLAGS (ACTOR_FLAG_UPDATE_CULLING_DISABLED | ACTOR_FLAG_DRAW_CULLING_DISABLED) void EnArrow_Init(Actor* thisx, PlayState* play); void EnArrow_Destroy(Actor* thisx, PlayState* play); @@ -193,7 +193,7 @@ void EnArrow_Destroy(Actor* thisx, PlayState* play) { Collider_DestroyQuad(play, &this->collider); if ((this->hitActor != NULL) && (this->hitActor->update != NULL)) { - this->hitActor->flags &= ~ACTOR_FLAG_DRAGGED_BY_ARROW; + this->hitActor->flags &= ~ACTOR_FLAG_ATTACHED_TO_ARROW; } } @@ -333,11 +333,11 @@ void EnArrow_Fly(EnArrow* this, PlayState* play) { hitActor = this->collider.base.at; if ((hitActor->update != NULL) && (!(this->collider.base.atFlags & AT_BOUNCED)) && - (hitActor->flags & ACTOR_FLAG_ARROW_DRAGGABLE)) { + (hitActor->flags & ACTOR_FLAG_CAN_ATTACH_TO_ARROW)) { this->hitActor = hitActor; EnArrow_CarryActor(this, play); Math_Vec3f_Diff(&hitActor->world.pos, &this->actor.world.pos, &this->unk_250); - hitActor->flags |= ACTOR_FLAG_DRAGGED_BY_ARROW; + hitActor->flags |= ACTOR_FLAG_ATTACHED_TO_ARROW; this->collider.base.atFlags &= ~AT_HIT; this->actor.speedXZ /= 2.0f; this->actor.velocity.y /= 2.0f; @@ -396,14 +396,14 @@ void EnArrow_Fly(EnArrow* this, PlayState* play) { this->hitActor->world.pos.y = hitPoint.y + ((sp54.y <= hitPoint.y) ? 1.0f : -1.0f); this->hitActor->world.pos.z = hitPoint.z + ((sp54.z <= hitPoint.z) ? 1.0f : -1.0f); Math_Vec3f_Diff(&this->hitActor->world.pos, &this->actor.world.pos, &this->unk_250); - this->hitActor->flags &= ~ACTOR_FLAG_DRAGGED_BY_ARROW; + this->hitActor->flags &= ~ACTOR_FLAG_ATTACHED_TO_ARROW; this->hitActor = NULL; } else { Math_Vec3f_Sum(&this->actor.world.pos, &this->unk_250, &this->hitActor->world.pos); } if (this->touchedPoly && (this->hitActor != NULL)) { - this->hitActor->flags &= ~ACTOR_FLAG_DRAGGED_BY_ARROW; + this->hitActor->flags &= ~ACTOR_FLAG_ATTACHED_TO_ARROW; this->hitActor = NULL; } } else { diff --git a/soh/src/overlays/actors/ovl_En_Attack_Niw/z_en_attack_niw.c b/soh/src/overlays/actors/ovl_En_Attack_Niw/z_en_attack_niw.c index 8876b6e4e..aa455739e 100644 --- a/soh/src/overlays/actors/ovl_En_Attack_Niw/z_en_attack_niw.c +++ b/soh/src/overlays/actors/ovl_En_Attack_Niw/z_en_attack_niw.c @@ -9,7 +9,7 @@ #include "overlays/actors/ovl_En_Niw/z_en_niw.h" #include "soh/ResourceManagerHelpers.h" -#define FLAGS ACTOR_FLAG_UPDATE_WHILE_CULLED +#define FLAGS ACTOR_FLAG_UPDATE_CULLING_DISABLED void EnAttackNiw_Init(Actor* thisx, PlayState* play); void EnAttackNiw_Destroy(Actor* thisx, PlayState* play); @@ -55,7 +55,7 @@ void EnAttackNiw_Init(Actor* thisx, PlayState* play) { this->unk_298.y = Rand_CenteredFloat(10.0f); this->unk_298.z = Rand_CenteredFloat(100.0f); Actor_SetScale(&this->actor, 0.01f); - this->actor.flags &= ~ACTOR_FLAG_TARGETABLE; + this->actor.flags &= ~ACTOR_FLAG_ATTENTION_ENABLED; this->actor.shape.rot.y = this->actor.world.rot.y = (Rand_ZeroOne() - 0.5f) * 60000.0f; this->actionFunc = func_809B5670; } diff --git a/soh/src/overlays/actors/ovl_En_Ba/z_en_ba.c b/soh/src/overlays/actors/ovl_En_Ba/z_en_ba.c index 953b4b212..6914adfc3 100644 --- a/soh/src/overlays/actors/ovl_En_Ba/z_en_ba.c +++ b/soh/src/overlays/actors/ovl_En_Ba/z_en_ba.c @@ -9,7 +9,7 @@ #include "soh/frame_interpolation.h" #include "soh/Enhancements/game-interactor/GameInteractor_Hooks.h" -#define FLAGS (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_HOSTILE | ACTOR_FLAG_UPDATE_WHILE_CULLED) +#define FLAGS (ACTOR_FLAG_ATTENTION_ENABLED | ACTOR_FLAG_HOSTILE | ACTOR_FLAG_UPDATE_CULLING_DISABLED) void EnBa_Init(Actor* thisx, PlayState* play); void EnBa_Destroy(Actor* thisx, PlayState* play); @@ -150,7 +150,7 @@ void EnBa_Idle(EnBa* this, PlayState* play) { if ((this->actor.colChkInfo.mass == MASS_IMMOVABLE) && (this->actor.xzDistToPlayer > 175.0f)) { Math_SmoothStepToF(&this->actor.world.pos.y, this->actor.home.pos.y + 330.0f, 1.0f, 7.0f, 0.0f); } else { - this->actor.flags |= ACTOR_FLAG_TARGETABLE; + this->actor.flags |= ACTOR_FLAG_ATTENTION_ENABLED; Math_SmoothStepToF(&this->actor.world.pos.y, this->actor.home.pos.y + 100.0f, 1.0f, 10.0f, 0.0f); } this->unk_2FC = this->actor.world.pos; @@ -399,7 +399,7 @@ void func_809B75A0(EnBa* this, PlayState* play2) { Matrix_Translate(this->actor.world.pos.x, this->actor.world.pos.y, this->actor.world.pos.z, MTXMODE_NEW); Matrix_RotateZYX(this->actor.shape.rot.x - 0x8000, this->actor.shape.rot.y, 0, MTXMODE_APPLY); Matrix_MultVec3f(&D_809B8080, &this->unk_158[0]); - this->actor.flags &= ~ACTOR_FLAG_TARGETABLE; + this->actor.flags &= ~ACTOR_FLAG_ATTENTION_ENABLED; for (i = 5; i < 13; i++) { Math_SmoothStepToS(&this->unk_2A8[i].x, this->unk_2A8[5].x, 1, this->unk_31C, 0); Math_SmoothStepToS(&this->unk_2A8[i].y, this->unk_2A8[5].y, 1, this->unk_31C, 0); diff --git a/soh/src/overlays/actors/ovl_En_Bb/z_en_bb.c b/soh/src/overlays/actors/ovl_En_Bb/z_en_bb.c index b03b6490a..ead1e54be 100644 --- a/soh/src/overlays/actors/ovl_En_Bb/z_en_bb.c +++ b/soh/src/overlays/actors/ovl_En_Bb/z_en_bb.c @@ -10,7 +10,7 @@ #include "soh/Enhancements/game-interactor/GameInteractor_Hooks.h" #include "soh/ResourceManagerHelpers.h" -#define FLAGS (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_HOSTILE | ACTOR_FLAG_UPDATE_WHILE_CULLED | ACTOR_FLAG_PLAY_HIT_SFX) +#define FLAGS (ACTOR_FLAG_ATTENTION_ENABLED | ACTOR_FLAG_HOSTILE | ACTOR_FLAG_UPDATE_CULLING_DISABLED | ACTOR_FLAG_SFX_FOR_PLAYER_BODY_HIT) #define vBombHopPhase actionVar1 #define vTrailIdx actionVar1 @@ -347,7 +347,7 @@ void EnBb_Init(Actor* thisx, PlayState* play) { this->flamePrimBlue = this->flameEnvColor.b = 255; thisx->world.pos.y += 50.0f; EnBb_SetupBlue(this); - thisx->flags |= ACTOR_FLAG_ARROW_DRAGGABLE; + thisx->flags |= ACTOR_FLAG_CAN_ATTACH_TO_ARROW; break; case ENBB_RED: thisx->naviEnemyId = 0x24; @@ -376,7 +376,7 @@ void EnBb_Init(Actor* thisx, PlayState* play) { EnBb_SetupWhite(play, this); EnBb_SetWaypoint(this, play); EnBb_FaceWaypoint(this); - thisx->flags |= ACTOR_FLAG_ARROW_DRAGGABLE; + thisx->flags |= ACTOR_FLAG_CAN_ATTACH_TO_ARROW; break; case ENBB_GREEN_BIG: this->path = this->actionState >> 4; @@ -412,7 +412,7 @@ void EnBb_Destroy(Actor* thisx, PlayState* play) { void EnBb_SetupFlameTrail(EnBb* this) { this->action = BB_FLAME_TRAIL; this->moveMode = BBMOVE_NOCLIP; - this->actor.flags &= ~ACTOR_FLAG_TARGETABLE; + this->actor.flags &= ~ACTOR_FLAG_ATTENTION_ENABLED; this->actor.velocity.y = 0.0f; this->actor.gravity = 0.0f; this->actor.speedXZ = 0.0f; @@ -705,7 +705,7 @@ void EnBb_Down(EnBb* this, PlayState* play) { this->moveMode = BBMOVE_HIDDEN; this->timer = 10; this->actionState++; - this->actor.flags &= ~ACTOR_FLAG_TARGETABLE; + this->actor.flags &= ~ACTOR_FLAG_ATTENTION_ENABLED; this->action = BB_RED; EnBb_SetupAction(this, EnBb_Red); return; @@ -770,7 +770,7 @@ void EnBb_SetupRed(PlayState* play, EnBb* this) { this->actor.home.pos = this->actor.world.pos; this->actor.velocity.y = this->actor.gravity = this->actor.speedXZ = 0.0f; this->actor.bgCheckFlags &= ~1; - this->actor.flags &= ~ACTOR_FLAG_TARGETABLE; + this->actor.flags &= ~ACTOR_FLAG_ATTENTION_ENABLED; } this->action = BB_RED; EnBb_SetupAction(this, EnBb_Red); @@ -804,7 +804,7 @@ void EnBb_Red(EnBb* this, PlayState* play) { case BBRED_ATTACK: if (this->timer == 0) { this->moveMode = BBMOVE_NORMAL; - this->actor.flags |= ACTOR_FLAG_TARGETABLE; + this->actor.flags |= ACTOR_FLAG_ATTENTION_ENABLED; } this->bobPhase += Rand_ZeroOne(); Math_SmoothStepToF(&this->flameScaleY, 80.0f, 1.0f, 10.0f, 0.0f); @@ -823,7 +823,7 @@ void EnBb_Red(EnBb* this, PlayState* play) { this->moveMode = BBMOVE_HIDDEN; this->timer = 10; this->actionState++; - this->actor.flags &= ~ACTOR_FLAG_TARGETABLE; + this->actor.flags &= ~ACTOR_FLAG_ATTENTION_ENABLED; } else { this->actor.velocity.y *= -1.06f; if (this->actor.velocity.y > 13.0f) { @@ -1132,7 +1132,7 @@ void EnBb_Stunned(EnBb* this, PlayState* play) { EnBb_SetupDown(this); } } else { - this->actor.flags &= ~ACTOR_FLAG_TARGETABLE; + this->actor.flags &= ~ACTOR_FLAG_ATTENTION_ENABLED; EnBb_SetupDeath(this, play); } } @@ -1197,7 +1197,7 @@ void EnBb_CollisionCheck(EnBb* this, PlayState* play) { } } if (this->actor.colChkInfo.health == 0) { - this->actor.flags &= ~ACTOR_FLAG_TARGETABLE; + this->actor.flags &= ~ACTOR_FLAG_ATTENTION_ENABLED; if (this->actor.params == ENBB_RED) { EnBb_KillFlameTrail(this); } @@ -1239,7 +1239,7 @@ void EnBb_Update(Actor* thisx, PlayState* play2) { if (this->actor.colChkInfo.damageEffect != 0xD) { this->actionFunc(this, play); if ((this->actor.params <= ENBB_BLUE) && (this->actor.speedXZ >= -6.0f) && - ((this->actor.flags & ACTOR_FLAG_DRAGGED_BY_ARROW) == 0)) { + ((this->actor.flags & ACTOR_FLAG_ATTACHED_TO_ARROW) == 0)) { Actor_MoveXZGravity(&this->actor); } if (this->moveMode == BBMOVE_NORMAL) { diff --git a/soh/src/overlays/actors/ovl_En_Bdfire/z_en_bdfire.c b/soh/src/overlays/actors/ovl_En_Bdfire/z_en_bdfire.c index eeeec465c..12255f599 100644 --- a/soh/src/overlays/actors/ovl_En_Bdfire/z_en_bdfire.c +++ b/soh/src/overlays/actors/ovl_En_Bdfire/z_en_bdfire.c @@ -7,7 +7,7 @@ #include "z_en_bdfire.h" #include "objects/object_kingdodongo/object_kingdodongo.h" -#define FLAGS (ACTOR_FLAG_UPDATE_WHILE_CULLED | ACTOR_FLAG_DRAW_WHILE_CULLED) +#define FLAGS (ACTOR_FLAG_UPDATE_CULLING_DISABLED | ACTOR_FLAG_DRAW_CULLING_DISABLED) void EnBdfire_Init(Actor* thisx, PlayState* play); void EnBdfire_Destroy(Actor* thisx, PlayState* play); diff --git a/soh/src/overlays/actors/ovl_En_Bigokuta/z_en_bigokuta.c b/soh/src/overlays/actors/ovl_En_Bigokuta/z_en_bigokuta.c index aa53182c5..27ba0e3f2 100644 --- a/soh/src/overlays/actors/ovl_En_Bigokuta/z_en_bigokuta.c +++ b/soh/src/overlays/actors/ovl_En_Bigokuta/z_en_bigokuta.c @@ -3,7 +3,7 @@ #include "soh/Enhancements/game-interactor/GameInteractor_Hooks.h" #include "soh/ResourceManagerHelpers.h" -#define FLAGS (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_HOSTILE | ACTOR_FLAG_UPDATE_WHILE_CULLED | ACTOR_FLAG_DRAW_WHILE_CULLED) +#define FLAGS (ACTOR_FLAG_ATTENTION_ENABLED | ACTOR_FLAG_HOSTILE | ACTOR_FLAG_UPDATE_CULLING_DISABLED | ACTOR_FLAG_DRAW_CULLING_DISABLED) void EnBigokuta_Init(Actor* thisx, PlayState* play); void EnBigokuta_Destroy(Actor* thisx, PlayState* play); @@ -388,7 +388,7 @@ void func_809BD6B8(EnBigokuta* this) { void func_809BD768(EnBigokuta* this) { this->unk_194 = Rand_ZeroOne() < 0.5f ? -1 : 1; this->unk_19A = 0; - this->actor.flags &= ~ACTOR_FLAG_TARGETABLE; + this->actor.flags &= ~ACTOR_FLAG_ATTENTION_ENABLED; this->cylinder[0].base.atFlags &= ~AT_ON; Audio_PlayActorSound2(&this->actor, NA_SE_EN_DAIOCTA_SINK); this->actionFunc = func_809BE4A4; @@ -690,7 +690,7 @@ void func_809BE4A4(EnBigokuta* this, PlayState* play) { void func_809BE518(EnBigokuta* this, PlayState* play) { if (Math_StepToF(&this->actor.world.pos.y, this->actor.home.pos.y, 10.0f)) { - this->actor.flags |= ACTOR_FLAG_TARGETABLE; + this->actor.flags |= ACTOR_FLAG_ATTENTION_ENABLED; func_809BD3F8(this); } } @@ -791,7 +791,7 @@ void EnBigokuta_Update(Actor* thisx, PlayState* play2) { for (i = 0; i < ARRAY_COUNT(this->cylinder); i++) { CollisionCheck_SetAT(play, &play->colChkCtx, &this->cylinder[i].base); } - this->actor.flags |= ACTOR_FLAG_PLAY_HIT_SFX; + this->actor.flags |= ACTOR_FLAG_SFX_FOR_PLAYER_BODY_HIT; } else { for (i = 0; i < ARRAY_COUNT(this->cylinder); i++) { CollisionCheck_SetOC(play, &play->colChkCtx, &this->cylinder[i].base); diff --git a/soh/src/overlays/actors/ovl_En_Bili/z_en_bili.c b/soh/src/overlays/actors/ovl_En_Bili/z_en_bili.c index cd927a5c2..0f9090a9c 100644 --- a/soh/src/overlays/actors/ovl_En_Bili/z_en_bili.c +++ b/soh/src/overlays/actors/ovl_En_Bili/z_en_bili.c @@ -9,7 +9,7 @@ #include "soh/Enhancements/game-interactor/GameInteractor_Hooks.h" #include "soh/ResourceManagerHelpers.h" -#define FLAGS (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_HOSTILE | ACTOR_FLAG_IGNORE_QUAKE | ACTOR_FLAG_ARROW_DRAGGABLE) +#define FLAGS (ACTOR_FLAG_ATTENTION_ENABLED | ACTOR_FLAG_HOSTILE | ACTOR_FLAG_IGNORE_QUAKE | ACTOR_FLAG_CAN_ATTACH_TO_ARROW) void EnBili_Init(Actor* thisx, PlayState* play); void EnBili_Destroy(Actor* thisx, PlayState* play); @@ -224,7 +224,7 @@ void EnBili_SetupBurnt(EnBili* this) { this->timer = 20; this->collider.base.atFlags &= ~AT_ON; this->collider.base.acFlags &= ~AC_ON; - this->actor.flags |= ACTOR_FLAG_UPDATE_WHILE_CULLED; + this->actor.flags |= ACTOR_FLAG_UPDATE_CULLING_DISABLED; this->actor.speedXZ = 0.0f; Actor_SetColorFilter(&this->actor, 0x4000, 0xC8, 0x2000, 0x14); this->actionFunc = EnBili_Burnt; @@ -232,7 +232,7 @@ void EnBili_SetupBurnt(EnBili* this) { void EnBili_SetupDie(EnBili* this) { this->timer = 18; - this->actor.flags &= ~ACTOR_FLAG_TARGETABLE; + this->actor.flags &= ~ACTOR_FLAG_ATTENTION_ENABLED; this->actionFunc = EnBili_Die; this->actor.speedXZ = 0.0f; GameInteractor_ExecuteOnEnemyDefeat(&this->actor); @@ -256,7 +256,7 @@ void EnBili_SetupFrozen(EnBili* this, PlayState* play) { s32 i; Vec3f effectPos; - if (!(this->actor.flags & ACTOR_FLAG_DRAGGED_BY_ARROW)) { + if (!(this->actor.flags & ACTOR_FLAG_ATTACHED_TO_ARROW)) { this->actor.gravity = -1.0f; } @@ -461,7 +461,7 @@ void EnBili_Recoil(EnBili* this, PlayState* play) { void EnBili_Burnt(EnBili* this, PlayState* play) { SkelAnime_Update(&this->skelAnime); - if (this->actor.flags & ACTOR_FLAG_DRAGGED_BY_ARROW) { + if (this->actor.flags & ACTOR_FLAG_ATTACHED_TO_ARROW) { this->actor.colorFilterTimer = 20; } else { if (this->timer != 0) { @@ -482,7 +482,7 @@ void EnBili_Die(EnBili* this, PlayState* play) { s32 i; if (this->actor.draw != NULL) { - if (this->actor.flags & ACTOR_FLAG_DRAGGED_BY_ARROW) { + if (this->actor.flags & ACTOR_FLAG_ATTACHED_TO_ARROW) { return; } this->actor.draw = NULL; @@ -538,7 +538,7 @@ void EnBili_Frozen(EnBili* this, PlayState* play) { this->timer--; } - if (!(this->actor.flags & ACTOR_FLAG_DRAGGED_BY_ARROW)) { + if (!(this->actor.flags & ACTOR_FLAG_ATTACHED_TO_ARROW)) { this->actor.gravity = -1.0f; } @@ -561,7 +561,7 @@ void EnBili_UpdateDamage(EnBili* this, PlayState* play) { if (Actor_ApplyDamage(&this->actor) == 0) { Audio_PlayActorSound2(&this->actor, NA_SE_EN_BIRI_DEAD); Enemy_StartFinishingBlow(play, &this->actor); - this->actor.flags &= ~ACTOR_FLAG_TARGETABLE; + this->actor.flags &= ~ACTOR_FLAG_ATTENTION_ENABLED; } damageEffect = this->actor.colChkInfo.damageEffect; @@ -593,7 +593,7 @@ void EnBili_UpdateDamage(EnBili* this, PlayState* play) { } if (this->collider.info.acHitInfo->toucher.dmgFlags & 0x1F820) { // DMG_ARROW - this->actor.flags |= ACTOR_FLAG_UPDATE_WHILE_CULLED; + this->actor.flags |= ACTOR_FLAG_UPDATE_CULLING_DISABLED; } } } diff --git a/soh/src/overlays/actors/ovl_En_Blkobj/z_en_blkobj.c b/soh/src/overlays/actors/ovl_En_Blkobj/z_en_blkobj.c index 43d142fab..f31e05a9f 100644 --- a/soh/src/overlays/actors/ovl_En_Blkobj/z_en_blkobj.c +++ b/soh/src/overlays/actors/ovl_En_Blkobj/z_en_blkobj.c @@ -8,7 +8,7 @@ #include "objects/object_blkobj/object_blkobj.h" #include "soh/Enhancements/game-interactor/GameInteractor.h" -#define FLAGS (ACTOR_FLAG_UPDATE_WHILE_CULLED | ACTOR_FLAG_DRAW_WHILE_CULLED) +#define FLAGS (ACTOR_FLAG_UPDATE_CULLING_DISABLED | ACTOR_FLAG_DRAW_CULLING_DISABLED) void EnBlkobj_Init(Actor* thisx, PlayState* play); void EnBlkobj_Destroy(Actor* thisx, PlayState* play); @@ -89,7 +89,7 @@ void EnBlkobj_Wait(EnBlkobj* this, PlayState* play) { } void EnBlkobj_SpawnDarkLink(EnBlkobj* this, PlayState* play) { - if (!(this->dyna.actor.flags & ACTOR_FLAG_ACTIVE)) { + if (!(this->dyna.actor.flags & ACTOR_FLAG_INSIDE_CULLING_VOLUME)) { Actor_Spawn(&play->actorCtx, play, ACTOR_EN_TORCH2, this->dyna.actor.world.pos.x, this->dyna.actor.world.pos.y, this->dyna.actor.world.pos.z, 0, this->dyna.actor.yawTowardsPlayer, 0, 0, true); diff --git a/soh/src/overlays/actors/ovl_En_Bom/z_en_bom.c b/soh/src/overlays/actors/ovl_En_Bom/z_en_bom.c index e5c9c2a99..1efbdd5d7 100644 --- a/soh/src/overlays/actors/ovl_En_Bom/z_en_bom.c +++ b/soh/src/overlays/actors/ovl_En_Bom/z_en_bom.c @@ -10,7 +10,7 @@ #include "soh/Enhancements/game-interactor/GameInteractor.h" #include -#define FLAGS (ACTOR_FLAG_UPDATE_WHILE_CULLED | ACTOR_FLAG_DRAW_WHILE_CULLED) +#define FLAGS (ACTOR_FLAG_UPDATE_CULLING_DISABLED | ACTOR_FLAG_DRAW_CULLING_DISABLED) void EnBom_Init(Actor* thisx, PlayState* play); void EnBom_Destroy(Actor* thisx, PlayState* play); @@ -195,7 +195,7 @@ void EnBom_Explode(EnBom* this, PlayState* play) { Player* player; if (this->explosionCollider.elements[0].dim.modelSphere.radius == 0) { - this->actor.flags |= ACTOR_FLAG_DRAW_WHILE_CULLED; + this->actor.flags |= ACTOR_FLAG_DRAW_CULLING_DISABLED; func_800AA000(this->actor.xzDistToPlayer, 0xFF, 0x14, 0x96); } @@ -357,7 +357,7 @@ void EnBom_Update(Actor* thisx, PlayState* play2) { Camera_AddQuake(&play->mainCamera, 2, 0xB, 8); thisx->params = BOMB_EXPLOSION; this->timer = 10; - thisx->flags |= ACTOR_FLAG_DRAW_WHILE_CULLED; + thisx->flags |= ACTOR_FLAG_DRAW_CULLING_DISABLED; EnBom_SetupAction(this, EnBom_Explode); } } diff --git a/soh/src/overlays/actors/ovl_En_Bom_Bowl_Man/z_en_bom_bowl_man.c b/soh/src/overlays/actors/ovl_En_Bom_Bowl_Man/z_en_bom_bowl_man.c index 2cb108703..9d9ed8a53 100644 --- a/soh/src/overlays/actors/ovl_En_Bom_Bowl_Man/z_en_bom_bowl_man.c +++ b/soh/src/overlays/actors/ovl_En_Bom_Bowl_Man/z_en_bom_bowl_man.c @@ -8,7 +8,7 @@ #include "soh/Enhancements/game-interactor/GameInteractor.h" #include "soh/Enhancements/game-interactor/GameInteractor_Hooks.h" -#define FLAGS (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_FRIENDLY | ACTOR_FLAG_UPDATE_WHILE_CULLED | ACTOR_FLAG_DRAW_WHILE_CULLED | ACTOR_FLAG_NO_LOCKON) +#define FLAGS (ACTOR_FLAG_ATTENTION_ENABLED | ACTOR_FLAG_FRIENDLY | ACTOR_FLAG_UPDATE_CULLING_DISABLED | ACTOR_FLAG_DRAW_CULLING_DISABLED | ACTOR_FLAG_LOCK_ON_DISABLED) typedef enum { /* 0 */ CHU_GIRL_EYES_ASLEEP, @@ -179,7 +179,7 @@ void EnBomBowMan_CheckBeatenDC(EnBomBowlMan* this, PlayState* play) { if (IS_RANDO) { // when rando'd, check if we have bombchus if chus are in logic // and check if we have a bomb bag if chus aren't in logic - u8 explosive = Randomizer_GetSettingValue(RSK_BOMBCHUS_IN_LOGIC) ? ITEM_BOMBCHU : ITEM_BOMB; + u8 explosive = Randomizer_GetSettingValue(RSK_BOMBCHU_BAG) ? ITEM_BOMBCHU : ITEM_BOMB; bombchuBowlingClosed = (INV_CONTENT(explosive) == ITEM_NONE); } else { // if not rando'd, check if we have beaten Dodongo's Cavern diff --git a/soh/src/overlays/actors/ovl_En_Bom_Bowl_Pit/z_en_bom_bowl_pit.c b/soh/src/overlays/actors/ovl_En_Bom_Bowl_Pit/z_en_bom_bowl_pit.c index 6c68b3831..712a9008d 100644 --- a/soh/src/overlays/actors/ovl_En_Bom_Bowl_Pit/z_en_bom_bowl_pit.c +++ b/soh/src/overlays/actors/ovl_En_Bom_Bowl_Pit/z_en_bom_bowl_pit.c @@ -5,7 +5,7 @@ #include "soh/OTRGlobals.h" #include "soh/Enhancements/game-interactor/GameInteractor_Hooks.h" -#define FLAGS ACTOR_FLAG_UPDATE_WHILE_CULLED +#define FLAGS ACTOR_FLAG_UPDATE_CULLING_DISABLED void EnBomBowlPit_Init(Actor* thisx, PlayState* play); void EnBomBowlPit_Destroy(Actor* thisx, PlayState* play); diff --git a/soh/src/overlays/actors/ovl_En_Bom_Chu/z_en_bom_chu.c b/soh/src/overlays/actors/ovl_En_Bom_Chu/z_en_bom_chu.c index df74e5317..e0b2bd7cb 100644 --- a/soh/src/overlays/actors/ovl_En_Bom_Chu/z_en_bom_chu.c +++ b/soh/src/overlays/actors/ovl_En_Bom_Chu/z_en_bom_chu.c @@ -2,7 +2,7 @@ #include "overlays/actors/ovl_En_Bom/z_en_bom.h" #include "objects/gameplay_keep/gameplay_keep.h" -#define FLAGS ACTOR_FLAG_UPDATE_WHILE_CULLED +#define FLAGS ACTOR_FLAG_UPDATE_CULLING_DISABLED #define BOMBCHU_SCALE 0.01f @@ -240,7 +240,7 @@ void EnBomChu_WaitForRelease(EnBomChu* this, PlayState* play) { //! @bug there is no NULL check on the floor poly. If the player is out of bounds the floor poly will be NULL //! and will cause a crash inside this function. EnBomChu_UpdateFloorPoly(this, this->actor.floorPoly, play); - this->actor.flags |= ACTOR_FLAG_TARGETABLE; // make chu targetable + this->actor.flags |= ACTOR_FLAG_ATTENTION_ENABLED; // make chu targetable func_8002F850(play, &this->actor); this->actionFunc = EnBomChu_Move; } diff --git a/soh/src/overlays/actors/ovl_En_Bombf/z_en_bombf.c b/soh/src/overlays/actors/ovl_En_Bombf/z_en_bombf.c index 2be1a20fc..a002f0d1c 100644 --- a/soh/src/overlays/actors/ovl_En_Bombf/z_en_bombf.c +++ b/soh/src/overlays/actors/ovl_En_Bombf/z_en_bombf.c @@ -8,7 +8,7 @@ #include "objects/object_bombf/object_bombf.h" #include "overlays/effects/ovl_Effect_Ss_Dead_Sound/z_eff_ss_dead_sound.h" -#define FLAGS (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_UPDATE_WHILE_CULLED) +#define FLAGS (ACTOR_FLAG_ATTENTION_ENABLED | ACTOR_FLAG_UPDATE_CULLING_DISABLED) void EnBombf_Init(Actor* thisx, PlayState* play); void EnBombf_Destroy(Actor* thisx, PlayState* play); @@ -105,7 +105,7 @@ void EnBombf_Init(Actor* thisx, PlayState* play) { thisx->focus.pos = thisx->world.pos; if (Actor_FindNearby(play, thisx, ACTOR_BG_DDAN_KD, ACTORCAT_BG, 10000.0f) != NULL) { - thisx->flags |= ACTOR_FLAG_DRAW_WHILE_CULLED; + thisx->flags |= ACTOR_FLAG_DRAW_CULLING_DISABLED; } thisx->colChkInfo.cylRadius = 10.0f; @@ -118,7 +118,7 @@ void EnBombf_Init(Actor* thisx, PlayState* play) { thisx->gravity = -1.5f; Actor_ChangeCategory(play, &play->actorCtx, thisx, ACTORCAT_EXPLOSIVE); thisx->colChkInfo.mass = 200; - thisx->flags &= ~ACTOR_FLAG_TARGETABLE; + thisx->flags &= ~ACTOR_FLAG_ATTENTION_ENABLED; EnBombf_SetupAction(this, EnBombf_Move); } else { thisx->colChkInfo.mass = MASS_IMMOVABLE; @@ -158,7 +158,7 @@ void EnBombf_GrowBomb(EnBombf* this, PlayState* play) { this->timer = 180; this->flowerBombScale = 0.0f; Audio_PlayActorSound2(&this->actor, NA_SE_PL_PULL_UP_ROCK); - this->actor.flags &= ~ACTOR_FLAG_TARGETABLE; + this->actor.flags &= ~ACTOR_FLAG_ATTENTION_ENABLED; } else { player->actor.child = NULL; player->heldActor = NULL; @@ -177,7 +177,7 @@ void EnBombf_GrowBomb(EnBombf* this, PlayState* play) { bombFlower->isFuseEnabled = 1; bombFlower->timer = 0; this->timer = 180; - this->actor.flags &= ~ACTOR_FLAG_TARGETABLE; + this->actor.flags &= ~ACTOR_FLAG_ATTENTION_ENABLED; this->flowerBombScale = 0.0f; } } @@ -189,7 +189,7 @@ void EnBombf_GrowBomb(EnBombf* this, PlayState* play) { if (bombFlower != NULL) { bombFlower->timer = 100; this->timer = 180; - this->actor.flags &= ~ACTOR_FLAG_TARGETABLE; + this->actor.flags &= ~ACTOR_FLAG_ATTENTION_ENABLED; this->flowerBombScale = 0.0f; } } else { @@ -209,7 +209,7 @@ void EnBombf_GrowBomb(EnBombf* this, PlayState* play) { if (this->timer == 0) { this->flowerBombScale += 0.05f; if (this->flowerBombScale >= 1.0f) { - this->actor.flags |= ACTOR_FLAG_TARGETABLE; + this->actor.flags |= ACTOR_FLAG_ATTENTION_ENABLED; } } @@ -263,7 +263,7 @@ void EnBombf_Explode(EnBombf* this, PlayState* play) { Player* player; if (this->explosionCollider.elements[0].dim.modelSphere.radius == 0) { - this->actor.flags |= ACTOR_FLAG_DRAW_WHILE_CULLED; + this->actor.flags |= ACTOR_FLAG_DRAW_CULLING_DISABLED; func_800AA000(this->actor.xzDistToPlayer, 0xFF, 0x14, 0x96); } @@ -430,7 +430,7 @@ void EnBombf_Update(Actor* thisx, PlayState* play) { Camera_AddQuake(&play->mainCamera, 2, 0xB, 8); thisx->params = BOMBFLOWER_EXPLOSION; this->timer = 10; - thisx->flags |= ACTOR_FLAG_DRAW_WHILE_CULLED; + thisx->flags |= ACTOR_FLAG_DRAW_CULLING_DISABLED; EnBombf_SetupAction(this, EnBombf_Explode); } } diff --git a/soh/src/overlays/actors/ovl_En_Boom/z_en_boom.c b/soh/src/overlays/actors/ovl_En_Boom/z_en_boom.c index 6079c1ff5..6f4d00084 100644 --- a/soh/src/overlays/actors/ovl_En_Boom/z_en_boom.c +++ b/soh/src/overlays/actors/ovl_En_Boom/z_en_boom.c @@ -7,7 +7,7 @@ #include "z_en_boom.h" #include "objects/gameplay_keep/gameplay_keep.h" -#define FLAGS (ACTOR_FLAG_UPDATE_WHILE_CULLED | ACTOR_FLAG_DRAW_WHILE_CULLED) +#define FLAGS (ACTOR_FLAG_UPDATE_CULLING_DISABLED | ACTOR_FLAG_DRAW_CULLING_DISABLED) void EnBoom_Init(Actor* thisx, PlayState* play); void EnBoom_Destroy(Actor* thisx, PlayState* play); diff --git a/soh/src/overlays/actors/ovl_En_Box/z_en_box.c b/soh/src/overlays/actors/ovl_En_Box/z_en_box.c index bcb0cb1fc..6977f4ee4 100644 --- a/soh/src/overlays/actors/ovl_En_Box/z_en_box.c +++ b/soh/src/overlays/actors/ovl_En_Box/z_en_box.c @@ -156,7 +156,7 @@ void EnBox_Init(Actor* thisx, PlayState* play2) { EnBox_SetupAction(this, EnBox_FallOnSwitchFlag); this->alpha = 0; this->movementFlags |= ENBOX_MOVE_IMMOBILE; - this->dyna.actor.flags |= ACTOR_FLAG_UPDATE_WHILE_CULLED; + this->dyna.actor.flags |= ACTOR_FLAG_UPDATE_CULLING_DISABLED; } else if ((this->type == ENBOX_TYPE_ROOM_CLEAR_BIG || this->type == ENBOX_TYPE_ROOM_CLEAR_SMALL) && !Flags_GetClear(play, this->dyna.actor.room)) { EnBox_SetupAction(this, EnBox_AppearOnRoomClear); @@ -164,25 +164,25 @@ void EnBox_Init(Actor* thisx, PlayState* play2) { this->movementFlags |= ENBOX_MOVE_IMMOBILE; this->dyna.actor.world.pos.y = this->dyna.actor.home.pos.y - 50.0f; this->alpha = 0; - this->dyna.actor.flags |= ACTOR_FLAG_UPDATE_WHILE_CULLED; + this->dyna.actor.flags |= ACTOR_FLAG_UPDATE_CULLING_DISABLED; } else if (this->type == ENBOX_TYPE_9 || this->type == ENBOX_TYPE_10) { EnBox_SetupAction(this, func_809C9700); - this->dyna.actor.flags |= ACTOR_FLAG_NO_FREEZE_OCARINA; + this->dyna.actor.flags |= ACTOR_FLAG_UPDATE_DURING_OCARINA; func_8003EBF8(play, &play->colCtx.dyna, this->dyna.bgId); this->movementFlags |= ENBOX_MOVE_IMMOBILE; this->dyna.actor.world.pos.y = this->dyna.actor.home.pos.y - 50.0f; this->alpha = 0; - this->dyna.actor.flags |= ACTOR_FLAG_UPDATE_WHILE_CULLED; + this->dyna.actor.flags |= ACTOR_FLAG_UPDATE_CULLING_DISABLED; } else if (this->type == ENBOX_TYPE_SWITCH_FLAG_BIG && !Flags_GetSwitch(play, this->switchFlag)) { EnBox_SetupAction(this, EnBox_AppearOnSwitchFlag); func_8003EBF8(play, &play->colCtx.dyna, this->dyna.bgId); this->movementFlags |= ENBOX_MOVE_IMMOBILE; this->dyna.actor.world.pos.y = this->dyna.actor.home.pos.y - 50.0f; this->alpha = 0; - this->dyna.actor.flags |= ACTOR_FLAG_UPDATE_WHILE_CULLED; + this->dyna.actor.flags |= ACTOR_FLAG_UPDATE_CULLING_DISABLED; } else { if (this->type == ENBOX_TYPE_4 || this->type == ENBOX_TYPE_6) { - this->dyna.actor.flags |= ACTOR_FLAG_LENS; + this->dyna.actor.flags |= ACTOR_FLAG_REACT_TO_LENS; } EnBox_SetupAction(this, EnBox_WaitOpen); this->movementFlags |= ENBOX_MOVE_IMMOBILE; @@ -335,7 +335,7 @@ void func_809C9700(EnBox* this, PlayState* play) { } else if (this->unk_1FB == ENBOX_STATE_2 && play->msgCtx.ocarinaMode == OCARINA_MODE_04) { if ((play->msgCtx.lastPlayedSong == OCARINA_SONG_LULLABY && this->type == ENBOX_TYPE_9) || (play->msgCtx.lastPlayedSong == OCARINA_SONG_SUNS && this->type == ENBOX_TYPE_10)) { - this->dyna.actor.flags &= ~ACTOR_FLAG_NO_FREEZE_OCARINA; + this->dyna.actor.flags &= ~ACTOR_FLAG_UPDATE_DURING_OCARINA; EnBox_SetupAction(this, EnBox_AppearInit); OnePointCutscene_Attention(play, &this->dyna.actor); this->unk_1A8 = 0; @@ -466,7 +466,7 @@ void EnBox_WaitOpen(EnBox* this, PlayState* play) { void EnBox_Open(EnBox* this, PlayState* play) { u16 sfxId; - this->dyna.actor.flags &= ~ACTOR_FLAG_LENS; + this->dyna.actor.flags &= ~ACTOR_FLAG_REACT_TO_LENS; if (SkelAnime_Update(&this->skelanime)) { if (this->unk_1F4 > 0) { @@ -487,7 +487,7 @@ void EnBox_Open(EnBox* this, PlayState* play) { if (Animation_OnFrame(&this->skelanime, 30.0f)) { sfxId = NA_SE_EV_TBOX_UNLOCK; - gSaveContext.sohStats.count[COUNT_CHESTS_OPENED]++; + gSaveContext.ship.stats.count[COUNT_CHESTS_OPENED]++; } else if (Animation_OnFrame(&this->skelanime, 90.0f)) { sfxId = NA_SE_EV_TBOX_OPEN; } @@ -582,6 +582,7 @@ void EnBox_UpdateSizeAndTexture(EnBox* this, PlayState* play) { (play->sceneNum == SCENE_TREASURE_BOX_SHOP && this->dyna.actor.room != 6); // Exclude treasure game chests except for the final room if (!isVanilla) { + GetItemEntry test = this->getItemEntry; getItemCategory = this->getItemEntry.getItemCategory; // If they have bombchus, don't consider the bombchu item major if ( @@ -912,11 +913,11 @@ void EnBox_Draw(Actor* thisx, PlayState* play) { OPEN_DISPS(play->state.gfxCtx); /* - this->dyna.actor.flags & ACTOR_FLAG_LENS is set by Init (if type is 4 or 6) + this->dyna.actor.flags & ACTOR_FLAG_REACT_TO_LENS is set by Init (if type is 4 or 6) and cleared by Open */ if ((this->alpha == 255 && !(this->type == ENBOX_TYPE_4 || this->type == ENBOX_TYPE_6)) || - (!CHECK_FLAG_ALL(this->dyna.actor.flags, ACTOR_FLAG_LENS) && + (!CHECK_FLAG_ALL(this->dyna.actor.flags, ACTOR_FLAG_REACT_TO_LENS) && (this->type == ENBOX_TYPE_4 || this->type == ENBOX_TYPE_6))) { gDPPipeSync(POLY_OPA_DISP++); gDPSetEnvColor(POLY_OPA_DISP++, 0, 0, 0, 255); diff --git a/soh/src/overlays/actors/ovl_En_Brob/z_en_brob.c b/soh/src/overlays/actors/ovl_En_Brob/z_en_brob.c index fbedc59bd..11dad1a11 100644 --- a/soh/src/overlays/actors/ovl_En_Brob/z_en_brob.c +++ b/soh/src/overlays/actors/ovl_En_Brob/z_en_brob.c @@ -8,7 +8,7 @@ #include "objects/object_brob/object_brob.h" #include "soh/ResourceManagerHelpers.h" -#define FLAGS (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_HOSTILE) +#define FLAGS (ACTOR_FLAG_ATTENTION_ENABLED | ACTOR_FLAG_HOSTILE) void EnBrob_Init(Actor* thisx, PlayState* play); void EnBrob_Destroy(Actor* thisx, PlayState* play); @@ -93,7 +93,7 @@ void EnBrob_Init(Actor* thisx, PlayState* play) { this->colliders[1].dim.height *= thisx->scale.y; this->colliders[1].dim.yShift *= thisx->scale.y; this->actionFunc = NULL; - thisx->flags &= ~ACTOR_FLAG_TARGETABLE; + thisx->flags &= ~ACTOR_FLAG_ATTENTION_ENABLED; func_809CADDC(this, play); } diff --git a/soh/src/overlays/actors/ovl_En_Bubble/z_en_bubble.c b/soh/src/overlays/actors/ovl_En_Bubble/z_en_bubble.c index 7965d2df1..b29e9044c 100644 --- a/soh/src/overlays/actors/ovl_En_Bubble/z_en_bubble.c +++ b/soh/src/overlays/actors/ovl_En_Bubble/z_en_bubble.c @@ -2,7 +2,7 @@ #include "objects/object_bubble/object_bubble.h" #include "soh/Enhancements/game-interactor/GameInteractor_Hooks.h" -#define FLAGS ACTOR_FLAG_TARGETABLE +#define FLAGS ACTOR_FLAG_ATTENTION_ENABLED void EnBubble_Init(Actor* thisx, PlayState* play); void EnBubble_Destroy(Actor* thisx, PlayState* play); @@ -80,7 +80,7 @@ void EnBubble_SetDimensions(EnBubble* this, f32 dim) { f32 c; f32 d; - this->actor.flags |= ACTOR_FLAG_TARGETABLE; + this->actor.flags |= ACTOR_FLAG_ATTENTION_ENABLED; Actor_SetScale(&this->actor, 1.0f); this->actor.shape.yOffset = 16.0f; this->graphicRotSpeed = 16.0f; @@ -149,7 +149,7 @@ s32 EnBubble_Explosion(EnBubble* this, PlayState* play) { &sEffectEnvColor, Rand_S16Offset(100, 50), 0x19, 0); } Item_DropCollectibleRandom(play, NULL, &this->actor.world.pos, 0x50); - this->actor.flags &= ~ACTOR_FLAG_TARGETABLE; + this->actor.flags &= ~ACTOR_FLAG_ATTENTION_ENABLED; return Rand_S16Offset(90, 60); } diff --git a/soh/src/overlays/actors/ovl_En_Butte/z_en_butte.c b/soh/src/overlays/actors/ovl_En_Butte/z_en_butte.c index 3bdfe377d..8a1f3ea2d 100644 --- a/soh/src/overlays/actors/ovl_En_Butte/z_en_butte.c +++ b/soh/src/overlays/actors/ovl_En_Butte/z_en_butte.c @@ -353,7 +353,7 @@ void EnButte_FollowLink(EnButte* this, PlayState* play) { void EnButte_SetupTransformIntoFairy(EnButte* this) { this->timer = 9; - this->actor.flags |= ACTOR_FLAG_UPDATE_WHILE_CULLED; + this->actor.flags |= ACTOR_FLAG_UPDATE_CULLING_DISABLED; this->skelAnime.playSpeed = 1.0f; EnButte_ResetTransformationEffect(); this->actionFunc = EnButte_TransformIntoFairy; diff --git a/soh/src/overlays/actors/ovl_En_Bw/z_en_bw.c b/soh/src/overlays/actors/ovl_En_Bw/z_en_bw.c index 84754caba..4c1730ae2 100644 --- a/soh/src/overlays/actors/ovl_En_Bw/z_en_bw.c +++ b/soh/src/overlays/actors/ovl_En_Bw/z_en_bw.c @@ -10,7 +10,7 @@ #include "soh/Enhancements/game-interactor/GameInteractor_Hooks.h" #include "soh/ResourceManagerHelpers.h" -#define FLAGS (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_HOSTILE | ACTOR_FLAG_UPDATE_WHILE_CULLED) +#define FLAGS (ACTOR_FLAG_ATTENTION_ENABLED | ACTOR_FLAG_HOSTILE | ACTOR_FLAG_UPDATE_CULLING_DISABLED) void EnBw_Init(Actor* thisx, PlayState* play); void EnBw_Destroy(Actor* thisx, PlayState* play); @@ -434,7 +434,7 @@ void func_809CF8F0(EnBw* this) { this->unk_222 = 1000; this->actor.velocity.y = 11.0f; Audio_PlayActorSound2(&this->actor, NA_SE_EN_STAL_JUMP); - this->actor.flags |= ACTOR_FLAG_PLAY_HIT_SFX; + this->actor.flags |= ACTOR_FLAG_SFX_FOR_PLAYER_BODY_HIT; EnBw_SetupAction(this, func_809CF984); } @@ -464,7 +464,7 @@ void func_809CF984(EnBw* this, PlayState* play) { } Actor_SpawnFloorDustRing(play, &this->actor, &this->actor.world.pos, 30.0f, 11, 4.0f, 0, 0, false); this->unk_222 = 3000; - this->actor.flags &= ~ACTOR_FLAG_PLAY_HIT_SFX; + this->actor.flags &= ~ACTOR_FLAG_SFX_FOR_PLAYER_BODY_HIT; this->actor.speedXZ = 0.0f; Audio_PlayActorSound2(&this->actor, NA_SE_EN_DODO_M_GND); EnBw_SetupAction(this, func_809CE884); @@ -575,7 +575,7 @@ void func_809CFF98(EnBw* this, PlayState* play) { void func_809D00F4(EnBw* this) { this->unk_220 = 0; this->unk_222 = 40; - this->actor.flags &= ~ACTOR_FLAG_TARGETABLE; + this->actor.flags &= ~ACTOR_FLAG_ATTENTION_ENABLED; this->actor.speedXZ = 0.0f; Audio_PlayActorSound2(&this->actor, NA_SE_EN_BUBLEWALK_DEAD); EnBw_SetupAction(this, func_809D014C); diff --git a/soh/src/overlays/actors/ovl_En_Bx/z_en_bx.c b/soh/src/overlays/actors/ovl_En_Bx/z_en_bx.c index 626ca53bc..26e02d52e 100644 --- a/soh/src/overlays/actors/ovl_En_Bx/z_en_bx.c +++ b/soh/src/overlays/actors/ovl_En_Bx/z_en_bx.c @@ -8,7 +8,7 @@ #include "objects/object_bxa/object_bxa.h" #include "soh/frame_interpolation.h" -#define FLAGS ACTOR_FLAG_UPDATE_WHILE_CULLED +#define FLAGS ACTOR_FLAG_UPDATE_CULLING_DISABLED void EnBx_Init(Actor* thisx, PlayState* play); void EnBx_Destroy(Actor* thisx, PlayState* play); diff --git a/soh/src/overlays/actors/ovl_En_Changer/z_en_changer.c b/soh/src/overlays/actors/ovl_En_Changer/z_en_changer.c index 18609091b..4c4695e77 100644 --- a/soh/src/overlays/actors/ovl_En_Changer/z_en_changer.c +++ b/soh/src/overlays/actors/ovl_En_Changer/z_en_changer.c @@ -201,7 +201,7 @@ void EnChanger_Init(Actor* thisx, PlayState* play2) { ((this->rightChestNum & 0x1F) << 8) + (rightChestItem & 0xFF), true); } - this->actor.flags &= ~ACTOR_FLAG_TARGETABLE; + this->actor.flags &= ~ACTOR_FLAG_ATTENTION_ENABLED; this->actionFunc = EnChanger_Wait; } diff --git a/soh/src/overlays/actors/ovl_En_Clear_Tag/z_en_clear_tag.c b/soh/src/overlays/actors/ovl_En_Clear_Tag/z_en_clear_tag.c index 753c3d537..b7a6bd4a6 100644 --- a/soh/src/overlays/actors/ovl_En_Clear_Tag/z_en_clear_tag.c +++ b/soh/src/overlays/actors/ovl_En_Clear_Tag/z_en_clear_tag.c @@ -5,7 +5,7 @@ #include "soh/frame_interpolation.h" #include "soh/Enhancements/game-interactor/GameInteractor_Hooks.h" -#define FLAGS (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_HOSTILE | ACTOR_FLAG_UPDATE_WHILE_CULLED | ACTOR_FLAG_DRAW_WHILE_CULLED) +#define FLAGS (ACTOR_FLAG_ATTENTION_ENABLED | ACTOR_FLAG_HOSTILE | ACTOR_FLAG_UPDATE_CULLING_DISABLED | ACTOR_FLAG_DRAW_CULLING_DISABLED) void EnClearTag_Init(Actor* thisx, PlayState* play); void EnClearTag_Destroy(Actor* thisx, PlayState* play); @@ -266,7 +266,7 @@ void EnClearTag_Init(Actor* thisx, PlayState* play) { Actor_ChangeCategory(play, &play->actorCtx, thisx, ACTORCAT_ENEMY); } - this->actor.flags |= ACTOR_FLAG_TARGETABLE; + this->actor.flags |= ACTOR_FLAG_ATTENTION_ENABLED; this->actor.targetMode = 5; Collider_SetCylinder(play, &this->collider, &this->actor, &sArwingCylinderInit); this->actor.colChkInfo.health = 3; @@ -553,7 +553,7 @@ void EnClearTag_Update(Actor* thisx, PlayState* play2) { if (this->drawMode != CLEAR_TAG_DRAW_MODE_ARWING) { this->drawMode = CLEAR_TAG_DRAW_MODE_EFFECT; this->deathTimer = 70; - this->actor.flags &= ~ACTOR_FLAG_TARGETABLE; + this->actor.flags &= ~ACTOR_FLAG_ATTENTION_ENABLED; } else { Actor_Kill(&this->actor); } diff --git a/soh/src/overlays/actors/ovl_En_Cow/z_en_cow.c b/soh/src/overlays/actors/ovl_En_Cow/z_en_cow.c index 40d206ecc..ec5d0f093 100644 --- a/soh/src/overlays/actors/ovl_En_Cow/z_en_cow.c +++ b/soh/src/overlays/actors/ovl_En_Cow/z_en_cow.c @@ -10,7 +10,7 @@ #include "soh/ResourceManagerHelpers.h" #include "soh/Enhancements/game-interactor/GameInteractor_Hooks.h" -#define FLAGS (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_FRIENDLY) +#define FLAGS (ACTOR_FLAG_ATTENTION_ENABLED | ACTOR_FLAG_FRIENDLY) void EnCow_Init(Actor* thisx, PlayState* play); void EnCow_Destroy(Actor* thisx, PlayState* play); @@ -141,7 +141,7 @@ void EnCow_Init(Actor* thisx, PlayState* play) { this->actor.draw = func_809E0070; this->actionFunc = func_809DFA84; func_809DEF94(this); - this->actor.flags &= ~ACTOR_FLAG_TARGETABLE; + this->actor.flags &= ~ACTOR_FLAG_ATTENTION_ENABLED; this->unk_278 = ((u32)(Rand_ZeroFloat(1000.0f)) & 0xFFFF) + 40.0f; break; } @@ -198,7 +198,7 @@ void func_809DF494(EnCow* this, PlayState* play) { void func_809DF6BC(EnCow* this, PlayState* play) { if ((Message_GetState(&play->msgCtx) == TEXT_STATE_EVENT) && Message_ShouldAdvance(play)) { - this->actor.flags &= ~ACTOR_FLAG_WILL_TALK; + this->actor.flags &= ~ACTOR_FLAG_TALK_OFFER_AUTO_ACCEPTED; Message_CloseTextbox(play); this->actionFunc = func_809DF96C; } @@ -206,7 +206,7 @@ void func_809DF6BC(EnCow* this, PlayState* play) { void func_809DF730(EnCow* this, PlayState* play) { if (Actor_TextboxIsClosing(&this->actor, play)) { - this->actor.flags &= ~ACTOR_FLAG_WILL_TALK; + this->actor.flags &= ~ACTOR_FLAG_TALK_OFFER_AUTO_ACCEPTED; this->actionFunc = func_809DF96C; } } @@ -222,7 +222,7 @@ void func_809DF778(EnCow* this, PlayState* play) { void func_809DF7D8(EnCow* this, PlayState* play) { if ((Message_GetState(&play->msgCtx) == TEXT_STATE_EVENT) && Message_ShouldAdvance(play)) { - this->actor.flags &= ~ACTOR_FLAG_WILL_TALK; + this->actor.flags &= ~ACTOR_FLAG_TALK_OFFER_AUTO_ACCEPTED; Message_CloseTextbox(play); this->actionFunc = func_809DF778; Actor_OfferGetItem(&this->actor, play, GI_MILK, 10000.0f, 100.0f); @@ -245,7 +245,7 @@ void func_809DF8FC(EnCow* this, PlayState* play) { if (Actor_ProcessTalkRequest(&this->actor, play)) { this->actionFunc = func_809DF870; } else { - this->actor.flags |= ACTOR_FLAG_WILL_TALK; + this->actor.flags |= ACTOR_FLAG_TALK_OFFER_AUTO_ACCEPTED; func_8002F2CC(&this->actor, play, 170.0f); this->actor.textId = 0x2006; } @@ -264,7 +264,7 @@ void func_809DF96C(EnCow* this, PlayState* play) { DREG(53) = 0; if (GameInteractor_Should(VB_GIVE_ITEM_FROM_COW, true, this)) { this->actionFunc = func_809DF8FC; - this->actor.flags |= ACTOR_FLAG_WILL_TALK; + this->actor.flags |= ACTOR_FLAG_TALK_OFFER_AUTO_ACCEPTED; func_8002F2CC(&this->actor, play, 170.0f); this->actor.textId = 0x2006; } else { diff --git a/soh/src/overlays/actors/ovl_En_Crow/z_en_crow.c b/soh/src/overlays/actors/ovl_En_Crow/z_en_crow.c index 2ff76ab68..9bc35295c 100644 --- a/soh/src/overlays/actors/ovl_En_Crow/z_en_crow.c +++ b/soh/src/overlays/actors/ovl_En_Crow/z_en_crow.c @@ -3,7 +3,7 @@ #include "soh/Enhancements/game-interactor/GameInteractor_Hooks.h" #include "soh/ResourceManagerHelpers.h" -#define FLAGS (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_HOSTILE | ACTOR_FLAG_IGNORE_QUAKE | ACTOR_FLAG_ARROW_DRAGGABLE) +#define FLAGS (ACTOR_FLAG_ATTENTION_ENABLED | ACTOR_FLAG_HOSTILE | ACTOR_FLAG_IGNORE_QUAKE | ACTOR_FLAG_CAN_ATTACH_TO_ARROW) void EnCrow_Init(Actor* thisx, PlayState* play); void EnCrow_Destroy(Actor* thisx, PlayState* play); @@ -180,12 +180,12 @@ void EnCrow_SetupDamaged(EnCrow* this, PlayState* play) { Actor_SetColorFilter(&this->actor, 0x4000, 255, 0, 40); } - if (this->actor.flags & ACTOR_FLAG_DRAGGED_BY_ARROW) { + if (this->actor.flags & ACTOR_FLAG_ATTACHED_TO_ARROW) { this->actor.speedXZ = 0.0f; } this->collider.base.acFlags &= ~AC_ON; - this->actor.flags |= ACTOR_FLAG_UPDATE_WHILE_CULLED; + this->actor.flags |= ACTOR_FLAG_UPDATE_CULLING_DISABLED; this->actionFunc = EnCrow_Damaged; } @@ -336,7 +336,7 @@ void EnCrow_Damaged(EnCrow* this, PlayState* play) { Math_StepToF(&this->actor.speedXZ, 0.0f, 0.5f); this->actor.colorFilterTimer = 40; - if (!(this->actor.flags & ACTOR_FLAG_DRAGGED_BY_ARROW)) { + if (!(this->actor.flags & ACTOR_FLAG_ATTACHED_TO_ARROW)) { if (this->actor.colorFilterParams & 0x4000) { Math_ScaledStepToS(&this->actor.shape.rot.x, 0x4000, 0x200); this->actor.shape.rot.z += 0x1780; @@ -411,8 +411,8 @@ void EnCrow_Respawn(EnCrow* this, PlayState* play) { target = 0.01f; } if (Math_StepToF(&this->actor.scale.x, target, target * 0.1f)) { - this->actor.flags |= ACTOR_FLAG_TARGETABLE; - this->actor.flags &= ~ACTOR_FLAG_UPDATE_WHILE_CULLED; + this->actor.flags |= ACTOR_FLAG_ATTENTION_ENABLED; + this->actor.flags &= ~ACTOR_FLAG_UPDATE_CULLING_DISABLED; this->actor.colChkInfo.health = 1; EnCrow_SetupFlyIdle(this); } @@ -429,7 +429,7 @@ void EnCrow_UpdateDamage(EnCrow* this, PlayState* play) { EnCrow_SetupTurnAway(this); } else { Actor_ApplyDamage(&this->actor); - this->actor.flags &= ~ACTOR_FLAG_TARGETABLE; + this->actor.flags &= ~ACTOR_FLAG_ATTENTION_ENABLED; Enemy_StartFinishingBlow(play, &this->actor); EnCrow_SetupDamaged(this, play); } diff --git a/soh/src/overlays/actors/ovl_En_Cs/z_en_cs.c b/soh/src/overlays/actors/ovl_En_Cs/z_en_cs.c index 78d4350c6..0c8c8e59e 100644 --- a/soh/src/overlays/actors/ovl_En_Cs/z_en_cs.c +++ b/soh/src/overlays/actors/ovl_En_Cs/z_en_cs.c @@ -3,7 +3,7 @@ #include "objects/object_link_child/object_link_child.h" #include "soh/ResourceManagerHelpers.h" -#define FLAGS (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_FRIENDLY) +#define FLAGS (ACTOR_FLAG_ATTENTION_ENABLED | ACTOR_FLAG_FRIENDLY) void EnCs_Init(Actor* thisx, PlayState* play); void EnCs_Destroy(Actor* thisx, PlayState* play); diff --git a/soh/src/overlays/actors/ovl_En_Daiku/z_en_daiku.c b/soh/src/overlays/actors/ovl_En_Daiku/z_en_daiku.c index 75ae78404..15c1950aa 100644 --- a/soh/src/overlays/actors/ovl_En_Daiku/z_en_daiku.c +++ b/soh/src/overlays/actors/ovl_En_Daiku/z_en_daiku.c @@ -4,7 +4,7 @@ #include "soh/Enhancements/game-interactor/GameInteractor_Hooks.h" #include "soh/ResourceManagerHelpers.h" -#define FLAGS (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_FRIENDLY | ACTOR_FLAG_UPDATE_WHILE_CULLED) +#define FLAGS (ACTOR_FLAG_ATTENTION_ENABLED | ACTOR_FLAG_FRIENDLY | ACTOR_FLAG_UPDATE_CULLING_DISABLED) typedef struct { Vec3f eyePosDeltaLocal; @@ -372,7 +372,7 @@ void EnDaiku_Jailed(EnDaiku* this, PlayState* play) { this->actionFunc = EnDaiku_WaitFreedom; } else if (!(this->stateFlags & ENDAIKU_STATEFLAG_GERUDOFIGHTING) && !gerudo->invisible) { this->stateFlags |= ENDAIKU_STATEFLAG_GERUDOFIGHTING; - this->actor.flags &= ~(ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_FRIENDLY); + this->actor.flags &= ~(ACTOR_FLAG_ATTENTION_ENABLED | ACTOR_FLAG_FRIENDLY); } } @@ -384,7 +384,7 @@ void EnDaiku_WaitFreedom(EnDaiku* this, PlayState* play) { SkelAnime_Update(&this->skelAnime); if (Flags_GetSwitch(play, this->actor.params >> 8 & 0x3F) || (IS_RANDO && Flags_GetRandomizerInf(RAND_INF_HAS_SKELETON_KEY))) { - this->actor.flags |= ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_FRIENDLY; + this->actor.flags |= ACTOR_FLAG_ATTENTION_ENABLED | ACTOR_FLAG_FRIENDLY; EnDaiku_UpdateText(this, play); } } diff --git a/soh/src/overlays/actors/ovl_En_Daiku_Kakariko/z_en_daiku_kakariko.c b/soh/src/overlays/actors/ovl_En_Daiku_Kakariko/z_en_daiku_kakariko.c index 77e8bda81..3798f1adf 100644 --- a/soh/src/overlays/actors/ovl_En_Daiku_Kakariko/z_en_daiku_kakariko.c +++ b/soh/src/overlays/actors/ovl_En_Daiku_Kakariko/z_en_daiku_kakariko.c @@ -8,7 +8,7 @@ #include "objects/object_daiku/object_daiku.h" #include "soh/ResourceManagerHelpers.h" -#define FLAGS (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_FRIENDLY | ACTOR_FLAG_UPDATE_WHILE_CULLED) +#define FLAGS (ACTOR_FLAG_ATTENTION_ENABLED | ACTOR_FLAG_FRIENDLY | ACTOR_FLAG_UPDATE_CULLING_DISABLED) typedef enum { /* 0x0 */ CARPENTER_ICHIRO, // Red and purple pants, normal hair diff --git a/soh/src/overlays/actors/ovl_En_Dekubaba/z_en_dekubaba.c b/soh/src/overlays/actors/ovl_En_Dekubaba/z_en_dekubaba.c index 735cb025d..21f278077 100644 --- a/soh/src/overlays/actors/ovl_En_Dekubaba/z_en_dekubaba.c +++ b/soh/src/overlays/actors/ovl_En_Dekubaba/z_en_dekubaba.c @@ -5,7 +5,7 @@ #include "soh/Enhancements/game-interactor/GameInteractor_Hooks.h" #include "soh/ResourceManagerHelpers.h" -#define FLAGS (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_HOSTILE) +#define FLAGS (ACTOR_FLAG_ATTENTION_ENABLED | ACTOR_FLAG_HOSTILE) void EnDekubaba_Init(Actor* thisx, PlayState* play); void EnDekubaba_Destroy(Actor* thisx, PlayState* play); @@ -408,7 +408,7 @@ void EnDekubaba_SetupPrunedSomersault(EnDekubaba* this) { this->actor.world.rot.y = this->actor.shape.rot.y + 0x8000; this->collider.base.acFlags &= ~AC_ON; this->actor.speedXZ = this->size * 3.0f; - this->actor.flags |= ACTOR_FLAG_UPDATE_WHILE_CULLED | ACTOR_FLAG_DRAW_WHILE_CULLED; + this->actor.flags |= ACTOR_FLAG_UPDATE_CULLING_DISABLED | ACTOR_FLAG_DRAW_CULLING_DISABLED; this->actionFunc = EnDekubaba_PrunedSomersault; GameInteractor_ExecuteOnEnemyDefeat(&this->actor); @@ -465,7 +465,7 @@ void EnDekubaba_SetupDeadStickDrop(EnDekubaba* this, PlayState* play) { this->actor.velocity.y = 0.0f; this->actor.shape.shadowScale = 3.0f; Actor_ChangeCategory(play, &play->actorCtx, &this->actor, ACTORCAT_MISC); - this->actor.flags &= ~ACTOR_FLAG_DRAW_WHILE_CULLED; + this->actor.flags &= ~ACTOR_FLAG_DRAW_CULLING_DISABLED; this->timer = 200; this->actionFunc = EnDekubaba_DeadStickDrop; } @@ -964,7 +964,7 @@ void EnDekubaba_PrunedSomersault(EnDekubaba* this, PlayState* play) { if ((this->actor.scale.x > 0.005f) && ((this->actor.bgCheckFlags & 2) || (this->actor.bgCheckFlags & 8))) { this->actor.scale.x = this->actor.scale.y = this->actor.scale.z = 0.0f; this->actor.speedXZ = 0.0f; - this->actor.flags &= ~(ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_HOSTILE); + this->actor.flags &= ~(ACTOR_FLAG_ATTENTION_ENABLED | ACTOR_FLAG_HOSTILE); EffectSsHahen_SpawnBurst(play, &this->actor.world.pos, this->size * 3.0f, 0, this->size * 12.0f, this->size * 5.0f, 15, HAHEN_OBJECT_DEFAULT, 10, NULL); } @@ -1140,7 +1140,7 @@ void EnDekubaba_Update(Actor* thisx, PlayState* play) { } if (this->actionFunc == EnDekubaba_Lunge) { CollisionCheck_SetAT(play, &play->colChkCtx, &this->collider.base); - this->actor.flags |= ACTOR_FLAG_PLAY_HIT_SFX; + this->actor.flags |= ACTOR_FLAG_SFX_FOR_PLAYER_BODY_HIT; } if (this->collider.base.acFlags & AC_ON) { diff --git a/soh/src/overlays/actors/ovl_En_Dekunuts/z_en_dekunuts.c b/soh/src/overlays/actors/ovl_En_Dekunuts/z_en_dekunuts.c index 138639f1c..4dca644a3 100644 --- a/soh/src/overlays/actors/ovl_En_Dekunuts/z_en_dekunuts.c +++ b/soh/src/overlays/actors/ovl_En_Dekunuts/z_en_dekunuts.c @@ -10,7 +10,7 @@ #include "soh/Enhancements/game-interactor/GameInteractor_Hooks.h" #include "soh/ResourceManagerHelpers.h" -#define FLAGS (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_HOSTILE) +#define FLAGS (ACTOR_FLAG_ATTENTION_ENABLED | ACTOR_FLAG_HOSTILE) #define DEKUNUTS_FLOWER 10 @@ -114,7 +114,7 @@ void EnDekunuts_Init(Actor* thisx, PlayState* play) { Actor_ProcessInitChain(&this->actor, sInitChain); if (thisx->params == DEKUNUTS_FLOWER) { - thisx->flags &= ~(ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_HOSTILE); + thisx->flags &= ~(ACTOR_FLAG_ATTENTION_ENABLED | ACTOR_FLAG_HOSTILE); } else { ActorShape_Init(&thisx->shape, 0.0f, ActorShadow_DrawCircle, 35.0f); SkelAnime_Init(play, &this->skelAnime, &gDekuNutsSkel, &gDekuNutsStandAnim, this->jointTable, diff --git a/soh/src/overlays/actors/ovl_En_Dh/z_en_dh.c b/soh/src/overlays/actors/ovl_En_Dh/z_en_dh.c index 8e4fd6413..935384c59 100644 --- a/soh/src/overlays/actors/ovl_En_Dh/z_en_dh.c +++ b/soh/src/overlays/actors/ovl_En_Dh/z_en_dh.c @@ -3,7 +3,7 @@ #include "soh/Enhancements/game-interactor/GameInteractor_Hooks.h" #include "soh/ResourceManagerHelpers.h" -#define FLAGS (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_HOSTILE | ACTOR_FLAG_UPDATE_WHILE_CULLED | ACTOR_FLAG_DRAGGED_BY_HOOKSHOT) +#define FLAGS (ACTOR_FLAG_ATTENTION_ENABLED | ACTOR_FLAG_HOSTILE | ACTOR_FLAG_UPDATE_CULLING_DISABLED | ACTOR_FLAG_HOOKSHOT_PULLS_PLAYER) typedef enum { /* 0 */ DH_WAIT, @@ -151,7 +151,7 @@ void EnDh_Init(Actor* thisx, PlayState* play) { this->actor.colChkInfo.mass = MASS_HEAVY; this->actor.colChkInfo.health = LINK_IS_ADULT ? 14 : 20; this->alpha = this->unk_258 = 255; - this->actor.flags &= ~ACTOR_FLAG_TARGETABLE; + this->actor.flags &= ~ACTOR_FLAG_ATTENTION_ENABLED; Collider_InitCylinder(play, &this->collider1); Collider_SetCylinder(play, &this->collider1, &this->actor, &sCylinderInit); Collider_InitJntSph(play, &this->collider2); @@ -197,7 +197,7 @@ void EnDh_SetupWait(EnDh* this) { this->actor.shape.yOffset = -15000.0f; this->dirtWaveSpread = this->actor.speedXZ = 0.0f; this->actor.world.rot.y = this->actor.shape.rot.y; - this->actor.flags |= ACTOR_FLAG_LENS; + this->actor.flags |= ACTOR_FLAG_REACT_TO_LENS; this->dirtWavePhase = this->actionState = this->actor.params = ENDH_WAIT_UNDERGROUND; EnDh_SetupAction(this, EnDh_Wait); } @@ -212,9 +212,9 @@ void EnDh_Wait(EnDh* this, PlayState* play) { if ((this->actor.params >= ENDH_START_ATTACK_GRAB) || (this->actor.params <= ENDH_HANDS_KILLED_4)) { switch (this->actionState) { case 0: - this->actor.flags |= ACTOR_FLAG_TARGETABLE; + this->actor.flags |= ACTOR_FLAG_ATTENTION_ENABLED; this->actor.shape.rot.y = this->actor.yawTowardsPlayer; - this->actor.flags &= ~ACTOR_FLAG_LENS; + this->actor.flags &= ~ACTOR_FLAG_REACT_TO_LENS; this->actionState++; this->drawDirtWave++; Audio_PlayActorSound2(&this->actor, NA_SE_EN_DEADHAND_HIDE); @@ -368,7 +368,7 @@ void EnDh_SetupBurrow(EnDh* this) { this->actor.world.rot.y = this->actor.shape.rot.y; this->dirtWavePhase = 0; this->actionState = 0; - this->actor.flags &= ~ACTOR_FLAG_TARGETABLE; + this->actor.flags &= ~ACTOR_FLAG_ATTENTION_ENABLED; Audio_PlayActorSound2(&this->actor, NA_SE_EN_DEADHAND_HIDE); EnDh_SetupAction(this, EnDh_Burrow); } @@ -438,7 +438,7 @@ void EnDh_SetupDeath(EnDh* this) { Animation_MorphToPlayOnce(&this->skelAnime, &object_dh_Anim_0032BC, -1.0f); this->curAction = DH_DEATH; this->timer = 300; - this->actor.flags &= ~ACTOR_FLAG_TARGETABLE; + this->actor.flags &= ~ACTOR_FLAG_ATTENTION_ENABLED; this->actor.speedXZ = 0.0f; func_800F5B58(); this->actor.params = ENDH_DEATH; diff --git a/soh/src/overlays/actors/ovl_En_Dha/z_en_dha.c b/soh/src/overlays/actors/ovl_En_Dha/z_en_dha.c index 2b6b036b2..727669a77 100644 --- a/soh/src/overlays/actors/ovl_En_Dha/z_en_dha.c +++ b/soh/src/overlays/actors/ovl_En_Dha/z_en_dha.c @@ -9,7 +9,7 @@ #include "objects/object_dh/object_dh.h" #include "soh/ResourceManagerHelpers.h" -#define FLAGS (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_HOSTILE | ACTOR_FLAG_UPDATE_WHILE_CULLED) +#define FLAGS (ACTOR_FLAG_ATTENTION_ENABLED | ACTOR_FLAG_HOSTILE | ACTOR_FLAG_UPDATE_CULLING_DISABLED) void EnDha_Init(Actor* thisx, PlayState* play); void EnDha_Destroy(Actor* thisx, PlayState* play); @@ -168,7 +168,7 @@ void EnDha_Init(Actor* thisx, PlayState* play) { this->limbAngleX[0] = -0x4000; Collider_InitJntSph(play, &this->collider); Collider_SetJntSph(play, &this->collider, &this->actor, &sJntSphInit, this->colliderItem); - this->actor.flags &= ~ACTOR_FLAG_TARGETABLE; + this->actor.flags &= ~ACTOR_FLAG_ATTENTION_ENABLED; EnDha_SetupWait(this); } diff --git a/soh/src/overlays/actors/ovl_En_Diving_Game/z_en_diving_game.c b/soh/src/overlays/actors/ovl_En_Diving_Game/z_en_diving_game.c index 40663941b..ab109d607 100644 --- a/soh/src/overlays/actors/ovl_En_Diving_Game/z_en_diving_game.c +++ b/soh/src/overlays/actors/ovl_En_Diving_Game/z_en_diving_game.c @@ -12,7 +12,7 @@ #include "soh/ResourceManagerHelpers.h" #include "soh/Enhancements/game-interactor/GameInteractor_Hooks.h" -#define FLAGS (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_FRIENDLY | ACTOR_FLAG_UPDATE_WHILE_CULLED) +#define FLAGS (ACTOR_FLAG_ATTENTION_ENABLED | ACTOR_FLAG_FRIENDLY | ACTOR_FLAG_UPDATE_CULLING_DISABLED) void EnDivingGame_Init(Actor* thisx, PlayState* play); void EnDivingGame_Destroy(Actor* thisx, PlayState* play); diff --git a/soh/src/overlays/actors/ovl_En_Dns/z_en_dns.c b/soh/src/overlays/actors/ovl_En_Dns/z_en_dns.c index fb665f74d..53308713d 100644 --- a/soh/src/overlays/actors/ovl_En_Dns/z_en_dns.c +++ b/soh/src/overlays/actors/ovl_En_Dns/z_en_dns.c @@ -11,40 +11,40 @@ #include "soh/OTRGlobals.h" #include "soh/ResourceManagerHelpers.h" -#define FLAGS (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_FRIENDLY) +#define FLAGS (ACTOR_FLAG_ATTENTION_ENABLED | ACTOR_FLAG_FRIENDLY) void EnDns_Init(Actor* thisx, PlayState* play); void EnDns_Destroy(Actor* thisx, PlayState* play); void EnDns_Update(Actor* thisx, PlayState* play); void EnDns_Draw(Actor* thisx, PlayState* play); -u32 func_809EF5A4(EnDns* this); -u32 func_809EF658(EnDns* this); -u32 func_809EF70C(EnDns* this); -u32 func_809EF73C(EnDns* this); -u32 func_809EF800(EnDns* this); -u32 func_809EF854(EnDns* this); -u32 func_809EF8F4(EnDns* this); -u32 func_809EF9A4(EnDns* this); +u32 EnDns_CanBuyPrice(EnDns* this); +u32 EnDns_CanBuyDekuNuts(EnDns* this); +u32 EnDns_CanBuyDekuSticks(EnDns* this); +u32 EnDns_CanBuyDekuSeeds(EnDns* this); +u32 EnDns_CanBuyDekuShield(EnDns* this); +u32 EnDns_CanBuyBombs(EnDns* this); +u32 EnDns_CanBuyArrows(EnDns* this); +u32 EnDns_CanBuyBottle(EnDns* this); -void func_809EF9F8(EnDns* this); -void func_809EFA28(EnDns* this); -void func_809EFA58(EnDns* this); -void func_809EFA9C(EnDns* this); -void func_809EFACC(EnDns* this); -void func_809EFAFC(EnDns* this); -void func_809EFB40(EnDns* this); +void EnDns_PayPrice(EnDns* this); +void EnDns_PayForDekuNuts(EnDns* this); +void EnDns_PayForHeartPiece(EnDns* this); +void EnDns_PayForBombs(EnDns* this); +void EnDns_PayForArrows(EnDns* this); +void EnDns_PayForDekuStickUpgrade(EnDns* this); +void EnDns_PayForDekuNutUpgrade(EnDns* this); -void EnDns_SetupWait(EnDns* this, PlayState* play); -void EnDns_Wait(EnDns* this, PlayState* play); +void EnDns_SetupIdle(EnDns* this, PlayState* play); +void EnDns_Idle(EnDns* this, PlayState* play); void EnDns_Talk(EnDns* this, PlayState* play); -void func_809EFDD0(EnDns* this, PlayState* play); -void func_809EFEE8(EnDns* this, PlayState* play); -void func_809EFF50(EnDns* this, PlayState* play); -void func_809EFF98(EnDns* this, PlayState* play); -void func_809F008C(EnDns* this, PlayState* play); +void EnDns_OfferSaleItem(EnDns* this, PlayState* play); +void EnDns_SetupSale(EnDns* this, PlayState* play); +void EnDns_Sale(EnDns* this, PlayState* play); void EnDns_SetupBurrow(EnDns* this, PlayState* play); +void EnDns_SetupNoSaleBurrow(EnDns* this, PlayState* play); void EnDns_Burrow(EnDns* this, PlayState* play); +void EnDns_PostBurrow(EnDns* this, PlayState* play); const ActorInit En_Dns_InitVars = { ACTOR_EN_DNS, @@ -78,44 +78,35 @@ static ColliderCylinderInitType1 sCylinderInit = { { 18, 32, 0, { 0, 0, 0 } }, }; -static u16 D_809F040C[] = { +static u16 sStartingTextIds[] = { 0x10A0, 0x10A1, 0x10A2, 0x10CA, 0x10CB, 0x10CC, 0x10CD, 0x10CE, 0x10CF, 0x10DC, 0x10DD, }; // Debug text: "sells" { "Deku Nuts", "Deku Sticks", "Piece of Heart", "Deku Seeds", // "Deku Shield", "Bombs", "Arrows", "Red Potion", // "Green Potion", "Deku Stick Upgrade", "Deku Nut Upgrade" } -static char* D_809F0424[] = { +static char* sItemDebugTxt[] = { "デクの実売り ", "デクの棒売り ", "ハートの欠片売り ", "デクの種売り ", "デクの盾売り ", "バクダン売り ", "矢売り ", "赤のくすり売り ", "緑のくすり売り ", "デクの棒持てる数を増やす", "デクの実持てる数を増やす", }; -static DnsItemEntry D_809F0450 = { 20, 5, GI_NUTS_5_2, func_809EF5A4, func_809EFA28 }; +static DnsItemEntry sItemNuts = { 20, 5, GI_NUTS_5_2, EnDns_CanBuyDekuNuts, EnDns_PayForDekuNuts }; +static DnsItemEntry sItemSticks = { 15, 1, GI_STICKS_1, EnDns_CanBuyDekuSticks, EnDns_PayPrice }; +static DnsItemEntry sItemHeartPiece = { 10, 1, GI_HEART_PIECE, EnDns_CanBuyPrice, EnDns_PayForHeartPiece }; +static DnsItemEntry sItemSeeds = { 40, 30, GI_SEEDS_30, EnDns_CanBuyDekuSeeds, EnDns_PayPrice }; +static DnsItemEntry sItemDekuShield = { 50, 1, GI_SHIELD_DEKU, EnDns_CanBuyDekuShield, EnDns_PayPrice }; +static DnsItemEntry sItemBombs = { 40, 5, GI_BOMBS_5, EnDns_CanBuyBombs, EnDns_PayForBombs }; +static DnsItemEntry sItemArrows = { 70, 20, GI_ARROWS_LARGE, EnDns_CanBuyArrows, EnDns_PayForArrows }; +static DnsItemEntry sItemRedPotion = { 40, 1, GI_POTION_RED, EnDns_CanBuyBottle, EnDns_PayPrice }; +static DnsItemEntry sItemGreenPotion = { 40, 1, GI_POTION_GREEN, EnDns_CanBuyBottle, EnDns_PayPrice }; -static DnsItemEntry D_809F0460 = { 15, 1, GI_STICKS_1, func_809EF658, func_809EF9F8 }; - -static DnsItemEntry D_809F0470 = { 10, 1, GI_HEART_PIECE, func_809EF70C, func_809EFA58 }; - -static DnsItemEntry D_809F0480 = { 40, 30, GI_SEEDS_30, func_809EF73C, func_809EF9F8 }; - -static DnsItemEntry D_809F0490 = { 50, 1, GI_SHIELD_DEKU, func_809EF800, func_809EF9F8 }; - -static DnsItemEntry D_809F04A0 = { 40, 5, GI_BOMBS_5, func_809EF854, func_809EFA9C }; - -static DnsItemEntry D_809F04B0 = { 70, 20, GI_ARROWS_LARGE, func_809EF8F4, func_809EFACC }; - -static DnsItemEntry D_809F04C0 = { 40, 1, GI_POTION_RED, func_809EF9A4, func_809EF9F8 }; - -static DnsItemEntry D_809F04D0 = { 40, 1, GI_POTION_GREEN, func_809EF9A4, func_809EF9F8 }; - -static DnsItemEntry D_809F04E0 = { 40, 1, GI_STICK_UPGRADE_20, func_809EF70C, func_809EFAFC }; - -static DnsItemEntry D_809F04F0 = { 40, 1, GI_NUT_UPGRADE_30, func_809EF70C, func_809EFB40 }; +static DnsItemEntry sItemStickUpgrade = { 40, 1, GI_STICK_UPGRADE_20, EnDns_CanBuyPrice, EnDns_PayForDekuStickUpgrade }; +static DnsItemEntry sItemNutUpgrade = { 40, 1, GI_NUT_UPGRADE_30, EnDns_CanBuyPrice, EnDns_PayForDekuNutUpgrade }; static DnsItemEntry* sItemEntries[] = { - &D_809F0450, &D_809F0460, &D_809F0470, &D_809F0480, &D_809F0490, &D_809F04A0, - &D_809F04B0, &D_809F04C0, &D_809F04D0, &D_809F04E0, &D_809F04F0, + &sItemNuts, &sItemSticks, &sItemHeartPiece, &sItemSeeds, &sItemDekuShield, &sItemBombs, + &sItemArrows, &sItemRedPotion, &sItemGreenPotion, &sItemStickUpgrade, &sItemNutUpgrade, }; static InitChainEntry sInitChain[] = { @@ -124,15 +115,9 @@ static InitChainEntry sInitChain[] = { ICHAIN_F32(targetArrowOffset, 30, ICHAIN_STOP), }; -typedef enum { - /* 0 */ ENDNS_ANIM_0, - /* 1 */ ENDNS_ANIM_1, - /* 2 */ ENDNS_ANIM_2 -} EnDnsAnimation; - static AnimationMinimalInfo sAnimationInfo[] = { { &gBusinessScrubNervousIdleAnim, ANIMMODE_LOOP, 0.0f }, - { &gBusinessScrubAnim_4404, ANIMMODE_ONCE, 0.0f }, + { &gBusinessScrubLeaveBurrowAnim, ANIMMODE_ONCE, 0.0f }, { &gBusinessScrubNervousTransitionAnim, ANIMMODE_ONCE, 0.0f }, }; @@ -146,11 +131,11 @@ void EnDns_Init(Actor* thisx, PlayState* play) { return; } // Sell Seeds instead of Arrows if Link is child - if ((this->actor.params == 0x0006) && (LINK_AGE_IN_YEARS == YEARS_CHILD)) { - this->actor.params = 0x0003; + if ((this->actor.params == DNS_TYPE_ARROWS_30) && (LINK_AGE_IN_YEARS == YEARS_CHILD)) { + this->actor.params = DNS_TYPE_DEKU_SEEDS_30; } // "Deku Salesman" - osSyncPrintf(VT_FGCOL(GREEN) "◆◆◆ 売りナッツ『%s』 ◆◆◆" VT_RST "\n", D_809F0424[this->actor.params], + osSyncPrintf(VT_FGCOL(GREEN) "◆◆◆ 売りナッツ『%s』 ◆◆◆" VT_RST "\n", sItemDebugTxt[this->actor.params], this->actor.params); Actor_ProcessInitChain(&this->actor, sInitChain); SkelAnime_InitFlex(play, &this->skelAnime, &gBusinessScrubSkel, &gBusinessScrubNervousTransitionAnim, @@ -166,9 +151,9 @@ void EnDns_Init(Actor* thisx, PlayState* play) { this->actor.speedXZ = 0.0f; this->actor.velocity.y = 0.0f; this->actor.gravity = -1.0f; - this->actor.textId = D_809F040C[this->actor.params]; + this->actor.textId = sStartingTextIds[this->actor.params]; this->dnsItemEntry = sItemEntries[this->actor.params]; - this->actionFunc = EnDns_SetupWait; + this->actionFunc = EnDns_SetupIdle; } void EnDns_Destroy(Actor* thisx, PlayState* play) { @@ -183,158 +168,158 @@ void EnDns_ChangeAnim(EnDns* this, u8 index) { s16 frameCount; frameCount = Animation_GetLastFrame(sAnimationInfo[index].animation); - this->unk_2BA = index; // Not used anywhere else? + this->animIndex = index; // Not used anywhere else? Animation_Change(&this->skelAnime, sAnimationInfo[index].animation, 1.0f, 0.0f, (f32)frameCount, sAnimationInfo[index].mode, sAnimationInfo[index].morphFrames); } /* Item give checking functions */ -u32 func_809EF5A4(EnDns* this) { +u32 EnDns_CanBuyDekuNuts(EnDns* this) { if ((CUR_CAPACITY(UPG_NUTS) != 0) && (AMMO(ITEM_NUT) >= CUR_CAPACITY(UPG_NUTS))) { - return 1; + return DNS_CANBUY_RESULT_CAPACITY_FULL; } if (gSaveContext.rupees < this->dnsItemEntry->itemPrice) { - return 0; + return DNS_CANBUY_RESULT_NEED_RUPEES; } if (Item_CheckObtainability(ITEM_NUT) == ITEM_NONE) { - return 2; + return DNS_CANBUY_RESULT_SUCCESS_NEW_ITEM; } - return 4; + return DNS_CANBUY_RESULT_SUCCESS; } -u32 func_809EF658(EnDns* this) { +u32 EnDns_CanBuyDekuSticks(EnDns* this) { if ((CUR_CAPACITY(UPG_STICKS) != 0) && (AMMO(ITEM_STICK) >= CUR_CAPACITY(UPG_STICKS))) { - return 1; + return DNS_CANBUY_RESULT_CAPACITY_FULL; } if (gSaveContext.rupees < this->dnsItemEntry->itemPrice) { - return 0; + return DNS_CANBUY_RESULT_NEED_RUPEES; } if (Item_CheckObtainability(ITEM_STICK) == ITEM_NONE) { - return 2; + return DNS_CANBUY_RESULT_SUCCESS_NEW_ITEM; } - return 4; + return DNS_CANBUY_RESULT_SUCCESS; } -u32 func_809EF70C(EnDns* this) { +u32 EnDns_CanBuyPrice(EnDns* this) { if (gSaveContext.rupees < this->dnsItemEntry->itemPrice) { - return 0; + return DNS_CANBUY_RESULT_NEED_RUPEES; } - return 4; + return DNS_CANBUY_RESULT_SUCCESS; } -u32 func_809EF73C(EnDns* this) { +u32 EnDns_CanBuyDekuSeeds(EnDns* this) { if (INV_CONTENT(ITEM_SLINGSHOT) == ITEM_NONE) { - return 3; + return DNS_CANBUY_RESULT_CANT_GET_NOW; } if (AMMO(ITEM_SLINGSHOT) >= CUR_CAPACITY(UPG_BULLET_BAG)) { - return 1; + return DNS_CANBUY_RESULT_CAPACITY_FULL; } if (gSaveContext.rupees < this->dnsItemEntry->itemPrice) { - return 0; + return DNS_CANBUY_RESULT_NEED_RUPEES; } if (Item_CheckObtainability(ITEM_SEEDS) == ITEM_NONE) { - return 2; + return DNS_CANBUY_RESULT_SUCCESS_NEW_ITEM; } - return 4; + return DNS_CANBUY_RESULT_SUCCESS; } -u32 func_809EF800(EnDns* this) { +u32 EnDns_CanBuyDekuShield(EnDns* this) { if (CHECK_OWNED_EQUIP_ALT(EQUIP_TYPE_SHIELD, EQUIP_INV_SHIELD_DEKU)) { - return 1; + return DNS_CANBUY_RESULT_CAPACITY_FULL; } if (gSaveContext.rupees < this->dnsItemEntry->itemPrice) { - return 0; + return DNS_CANBUY_RESULT_NEED_RUPEES; } - return 4; + return DNS_CANBUY_RESULT_SUCCESS; } -u32 func_809EF854(EnDns* this) { +u32 EnDns_CanBuyBombs(EnDns* this) { if (!CHECK_QUEST_ITEM(QUEST_GORON_RUBY)) { - return 3; + return DNS_CANBUY_RESULT_CANT_GET_NOW; } if (AMMO(ITEM_BOMB) >= CUR_CAPACITY(UPG_BOMB_BAG)) { - return 1; + return DNS_CANBUY_RESULT_CAPACITY_FULL; } if (gSaveContext.rupees < this->dnsItemEntry->itemPrice) { - return 0; + return DNS_CANBUY_RESULT_NEED_RUPEES; } - return 4; + return DNS_CANBUY_RESULT_SUCCESS; } -u32 func_809EF8F4(EnDns* this) { +u32 EnDns_CanBuyArrows(EnDns* this) { if (Item_CheckObtainability(ITEM_BOW) == ITEM_NONE) { - return 3; + return DNS_CANBUY_RESULT_CANT_GET_NOW; } if (AMMO(ITEM_BOW) >= CUR_CAPACITY(UPG_QUIVER)) { - return 1; + return DNS_CANBUY_RESULT_CAPACITY_FULL; } if (gSaveContext.rupees < this->dnsItemEntry->itemPrice) { - return 0; + return DNS_CANBUY_RESULT_NEED_RUPEES; } - return 4; + return DNS_CANBUY_RESULT_SUCCESS; } -u32 func_809EF9A4(EnDns* this) { +u32 EnDns_CanBuyBottle(EnDns* this) { if (!Inventory_HasEmptyBottle()) { - return 1; + return DNS_CANBUY_RESULT_CAPACITY_FULL; } if (gSaveContext.rupees < this->dnsItemEntry->itemPrice) { - return 0; + return DNS_CANBUY_RESULT_NEED_RUPEES; } - return 4; + return DNS_CANBUY_RESULT_SUCCESS; } /* Paying and flagging functions */ -void func_809EF9F8(EnDns* this) { +void EnDns_PayPrice(EnDns* this) { Rupees_ChangeBy(-this->dnsItemEntry->itemPrice); } -void func_809EFA28(EnDns* this) { +void EnDns_PayForDekuNuts(EnDns* this) { Rupees_ChangeBy(-this->dnsItemEntry->itemPrice); } -void func_809EFA58(EnDns* this) { - Flags_SetItemGetInf(ITEMGETINF_0B); +void EnDns_PayForHeartPiece(EnDns* this) { + Flags_SetItemGetInf(ITEMGETINF_DEKU_SCRUB_HEART_PIECE); Rupees_ChangeBy(-this->dnsItemEntry->itemPrice); } -void func_809EFA9C(EnDns* this) { +void EnDns_PayForBombs(EnDns* this) { Rupees_ChangeBy(-this->dnsItemEntry->itemPrice); } -void func_809EFACC(EnDns* this) { +void EnDns_PayForArrows(EnDns* this) { Rupees_ChangeBy(-this->dnsItemEntry->itemPrice); } -void func_809EFAFC(EnDns* this) { - Flags_SetInfTable(INFTABLE_192); +void EnDns_PayForDekuStickUpgrade(EnDns* this) { + Flags_SetInfTable(INFTABLE_BOUGHT_STICK_UPGRADE); Rupees_ChangeBy(-this->dnsItemEntry->itemPrice); } -void func_809EFB40(EnDns* this) { - Flags_SetInfTable(INFTABLE_193); +void EnDns_PayForDekuNutUpgrade(EnDns* this) { + Flags_SetInfTable(INFTABLE_BOUGHT_NUT_UPGRADE); Rupees_ChangeBy(-this->dnsItemEntry->itemPrice); } -void EnDns_SetupWait(EnDns* this, PlayState* play) { +void EnDns_SetupIdle(EnDns* this, PlayState* play) { if (this->skelAnime.curFrame == this->skelAnime.endFrame) { - this->actionFunc = EnDns_Wait; - EnDns_ChangeAnim(this, ENDNS_ANIM_0); + this->actionFunc = EnDns_Idle; + EnDns_ChangeAnim(this, DNS_ANIM_IDLE); } } -void EnDns_Wait(EnDns* this, PlayState* play) { +void EnDns_Idle(EnDns* this, PlayState* play) { Math_SmoothStepToS(&this->actor.shape.rot.y, this->actor.yawTowardsPlayer, 3, 2000, 0); this->actor.world.rot.y = this->actor.shape.rot.y; if (Actor_ProcessTalkRequest(&this->actor, play)) { this->actionFunc = EnDns_Talk; } else { if ((this->collider.base.ocFlags1 & OC1_HIT) || this->actor.isTargeted) { - this->actor.flags |= ACTOR_FLAG_WILL_TALK; + this->actor.flags |= ACTOR_FLAG_TALK_OFFER_AUTO_ACCEPTED; } else { - this->actor.flags &= ~ACTOR_FLAG_WILL_TALK; + this->actor.flags &= ~ACTOR_FLAG_TALK_OFFER_AUTO_ACCEPTED; } if (this->actor.xzDistToPlayer < 130.0f) { func_8002F2F4(&this->actor, play); @@ -347,41 +332,41 @@ void EnDns_Talk(EnDns* this, PlayState* play) { switch (play->msgCtx.choiceIndex) { case 0: // OK switch (this->dnsItemEntry->purchaseableCheck(this)) { - case 0: + case DNS_CANBUY_RESULT_NEED_RUPEES: Message_ContinueTextbox(play, 0x10A5); - this->actionFunc = func_809F008C; + this->actionFunc = EnDns_SetupNoSaleBurrow; break; - case 1: + case DNS_CANBUY_RESULT_CAPACITY_FULL: Message_ContinueTextbox(play, 0x10A6); - this->actionFunc = func_809F008C; + this->actionFunc = EnDns_SetupNoSaleBurrow; break; - case 3: + case DNS_CANBUY_RESULT_CANT_GET_NOW: Message_ContinueTextbox(play, 0x10DE); - this->actionFunc = func_809F008C; + this->actionFunc = EnDns_SetupNoSaleBurrow; break; - case 2: - case 4: + case DNS_CANBUY_RESULT_SUCCESS_NEW_ITEM: + case DNS_CANBUY_RESULT_SUCCESS: Message_ContinueTextbox(play, 0x10A7); - this->actionFunc = func_809EFEE8; + this->actionFunc = EnDns_SetupSale; break; } break; case 1: // No way Message_ContinueTextbox(play, 0x10A4); - this->actionFunc = func_809F008C; + this->actionFunc = EnDns_SetupNoSaleBurrow; } } } -void func_809EFDD0(EnDns* this, PlayState* play) { +void EnDns_OfferSaleItem(EnDns* this, PlayState* play) { u16 pendingGetItemId; - if (this->actor.params == 0x9) { + if (this->actor.params == DNS_TYPE_DEKU_STICK_UPGRADE) { if (CUR_UPG_VALUE(UPG_STICKS) < 2) { pendingGetItemId = GI_STICK_UPGRADE_20; } else { pendingGetItemId = GI_STICK_UPGRADE_30; } - } else if (this->actor.params == 0xA) { + } else if (this->actor.params == DNS_TYPE_DEKU_NUT_UPGRADE) { if (CUR_UPG_VALUE(UPG_NUTS) < 2) { pendingGetItemId = GI_NUT_UPGRADE_30; } else { @@ -391,31 +376,31 @@ void func_809EFDD0(EnDns* this, PlayState* play) { pendingGetItemId = this->dnsItemEntry->getItemId; } GetItemEntry itemEntry = ItemTable_Retrieve(pendingGetItemId); - gSaveContext.pendingSale = itemEntry.itemId; - gSaveContext.pendingSaleMod = itemEntry.modIndex; + gSaveContext.ship.pendingSale = itemEntry.itemId; + gSaveContext.ship.pendingSaleMod = itemEntry.modIndex; Actor_OfferGetItem(&this->actor, play, pendingGetItemId, 130.0f, 100.0f); } -void func_809EFEE8(EnDns* this, PlayState* play) { +void EnDns_SetupSale(EnDns* this, PlayState* play) { if ((Message_GetState(&play->msgCtx) == TEXT_STATE_EVENT) && Message_ShouldAdvance(play)) { Message_CloseTextbox(play); if (GameInteractor_Should(VB_GIVE_ITEM_FROM_BUSINESS_SCRUB, true, this)) { - func_809EFDD0(this, play); + EnDns_OfferSaleItem(this, play); } - this->actionFunc = func_809EFF50; + this->actionFunc = EnDns_Sale; } } -void func_809EFF50(EnDns* this, PlayState* play) { +void EnDns_Sale(EnDns* this, PlayState* play) { if (Actor_HasParent(&this->actor, play) || !GameInteractor_Should(VB_GIVE_ITEM_FROM_BUSINESS_SCRUB, true, this)) { this->actor.parent = NULL; - this->actionFunc = func_809EFF98; + this->actionFunc = EnDns_SetupBurrow; } else { - func_809EFDD0(this, play); + EnDns_OfferSaleItem(this, play); } } -void func_809EFF98(EnDns* this, PlayState* play) { +void EnDns_SetupBurrow(EnDns* this, PlayState* play) { Player* player = GET_PLAYER(play); if (player->stateFlags1 & PLAYER_STATE1_GETTING_ITEM) { @@ -423,41 +408,41 @@ void func_809EFF98(EnDns* this, PlayState* play) { this->dnsItemEntry->setRupeesAndFlags(this); this->dropCollectible = 1; this->maintainCollider = 0; - this->actor.flags &= ~ACTOR_FLAG_TARGETABLE; - EnDns_ChangeAnim(this, ENDNS_ANIM_1); - this->actionFunc = EnDns_SetupBurrow; + this->actor.flags &= ~ACTOR_FLAG_ATTENTION_ENABLED; + EnDns_ChangeAnim(this, DNS_ANIM_BURROW); + this->actionFunc = EnDns_Burrow; } } else { this->dnsItemEntry->setRupeesAndFlags(this); this->dropCollectible = 1; this->maintainCollider = 0; - this->actor.flags &= ~ACTOR_FLAG_TARGETABLE; - EnDns_ChangeAnim(this, ENDNS_ANIM_1); - this->actionFunc = EnDns_SetupBurrow; + this->actor.flags &= ~ACTOR_FLAG_ATTENTION_ENABLED; + EnDns_ChangeAnim(this, DNS_ANIM_BURROW); + this->actionFunc = EnDns_Burrow; } } -void func_809F008C(EnDns* this, PlayState* play) { +void EnDns_SetupNoSaleBurrow(EnDns* this, PlayState* play) { if ((Message_GetState(&play->msgCtx) == TEXT_STATE_DONE) && Message_ShouldAdvance(play)) { this->maintainCollider = 0; - this->actor.flags &= ~ACTOR_FLAG_TARGETABLE; - EnDns_ChangeAnim(this, ENDNS_ANIM_1); - this->actionFunc = EnDns_SetupBurrow; + this->actor.flags &= ~ACTOR_FLAG_ATTENTION_ENABLED; + EnDns_ChangeAnim(this, DNS_ANIM_BURROW); + this->actionFunc = EnDns_Burrow; } } -void EnDns_SetupBurrow(EnDns* this, PlayState* play) { - f32 frameCount = Animation_GetLastFrame(&gBusinessScrubAnim_4404); +void EnDns_Burrow(EnDns* this, PlayState* play) { + f32 frameCount = Animation_GetLastFrame(&gBusinessScrubLeaveBurrowAnim); if (this->skelAnime.curFrame == frameCount) { Audio_PlayActorSound2(&this->actor, NA_SE_EN_AKINDONUTS_HIDE); - this->actionFunc = EnDns_Burrow; + this->actionFunc = EnDns_PostBurrow; this->standOnGround = 0; this->yInitPos = this->actor.world.pos.y; } } -void EnDns_Burrow(EnDns* this, PlayState* play) { +void EnDns_PostBurrow(EnDns* this, PlayState* play) { f32 depth; Vec3f initPos; s32 i; @@ -490,7 +475,7 @@ void EnDns_Update(Actor* thisx, PlayState* play) { s16 pad; this->dustTimer++; - this->actor.textId = D_809F040C[this->actor.params]; + this->actor.textId = sStartingTextIds[this->actor.params]; Actor_SetFocus(&this->actor, 60.0f); Actor_SetScale(&this->actor, 0.01f); SkelAnime_Update(&this->skelAnime); diff --git a/soh/src/overlays/actors/ovl_En_Dns/z_en_dns.h b/soh/src/overlays/actors/ovl_En_Dns/z_en_dns.h index 0e3e50c9b..9924a9686 100644 --- a/soh/src/overlays/actors/ovl_En_Dns/z_en_dns.h +++ b/soh/src/overlays/actors/ovl_En_Dns/z_en_dns.h @@ -4,6 +4,36 @@ #include #include "global.h" +#define DNS_GET_TYPE(thisx) ((thisx)->params) + +typedef enum EnDnsType { + /* 0 */ DNS_TYPE_DEKU_NUTS_5, + /* 1 */ DNS_TYPE_DEKU_STICKS_1, + /* 2 */ DNS_TYPE_HEART_PIECE, + /* 3 */ DNS_TYPE_DEKU_SEEDS_30, + /* 4 */ DNS_TYPE_DEKU_SHIELD, + /* 5 */ DNS_TYPE_BOMBS_5, + /* 6 */ DNS_TYPE_ARROWS_30, + /* 7 */ DNS_TYPE_RED_POTION, + /* 8 */ DNS_TYPE_GREEN_POTION, + /* 9 */ DNS_TYPE_DEKU_STICK_UPGRADE, + /* 10 */ DNS_TYPE_DEKU_NUT_UPGRADE +} EnDnsType; + +typedef enum EnDnsCanBuyResult { + /* 0 */ DNS_CANBUY_RESULT_NEED_RUPEES, + /* 1 */ DNS_CANBUY_RESULT_CAPACITY_FULL, + /* 2 */ DNS_CANBUY_RESULT_SUCCESS_NEW_ITEM, + /* 3 */ DNS_CANBUY_RESULT_CANT_GET_NOW, + /* 4 */ DNS_CANBUY_RESULT_SUCCESS +} EnDnsCanBuyResult; + +typedef enum EnDnsAnimation { + /* 0 */ DNS_ANIM_IDLE, + /* 1 */ DNS_ANIM_BURROW, + /* 2 */ DNS_ANIM_IDLE_TRANSITION +} EnDnsAnimation; + struct EnDns; typedef void (*EnDnsActionFunc)(struct EnDns*, PlayState*); @@ -26,7 +56,7 @@ typedef struct EnDns { /* 0x0268 */ EnDnsActionFunc actionFunc; /* 0x026C */ ColliderCylinder collider; /* 0x02B8 */ s16 dustTimer; - /* 0x02BA */ u8 unk_2BA; + /* 0x02BA */ u8 animIndex; // set but not read /* 0x02BB */ u8 maintainCollider; /* 0x02BC */ u8 standOnGround; /* 0x02BD */ u8 dropCollectible; diff --git a/soh/src/overlays/actors/ovl_En_Dnt_Demo/z_en_dnt_demo.c b/soh/src/overlays/actors/ovl_En_Dnt_Demo/z_en_dnt_demo.c index ef9228dc2..f9328d729 100644 --- a/soh/src/overlays/actors/ovl_En_Dnt_Demo/z_en_dnt_demo.c +++ b/soh/src/overlays/actors/ovl_En_Dnt_Demo/z_en_dnt_demo.c @@ -100,7 +100,7 @@ void EnDntDemo_Init(Actor* thisx, PlayState* play2) { osSyncPrintf(VT_FGCOL(GREEN) "☆☆☆☆☆ じじじじじじじじじじい ☆☆☆☆☆ %x\n" VT_RST, this->leader); } this->subCamera = 0; - this->actor.flags &= ~ACTOR_FLAG_TARGETABLE; + this->actor.flags &= ~ACTOR_FLAG_ATTENTION_ENABLED; this->actionFunc = EnDntDemo_Judge; } diff --git a/soh/src/overlays/actors/ovl_En_Dnt_Jiji/z_en_dnt_jiji.c b/soh/src/overlays/actors/ovl_En_Dnt_Jiji/z_en_dnt_jiji.c index 85ebef2d0..a459358dd 100644 --- a/soh/src/overlays/actors/ovl_En_Dnt_Jiji/z_en_dnt_jiji.c +++ b/soh/src/overlays/actors/ovl_En_Dnt_Jiji/z_en_dnt_jiji.c @@ -11,7 +11,7 @@ #include "vt.h" #include "soh/ResourceManagerHelpers.h" -#define FLAGS (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_FRIENDLY | ACTOR_FLAG_UPDATE_WHILE_CULLED) +#define FLAGS (ACTOR_FLAG_ATTENTION_ENABLED | ACTOR_FLAG_FRIENDLY | ACTOR_FLAG_UPDATE_CULLING_DISABLED) void EnDntJiji_Init(Actor* thisx, PlayState* play); void EnDntJiji_Destroy(Actor* thisx, PlayState* play); @@ -85,7 +85,7 @@ void EnDntJiji_Init(Actor* thisx, PlayState* play) { osSyncPrintf("\n\n"); // "Deku Scrub mask show elder" osSyncPrintf(VT_FGCOL(YELLOW) "☆☆☆☆☆ デグナッツお面品評会長老 ☆☆☆☆☆ %x\n" VT_RST, this->stage); - this->actor.flags &= ~ACTOR_FLAG_TARGETABLE; + this->actor.flags &= ~ACTOR_FLAG_ATTENTION_ENABLED; this->actor.colChkInfo.mass = 0xFF; this->actor.targetMode = 6; this->actionFunc = EnDntJiji_SetFlower; @@ -226,7 +226,7 @@ void EnDntJiji_SetupCower(EnDntJiji* this, PlayState* play) { } else { this->getItemId = GI_NUT_UPGRADE_40; } - this->actor.flags |= ACTOR_FLAG_TARGETABLE; + this->actor.flags |= ACTOR_FLAG_ATTENTION_ENABLED; this->actor.textId = 0x10DB; this->unused = 5; this->actionFunc = EnDntJiji_Cower; @@ -307,7 +307,7 @@ void EnDntJiji_GivePrize(EnDntJiji* this, PlayState* play) { this->stage->leaderSignal = DNT_SIGNAL_RETURN; } } - this->actor.flags &= ~ACTOR_FLAG_TARGETABLE; + this->actor.flags &= ~ACTOR_FLAG_ATTENTION_ENABLED; if (!this->unburrow) { this->actionFunc = EnDntJiji_SetupHide; } else { diff --git a/soh/src/overlays/actors/ovl_En_Dnt_Nomal/z_en_dnt_nomal.c b/soh/src/overlays/actors/ovl_En_Dnt_Nomal/z_en_dnt_nomal.c index e629277f4..06d44e17a 100644 --- a/soh/src/overlays/actors/ovl_En_Dnt_Nomal/z_en_dnt_nomal.c +++ b/soh/src/overlays/actors/ovl_En_Dnt_Nomal/z_en_dnt_nomal.c @@ -15,7 +15,7 @@ #include "soh/ResourceManagerHelpers.h" #include "soh/Enhancements/game-interactor/GameInteractor_Hooks.h" -#define FLAGS (ACTOR_FLAG_UPDATE_WHILE_CULLED | ACTOR_FLAG_DRAW_WHILE_CULLED) +#define FLAGS (ACTOR_FLAG_UPDATE_CULLING_DISABLED | ACTOR_FLAG_DRAW_CULLING_DISABLED) void EnDntNomal_Init(Actor* thisx, PlayState* play); void EnDntNomal_Destroy(Actor* thisx, PlayState* play); @@ -125,7 +125,7 @@ void EnDntNomal_Init(Actor* thisx, PlayState* play) { if (this->type < ENDNTNOMAL_TARGET) { this->type = ENDNTNOMAL_TARGET; } - this->actor.flags &= ~ACTOR_FLAG_TARGETABLE; + this->actor.flags &= ~ACTOR_FLAG_ATTENTION_ENABLED; this->actor.colChkInfo.mass = 0xFF; this->objId = -1; if (this->type == ENDNTNOMAL_TARGET) { diff --git a/soh/src/overlays/actors/ovl_En_Dodojr/z_en_dodojr.c b/soh/src/overlays/actors/ovl_En_Dodojr/z_en_dodojr.c index 96121dfc6..6683ae032 100644 --- a/soh/src/overlays/actors/ovl_En_Dodojr/z_en_dodojr.c +++ b/soh/src/overlays/actors/ovl_En_Dodojr/z_en_dodojr.c @@ -10,7 +10,7 @@ #include "soh/Enhancements/game-interactor/GameInteractor_Hooks.h" #include "soh/ResourceManagerHelpers.h" -#define FLAGS (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_HOSTILE) +#define FLAGS (ACTOR_FLAG_ATTENTION_ENABLED | ACTOR_FLAG_HOSTILE) void EnDodojr_Init(Actor* thisx, PlayState* play); void EnDodojr_Destroy(Actor* thisx, PlayState* play); @@ -79,7 +79,7 @@ void EnDodojr_Init(Actor* thisx, PlayState* play) { CollisionCheck_SetInfo2(&this->actor.colChkInfo, DamageTable_Get(4), &sColChkInit); this->actor.naviEnemyId = 0xE; - this->actor.flags &= ~ACTOR_FLAG_TARGETABLE; + this->actor.flags &= ~ACTOR_FLAG_ATTENTION_ENABLED; Actor_SetScale(&this->actor, 0.02f); @@ -209,7 +209,7 @@ void func_809F6B38(EnDodojr* this) { void func_809F6BBC(EnDodojr* this) { this->actor.shape.shadowDraw = NULL; - this->actor.flags &= ~ACTOR_FLAG_TARGETABLE; + this->actor.flags &= ~ACTOR_FLAG_ATTENTION_ENABLED; this->actor.home.pos = this->actor.world.pos; this->actor.speedXZ = 0.0f; this->actor.gravity = -0.8f; @@ -321,7 +321,7 @@ s32 func_809F706C(EnDodojr* this) { void func_809F709C(EnDodojr* this) { Audio_PlayActorSound2(&this->actor, NA_SE_EN_DODO_M_DEAD); - this->actor.flags &= ~ACTOR_FLAG_TARGETABLE; + this->actor.flags &= ~ACTOR_FLAG_ATTENTION_ENABLED; func_809F6A20(this); this->actionFunc = func_809F7AB8; } @@ -406,7 +406,7 @@ void func_809F73AC(EnDodojr* this, PlayState* play) { -10.0f); Audio_PlayActorSound2(&this->actor, NA_SE_EN_DODO_M_UP); this->actor.world.pos.y -= 60.0f; - this->actor.flags |= ACTOR_FLAG_TARGETABLE; + this->actor.flags |= ACTOR_FLAG_ATTENTION_ENABLED; this->actor.world.rot.x -= 0x4000; this->actor.shape.rot.x = this->actor.world.rot.x; this->dustPos = this->actor.world.pos; @@ -482,7 +482,7 @@ void func_809F768C(EnDodojr* this, PlayState* play) { void func_809F773C(EnDodojr* this, PlayState* play) { if (DECR(this->timer3) == 0) { func_809F64D0(this); - this->actor.flags &= ~ACTOR_FLAG_TARGETABLE; + this->actor.flags &= ~ACTOR_FLAG_ATTENTION_ENABLED; func_809F6A20(this); this->actionFunc = func_809F77AC; } @@ -538,7 +538,7 @@ void func_809F78EC(EnDodojr* this, PlayState* play) { } void func_809F799C(EnDodojr* this, PlayState* play) { - this->actor.flags |= ACTOR_FLAG_PLAY_HIT_SFX; + this->actor.flags |= ACTOR_FLAG_SFX_FOR_PLAYER_BODY_HIT; Actor_UpdateVelocityXZGravity(&this->actor); if (func_809F68B0(this, play) != 0) { diff --git a/soh/src/overlays/actors/ovl_En_Dodongo/z_en_dodongo.c b/soh/src/overlays/actors/ovl_En_Dodongo/z_en_dodongo.c index d714093ac..7e2333805 100644 --- a/soh/src/overlays/actors/ovl_En_Dodongo/z_en_dodongo.c +++ b/soh/src/overlays/actors/ovl_En_Dodongo/z_en_dodongo.c @@ -5,7 +5,7 @@ #include "soh/Enhancements/game-interactor/GameInteractor_Hooks.h" #include "soh/ResourceManagerHelpers.h" -#define FLAGS (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_HOSTILE | ACTOR_FLAG_UPDATE_WHILE_CULLED) +#define FLAGS (ACTOR_FLAG_ATTENTION_ENABLED | ACTOR_FLAG_HOSTILE | ACTOR_FLAG_UPDATE_CULLING_DISABLED) typedef enum { DODONGO_SWEEP_TAIL, @@ -567,12 +567,12 @@ void EnDodongo_Walk(EnDodongo* this, PlayState* play) { if (Math_Vec3f_DistXZ(&this->actor.home.pos, &player->actor.world.pos) < 400.0f) { Math_SmoothStepToS(&this->actor.world.rot.y, this->actor.yawTowardsPlayer, 1, 0x1F4, 0); - this->actor.flags |= ACTOR_FLAG_TARGETABLE; + this->actor.flags |= ACTOR_FLAG_ATTENTION_ENABLED; if ((this->actor.xzDistToPlayer < 100.0f) && (yawDiff < 0x1388) && (this->actor.yDistToPlayer < 60.0f)) { EnDodongo_SetupBreatheFire(this); } } else { - this->actor.flags &= ~ACTOR_FLAG_TARGETABLE; + this->actor.flags &= ~ACTOR_FLAG_ATTENTION_ENABLED; if ((Math_Vec3f_DistXZ(&this->actor.world.pos, &this->actor.home.pos) > 150.0f) || (this->retreatTimer != 0)) { s16 yawToHome = Math_Vec3f_Yaw(&this->actor.world.pos, &this->actor.home.pos); @@ -667,7 +667,7 @@ void EnDodongo_SetupDeath(EnDodongo* this, PlayState* play) { this->timer = 0; Audio_PlayActorSound2(&this->actor, NA_SE_EN_DODO_J_DEAD); this->actionState = DODONGO_DEATH; - this->actor.flags &= ~ACTOR_FLAG_TARGETABLE; + this->actor.flags &= ~ACTOR_FLAG_ATTENTION_ENABLED; this->actor.speedXZ = 0.0f; EnDodongo_SetupAction(this, EnDodongo_Death); GameInteractor_ExecuteOnEnemyDefeat(&this->actor); diff --git a/soh/src/overlays/actors/ovl_En_Door/z_en_door.c b/soh/src/overlays/actors/ovl_En_Door/z_en_door.c index 92670921d..8208881d2 100644 --- a/soh/src/overlays/actors/ovl_En_Door/z_en_door.c +++ b/soh/src/overlays/actors/ovl_En_Door/z_en_door.c @@ -11,8 +11,9 @@ #include "objects/object_mizu_objects/object_mizu_objects.h" #include "objects/object_haka_door/object_haka_door.h" #include "soh/ResourceManagerHelpers.h" +#include "soh/Enhancements/game-interactor/GameInteractor_Hooks.h" -#define FLAGS ACTOR_FLAG_UPDATE_WHILE_CULLED +#define FLAGS ACTOR_FLAG_UPDATE_CULLING_DISABLED #define DOOR_AJAR_SLAM_RANGE 120.0f #define DOOR_AJAR_OPEN_RANGE (2 * DOOR_AJAR_SLAM_RANGE) @@ -153,7 +154,7 @@ void EnDoor_SetupType(EnDoor* this, PlayState* play) { if (Object_IsLoaded(&play->objectCtx, this->requiredObjBankIndex)) { doorType = this->actor.params >> 7 & 7; - this->actor.flags &= ~ACTOR_FLAG_UPDATE_WHILE_CULLED; + this->actor.flags &= ~ACTOR_FLAG_UPDATE_CULLING_DISABLED; this->actor.objBankIndex = this->requiredObjBankIndex; this->actionFunc = EnDoor_Idle; if (doorType == DOOR_EVENING) { @@ -162,7 +163,7 @@ void EnDoor_SetupType(EnDoor* this, PlayState* play) { } this->actor.world.rot.y = 0x0000; if (doorType == DOOR_LOCKED) { - if (!Flags_GetSwitch(play, this->actor.params & 0x3F)) { + if (GameInteractor_Should(VB_DOOR_BE_LOCKED, !Flags_GetSwitch(play, this->actor.params & 0x3F), this)) { this->lockTimer = 10; } } else if (doorType == DOOR_AJAR) { @@ -180,7 +181,7 @@ void EnDoor_SetupType(EnDoor* this, PlayState* play) { doorType = DOOR_SCENEEXIT; } else { this->actionFunc = EnDoor_WaitForCheck; - this->actor.flags |= ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_FRIENDLY | ACTOR_FLAG_NO_LOCKON; + this->actor.flags |= ACTOR_FLAG_ATTENTION_ENABLED | ACTOR_FLAG_FRIENDLY | ACTOR_FLAG_LOCK_ON_DISABLED; } } // Replace the door type it was loaded with by the new type @@ -201,8 +202,10 @@ void EnDoor_Idle(EnDoor* this, PlayState* play) { Animation_PlayOnceSetSpeed(&this->skelAnime, D_809FCECC[this->animStyle], (player->stateFlags1 & PLAYER_STATE1_IN_WATER) ? 0.75f : 1.5f); if (this->lockTimer != 0) { - gSaveContext.inventory.dungeonKeys[gSaveContext.mapIndex]--; - Flags_SetSwitch(play, this->actor.params & 0x3F); + if (GameInteractor_Should(VB_CONSUME_SMALL_KEY, true, this)) { + gSaveContext.inventory.dungeonKeys[gSaveContext.mapIndex]--; + Flags_SetSwitch(play, this->actor.params & 0x3F); + } Audio_PlayActorSound2(&this->actor, NA_SE_EV_CHAIN_KEY_UNLOCK); } } else if (!Player_InCsMode(play)) { @@ -214,7 +217,7 @@ void EnDoor_Idle(EnDoor* this, PlayState* play) { } if (ABS(phi_v0) < 0x3000) { if (this->lockTimer != 0) { - if (gSaveContext.inventory.dungeonKeys[gSaveContext.mapIndex] <= 0) { + if (GameInteractor_Should(VB_NOT_HAVE_SMALL_KEY, gSaveContext.inventory.dungeonKeys[gSaveContext.mapIndex] <= 0, this)) { Player* player2 = GET_PLAYER(play); player2->naviTextId = -0x203; diff --git a/soh/src/overlays/actors/ovl_En_Door/z_en_door.h b/soh/src/overlays/actors/ovl_En_Door/z_en_door.h index 4e7ef1279..a21047d74 100644 --- a/soh/src/overlays/actors/ovl_En_Door/z_en_door.h +++ b/soh/src/overlays/actors/ovl_En_Door/z_en_door.h @@ -55,6 +55,9 @@ typedef struct EnDoor { /* 0x0198 */ Vec3s jointTable[5]; /* 0x01B6 */ Vec3s morphTable[5]; /* 0x01D4 */ EnDoorActionFunc actionFunc; + // #region SOH [Randomizer] + /* */ RandomizerInf randomizerInf; + // #endregion } EnDoor; // size = 0x01D8 #ifdef __cplusplus diff --git a/soh/src/overlays/actors/ovl_En_Ds/z_en_ds.c b/soh/src/overlays/actors/ovl_En_Ds/z_en_ds.c index 497ba9388..ebc1b07b4 100644 --- a/soh/src/overlays/actors/ovl_En_Ds/z_en_ds.c +++ b/soh/src/overlays/actors/ovl_En_Ds/z_en_ds.c @@ -11,7 +11,7 @@ #include "soh/ResourceManagerHelpers.h" #include "soh/Enhancements/game-interactor/GameInteractor_Hooks.h" -#define FLAGS (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_FRIENDLY) +#define FLAGS (ACTOR_FLAG_ATTENTION_ENABLED | ACTOR_FLAG_FRIENDLY) void EnDs_Init(Actor* thisx, PlayState* play); void EnDs_Destroy(Actor* thisx, PlayState* play); @@ -48,7 +48,7 @@ void EnDs_Init(Actor* thisx, PlayState* play) { this->actionFunc = EnDs_Wait; this->actor.targetMode = 1; this->unk_1E8 = 0; - this->actor.flags &= ~ACTOR_FLAG_TARGETABLE; + this->actor.flags &= ~ACTOR_FLAG_ATTENTION_ENABLED; this->unk_1E4 = 0.0f; } @@ -61,7 +61,7 @@ void EnDs_Destroy(Actor* thisx, PlayState* play) { void EnDs_Talk(EnDs* this, PlayState* play) { if (Actor_TextboxIsClosing(&this->actor, play)) { this->actionFunc = EnDs_Wait; - this->actor.flags &= ~ACTOR_FLAG_WILL_TALK; + this->actor.flags &= ~ACTOR_FLAG_TALK_OFFER_AUTO_ACCEPTED; } this->unk_1E8 |= 1; } @@ -78,7 +78,7 @@ void EnDs_TalkAfterGiveOddPotion(EnDs* this, PlayState* play) { if (Actor_ProcessTalkRequest(&this->actor, play)) { this->actionFunc = EnDs_Talk; } else { - this->actor.flags |= ACTOR_FLAG_WILL_TALK; + this->actor.flags |= ACTOR_FLAG_TALK_OFFER_AUTO_ACCEPTED; func_8002F2CC(&this->actor, play, 1000.0f); } } @@ -87,7 +87,7 @@ void EnDs_DisplayOddPotionText(EnDs* this, PlayState* play) { if (Actor_TextboxIsClosing(&this->actor, play)) { this->actor.textId = 0x504F; this->actionFunc = EnDs_TalkAfterGiveOddPotion; - this->actor.flags &= ~ACTOR_FLAG_PLAYER_TALKED_TO; + this->actor.flags &= ~ACTOR_FLAG_TALK; Flags_SetItemGetInf(ITEMGETINF_30); } } @@ -201,13 +201,13 @@ void EnDs_OfferBluePotion(EnDs* this, PlayState* play) { if(GameInteractor_Should(VB_GRANNY_TAKE_MONEY, true, this)){ Rupees_ChangeBy(-100); } - this->actor.flags &= ~ACTOR_FLAG_WILL_TALK; + this->actor.flags &= ~ACTOR_FLAG_TALK_OFFER_AUTO_ACCEPTED; if (GameInteractor_Should(VB_GIVE_ITEM_FROM_GRANNYS_SHOP, true, this)) { GetItemEntry itemEntry = ItemTable_Retrieve(GI_POTION_BLUE); Actor_OfferGetItem(&this->actor, play, GI_POTION_BLUE, 10000.0f, 50.0f); - gSaveContext.pendingSale = itemEntry.itemId; - gSaveContext.pendingSaleMod = itemEntry.modIndex; + gSaveContext.ship.pendingSale = itemEntry.itemId; + gSaveContext.ship.pendingSaleMod = itemEntry.modIndex; this->actionFunc = EnDs_GiveBluePotion; } diff --git a/soh/src/overlays/actors/ovl_En_Du/z_en_du.c b/soh/src/overlays/actors/ovl_En_Du/z_en_du.c index 04d979127..e00124dee 100644 --- a/soh/src/overlays/actors/ovl_En_Du/z_en_du.c +++ b/soh/src/overlays/actors/ovl_En_Du/z_en_du.c @@ -4,7 +4,7 @@ #include "soh/OTRGlobals.h" #include "soh/Enhancements/game-interactor/GameInteractor_Hooks.h" -#define FLAGS (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_FRIENDLY | ACTOR_FLAG_NO_FREEZE_OCARINA) +#define FLAGS (ACTOR_FLAG_ATTENTION_ENABLED | ACTOR_FLAG_FRIENDLY | ACTOR_FLAG_UPDATE_DURING_OCARINA) void EnDu_Init(Actor* thisx, PlayState* play); void EnDu_Destroy(Actor* thisx, PlayState* play); diff --git a/soh/src/overlays/actors/ovl_En_Dy_Extra/z_en_dy_extra.c b/soh/src/overlays/actors/ovl_En_Dy_Extra/z_en_dy_extra.c index cf4ceaee2..f3cb62144 100644 --- a/soh/src/overlays/actors/ovl_En_Dy_Extra/z_en_dy_extra.c +++ b/soh/src/overlays/actors/ovl_En_Dy_Extra/z_en_dy_extra.c @@ -9,7 +9,7 @@ #include "vt.h" #include "soh/ResourceManagerHelpers.h" -#define FLAGS (ACTOR_FLAG_UPDATE_WHILE_CULLED | ACTOR_FLAG_DRAW_WHILE_CULLED) +#define FLAGS (ACTOR_FLAG_UPDATE_CULLING_DISABLED | ACTOR_FLAG_DRAW_CULLING_DISABLED) void EnDyExtra_Init(Actor* thisx, PlayState* play); void EnDyExtra_Destroy(Actor* thisx, PlayState* play); diff --git a/soh/src/overlays/actors/ovl_En_Eg/z_en_eg.c b/soh/src/overlays/actors/ovl_En_Eg/z_en_eg.c index f204e146e..2aa4a3a20 100644 --- a/soh/src/overlays/actors/ovl_En_Eg/z_en_eg.c +++ b/soh/src/overlays/actors/ovl_En_Eg/z_en_eg.c @@ -7,7 +7,7 @@ #include "z_en_eg.h" #include "vt.h" -#define FLAGS ACTOR_FLAG_UPDATE_WHILE_CULLED +#define FLAGS ACTOR_FLAG_UPDATE_CULLING_DISABLED void EnEg_Init(Actor* thisx, PlayState* play); void EnEg_Destroy(Actor* thisx, PlayState* play); diff --git a/soh/src/overlays/actors/ovl_En_Eiyer/z_en_eiyer.c b/soh/src/overlays/actors/ovl_En_Eiyer/z_en_eiyer.c index 70cefaa65..a0213fb02 100644 --- a/soh/src/overlays/actors/ovl_En_Eiyer/z_en_eiyer.c +++ b/soh/src/overlays/actors/ovl_En_Eiyer/z_en_eiyer.c @@ -3,7 +3,7 @@ #include "soh/Enhancements/game-interactor/GameInteractor_Hooks.h" #include "soh/ResourceManagerHelpers.h" -#define FLAGS (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_HOSTILE) +#define FLAGS (ACTOR_FLAG_ATTENTION_ENABLED | ACTOR_FLAG_HOSTILE) void EnEiyer_Init(Actor* thisx, PlayState* play); void EnEiyer_Destroy(Actor* thisx, PlayState* play); @@ -206,7 +206,7 @@ void EnEiyer_SetupAppearFromGround(EnEiyer* this) { this->collider.base.atFlags &= ~AT_ON; this->collider.base.acFlags &= ~AC_ON; - this->actor.flags &= ~(ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_IGNORE_QUAKE); + this->actor.flags &= ~(ACTOR_FLAG_ATTENTION_ENABLED | ACTOR_FLAG_IGNORE_QUAKE); this->actor.shape.shadowScale = 0.0f; this->actor.shape.yOffset = 0.0f; this->actionFunc = EnEiyer_AppearFromGround; @@ -221,12 +221,12 @@ void EnEiyer_SetupUnderground(EnEiyer* this) { } this->collider.base.acFlags |= AC_ON; - this->actor.flags &= ~ACTOR_FLAG_UPDATE_WHILE_CULLED; - this->actor.flags |= ACTOR_FLAG_TARGETABLE; + this->actor.flags &= ~ACTOR_FLAG_UPDATE_CULLING_DISABLED; + this->actor.flags |= ACTOR_FLAG_ATTENTION_ENABLED; } void EnEiyer_SetupInactive(EnEiyer* this) { - this->actor.flags &= ~ACTOR_FLAG_TARGETABLE; + this->actor.flags &= ~ACTOR_FLAG_ATTENTION_ENABLED; this->actor.world.rot.y = this->actor.shape.rot.y; this->actionFunc = EnEiyer_Inactive; } @@ -271,7 +271,7 @@ void EnEiyer_SetupDiveAttack(EnEiyer* this, PlayState* play) { void EnEiyer_SetupLand(EnEiyer* this) { Animation_MorphToPlayOnce(&this->skelanime, &gStingerDiveAnim, -3.0f); this->collider.base.atFlags &= ~AT_ON; - this->actor.flags |= ACTOR_FLAG_UPDATE_WHILE_CULLED; + this->actor.flags |= ACTOR_FLAG_UPDATE_CULLING_DISABLED; // Update BgCheck info, play sound, and spawn effect on the first frame of the land action this->timer = -1; @@ -614,7 +614,7 @@ void EnEiyer_UpdateDamage(EnEiyer* this, PlayState* play) { if (Actor_ApplyDamage(&this->actor) == 0) { Enemy_StartFinishingBlow(play, &this->actor); Audio_PlayActorSound2(&this->actor, NA_SE_EN_EIER_DEAD); - this->actor.flags &= ~ACTOR_FLAG_TARGETABLE; + this->actor.flags &= ~ACTOR_FLAG_ATTENTION_ENABLED; GameInteractor_ExecuteOnEnemyDefeat(&this->actor); } @@ -678,7 +678,7 @@ void EnEiyer_Update(Actor* thisx, PlayState* play) { } } - if (this->actor.flags & ACTOR_FLAG_TARGETABLE) { + if (this->actor.flags & ACTOR_FLAG_ATTENTION_ENABLED) { this->actor.focus.pos.x = this->actor.world.pos.x + Math_SinS(this->actor.shape.rot.y) * 12.5f; this->actor.focus.pos.z = this->actor.world.pos.z + Math_CosS(this->actor.shape.rot.y) * 12.5f; this->actor.focus.pos.y = this->actor.world.pos.y; diff --git a/soh/src/overlays/actors/ovl_En_Elf/z_en_elf.c b/soh/src/overlays/actors/ovl_En_Elf/z_en_elf.c index 7b0e49674..bac3a0f5d 100644 --- a/soh/src/overlays/actors/ovl_En_Elf/z_en_elf.c +++ b/soh/src/overlays/actors/ovl_En_Elf/z_en_elf.c @@ -10,7 +10,7 @@ #include "soh/Enhancements/game-interactor/GameInteractor_Hooks.h" #include "soh/ResourceManagerHelpers.h" -#define FLAGS (ACTOR_FLAG_UPDATE_WHILE_CULLED | ACTOR_FLAG_DRAW_WHILE_CULLED | ACTOR_FLAG_NO_FREEZE_OCARINA) +#define FLAGS (ACTOR_FLAG_UPDATE_CULLING_DISABLED | ACTOR_FLAG_DRAW_CULLING_DISABLED | ACTOR_FLAG_UPDATE_DURING_OCARINA) #define FAIRY_FLAG_TIMED (1 << 8) #define FAIRY_FLAG_BIG (1 << 9) @@ -1387,7 +1387,7 @@ void func_80A053F0(Actor* thisx, PlayState* play) { } } else if (player->naviTextId < 0) { // trigger dialog instantly for negative message IDs - thisx->flags |= ACTOR_FLAG_WILL_TALK; + thisx->flags |= ACTOR_FLAG_TALK_OFFER_AUTO_ACCEPTED; } if (Actor_ProcessTalkRequest(thisx, play)) { @@ -1405,10 +1405,10 @@ void func_80A053F0(Actor* thisx, PlayState* play) { func_80A01C38(this, 3); if (this->elfMsg != NULL) { - this->elfMsg->actor.flags |= ACTOR_FLAG_PLAYER_TALKED_TO; + this->elfMsg->actor.flags |= ACTOR_FLAG_TALK; } - thisx->flags &= ~ACTOR_FLAG_WILL_TALK; + thisx->flags &= ~ACTOR_FLAG_TALK_OFFER_AUTO_ACCEPTED; } else { this->actionFunc(this, play); thisx->shape.rot.y = this->unk_2BC; diff --git a/soh/src/overlays/actors/ovl_En_Encount1/z_en_encount1.c b/soh/src/overlays/actors/ovl_En_Encount1/z_en_encount1.c index 74d5fcd06..fb2d74969 100644 --- a/soh/src/overlays/actors/ovl_En_Encount1/z_en_encount1.c +++ b/soh/src/overlays/actors/ovl_En_Encount1/z_en_encount1.c @@ -2,7 +2,7 @@ #include "vt.h" #include "overlays/actors/ovl_En_Tite/z_en_tite.h" -#define FLAGS (ACTOR_FLAG_UPDATE_WHILE_CULLED | ACTOR_FLAG_NO_LOCKON) +#define FLAGS (ACTOR_FLAG_UPDATE_CULLING_DISABLED | ACTOR_FLAG_LOCK_ON_DISABLED) void EnEncount1_Init(Actor* thisx, PlayState* play); void EnEncount1_Update(Actor* thisx, PlayState* play); @@ -65,7 +65,7 @@ void EnEncount1_Init(Actor* thisx, PlayState* play) { osSyncPrintf(VT_FGCOL(GREEN) "☆☆☆☆☆ 発生チェック範囲 ☆☆☆☆☆ %f\n" VT_RST, this->spawnRange); osSyncPrintf("\n\n"); - this->actor.flags &= ~ACTOR_FLAG_TARGETABLE; + this->actor.flags &= ~ACTOR_FLAG_ATTENTION_ENABLED; switch (this->spawnType) { case SPAWNER_LEEVER: this->timer = 30; diff --git a/soh/src/overlays/actors/ovl_En_Encount2/z_en_encount2.c b/soh/src/overlays/actors/ovl_En_Encount2/z_en_encount2.c index 8a200300f..66f2af5bf 100644 --- a/soh/src/overlays/actors/ovl_En_Encount2/z_en_encount2.c +++ b/soh/src/overlays/actors/ovl_En_Encount2/z_en_encount2.c @@ -4,7 +4,7 @@ #include "objects/object_efc_star_field/object_efc_star_field.h" #include "soh/frame_interpolation.h" -#define FLAGS (ACTOR_FLAG_UPDATE_WHILE_CULLED | ACTOR_FLAG_DRAW_WHILE_CULLED) +#define FLAGS (ACTOR_FLAG_UPDATE_CULLING_DISABLED | ACTOR_FLAG_DRAW_CULLING_DISABLED) typedef enum { /* 0x0 */ ENCOUNT2_INACTIVE, diff --git a/soh/src/overlays/actors/ovl_En_Ex_Item/z_en_ex_item.c b/soh/src/overlays/actors/ovl_En_Ex_Item/z_en_ex_item.c index 99be5f022..b3b206f79 100644 --- a/soh/src/overlays/actors/ovl_En_Ex_Item/z_en_ex_item.c +++ b/soh/src/overlays/actors/ovl_En_Ex_Item/z_en_ex_item.c @@ -11,7 +11,7 @@ #include "soh/OTRGlobals.h" #include "soh/Enhancements/game-interactor/GameInteractor_Hooks.h" -#define FLAGS (ACTOR_FLAG_UPDATE_WHILE_CULLED | ACTOR_FLAG_DRAW_WHILE_CULLED) +#define FLAGS (ACTOR_FLAG_UPDATE_CULLING_DISABLED | ACTOR_FLAG_DRAW_CULLING_DISABLED) void EnExItem_Init(Actor* thisx, PlayState* play); void EnExItem_Destroy(Actor* thisx, PlayState* play); @@ -54,7 +54,7 @@ void EnExItem_Init(Actor* thisx, PlayState* play) { s32 pad; EnExItem* this = (EnExItem*)thisx; - this->actor.flags &= ~ACTOR_FLAG_TARGETABLE; + this->actor.flags &= ~ACTOR_FLAG_ATTENTION_ENABLED; this->type = this->actor.params & 0xFF; this->unusedParam = (this->actor.params >> 8) & 0xFF; osSyncPrintf("\n\n"); diff --git a/soh/src/overlays/actors/ovl_En_Ex_Ruppy/z_en_ex_ruppy.c b/soh/src/overlays/actors/ovl_En_Ex_Ruppy/z_en_ex_ruppy.c index 6864ad652..a97d67612 100644 --- a/soh/src/overlays/actors/ovl_En_Ex_Ruppy/z_en_ex_ruppy.c +++ b/soh/src/overlays/actors/ovl_En_Ex_Ruppy/z_en_ex_ruppy.c @@ -3,7 +3,7 @@ #include "../ovl_En_Diving_Game/z_en_diving_game.h" #include "objects/gameplay_keep/gameplay_keep.h" -#define FLAGS ACTOR_FLAG_UPDATE_WHILE_CULLED +#define FLAGS ACTOR_FLAG_UPDATE_CULLING_DISABLED void EnExRuppy_Init(Actor* thisx, PlayState* play); void EnExRuppy_Destroy(Actor* thisx, PlayState* play); @@ -106,7 +106,7 @@ void EnExRuppy_Init(Actor* thisx, PlayState* play) { this->unk_15A = this->actor.world.rot.z; this->actor.world.rot.z = 0; this->timer = 30; - this->actor.flags &= ~ACTOR_FLAG_TARGETABLE; + this->actor.flags &= ~ACTOR_FLAG_ATTENTION_ENABLED; this->actionFunc = EnExRuppy_DropIntoWater; break; @@ -124,7 +124,7 @@ void EnExRuppy_Init(Actor* thisx, PlayState* play) { osSyncPrintf(VT_FGCOL(GREEN) "☆☆☆☆☆ わーなーコイン ☆☆☆☆☆ \n" VT_RST); this->actor.shape.shadowScale = 6.0f; this->actor.shape.yOffset = 700.0f; - this->actor.flags &= ~ACTOR_FLAG_TARGETABLE; + this->actor.flags &= ~ACTOR_FLAG_ATTENTION_ENABLED; this->actionFunc = EnExRuppy_WaitToBlowUp; break; @@ -146,13 +146,13 @@ void EnExRuppy_Init(Actor* thisx, PlayState* play) { osSyncPrintf(VT_FGCOL(GREEN) "☆☆☆☆☆ ノーマルルピー ☆☆☆☆☆ \n" VT_RST); this->actor.shape.shadowScale = 6.0f; this->actor.shape.yOffset = 700.0f; - this->actor.flags &= ~ACTOR_FLAG_TARGETABLE; + this->actor.flags &= ~ACTOR_FLAG_ATTENTION_ENABLED; this->actionFunc = EnExRuppy_WaitAsCollectible; break; case 4: // Progress markers in the shooting gallery this->actor.gravity = -3.0f; - this->actor.flags &= ~ACTOR_FLAG_TARGETABLE; + this->actor.flags &= ~ACTOR_FLAG_ATTENTION_ENABLED; Actor_SetScale(&this->actor, 0.01f); this->actor.shape.shadowScale = 6.0f; this->actor.shape.yOffset = -700.0f; diff --git a/soh/src/overlays/actors/ovl_En_Fd/z_en_fd.c b/soh/src/overlays/actors/ovl_En_Fd/z_en_fd.c index c71d8c9b7..9f16a40d5 100644 --- a/soh/src/overlays/actors/ovl_En_Fd/z_en_fd.c +++ b/soh/src/overlays/actors/ovl_En_Fd/z_en_fd.c @@ -11,7 +11,7 @@ #include "soh/Enhancements/game-interactor/GameInteractor_Hooks.h" #include "soh/ResourceManagerHelpers.h" -#define FLAGS (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_HOSTILE | ACTOR_FLAG_UPDATE_WHILE_CULLED | ACTOR_FLAG_HOOKSHOT_DRAGS) +#define FLAGS (ACTOR_FLAG_ATTENTION_ENABLED | ACTOR_FLAG_HOSTILE | ACTOR_FLAG_UPDATE_CULLING_DISABLED | ACTOR_FLAG_HOOKSHOT_PULLS_ACTOR) #define FLG_COREDEAD (0x4000) #define FLG_COREDONE (0x8000) @@ -296,7 +296,7 @@ s32 EnFd_ColliderCheck(EnFd* this, PlayState* play) { return false; } this->invincibilityTimer = 30; - this->actor.flags &= ~ACTOR_FLAG_TARGETABLE; + this->actor.flags &= ~ACTOR_FLAG_ATTENTION_ENABLED; Audio_PlayActorSound2(&this->actor, NA_SE_EN_FLAME_DAMAGE); Enemy_StartFinishingBlow(play, &this->actor); return true; @@ -460,8 +460,8 @@ void EnFd_Init(Actor* thisx, PlayState* play) { Collider_InitJntSph(play, &this->collider); Collider_SetJntSph(play, &this->collider, &this->actor, &sJntSphInit, this->colSphs); CollisionCheck_SetInfo2(&this->actor.colChkInfo, DamageTable_Get(0xF), &sColChkInit); - this->actor.flags &= ~ACTOR_FLAG_TARGETABLE; - this->actor.flags |= ACTOR_FLAG_PLAY_HIT_SFX; + this->actor.flags &= ~ACTOR_FLAG_ATTENTION_ENABLED; + this->actor.flags |= ACTOR_FLAG_SFX_FOR_PLAYER_BODY_HIT; Actor_SetScale(&this->actor, 0.01f); this->firstUpdateFlag = true; this->actor.gravity = -1.0f; @@ -495,7 +495,7 @@ void EnFd_SpinAndGrow(EnFd* this, PlayState* play) { this->actor.velocity.y = 6.0f; this->actor.scale.y = 0.01f; this->actor.world.rot.y ^= 0x8000; - this->actor.flags |= ACTOR_FLAG_TARGETABLE; + this->actor.flags |= ACTOR_FLAG_ATTENTION_ENABLED; this->actor.speedXZ = 8.0f; Animation_ChangeByInfo(&this->skelAnime, sAnimationInfo, ENFD_ANIM_1); this->actionFunc = EnFd_JumpToGround; @@ -671,7 +671,7 @@ void EnFd_Update(Actor* thisx, PlayState* play) { if (CHECK_FLAG_ALL(this->actor.flags, ACTOR_FLAG_HOOKSHOT_ATTACHED)) { // has been hookshoted if (EnFd_SpawnCore(this, play)) { - this->actor.flags &= ~ACTOR_FLAG_TARGETABLE; + this->actor.flags &= ~ACTOR_FLAG_ATTENTION_ENABLED; this->invincibilityTimer = 30; Audio_PlayActorSound2(&this->actor, NA_SE_EN_FLAME_DAMAGE); Enemy_StartFinishingBlow(play, &this->actor); diff --git a/soh/src/overlays/actors/ovl_En_Fd_Fire/z_en_fd_fire.c b/soh/src/overlays/actors/ovl_En_Fd_Fire/z_en_fd_fire.c index 7db366ca4..29a46375f 100644 --- a/soh/src/overlays/actors/ovl_En_Fd_Fire/z_en_fd_fire.c +++ b/soh/src/overlays/actors/ovl_En_Fd_Fire/z_en_fd_fire.c @@ -1,7 +1,7 @@ #include "z_en_fd_fire.h" #include "objects/gameplay_keep/gameplay_keep.h" -#define FLAGS (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_HOSTILE | ACTOR_FLAG_UPDATE_WHILE_CULLED) +#define FLAGS (ACTOR_FLAG_ATTENTION_ENABLED | ACTOR_FLAG_HOSTILE | ACTOR_FLAG_UPDATE_CULLING_DISABLED) void EnFdFire_Init(Actor* thisx, PlayState* play); void EnFdFire_Destroy(Actor* thisx, PlayState* play); @@ -129,7 +129,7 @@ void EnFdFire_Init(Actor* thisx, PlayState* play) { Collider_InitCylinder(play, &this->collider); Collider_SetCylinder(play, &this->collider, &this->actor, &sCylinderInit); CollisionCheck_SetInfo2(&this->actor.colChkInfo, &sDamageTable, &sColChkInit); - this->actor.flags &= ~ACTOR_FLAG_TARGETABLE; + this->actor.flags &= ~ACTOR_FLAG_ATTENTION_ENABLED; this->actor.gravity = -0.6f; this->actor.speedXZ = 5.0f; this->actor.velocity.y = 12.0f; diff --git a/soh/src/overlays/actors/ovl_En_Fhg_Fire/z_en_fhg_fire.c b/soh/src/overlays/actors/ovl_En_Fhg_Fire/z_en_fhg_fire.c index 1647e034c..f64023d05 100644 --- a/soh/src/overlays/actors/ovl_En_Fhg_Fire/z_en_fhg_fire.c +++ b/soh/src/overlays/actors/ovl_En_Fhg_Fire/z_en_fhg_fire.c @@ -11,7 +11,7 @@ #include "overlays/actors/ovl_En_fHG/z_en_fhg.h" #include "overlays/effects/ovl_Effect_Ss_Fhg_Flash/z_eff_ss_fhg_flash.h" -#define FLAGS (ACTOR_FLAG_UPDATE_WHILE_CULLED | ACTOR_FLAG_DRAW_WHILE_CULLED) +#define FLAGS (ACTOR_FLAG_UPDATE_CULLING_DISABLED | ACTOR_FLAG_DRAW_CULLING_DISABLED) typedef enum { /* 0 */ STRIKE_INIT, diff --git a/soh/src/overlays/actors/ovl_En_Fire_Rock/z_en_fire_rock.c b/soh/src/overlays/actors/ovl_En_Fire_Rock/z_en_fire_rock.c index e85844a2f..5be48769e 100644 --- a/soh/src/overlays/actors/ovl_En_Fire_Rock/z_en_fire_rock.c +++ b/soh/src/overlays/actors/ovl_En_Fire_Rock/z_en_fire_rock.c @@ -3,7 +3,7 @@ #include "vt.h" #include "objects/object_efc_star_field/object_efc_star_field.h" -#define FLAGS (ACTOR_FLAG_UPDATE_WHILE_CULLED | ACTOR_FLAG_DRAW_WHILE_CULLED) +#define FLAGS (ACTOR_FLAG_UPDATE_CULLING_DISABLED | ACTOR_FLAG_DRAW_CULLING_DISABLED) void EnFireRock_Init(Actor* thisx, PlayState* play); void EnFireRock_Destroy(Actor* thisx, PlayState* play); diff --git a/soh/src/overlays/actors/ovl_En_Firefly/z_en_firefly.c b/soh/src/overlays/actors/ovl_En_Firefly/z_en_firefly.c index 46b1f502d..d8d42a659 100644 --- a/soh/src/overlays/actors/ovl_En_Firefly/z_en_firefly.c +++ b/soh/src/overlays/actors/ovl_En_Firefly/z_en_firefly.c @@ -10,7 +10,7 @@ #include "soh/Enhancements/game-interactor/GameInteractor_Hooks.h" #include "soh/ResourceManagerHelpers.h" -#define FLAGS (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_HOSTILE | ACTOR_FLAG_IGNORE_QUAKE | ACTOR_FLAG_ARROW_DRAGGABLE) +#define FLAGS (ACTOR_FLAG_ATTENTION_ENABLED | ACTOR_FLAG_HOSTILE | ACTOR_FLAG_IGNORE_QUAKE | ACTOR_FLAG_CAN_ATTACH_TO_ARROW) void EnFirefly_Init(Actor* thisx, PlayState* play); void EnFirefly_Destroy(Actor* thisx, PlayState* play); @@ -151,7 +151,7 @@ void EnFirefly_Init(Actor* thisx, PlayState* play) { CollisionCheck_SetInfo(&this->actor.colChkInfo, &sDamageTable, &sColChkInfoInit); if ((this->actor.params & 0x8000) != 0) { - this->actor.flags |= ACTOR_FLAG_LENS; + this->actor.flags |= ACTOR_FLAG_REACT_TO_LENS; this->actor.draw = EnFirefly_DrawInvisible; this->actor.params &= 0x7FFF; } @@ -218,7 +218,7 @@ void EnFirefly_SetupFall(EnFirefly* this) { this->actor.velocity.y = 0.0f; Animation_Change(&this->skelAnime, &gKeeseFlyAnim, 0.5f, 0.0f, 0.0f, ANIMMODE_LOOP_INTERP, -3.0f); Audio_PlayActorSound2(&this->actor, NA_SE_EN_FFLY_DEAD); - this->actor.flags |= ACTOR_FLAG_UPDATE_WHILE_CULLED; + this->actor.flags |= ACTOR_FLAG_UPDATE_CULLING_DISABLED; Actor_SetColorFilter(&this->actor, 0x4000, 0xFF, 0, 40); this->actionFunc = EnFirefly_Fall; } @@ -267,7 +267,7 @@ void EnFirefly_SetupFrozenFall(EnFirefly* this, PlayState* play) { s32 i; Vec3f iceParticlePos; - this->actor.flags |= ACTOR_FLAG_UPDATE_WHILE_CULLED; + this->actor.flags |= ACTOR_FLAG_UPDATE_CULLING_DISABLED; this->auraType = KEESE_AURA_NONE; this->actor.speedXZ = 0.0f; Actor_SetColorFilter(&this->actor, 0, 0xFF, 0, 0xFF); @@ -430,7 +430,7 @@ void EnFirefly_Fall(EnFirefly* this, PlayState* play) { this->actor.colorFilterTimer = 40; SkelAnime_Update(&this->skelAnime); Math_StepToF(&this->actor.speedXZ, 0.0f, 0.5f); - if (this->actor.flags & ACTOR_FLAG_DRAGGED_BY_ARROW) { + if (this->actor.flags & ACTOR_FLAG_ATTACHED_TO_ARROW) { this->actor.colorFilterTimer = 40; } else { Math_ScaledStepToS(&this->actor.shape.rot.x, 0x6800, 0x200); @@ -634,7 +634,7 @@ void EnFirefly_UpdateDamage(EnFirefly* this, PlayState* play) { if ((this->actor.colChkInfo.damageEffect != 0) || (this->actor.colChkInfo.damage != 0)) { if (Actor_ApplyDamage(&this->actor) == 0) { Enemy_StartFinishingBlow(play, &this->actor); - this->actor.flags &= ~ACTOR_FLAG_TARGETABLE; + this->actor.flags &= ~ACTOR_FLAG_ATTENTION_ENABLED; } damageEffect = this->actor.colChkInfo.damageEffect; @@ -690,7 +690,7 @@ void EnFirefly_Update(Actor* thisx, PlayState* play2) { this->actionFunc(this, play); - if (!(this->actor.flags & ACTOR_FLAG_DRAGGED_BY_ARROW)) { + if (!(this->actor.flags & ACTOR_FLAG_ATTACHED_TO_ARROW)) { if ((this->actor.colChkInfo.health == 0) || (this->actionFunc == EnFirefly_Stunned)) { Actor_MoveXZGravity(&this->actor); } else { diff --git a/soh/src/overlays/actors/ovl_En_Fish/z_en_fish.c b/soh/src/overlays/actors/ovl_En_Fish/z_en_fish.c index ecf368b91..3a6b10e91 100644 --- a/soh/src/overlays/actors/ovl_En_Fish/z_en_fish.c +++ b/soh/src/overlays/actors/ovl_En_Fish/z_en_fish.c @@ -118,7 +118,7 @@ void EnFish_SetCutsceneData(EnFish* this) { thisx->shape.yOffset = 600.0f; D_80A17014 = 10.0f; D_80A17018 = 0.0f; - thisx->flags |= ACTOR_FLAG_UPDATE_WHILE_CULLED; + thisx->flags |= ACTOR_FLAG_UPDATE_CULLING_DISABLED; EnFish_SetOutOfWaterAnimation(this); } } @@ -143,7 +143,7 @@ void EnFish_Init(Actor* thisx, PlayState* play) { this->fastPhase = Rand_ZeroOne() * (0xFFFF + 0.5f); if (params == FISH_DROPPED) { - this->actor.flags |= ACTOR_FLAG_UPDATE_WHILE_CULLED; + this->actor.flags |= ACTOR_FLAG_UPDATE_CULLING_DISABLED; ActorShape_Init(&this->actor.shape, 0.0f, ActorShadow_DrawCircle, 8.0f); EnFish_Dropped_SetupFall(this); } else if (params == FISH_SWIMMING_UNIQUE) { @@ -477,7 +477,7 @@ void EnFish_Dropped_FlopOnGround(EnFish* this, PlayState* play) { void EnFish_Dropped_SetupSwimAway(EnFish* this) { this->actor.home.pos = this->actor.world.pos; - this->actor.flags |= ACTOR_FLAG_UPDATE_WHILE_CULLED; + this->actor.flags |= ACTOR_FLAG_UPDATE_CULLING_DISABLED; this->timer = 200; this->actor.gravity = 0.0f; this->actor.minVelocityY = 0.0f; diff --git a/soh/src/overlays/actors/ovl_En_Floormas/z_en_floormas.c b/soh/src/overlays/actors/ovl_En_Floormas/z_en_floormas.c index 636203c55..2695dc05b 100644 --- a/soh/src/overlays/actors/ovl_En_Floormas/z_en_floormas.c +++ b/soh/src/overlays/actors/ovl_En_Floormas/z_en_floormas.c @@ -9,7 +9,7 @@ #include "soh/Enhancements/game-interactor/GameInteractor_Hooks.h" #include "soh/ResourceManagerHelpers.h" -#define FLAGS (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_HOSTILE | ACTOR_FLAG_DRAGGED_BY_HOOKSHOT) +#define FLAGS (ACTOR_FLAG_ATTENTION_ENABLED | ACTOR_FLAG_HOSTILE | ACTOR_FLAG_HOOKSHOT_PULLS_PLAYER) #define SPAWN_INVISIBLE 0x8000 #define SPAWN_SMALL 0x10 @@ -141,13 +141,13 @@ void EnFloormas_Init(Actor* thisx, PlayState* play2) { // s16 cast needed this->actor.params &= (s16) ~(SPAWN_INVISIBLE); if (invisble) { - this->actor.flags |= ACTOR_FLAG_LENS; + this->actor.flags |= ACTOR_FLAG_REACT_TO_LENS; this->actor.draw = EnFloormas_DrawHighlighted; } if (this->actor.params == SPAWN_SMALL) { this->actor.draw = NULL; - this->actor.flags &= ~ACTOR_FLAG_TARGETABLE; + this->actor.flags &= ~ACTOR_FLAG_ATTENTION_ENABLED; this->actionFunc = EnFloormas_SmWait; } else { // spawn first small floormaster @@ -285,8 +285,8 @@ void EnFloormas_SetupLand(EnFloormas* this) { void EnFloormas_SetupSplit(EnFloormas* this) { Actor_SetScale(&this->actor, 0.004f); - this->actor.flags |= ACTOR_FLAG_UPDATE_WHILE_CULLED; - if (CHECK_FLAG_ALL(this->actor.flags, ACTOR_FLAG_LENS)) { + this->actor.flags |= ACTOR_FLAG_UPDATE_CULLING_DISABLED; + if (CHECK_FLAG_ALL(this->actor.flags, ACTOR_FLAG_REACT_TO_LENS)) { this->actor.draw = EnFloormas_DrawHighlighted; } else { this->actor.draw = EnFloormas_Draw; @@ -351,7 +351,7 @@ void EnFloormas_SetupGrabLink(EnFloormas* this, Player* player) { f32 xzDelta; Animation_Change(&this->skelAnime, &gWallmasterJumpAnim, 1.0f, 36.0f, 45.0f, ANIMMODE_ONCE, -3.0f); - this->actor.flags &= ~ACTOR_FLAG_TARGETABLE; + this->actor.flags &= ~ACTOR_FLAG_ATTENTION_ENABLED; this->actor.speedXZ = 0.0f; this->actor.velocity.y = 0.0f; EnFloormas_MakeInvulnerable(this); @@ -390,7 +390,7 @@ void EnFloormas_SetupSmWait(EnFloormas* this) { } this->actor.draw = NULL; this->actionFunc = EnFloormas_SmWait; - this->actor.flags &= ~(ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_UPDATE_WHILE_CULLED); + this->actor.flags &= ~(ACTOR_FLAG_ATTENTION_ENABLED | ACTOR_FLAG_UPDATE_CULLING_DISABLED); } void EnFloormas_SetupTakeDamage(EnFloormas* this) { @@ -670,7 +670,7 @@ void EnFloormas_Land(EnFloormas* this, PlayState* play) { void EnFloormas_Split(EnFloormas* this, PlayState* play) { if (this->actor.bgCheckFlags & 1) { if (SkelAnime_Update(&this->skelAnime)) { - this->actor.flags |= ACTOR_FLAG_TARGETABLE; + this->actor.flags |= ACTOR_FLAG_ATTENTION_ENABLED; this->smActionTimer = 50; EnFloormas_SetupStand(this); } @@ -812,7 +812,7 @@ void EnFloormas_GrabLink(EnFloormas* this, PlayState* play) { this->actor.shape.rot.x = 0; this->actor.velocity.y = 6.0f; - this->actor.flags |= ACTOR_FLAG_TARGETABLE; + this->actor.flags |= ACTOR_FLAG_ATTENTION_ENABLED; this->actor.speedXZ = -3.0f; EnFloormas_SetupLand(this); } else { @@ -919,7 +919,7 @@ void EnFloormas_Merge(EnFloormas* this, PlayState* play) { if (SkelAnime_Update(&this->skelAnime) != 0) { if (this->actor.scale.x >= 0.01f) { - this->actor.flags &= ~ACTOR_FLAG_UPDATE_WHILE_CULLED; + this->actor.flags &= ~ACTOR_FLAG_UPDATE_CULLING_DISABLED; EnFloormas_MakeVulnerable(this); this->actor.params = 0; this->collider.info.bumperFlags |= BUMP_HOOKABLE; @@ -1004,7 +1004,7 @@ void EnFloormas_ColliderCheck(EnFloormas* this, PlayState* play) { Audio_PlayActorSound2(&this->actor, NA_SE_EN_FALL_DEAD); } Enemy_StartFinishingBlow(play, &this->actor); - this->actor.flags &= ~ACTOR_FLAG_TARGETABLE; + this->actor.flags &= ~ACTOR_FLAG_ATTENTION_ENABLED; } else if (this->actor.colChkInfo.damage != 0) { Audio_PlayActorSound2(&this->actor, NA_SE_EN_FALL_DAMAGE); } @@ -1058,7 +1058,7 @@ void EnFloormas_Update(Actor* thisx, PlayState* play) { Actor_UpdateBgCheckInfo(play, &this->actor, 20.0f, this->actor.scale.x * 3000.0f, 0.0f, 0x1D); Collider_UpdateCylinder(&this->actor, &this->collider); if (this->actionFunc == EnFloormas_Charge) { - this->actor.flags |= ACTOR_FLAG_PLAY_HIT_SFX; + this->actor.flags |= ACTOR_FLAG_SFX_FOR_PLAYER_BODY_HIT; CollisionCheck_SetAT(play, &play->colChkCtx, &this->collider.base); } if (this->actionFunc != EnFloormas_GrabLink) { diff --git a/soh/src/overlays/actors/ovl_En_Fr/z_en_fr.c b/soh/src/overlays/actors/ovl_En_Fr/z_en_fr.c index 1606fbc1d..2ce772484 100644 --- a/soh/src/overlays/actors/ovl_En_Fr/z_en_fr.c +++ b/soh/src/overlays/actors/ovl_En_Fr/z_en_fr.c @@ -7,7 +7,7 @@ #include "soh/OTRGlobals.h" #include "soh/ResourceManagerHelpers.h" -#define FLAGS (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_FRIENDLY | ACTOR_FLAG_UPDATE_WHILE_CULLED | ACTOR_FLAG_NO_FREEZE_OCARINA) +#define FLAGS (ACTOR_FLAG_ATTENTION_ENABLED | ACTOR_FLAG_FRIENDLY | ACTOR_FLAG_UPDATE_CULLING_DISABLED | ACTOR_FLAG_UPDATE_DURING_OCARINA) void EnFr_Init(Actor* thisx, PlayState* play); void EnFr_Destroy(Actor* thisx, PlayState* play); @@ -230,7 +230,7 @@ void EnFr_Init(Actor* thisx, PlayState* play) { this->actor.destroy = NULL; this->actor.draw = NULL; this->actor.update = EnFr_UpdateIdle; - this->actor.flags &= ~(ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_UPDATE_WHILE_CULLED); + this->actor.flags &= ~(ACTOR_FLAG_ATTENTION_ENABLED | ACTOR_FLAG_UPDATE_CULLING_DISABLED); this->actor.flags &= ~0; Actor_ChangeCategory(play, &play->actorCtx, &this->actor, ACTORCAT_PROP); this->actor.textId = 0x40AC; @@ -272,7 +272,7 @@ void EnFr_Update(Actor* thisx, PlayState* play) { s32 pad2; if (Object_IsLoaded(&play->objectCtx, this->objBankIndex)) { - this->actor.flags &= ~ACTOR_FLAG_UPDATE_WHILE_CULLED; + this->actor.flags &= ~ACTOR_FLAG_UPDATE_CULLING_DISABLED; frogIndex = this->actor.params - 1; sEnFrPointers.frogs[frogIndex] = this; Actor_ProcessInitChain(&this->actor, sInitChain); @@ -315,7 +315,7 @@ void EnFr_Update(Actor* thisx, PlayState* play) { this->posButterflyLight.x = this->posButterfly.x = this->posLogSpot.x; this->posButterflyLight.y = this->posButterfly.y = this->posLogSpot.y + 50.0f; this->posButterflyLight.z = this->posButterfly.z = this->posLogSpot.z; - this->actor.flags &= ~ACTOR_FLAG_TARGETABLE; + this->actor.flags &= ~ACTOR_FLAG_ATTENTION_ENABLED; } } diff --git a/soh/src/overlays/actors/ovl_En_Fu/z_en_fu.c b/soh/src/overlays/actors/ovl_En_Fu/z_en_fu.c index 38553196c..8b9a7ae82 100644 --- a/soh/src/overlays/actors/ovl_En_Fu/z_en_fu.c +++ b/soh/src/overlays/actors/ovl_En_Fu/z_en_fu.c @@ -10,7 +10,7 @@ #include "soh/OTRGlobals.h" #include "soh/ResourceManagerHelpers.h" -#define FLAGS (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_FRIENDLY | ACTOR_FLAG_UPDATE_WHILE_CULLED | ACTOR_FLAG_NO_FREEZE_OCARINA) +#define FLAGS (ACTOR_FLAG_ATTENTION_ENABLED | ACTOR_FLAG_FRIENDLY | ACTOR_FLAG_UPDATE_CULLING_DISABLED | ACTOR_FLAG_UPDATE_DURING_OCARINA) #define FU_RESET_LOOK_ANGLE (1 << 0) #define FU_WAIT (1 << 1) @@ -183,11 +183,11 @@ void func_80A1DBD4(EnFu* this, PlayState* play) { if (play->msgCtx.ocarinaMode >= OCARINA_MODE_04) { this->actionFunc = EnFu_WaitAdult; play->msgCtx.ocarinaMode = OCARINA_MODE_04; - this->actor.flags &= ~ACTOR_FLAG_WILL_TALK; + this->actor.flags &= ~ACTOR_FLAG_TALK_OFFER_AUTO_ACCEPTED; } else if (play->msgCtx.ocarinaMode == OCARINA_MODE_03) { Sfx_PlaySfxCentered(NA_SE_SY_CORRECT_CHIME); this->actionFunc = func_80A1DB60; - this->actor.flags &= ~ACTOR_FLAG_WILL_TALK; + this->actor.flags &= ~ACTOR_FLAG_TALK_OFFER_AUTO_ACCEPTED; play->msgCtx.ocarinaMode = OCARINA_MODE_00; Flags_SetEventChkInf(EVENTCHKINF_PLAYED_SONG_OF_STORMS_IN_WINDMILL); diff --git a/soh/src/overlays/actors/ovl_En_Fw/z_en_fw.c b/soh/src/overlays/actors/ovl_En_Fw/z_en_fw.c index 9603d4af0..22de733c1 100644 --- a/soh/src/overlays/actors/ovl_En_Fw/z_en_fw.c +++ b/soh/src/overlays/actors/ovl_En_Fw/z_en_fw.c @@ -11,7 +11,7 @@ #include "soh/frame_interpolation.h" #include "soh/ResourceManagerHelpers.h" -#define FLAGS (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_HOSTILE | ACTOR_FLAG_UPDATE_WHILE_CULLED | ACTOR_FLAG_HOOKSHOT_DRAGS) +#define FLAGS (ACTOR_FLAG_ATTENTION_ENABLED | ACTOR_FLAG_HOSTILE | ACTOR_FLAG_UPDATE_CULLING_DISABLED | ACTOR_FLAG_HOOKSHOT_PULLS_ACTOR) void EnFw_Init(Actor* thisx, PlayState* play); void EnFw_Destroy(Actor* thisx, PlayState* play); diff --git a/soh/src/overlays/actors/ovl_En_Fz/z_en_fz.c b/soh/src/overlays/actors/ovl_En_Fz/z_en_fz.c index e439bfe41..8aaab1631 100644 --- a/soh/src/overlays/actors/ovl_En_Fz/z_en_fz.c +++ b/soh/src/overlays/actors/ovl_En_Fz/z_en_fz.c @@ -3,7 +3,7 @@ #include "soh/frame_interpolation.h" #include "soh/Enhancements/game-interactor/GameInteractor_Hooks.h" -#define FLAGS (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_HOSTILE | ACTOR_FLAG_UPDATE_WHILE_CULLED | ACTOR_FLAG_DRAGGED_BY_HOOKSHOT) +#define FLAGS (ACTOR_FLAG_ATTENTION_ENABLED | ACTOR_FLAG_HOSTILE | ACTOR_FLAG_UPDATE_CULLING_DISABLED | ACTOR_FLAG_HOOKSHOT_PULLS_PLAYER) void EnFz_Init(Actor* thisx, PlayState* play); void EnFz_Destroy(Actor* thisx, PlayState* play); @@ -176,7 +176,7 @@ void EnFz_Init(Actor* thisx, PlayState* play) { Actor_SetScale(&this->actor, 0.008f); this->actor.colChkInfo.mass = MASS_IMMOVABLE; - this->actor.flags &= ~ACTOR_FLAG_TARGETABLE; + this->actor.flags &= ~ACTOR_FLAG_ATTENTION_ENABLED; this->unusedTimer1 = 0; this->unusedCounter = 0; this->updateBgInfo = true; @@ -389,7 +389,7 @@ void EnFz_SetYawTowardsPlayer(EnFz* this) { void EnFz_SetupDisappear(EnFz* this) { this->state = 2; this->isFreezing = false; - this->actor.flags &= ~ACTOR_FLAG_TARGETABLE; + this->actor.flags &= ~ACTOR_FLAG_ATTENTION_ENABLED; this->actionFunc = EnFz_Disappear; } @@ -447,7 +447,7 @@ void EnFz_SetupAimForMove(EnFz* this) { this->timer = 40; this->updateBgInfo = true; this->isFreezing = true; - this->actor.flags |= ACTOR_FLAG_TARGETABLE; + this->actor.flags |= ACTOR_FLAG_ATTENTION_ENABLED; this->actionFunc = EnFz_AimForMove; this->actor.gravity = -1.0f; } @@ -550,7 +550,7 @@ void EnFz_SetupDespawn(EnFz* this, PlayState* play) { this->updateBgInfo = true; this->isFreezing = false; this->isDespawning = true; - this->actor.flags &= ~ACTOR_FLAG_TARGETABLE; + this->actor.flags &= ~ACTOR_FLAG_ATTENTION_ENABLED; this->isActive = false; this->timer = 60; this->speedXZ = 0.0f; @@ -572,7 +572,7 @@ void EnFz_SetupMelt(EnFz* this) { this->state = 3; this->isFreezing = false; this->isDespawning = true; - this->actor.flags &= ~ACTOR_FLAG_TARGETABLE; + this->actor.flags &= ~ACTOR_FLAG_ATTENTION_ENABLED; this->actionFunc = EnFz_Melt; this->actor.speedXZ = 0.0f; this->speedXZ = 0.0f; @@ -603,7 +603,7 @@ void EnFz_SetupBlowSmokeStationary(EnFz* this) { this->timer = 40; this->updateBgInfo = true; this->isFreezing = true; - this->actor.flags |= ACTOR_FLAG_TARGETABLE; + this->actor.flags |= ACTOR_FLAG_ATTENTION_ENABLED; this->actionFunc = EnFz_BlowSmokeStationary; this->actor.gravity = -1.0f; } diff --git a/soh/src/overlays/actors/ovl_En_G_Switch/z_en_g_switch.c b/soh/src/overlays/actors/ovl_En_G_Switch/z_en_g_switch.c index cbfa88b7b..c38b83560 100644 --- a/soh/src/overlays/actors/ovl_En_G_Switch/z_en_g_switch.c +++ b/soh/src/overlays/actors/ovl_En_G_Switch/z_en_g_switch.c @@ -14,7 +14,7 @@ #include "objects/object_gi_rupy/object_gi_rupy.h" #include "soh/frame_interpolation.h" -#define FLAGS (ACTOR_FLAG_UPDATE_WHILE_CULLED | ACTOR_FLAG_DRAW_WHILE_CULLED) +#define FLAGS (ACTOR_FLAG_UPDATE_CULLING_DISABLED | ACTOR_FLAG_DRAW_CULLING_DISABLED) typedef enum { /* 0 */ MOVE_TARGET, diff --git a/soh/src/overlays/actors/ovl_En_Ganon_Mant/z_en_ganon_mant.c b/soh/src/overlays/actors/ovl_En_Ganon_Mant/z_en_ganon_mant.c index 3c3b40295..ec0138a5a 100644 --- a/soh/src/overlays/actors/ovl_En_Ganon_Mant/z_en_ganon_mant.c +++ b/soh/src/overlays/actors/ovl_En_Ganon_Mant/z_en_ganon_mant.c @@ -9,7 +9,7 @@ #include "soh/OTRGlobals.h" #include "soh/ResourceManagerHelpers.h" -#define FLAGS (ACTOR_FLAG_UPDATE_WHILE_CULLED | ACTOR_FLAG_DRAW_WHILE_CULLED) +#define FLAGS (ACTOR_FLAG_UPDATE_CULLING_DISABLED | ACTOR_FLAG_DRAW_CULLING_DISABLED) void EnGanonMant_Init(Actor* thisx, PlayState* play); void EnGanonMant_Destroy(Actor* thisx, PlayState* play); @@ -105,7 +105,7 @@ static u8 sMaskTex[MANT_TEX_WIDTH * MANT_TEX_HEIGHT] = { {0} }; void EnGanonMant_Init(Actor* thisx, PlayState* play) { EnGanonMant* this = (EnGanonMant*)thisx; - this->actor.flags &= ~ACTOR_FLAG_TARGETABLE; + this->actor.flags &= ~ACTOR_FLAG_ATTENTION_ENABLED; for (int i = 0; i < ARRAY_COUNT(sMaskTex); i++) { sMaskTex[i] = 0; diff --git a/soh/src/overlays/actors/ovl_En_Ganon_Organ/z_en_ganon_organ.c b/soh/src/overlays/actors/ovl_En_Ganon_Organ/z_en_ganon_organ.c index 32b875df0..aebec1aa4 100644 --- a/soh/src/overlays/actors/ovl_En_Ganon_Organ/z_en_ganon_organ.c +++ b/soh/src/overlays/actors/ovl_En_Ganon_Organ/z_en_ganon_organ.c @@ -7,7 +7,7 @@ #include "z_en_ganon_organ.h" #include "overlays/actors/ovl_Boss_Ganon/z_boss_ganon.h" -#define FLAGS (ACTOR_FLAG_UPDATE_WHILE_CULLED | ACTOR_FLAG_DRAW_WHILE_CULLED) +#define FLAGS (ACTOR_FLAG_UPDATE_CULLING_DISABLED | ACTOR_FLAG_DRAW_CULLING_DISABLED) void EnGanonOrgan_Init(Actor* thisx, PlayState* play); void EnGanonOrgan_Destroy(Actor* thisx, PlayState* play); @@ -32,7 +32,7 @@ const ActorInit En_Ganon_Organ_InitVars = { #include "overlays/ovl_En_Ganon_Organ/ovl_En_Ganon_Organ.h" void EnGanonOrgan_Init(Actor* thisx, PlayState* play) { - thisx->flags &= ~ACTOR_FLAG_TARGETABLE; + thisx->flags &= ~ACTOR_FLAG_ATTENTION_ENABLED; } void EnGanonOrgan_Destroy(Actor* thisx, PlayState* play) { diff --git a/soh/src/overlays/actors/ovl_En_Gb/z_en_gb.c b/soh/src/overlays/actors/ovl_En_Gb/z_en_gb.c index 935e3dc40..15bac0bf0 100644 --- a/soh/src/overlays/actors/ovl_En_Gb/z_en_gb.c +++ b/soh/src/overlays/actors/ovl_En_Gb/z_en_gb.c @@ -11,7 +11,7 @@ #include "soh/ResourceManagerHelpers.h" #include "soh/Enhancements/game-interactor/GameInteractor_Hooks.h" -#define FLAGS (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_FRIENDLY) +#define FLAGS (ACTOR_FLAG_ATTENTION_ENABLED | ACTOR_FLAG_FRIENDLY) void EnGb_Init(Actor* thisx, PlayState* play); void EnGb_Destroy(Actor* thisx, PlayState* play); diff --git a/soh/src/overlays/actors/ovl_En_Ge1/z_en_ge1.c b/soh/src/overlays/actors/ovl_En_Ge1/z_en_ge1.c index cfc7bc8e1..1614bac81 100644 --- a/soh/src/overlays/actors/ovl_En_Ge1/z_en_ge1.c +++ b/soh/src/overlays/actors/ovl_En_Ge1/z_en_ge1.c @@ -12,7 +12,7 @@ #include "soh/ResourceManagerHelpers.h" #include "soh/Enhancements/game-interactor/GameInteractor_Hooks.h" -#define FLAGS (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_FRIENDLY) +#define FLAGS (ACTOR_FLAG_ATTENTION_ENABLED | ACTOR_FLAG_FRIENDLY) #define GE1_STATE_TALKING (1 << 0) #define GE1_STATE_GIVE_QUIVER (1 << 1) @@ -555,7 +555,7 @@ void EnGe1_BeginGiveItem_Archery(EnGe1* this, PlayState* play) { s32 getItemId; if (Actor_TextboxIsClosing(&this->actor, play)) { - this->actor.flags &= ~ACTOR_FLAG_WILL_TALK; + this->actor.flags &= ~ACTOR_FLAG_TALK_OFFER_AUTO_ACCEPTED; this->actionFunc = EnGe1_WaitTillItemGiven_Archery; } @@ -581,7 +581,7 @@ void EnGe1_BeginGiveItem_Archery(EnGe1* this, PlayState* play) { void EnGe1_TalkWinPrize_Archery(EnGe1* this, PlayState* play) { if (Actor_ProcessTalkRequest(&this->actor, play)) { this->actionFunc = EnGe1_BeginGiveItem_Archery; - this->actor.flags &= ~ACTOR_FLAG_WILL_TALK; + this->actor.flags &= ~ACTOR_FLAG_TALK_OFFER_AUTO_ACCEPTED; } else { func_8002F2CC(&this->actor, play, 200.0f); } @@ -603,7 +603,7 @@ void EnGe1_BeginGame_Archery(EnGe1* this, PlayState* play) { Actor* horse; if ((Message_GetState(&play->msgCtx) == TEXT_STATE_CHOICE) && Message_ShouldAdvance(play)) { - this->actor.flags &= ~ACTOR_FLAG_WILL_TALK; + this->actor.flags &= ~ACTOR_FLAG_TALK_OFFER_AUTO_ACCEPTED; switch (play->msgCtx.choiceIndex) { case 0: @@ -661,7 +661,7 @@ void EnGe1_TalkAfterGame_Archery(EnGe1* this, PlayState* play) { gSaveContext.eventInf[0] &= ~0x100; LOG_NUM("z_common_data.yabusame_total", gSaveContext.minigameScore); LOG_NUM("z_common_data.memory.information.room_inf[127][ 0 ]", HIGH_SCORE(HS_HBA)); - this->actor.flags |= ACTOR_FLAG_WILL_TALK; + this->actor.flags |= ACTOR_FLAG_TALK_OFFER_AUTO_ACCEPTED; if (HIGH_SCORE(HS_HBA) < gSaveContext.minigameScore) { HIGH_SCORE(HS_HBA) = gSaveContext.minigameScore; diff --git a/soh/src/overlays/actors/ovl_En_Ge2/z_en_ge2.c b/soh/src/overlays/actors/ovl_En_Ge2/z_en_ge2.c index fd1317bdb..ab1053805 100644 --- a/soh/src/overlays/actors/ovl_En_Ge2/z_en_ge2.c +++ b/soh/src/overlays/actors/ovl_En_Ge2/z_en_ge2.c @@ -13,7 +13,7 @@ #include "soh/OTRGlobals.h" #include "soh/ResourceManagerHelpers.h" -#define FLAGS (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_FRIENDLY | ACTOR_FLAG_UPDATE_WHILE_CULLED) +#define FLAGS (ACTOR_FLAG_ATTENTION_ENABLED | ACTOR_FLAG_FRIENDLY | ACTOR_FLAG_UPDATE_CULLING_DISABLED) #define GE2_STATE_ANIMCOMPLETE (1 << 1) #define GE2_STATE_KO (1 << 2) @@ -312,7 +312,7 @@ void EnGe2_KnockedOut(EnGe2* this, PlayState* play) { s32 effectAngle; Vec3f effectPos; - this->actor.flags &= ~ACTOR_FLAG_TARGETABLE; + this->actor.flags &= ~ACTOR_FLAG_ATTENTION_ENABLED; if (this->stateFlags & GE2_STATE_ANIMCOMPLETE) { effectAngle = (play->state.frames) * 0x2800; effectPos.x = this->actor.focus.pos.x + (Math_CosS(effectAngle) * 5.0f); @@ -452,7 +452,7 @@ void EnGe2_SetActionAfterTalk(EnGe2* this, PlayState* play) { break; } this->actor.update = EnGe2_UpdateFriendly; - this->actor.flags &= ~ACTOR_FLAG_WILL_TALK; + this->actor.flags &= ~ACTOR_FLAG_TALK_OFFER_AUTO_ACCEPTED; } EnGe2_TurnToFacePlayer(this, play); } @@ -473,7 +473,7 @@ void EnGe2_WaitTillCardGiven(EnGe2* this, PlayState* play) { void EnGe2_GiveCard(EnGe2* this, PlayState* play) { if ((Message_GetState(&play->msgCtx) == TEXT_STATE_EVENT) && Message_ShouldAdvance(play)) { Message_CloseTextbox(play); - this->actor.flags &= ~ACTOR_FLAG_WILL_TALK; + this->actor.flags &= ~ACTOR_FLAG_TALK_OFFER_AUTO_ACCEPTED; this->actionFunc = EnGe2_WaitTillCardGiven; if (GameInteractor_Should(VB_GIVE_ITEM_GERUDO_MEMBERSHIP_CARD, true)) { Actor_OfferGetItem(&this->actor, play, GI_GERUDO_CARD, 10000.0f, 50.0f); @@ -487,7 +487,7 @@ void EnGe2_ForceTalk(EnGe2* this, PlayState* play) { this->actionFunc = EnGe2_GiveCard; } else { this->actor.textId = 0x6004; - this->actor.flags |= ACTOR_FLAG_WILL_TALK; + this->actor.flags |= ACTOR_FLAG_TALK_OFFER_AUTO_ACCEPTED; func_8002F1C4(&this->actor, play, 300.0f, 300.0f, 0); } EnGe2_LookAtPlayer(this, play); diff --git a/soh/src/overlays/actors/ovl_En_Ge3/z_en_ge3.c b/soh/src/overlays/actors/ovl_En_Ge3/z_en_ge3.c index 811e0a673..24129fb2a 100644 --- a/soh/src/overlays/actors/ovl_En_Ge3/z_en_ge3.c +++ b/soh/src/overlays/actors/ovl_En_Ge3/z_en_ge3.c @@ -10,7 +10,7 @@ #include "soh/ResourceManagerHelpers.h" #include "soh/Enhancements/game-interactor/GameInteractor_Hooks.h" -#define FLAGS (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_FRIENDLY | ACTOR_FLAG_UPDATE_WHILE_CULLED) +#define FLAGS (ACTOR_FLAG_ATTENTION_ENABLED | ACTOR_FLAG_FRIENDLY | ACTOR_FLAG_UPDATE_CULLING_DISABLED) void EnGe3_Init(Actor* thisx, PlayState* play); void EnGe3_Destroy(Actor* thisx, PlayState* play); @@ -133,7 +133,7 @@ void EnGe3_Wait(EnGe3* this, PlayState* play) { if (Actor_TextboxIsClosing(&this->actor, play)) { this->actionFunc = EnGe3_WaitLookAtPlayer; this->actor.update = EnGe3_UpdateWhenNotTalking; - this->actor.flags &= ~ACTOR_FLAG_WILL_TALK; + this->actor.flags &= ~ACTOR_FLAG_TALK_OFFER_AUTO_ACCEPTED; } EnGe3_TurnToFacePlayer(this, play); } @@ -154,7 +154,7 @@ void EnGe3_WaitTillCardGiven(EnGe3* this, PlayState* play) { void EnGe3_GiveCard(EnGe3* this, PlayState* play) { if ((Message_GetState(&play->msgCtx) == TEXT_STATE_EVENT) && Message_ShouldAdvance(play)) { Message_CloseTextbox(play); - this->actor.flags &= ~ACTOR_FLAG_WILL_TALK; + this->actor.flags &= ~ACTOR_FLAG_TALK_OFFER_AUTO_ACCEPTED; this->actionFunc = EnGe3_WaitTillCardGiven; if (GameInteractor_Should(VB_GIVE_ITEM_GERUDO_MEMBERSHIP_CARD, true)) { Actor_OfferGetItem(&this->actor, play, GI_GERUDO_CARD, 10000.0f, 50.0f); @@ -171,7 +171,7 @@ void EnGe3_ForceTalk(EnGe3* this, PlayState* play) { this->unk_30C |= 4; } this->actor.textId = 0x6004; - this->actor.flags |= ACTOR_FLAG_WILL_TALK; + this->actor.flags |= ACTOR_FLAG_TALK_OFFER_AUTO_ACCEPTED; func_8002F1C4(&this->actor, play, 300.0f, 300.0f, 0); } EnGe3_LookAtPlayer(this, play); diff --git a/soh/src/overlays/actors/ovl_En_GeldB/z_en_geldb.c b/soh/src/overlays/actors/ovl_En_GeldB/z_en_geldb.c index af3107097..841181701 100644 --- a/soh/src/overlays/actors/ovl_En_GeldB/z_en_geldb.c +++ b/soh/src/overlays/actors/ovl_En_GeldB/z_en_geldb.c @@ -10,7 +10,7 @@ #include "soh/Enhancements/game-interactor/GameInteractor_Hooks.h" #include "soh/ResourceManagerHelpers.h" -#define FLAGS (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_HOSTILE | ACTOR_FLAG_UPDATE_WHILE_CULLED) +#define FLAGS (ACTOR_FLAG_ATTENTION_ENABLED | ACTOR_FLAG_HOSTILE | ACTOR_FLAG_UPDATE_CULLING_DISABLED) typedef enum { /* 0 */ GELDB_WAIT, @@ -354,7 +354,7 @@ void EnGeldB_SetupWait(EnGeldB* this) { this->action = GELDB_WAIT; this->actor.bgCheckFlags &= ~3; this->actor.gravity = -2.0f; - this->actor.flags &= ~ACTOR_FLAG_TARGETABLE; + this->actor.flags &= ~ACTOR_FLAG_ATTENTION_ENABLED; EnGeldB_SetupAction(this, EnGeldB_Wait); } @@ -372,7 +372,7 @@ void EnGeldB_Wait(EnGeldB* this, PlayState* play) { Audio_PlayActorSound2(&this->actor, NA_SE_EN_RIZA_DOWN); this->skelAnime.playSpeed = 1.0f; this->actor.world.pos.y = this->actor.floorHeight; - this->actor.flags |= ACTOR_FLAG_TARGETABLE; + this->actor.flags |= ACTOR_FLAG_ATTENTION_ENABLED; this->actor.focus.pos = this->actor.world.pos; this->actor.bgCheckFlags &= ~2; this->actor.velocity.y = 0.0f; @@ -1320,7 +1320,7 @@ void EnGeldB_SetupDefeated(EnGeldB* this) { this->invisible = true; } this->action = GELDB_DEFEAT; - this->actor.flags &= ~ACTOR_FLAG_TARGETABLE; + this->actor.flags &= ~ACTOR_FLAG_ATTENTION_ENABLED; Audio_PlayActorSound2(&this->actor, NA_SE_EN_GERUDOFT_DEAD); EnGeldB_SetupAction(this, EnGeldB_Defeated); GameInteractor_ExecuteOnEnemyDefeat(&this->actor); diff --git a/soh/src/overlays/actors/ovl_En_GirlA/z_en_girla.c b/soh/src/overlays/actors/ovl_En_GirlA/z_en_girla.c index b1ecb001e..611fbab18 100644 --- a/soh/src/overlays/actors/ovl_En_GirlA/z_en_girla.c +++ b/soh/src/overlays/actors/ovl_En_GirlA/z_en_girla.c @@ -11,7 +11,7 @@ #include "soh/OTRGlobals.h" #include -#define FLAGS (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_FRIENDLY | ACTOR_FLAG_UPDATE_WHILE_CULLED) +#define FLAGS (ACTOR_FLAG_ATTENTION_ENABLED | ACTOR_FLAG_FRIENDLY | ACTOR_FLAG_UPDATE_CULLING_DISABLED) void EnGirlA_Init(Actor* thisx, PlayState* play); void EnGirlA_Destroy(Actor* thisx, PlayState* play); @@ -763,9 +763,9 @@ s32 EnGirlA_CanBuy_Bombchus(PlayState* play, EnGirlA* this) { // When in rando, don't allow buying bombchus when the player doesn't have required explosives // If bombchus are in logic, the player needs to have bombchus; otherwise they need a bomb bag if (IS_RANDO) { - u8 bombchusInLogic = Randomizer_GetSettingValue(RSK_BOMBCHUS_IN_LOGIC); - if ((!bombchusInLogic && CUR_CAPACITY(UPG_BOMB_BAG) == 0) || - (bombchusInLogic && INV_CONTENT(ITEM_BOMBCHU) == ITEM_NONE)) { + u8 bombchuBag = Randomizer_GetSettingValue(RSK_BOMBCHU_BAG); + if ((!bombchuBag && CUR_CAPACITY(UPG_BOMB_BAG) == 0) || + (bombchuBag && INV_CONTENT(ITEM_BOMBCHU) == ITEM_NONE)) { return CANBUY_RESULT_CANT_GET_NOW; } } @@ -880,16 +880,16 @@ s32 EnGirlA_CanBuy_Randomizer(PlayState* play, EnGirlA* this) { void EnGirlA_ItemGive_Arrows(PlayState* play, EnGirlA* this) { GetItemEntry entry = ItemTable_Retrieve(this->getItemId); - gSaveContext.pendingSale = entry.itemId; - gSaveContext.pendingSaleMod = entry.modIndex; + gSaveContext.ship.pendingSale = entry.itemId; + gSaveContext.ship.pendingSaleMod = entry.modIndex; Inventory_ChangeAmmo(ITEM_BOW, this->itemCount); Rupees_ChangeBy(-this->basePrice); } void EnGirlA_ItemGive_Bombs(PlayState* play, EnGirlA* this) { GetItemEntry entry = ItemTable_Retrieve(this->getItemId); - gSaveContext.pendingSale = entry.itemId; - gSaveContext.pendingSaleMod = entry.modIndex; + gSaveContext.ship.pendingSale = entry.itemId; + gSaveContext.ship.pendingSaleMod = entry.modIndex; switch (this->itemCount) { case 5: Item_Give(play, ITEM_BOMBS_5); @@ -909,8 +909,8 @@ void EnGirlA_ItemGive_Bombs(PlayState* play, EnGirlA* this) { void EnGirlA_ItemGive_DekuNuts(PlayState* play, EnGirlA* this) { GetItemEntry entry = ItemTable_Retrieve(this->getItemId); - gSaveContext.pendingSale = entry.itemId; - gSaveContext.pendingSaleMod = entry.modIndex; + gSaveContext.ship.pendingSale = entry.itemId; + gSaveContext.ship.pendingSaleMod = entry.modIndex; switch (this->itemCount) { case 5: Item_Give(play, ITEM_NUTS_5); @@ -924,16 +924,16 @@ void EnGirlA_ItemGive_DekuNuts(PlayState* play, EnGirlA* this) { void EnGirlA_ItemGive_DekuSticks(PlayState* play, EnGirlA* this) { GetItemEntry entry = ItemTable_Retrieve(this->getItemId); - gSaveContext.pendingSale = entry.itemId; - gSaveContext.pendingSaleMod = entry.modIndex; + gSaveContext.ship.pendingSale = entry.itemId; + gSaveContext.ship.pendingSaleMod = entry.modIndex; Item_Give(play, ITEM_STICK); Rupees_ChangeBy(-this->basePrice); } void EnGirlA_ItemGive_Longsword(PlayState* play, EnGirlA* this) { GetItemEntry entry = ItemTable_Retrieve(this->getItemId); - gSaveContext.pendingSale = entry.itemId; - gSaveContext.pendingSaleMod = entry.modIndex; + gSaveContext.ship.pendingSale = entry.itemId; + gSaveContext.ship.pendingSaleMod = entry.modIndex; func_800849EC(play); gSaveContext.swordHealth = 8; Rupees_ChangeBy(-this->basePrice); @@ -941,86 +941,86 @@ void EnGirlA_ItemGive_Longsword(PlayState* play, EnGirlA* this) { void EnGirlA_ItemGive_HylianShield(PlayState* play, EnGirlA* this) { GetItemEntry entry = ItemTable_Retrieve(this->getItemId); - gSaveContext.pendingSale = entry.itemId; - gSaveContext.pendingSaleMod = entry.modIndex; + gSaveContext.ship.pendingSale = entry.itemId; + gSaveContext.ship.pendingSaleMod = entry.modIndex; Item_Give(play, ITEM_SHIELD_HYLIAN); Rupees_ChangeBy(-this->basePrice); } void EnGirlA_ItemGive_DekuShield(PlayState* play, EnGirlA* this) { GetItemEntry entry = ItemTable_Retrieve(this->getItemId); - gSaveContext.pendingSale = entry.itemId; - gSaveContext.pendingSaleMod = entry.modIndex; + gSaveContext.ship.pendingSale = entry.itemId; + gSaveContext.ship.pendingSaleMod = entry.modIndex; Item_Give(play, ITEM_SHIELD_DEKU); Rupees_ChangeBy(-this->basePrice); } void EnGirlA_ItemGive_GoronTunic(PlayState* play, EnGirlA* this) { GetItemEntry entry = ItemTable_Retrieve(this->getItemId); - gSaveContext.pendingSale = entry.itemId; - gSaveContext.pendingSaleMod = entry.modIndex; + gSaveContext.ship.pendingSale = entry.itemId; + gSaveContext.ship.pendingSaleMod = entry.modIndex; Item_Give(play, ITEM_TUNIC_GORON); Rupees_ChangeBy(-this->basePrice); } void EnGirlA_ItemGive_ZoraTunic(PlayState* play, EnGirlA* this) { GetItemEntry entry = ItemTable_Retrieve(this->getItemId); - gSaveContext.pendingSale = entry.itemId; - gSaveContext.pendingSaleMod = entry.modIndex; + gSaveContext.ship.pendingSale = entry.itemId; + gSaveContext.ship.pendingSaleMod = entry.modIndex; Item_Give(play, ITEM_TUNIC_ZORA); Rupees_ChangeBy(-this->basePrice); } void EnGirlA_ItemGive_Health(PlayState* play, EnGirlA* this) { GetItemEntry entry = ItemTable_Retrieve(this->getItemId); - gSaveContext.pendingSale = entry.itemId; - gSaveContext.pendingSaleMod = entry.modIndex; + gSaveContext.ship.pendingSale = entry.itemId; + gSaveContext.ship.pendingSaleMod = entry.modIndex; Health_ChangeBy(play, this->itemCount); Rupees_ChangeBy(-this->basePrice); } void EnGirlA_ItemGive_MilkBottle(PlayState* play, EnGirlA* this) { GetItemEntry entry = ItemTable_Retrieve(this->getItemId); - gSaveContext.pendingSale = entry.itemId; - gSaveContext.pendingSaleMod = entry.modIndex; + gSaveContext.ship.pendingSale = entry.itemId; + gSaveContext.ship.pendingSaleMod = entry.modIndex; Item_Give(play, ITEM_MILK_BOTTLE); Rupees_ChangeBy(-this->basePrice); } void EnGirlA_ItemGive_WeirdEgg(PlayState* play, EnGirlA* this) { GetItemEntry entry = ItemTable_Retrieve(this->getItemId); - gSaveContext.pendingSale = entry.itemId; - gSaveContext.pendingSaleMod = entry.modIndex; + gSaveContext.ship.pendingSale = entry.itemId; + gSaveContext.ship.pendingSaleMod = entry.modIndex; Item_Give(play, ITEM_WEIRD_EGG); Rupees_ChangeBy(-this->basePrice); } void EnGirlA_ItemGive_Unk19(PlayState* play, EnGirlA* this) { GetItemEntry entry = ItemTable_Retrieve(this->getItemId); - gSaveContext.pendingSale = entry.itemId; - gSaveContext.pendingSaleMod = entry.modIndex; + gSaveContext.ship.pendingSale = entry.itemId; + gSaveContext.ship.pendingSaleMod = entry.modIndex; Rupees_ChangeBy(-this->basePrice); } void EnGirlA_ItemGive_Unk20(PlayState* play, EnGirlA* this) { GetItemEntry entry = ItemTable_Retrieve(this->getItemId); - gSaveContext.pendingSale = entry.itemId; - gSaveContext.pendingSaleMod = entry.modIndex; + gSaveContext.ship.pendingSale = entry.itemId; + gSaveContext.ship.pendingSaleMod = entry.modIndex; Rupees_ChangeBy(-this->basePrice); } void EnGirlA_ItemGive_DekuSeeds(PlayState* play, EnGirlA* this) { GetItemEntry entry = ItemTable_Retrieve(this->getItemId); - gSaveContext.pendingSale = entry.itemId; - gSaveContext.pendingSaleMod = entry.modIndex; + gSaveContext.ship.pendingSale = entry.itemId; + gSaveContext.ship.pendingSaleMod = entry.modIndex; Item_Give(play, ITEM_SEEDS_30); Rupees_ChangeBy(-this->basePrice); } void EnGirlA_ItemGive_BottledItem(PlayState* play, EnGirlA* this) { GetItemEntry entry = ItemTable_Retrieve(this->getItemId); - gSaveContext.pendingSale = entry.itemId; - gSaveContext.pendingSaleMod = entry.modIndex; + gSaveContext.ship.pendingSale = entry.itemId; + gSaveContext.ship.pendingSaleMod = entry.modIndex; switch (this->actor.params) { case SI_FISH: Item_Give(play, ITEM_FISH); @@ -1066,8 +1066,8 @@ void EnGirlA_ItemGive_Randomizer(PlayState* play, EnGirlA* this) { void EnGirlA_BuyEvent_ShieldDiscount(PlayState* play, EnGirlA* this) { GetItemEntry entry = ItemTable_Retrieve(this->getItemId); - gSaveContext.pendingSale = entry.itemId; - gSaveContext.pendingSaleMod = entry.modIndex; + gSaveContext.ship.pendingSale = entry.itemId; + gSaveContext.ship.pendingSaleMod = entry.modIndex; if (this->actor.params == SI_HYLIAN_SHIELD) { if (Flags_GetInfTable(INFTABLE_SHOWED_ZELDAS_LETTER_TO_GATE_GUARD)) { Rupees_ChangeBy(-(this->basePrice - sShieldDiscounts[(s32)Rand_ZeroFloat(7.9f)])); @@ -1079,22 +1079,22 @@ void EnGirlA_BuyEvent_ShieldDiscount(PlayState* play, EnGirlA* this) { void EnGirlA_BuyEvent_GoronTunic(PlayState* play, EnGirlA* this) { GetItemEntry entry = ItemTable_Retrieve(this->getItemId); - gSaveContext.pendingSale = entry.itemId; - gSaveContext.pendingSaleMod = entry.modIndex; + gSaveContext.ship.pendingSale = entry.itemId; + gSaveContext.ship.pendingSaleMod = entry.modIndex; Rupees_ChangeBy(-this->basePrice); } void EnGirlA_BuyEvent_ZoraTunic(PlayState* play, EnGirlA* this) { GetItemEntry entry = ItemTable_Retrieve(this->getItemId); - gSaveContext.pendingSale = entry.itemId; - gSaveContext.pendingSaleMod = entry.modIndex; + gSaveContext.ship.pendingSale = entry.itemId; + gSaveContext.ship.pendingSaleMod = entry.modIndex; Rupees_ChangeBy(-this->basePrice); } void EnGirlA_BuyEvent_ObtainBombchuPack(PlayState* play, EnGirlA* this) { GetItemEntry entry = ItemTable_Retrieve(this->getItemId); - gSaveContext.pendingSale = entry.itemId; - gSaveContext.pendingSaleMod = entry.modIndex; + gSaveContext.ship.pendingSale = entry.itemId; + gSaveContext.ship.pendingSaleMod = entry.modIndex; Rupees_ChangeBy(-this->basePrice); // Normally, buying a bombchu pack sets a flag indicating the pack is now sold out @@ -1251,7 +1251,7 @@ void EnGirlA_WaitForObject(EnGirlA* this, PlayState* play) { ShopItemEntry* itemEntry = &shopItemEntries[params]; if (Object_IsLoaded(&play->objectCtx, this->requiredObjectSlot)) { - this->actor.flags &= ~ACTOR_FLAG_UPDATE_WHILE_CULLED; + this->actor.flags &= ~ACTOR_FLAG_UPDATE_CULLING_DISABLED; this->actor.objBankIndex = this->requiredObjectSlot; switch (this->actor.params) { case SI_KEATON_MASK: @@ -1334,7 +1334,7 @@ void EnGirlA_WaitForObject(EnGirlA* this, PlayState* play) { this->hiliteFunc = itemEntry->hiliteFunc; this->giDrawId = itemEntry->giDrawId; osSyncPrintf("%s(%2d)\n", sShopItemDescriptions[params], params); - this->actor.flags &= ~ACTOR_FLAG_TARGETABLE; + this->actor.flags &= ~ACTOR_FLAG_ATTENTION_ENABLED; Actor_SetScale(&this->actor, 0.25f); this->actor.shape.yOffset = 24.0f; this->actor.shape.shadowScale = 4.0f; @@ -1375,7 +1375,7 @@ void EnGirlA_WaitForObject(EnGirlA* this, PlayState* play) { this->hiliteFunc = itemEntry->hiliteFunc; this->giDrawId = itemEntry->giDrawId; osSyncPrintf("%s(%2d)\n", sShopItemDescriptions[params], params); - this->actor.flags &= ~ACTOR_FLAG_TARGETABLE; + this->actor.flags &= ~ACTOR_FLAG_ATTENTION_ENABLED; Actor_SetScale(&this->actor, 0.25f); this->actor.shape.yOffset = 24.0f; this->actor.shape.shadowScale = 4.0f; diff --git a/soh/src/overlays/actors/ovl_En_Gm/z_en_gm.c b/soh/src/overlays/actors/ovl_En_Gm/z_en_gm.c index 2a653edc9..06d7c89e9 100644 --- a/soh/src/overlays/actors/ovl_En_Gm/z_en_gm.c +++ b/soh/src/overlays/actors/ovl_En_Gm/z_en_gm.c @@ -13,7 +13,7 @@ #include "soh/OTRGlobals.h" #include "soh/ResourceManagerHelpers.h" -#define FLAGS (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_FRIENDLY | ACTOR_FLAG_UPDATE_WHILE_CULLED) +#define FLAGS (ACTOR_FLAG_ATTENTION_ENABLED | ACTOR_FLAG_FRIENDLY | ACTOR_FLAG_UPDATE_CULLING_DISABLED) void EnGm_Init(Actor* thisx, PlayState* play); void EnGm_Destroy(Actor* thisx, PlayState* play); @@ -112,7 +112,7 @@ s32 func_80A3D7C8(void) { void func_80A3D838(EnGm* this, PlayState* play) { if (Object_IsLoaded(&play->objectCtx, this->objGmBankIndex)) { - this->actor.flags &= ~ACTOR_FLAG_UPDATE_WHILE_CULLED; + this->actor.flags &= ~ACTOR_FLAG_UPDATE_CULLING_DISABLED; SkelAnime_InitFlex(play, &this->skelAnime, &gGoronSkel, NULL, this->jointTable, this->morphTable, 18); gSegments[6] = VIRTUAL_TO_PHYSICAL(play->objectCtx.status[this->objGmBankIndex].segment); Animation_Change(&this->skelAnime, &object_gm_Anim_0002B8, 1.0f, 0.0f, diff --git a/soh/src/overlays/actors/ovl_En_Go/z_en_go.c b/soh/src/overlays/actors/ovl_En_Go/z_en_go.c index 4718cac79..22117f9d0 100644 --- a/soh/src/overlays/actors/ovl_En_Go/z_en_go.c +++ b/soh/src/overlays/actors/ovl_En_Go/z_en_go.c @@ -6,7 +6,7 @@ #include "soh/Enhancements/randomizer/adult_trade_shuffle.h" #include "soh/OTRGlobals.h" -#define FLAGS (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_FRIENDLY | ACTOR_FLAG_UPDATE_WHILE_CULLED | ACTOR_FLAG_DRAW_WHILE_CULLED) +#define FLAGS (ACTOR_FLAG_ATTENTION_ENABLED | ACTOR_FLAG_FRIENDLY | ACTOR_FLAG_UPDATE_CULLING_DISABLED | ACTOR_FLAG_DRAW_CULLING_DISABLED) void EnGo_Init(Actor* thisx, PlayState* play); void EnGo_Destroy(Actor* thisx, PlayState* play); @@ -641,8 +641,8 @@ void EnGo_Init(Actor* thisx, PlayState* play) { } if ((this->actor.params & 0xF0) && ((this->actor.params & 0xF0) != 0x90)) { - this->actor.flags &= ~ACTOR_FLAG_UPDATE_WHILE_CULLED; - this->actor.flags &= ~ACTOR_FLAG_DRAW_WHILE_CULLED; + this->actor.flags &= ~ACTOR_FLAG_UPDATE_CULLING_DISABLED; + this->actor.flags &= ~ACTOR_FLAG_DRAW_CULLING_DISABLED; } EnGo_ChangeAnim(this, ENGO_ANIM_0); diff --git a/soh/src/overlays/actors/ovl_En_Go2/z_en_go2.c b/soh/src/overlays/actors/ovl_En_Go2/z_en_go2.c index 82abfca31..1462f8302 100644 --- a/soh/src/overlays/actors/ovl_En_Go2/z_en_go2.c +++ b/soh/src/overlays/actors/ovl_En_Go2/z_en_go2.c @@ -8,7 +8,7 @@ #include "soh/ResourceManagerHelpers.h" #include "soh/Enhancements/game-interactor/GameInteractor_Hooks.h" -#define FLAGS (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_FRIENDLY | ACTOR_FLAG_UPDATE_WHILE_CULLED | ACTOR_FLAG_DRAW_WHILE_CULLED) +#define FLAGS (ACTOR_FLAG_ATTENTION_ENABLED | ACTOR_FLAG_FRIENDLY | ACTOR_FLAG_UPDATE_CULLING_DISABLED | ACTOR_FLAG_DRAW_CULLING_DISABLED) /* FLAGS @@ -889,7 +889,7 @@ s32 func_80A44AB0(EnGo2* this, PlayState* play) { } else { if (this->collider.base.acFlags & 2) { Audio_PlaySoundGeneral(NA_SE_SY_CORRECT_CHIME, &gSfxDefaultPos, 4, &gSfxDefaultFreqAndVolScale, &gSfxDefaultFreqAndVolScale, &gSfxDefaultReverb); - this->actor.flags &= ~ACTOR_FLAG_PLAY_HIT_SFX; + this->actor.flags &= ~ACTOR_FLAG_SFX_FOR_PLAYER_BODY_HIT; this->collider.base.acFlags &= ~0x2; EnGo2_StopRolling(this, play); return true; @@ -965,10 +965,10 @@ s32 EnGo2_IsWakingUp(EnGo2* this) { if ((this->actor.params & 0x1F) == GORON_DMT_BIGGORON) { if ((this->collider.base.ocFlags2 & 1) == 0) { - this->actor.flags &= ~ACTOR_FLAG_TARGETABLE; + this->actor.flags &= ~ACTOR_FLAG_ATTENTION_ENABLED; return false; } else { - this->actor.flags |= ACTOR_FLAG_TARGETABLE; + this->actor.flags |= ACTOR_FLAG_ATTENTION_ENABLED; return true; } } @@ -1304,7 +1304,7 @@ void EnGo2_GetDustData(EnGo2* this, s32 index2) { void EnGo2_RollingAnimation(EnGo2* this, PlayState* play) { if ((this->actor.params & 0x1F) == GORON_DMT_BIGGORON) { - this->actor.flags &= ~ACTOR_FLAG_TARGETABLE; + this->actor.flags &= ~ACTOR_FLAG_ATTENTION_ENABLED; Animation_ChangeByInfo(&this->skelAnime, sAnimationInfo, ENGO2_ANIM_10); this->skelAnime.playSpeed = -0.5f; } else { @@ -1358,7 +1358,7 @@ void EnGo2_SetupRolling(EnGo2* this, PlayState* play) { } else { this->actor.speedXZ = 6.0f; } - this->actor.flags |= ACTOR_FLAG_PLAY_HIT_SFX; + this->actor.flags |= ACTOR_FLAG_SFX_FOR_PLAYER_BODY_HIT; this->animTimer = 10; this->actor.shape.yOffset = 1800.0f; this->actor.speedXZ += this->actor.speedXZ; // Speeding up @@ -1541,8 +1541,8 @@ void EnGo2_Init(Actor* thisx, PlayState* play) { case GORON_CITY_LOST_WOODS: case GORON_DMT_FAIRY_HINT: case GORON_MARKET_BAZAAR: - this->actor.flags &= ~ACTOR_FLAG_UPDATE_WHILE_CULLED; - this->actor.flags &= ~ACTOR_FLAG_DRAW_WHILE_CULLED; + this->actor.flags &= ~ACTOR_FLAG_UPDATE_CULLING_DISABLED; + this->actor.flags &= ~ACTOR_FLAG_DRAW_CULLING_DISABLED; } EnGo2_SetColliderDim(this); @@ -1609,7 +1609,7 @@ void EnGo2_Init(Actor* thisx, PlayState* play) { break; case GORON_DMT_BIGGORON: this->actor.shape.shadowDraw = NULL; - this->actor.flags &= ~ACTOR_FLAG_TARGETABLE; + this->actor.flags &= ~ACTOR_FLAG_ATTENTION_ENABLED; if ((INV_CONTENT(ITEM_TRADE_ADULT) >= ITEM_SWORD_BROKEN) && (INV_CONTENT(ITEM_TRADE_ADULT) <= ITEM_EYEDROPS)) { this->eyeMouthTexState = 1; @@ -1689,7 +1689,7 @@ void func_80A46B40(EnGo2* this, PlayState* play) { } else { if (Animation_OnFrame(&this->skelAnime, this->skelAnime.endFrame)) { if ((this->actor.params & 0x1F) == GORON_DMT_BIGGORON) { - this->actor.flags |= ACTOR_FLAG_TARGETABLE; + this->actor.flags |= ACTOR_FLAG_ATTENTION_ENABLED; } func_80A454CC(this); this->unk_211 = true; @@ -1839,7 +1839,7 @@ void EnGo2_BiggoronEyedrops(EnGo2* this, PlayState* play) { switch (this->goronState) { case 0: Animation_ChangeByInfo(&this->skelAnime, sAnimationInfo, ENGO2_ANIM_5); - this->actor.flags &= ~ACTOR_FLAG_TARGETABLE; + this->actor.flags &= ~ACTOR_FLAG_ATTENTION_ENABLED; this->actor.shape.rot.y += 0x5B0; this->trackingMode = NPC_TRACKING_NONE; this->animTimer = !GameInteractor_Should(VB_PLAY_EYEDROPS_CS, true) ? 0 : (this->skelAnime.endFrame + 60.0f + 60.0f); // eyeDrops animation timer @@ -1872,7 +1872,7 @@ void EnGo2_BiggoronEyedrops(EnGo2* this, PlayState* play) { } if (Message_GetState(&play->msgCtx) == TEXT_STATE_CLOSING) { Animation_ChangeByInfo(&this->skelAnime, sAnimationInfo, ENGO2_ANIM_1); - this->actor.flags |= ACTOR_FLAG_TARGETABLE; + this->actor.flags |= ACTOR_FLAG_ATTENTION_ENABLED; this->trackingMode = NPC_TRACKING_HEAD_AND_TORSO; this->skelAnime.playSpeed = 0.0f; this->skelAnime.curFrame = this->skelAnime.endFrame; diff --git a/soh/src/overlays/actors/ovl_En_Goma/z_en_goma.c b/soh/src/overlays/actors/ovl_En_Goma/z_en_goma.c index 11016dcc7..4ad72ea01 100644 --- a/soh/src/overlays/actors/ovl_En_Goma/z_en_goma.c +++ b/soh/src/overlays/actors/ovl_En_Goma/z_en_goma.c @@ -6,7 +6,7 @@ #include "soh/Enhancements/game-interactor/GameInteractor_Hooks.h" #include "soh/ResourceManagerHelpers.h" -#define FLAGS (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_HOSTILE | ACTOR_FLAG_UPDATE_WHILE_CULLED | ACTOR_FLAG_DRAW_WHILE_CULLED) +#define FLAGS (ACTOR_FLAG_ATTENTION_ENABLED | ACTOR_FLAG_HOSTILE | ACTOR_FLAG_UPDATE_CULLING_DISABLED | ACTOR_FLAG_DRAW_CULLING_DISABLED) void EnGoma_Init(Actor* thisx, PlayState* play); void EnGoma_Destroy(Actor* thisx, PlayState* play); @@ -123,10 +123,10 @@ void EnGoma_Init(Actor* thisx, PlayState* play) { this->gomaType = ENGOMA_BOSSLIMB; ActorShape_Init(&this->actor.shape, 0.0f, ActorShadow_DrawCircle, 0.0f); this->actionTimer = this->actor.params + 150; - this->actor.flags &= ~ACTOR_FLAG_TARGETABLE; + this->actor.flags &= ~ACTOR_FLAG_ATTENTION_ENABLED; } else if (params >= 10) { // Debris when hatching this->actor.gravity = -1.3f; - this->actor.flags &= ~ACTOR_FLAG_TARGETABLE; + this->actor.flags &= ~ACTOR_FLAG_ATTENTION_ENABLED; this->actionTimer = 50; this->gomaType = ENGOMA_HATCH_DEBRIS; this->eggScale = 1.0f; @@ -372,7 +372,7 @@ void EnGoma_SetupDie(EnGoma* this) { } this->invincibilityTimer = 100; - this->actor.flags &= ~ACTOR_FLAG_TARGETABLE; + this->actor.flags &= ~ACTOR_FLAG_ATTENTION_ENABLED; } void EnGoma_Die(EnGoma* this, PlayState* play) { @@ -504,7 +504,7 @@ void EnGoma_SetupJump(EnGoma* this) { } void EnGoma_Jump(EnGoma* this, PlayState* play) { - this->actor.flags |= ACTOR_FLAG_PLAY_HIT_SFX; + this->actor.flags |= ACTOR_FLAG_SFX_FOR_PLAYER_BODY_HIT; SkelAnime_Update(&this->skelanime); Math_ApproachF(&this->actor.speedXZ, 10.0f, 0.5f, 5.0f); diff --git a/soh/src/overlays/actors/ovl_En_Goroiwa/z_en_goroiwa.c b/soh/src/overlays/actors/ovl_En_Goroiwa/z_en_goroiwa.c index 72adefe3b..4df1b6040 100644 --- a/soh/src/overlays/actors/ovl_En_Goroiwa/z_en_goroiwa.c +++ b/soh/src/overlays/actors/ovl_En_Goroiwa/z_en_goroiwa.c @@ -10,7 +10,7 @@ #include "objects/object_goroiwa/object_goroiwa.h" #include "vt.h" -#define FLAGS ACTOR_FLAG_UPDATE_WHILE_CULLED +#define FLAGS ACTOR_FLAG_UPDATE_CULLING_DISABLED typedef s32 (*EnGoroiwaUnkFunc1)(EnGoroiwa* this, PlayState* play); typedef void (*EnGoroiwaUnkFunc2)(EnGoroiwa* this); diff --git a/soh/src/overlays/actors/ovl_En_Gs/z_en_gs.c b/soh/src/overlays/actors/ovl_En_Gs/z_en_gs.c index 2bb7534d1..83db2aeb0 100644 --- a/soh/src/overlays/actors/ovl_En_Gs/z_en_gs.c +++ b/soh/src/overlays/actors/ovl_En_Gs/z_en_gs.c @@ -10,7 +10,7 @@ #include "objects/gameplay_keep/gameplay_keep.h" #include "soh/Enhancements/game-interactor/GameInteractor_Hooks.h" -#define FLAGS (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_FRIENDLY | ACTOR_FLAG_NO_FREEZE_OCARINA) +#define FLAGS (ACTOR_FLAG_ATTENTION_ENABLED | ACTOR_FLAG_FRIENDLY | ACTOR_FLAG_UPDATE_DURING_OCARINA) void EnGs_Init(Actor* thisx, PlayState* play); void EnGs_Destroy(Actor* thisx, PlayState* play); @@ -359,7 +359,7 @@ void func_80A4ED34(EnGs* this, PlayState* play) { func_8002F974(&this->actor, NA_SE_EV_FIRE_PILLAR - SFX_FLAG); if (this->unk_200++ >= 40) { this->unk_19E |= 0x10; - this->actor.flags |= ACTOR_FLAG_UPDATE_WHILE_CULLED; + this->actor.flags |= ACTOR_FLAG_UPDATE_CULLING_DISABLED; this->actor.uncullZoneForward = 12000.0f; this->actor.gravity = 0.3f; diff --git a/soh/src/overlays/actors/ovl_En_Guest/z_en_guest.c b/soh/src/overlays/actors/ovl_En_Guest/z_en_guest.c index e69e4e610..ede41e583 100644 --- a/soh/src/overlays/actors/ovl_En_Guest/z_en_guest.c +++ b/soh/src/overlays/actors/ovl_En_Guest/z_en_guest.c @@ -11,7 +11,7 @@ #include #include "soh/ResourceManagerHelpers.h" -#define FLAGS (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_FRIENDLY | ACTOR_FLAG_UPDATE_WHILE_CULLED) +#define FLAGS (ACTOR_FLAG_ATTENTION_ENABLED | ACTOR_FLAG_FRIENDLY | ACTOR_FLAG_UPDATE_CULLING_DISABLED) void EnGuest_Init(Actor* thisx, PlayState* play); void EnGuest_Destroy(Actor* thisx, PlayState* play); @@ -82,7 +82,7 @@ void EnGuest_Update(Actor* thisx, PlayState* play) { s32 pad; if (Object_IsLoaded(&play->objectCtx, this->osAnimeBankIndex)) { - this->actor.flags &= ~ACTOR_FLAG_UPDATE_WHILE_CULLED; + this->actor.flags &= ~ACTOR_FLAG_UPDATE_CULLING_DISABLED; Actor_ProcessInitChain(&this->actor, sInitChain); SkelAnime_InitFlex(play, &this->skelAnime, &object_boj_Skel_0000F0, NULL, this->jointTable, this->morphTable, 16); diff --git a/soh/src/overlays/actors/ovl_En_Heishi1/z_en_heishi1.c b/soh/src/overlays/actors/ovl_En_Heishi1/z_en_heishi1.c index 90d47b098..2b23442a3 100644 --- a/soh/src/overlays/actors/ovl_En_Heishi1/z_en_heishi1.c +++ b/soh/src/overlays/actors/ovl_En_Heishi1/z_en_heishi1.c @@ -9,7 +9,7 @@ #include "vt.h" #include "soh/ResourceManagerHelpers.h" -#define FLAGS ACTOR_FLAG_UPDATE_WHILE_CULLED +#define FLAGS ACTOR_FLAG_UPDATE_CULLING_DISABLED void EnHeishi1_Init(Actor* thisx, PlayState* play); void EnHeishi1_Destroy(Actor* thisx, PlayState* play); diff --git a/soh/src/overlays/actors/ovl_En_Heishi2/z_en_heishi2.c b/soh/src/overlays/actors/ovl_En_Heishi2/z_en_heishi2.c index 89fd574d0..3a0824bc1 100644 --- a/soh/src/overlays/actors/ovl_En_Heishi2/z_en_heishi2.c +++ b/soh/src/overlays/actors/ovl_En_Heishi2/z_en_heishi2.c @@ -13,7 +13,7 @@ #include "overlays/actors/ovl_Bg_Spot15_Saku/z_bg_spot15_saku.h" #include "soh/ResourceManagerHelpers.h" -#define FLAGS (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_FRIENDLY) +#define FLAGS (ACTOR_FLAG_ATTENTION_ENABLED | ACTOR_FLAG_FRIENDLY) void EnHeishi2_Init(Actor* thisx, PlayState* play); void EnHeishi2_Destroy(Actor* thisx, PlayState* play); @@ -94,7 +94,7 @@ void EnHeishi2_Init(Actor* thisx, PlayState* play) { if ((this->type == 6) || (this->type == 9)) { this->actor.draw = EnHeishi2_DrawKingGuard; - this->actor.flags &= ~ACTOR_FLAG_TARGETABLE; + this->actor.flags &= ~ACTOR_FLAG_ATTENTION_ENABLED; Actor_ChangeCategory(play, &play->actorCtx, &this->actor, 6); if (this->type == 6) { this->actionFunc = EnHeishi2_DoNothing1; @@ -114,7 +114,7 @@ void EnHeishi2_Init(Actor* thisx, PlayState* play) { this->actor.shape.rot.y = this->actor.world.rot.y; Collider_DestroyCylinder(play, &this->collider); Player_SetCsActionWithHaltedActors(play, 0, 8); - this->actor.flags |= ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_UPDATE_WHILE_CULLED; + this->actor.flags |= ACTOR_FLAG_ATTENTION_ENABLED | ACTOR_FLAG_UPDATE_CULLING_DISABLED; this->actionFunc = func_80A544AC; } } else { @@ -145,7 +145,7 @@ void EnHeishi2_Init(Actor* thisx, PlayState* play) { // "Peep hole soldier!" osSyncPrintf(VT_FGCOL(GREEN) " ☆☆☆☆☆ 覗き穴奥兵士ふぃ〜 ☆☆☆☆☆ \n" VT_RST); Collider_DestroyCylinder(play, collider); - this->actor.flags &= ~(ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_FRIENDLY); + this->actor.flags &= ~(ACTOR_FLAG_ATTENTION_ENABLED | ACTOR_FLAG_FRIENDLY); this->actionFunc = EnHeishi_DoNothing2; break; } @@ -641,7 +641,7 @@ void func_80A544AC(EnHeishi2* this, PlayState* play) { this->actor.world.rot.z = this->actor.shape.rot.z; if (this->actor.shape.rot.z < -6000) { Message_StartTextbox(play, 0x708F, NULL); - this->actor.flags |= ACTOR_FLAG_WILL_TALK; + this->actor.flags |= ACTOR_FLAG_TALK_OFFER_AUTO_ACCEPTED; this->actionFunc = func_80A5455C; this->unk_2E4 = 0.0f; } diff --git a/soh/src/overlays/actors/ovl_En_Heishi4/z_en_heishi4.c b/soh/src/overlays/actors/ovl_En_Heishi4/z_en_heishi4.c index f118a55ec..bd38ba9d9 100644 --- a/soh/src/overlays/actors/ovl_En_Heishi4/z_en_heishi4.c +++ b/soh/src/overlays/actors/ovl_En_Heishi4/z_en_heishi4.c @@ -4,7 +4,7 @@ #include "soh/OTRGlobals.h" #include "soh/ResourceManagerHelpers.h" -#define FLAGS (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_FRIENDLY) +#define FLAGS (ACTOR_FLAG_ATTENTION_ENABLED | ACTOR_FLAG_FRIENDLY) void EnHeishi4_Init(Actor* thisx, PlayState* play); void EnHeishi4_Destroy(Actor* thisx, PlayState* play); diff --git a/soh/src/overlays/actors/ovl_En_Hintnuts/z_en_hintnuts.c b/soh/src/overlays/actors/ovl_En_Hintnuts/z_en_hintnuts.c index 36a7ae115..f0a990f03 100644 --- a/soh/src/overlays/actors/ovl_En_Hintnuts/z_en_hintnuts.c +++ b/soh/src/overlays/actors/ovl_En_Hintnuts/z_en_hintnuts.c @@ -9,7 +9,7 @@ #include "soh/Enhancements/game-interactor/GameInteractor_Hooks.h" #include "soh/ResourceManagerHelpers.h" -#define FLAGS (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_HOSTILE) +#define FLAGS (ACTOR_FLAG_ATTENTION_ENABLED | ACTOR_FLAG_HOSTILE) void EnHintnuts_Init(Actor* thisx, PlayState* play); void EnHintnuts_Destroy(Actor* thisx, PlayState* play); @@ -78,7 +78,7 @@ void EnHintnuts_Init(Actor* thisx, PlayState* play) { Actor_ProcessInitChain(&this->actor, sInitChain); if (this->actor.params == 0xA) { - this->actor.flags &= ~(ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_HOSTILE); + this->actor.flags &= ~(ACTOR_FLAG_ATTENTION_ENABLED | ACTOR_FLAG_HOSTILE); } else { ActorShape_Init(&this->actor.shape, 0x0, ActorShadow_DrawCircle, 35.0f); SkelAnime_Init(play, &this->skelAnime, &gHintNutsSkel, &gHintNutsStandAnim, this->jointTable, @@ -115,8 +115,8 @@ void EnHintnuts_Destroy(Actor* thisx, PlayState* play) { void EnHintnuts_HitByScrubProjectile1(EnHintnuts* this, PlayState* play) { if (this->actor.textId != 0 && this->actor.category == ACTORCAT_ENEMY && ((this->actor.params == 0) || (sPuzzleCounter == 2))) { - this->actor.flags &= ~(ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_HOSTILE); - this->actor.flags |= ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_FRIENDLY; + this->actor.flags &= ~(ACTOR_FLAG_ATTENTION_ENABLED | ACTOR_FLAG_HOSTILE); + this->actor.flags |= ACTOR_FLAG_ATTENTION_ENABLED | ACTOR_FLAG_FRIENDLY; Actor_ChangeCategory(play, &play->actorCtx, &this->actor, ACTORCAT_BG); } } @@ -175,7 +175,7 @@ void EnHintnuts_HitByScrubProjectile2(EnHintnuts* this) { } sPuzzleCounter--; } - this->actor.flags |= ACTOR_FLAG_UPDATE_WHILE_CULLED; + this->actor.flags |= ACTOR_FLAG_UPDATE_CULLING_DISABLED; this->actionFunc = EnHintnuts_BeginFreeze; } else { this->actionFunc = EnHintnuts_BeginRun; @@ -200,7 +200,7 @@ void EnHintnuts_SetupLeave(EnHintnuts* this, PlayState* play) { this->animFlagAndTimer = 100; this->actor.world.rot.y = this->actor.shape.rot.y; this->collider.base.ocFlags1 &= ~OC1_ON; - this->actor.flags |= ACTOR_FLAG_UPDATE_WHILE_CULLED; + this->actor.flags |= ACTOR_FLAG_UPDATE_CULLING_DISABLED; Audio_PlayActorSound2(&this->actor, NA_SE_EN_NUTS_DAMAGE); Actor_Spawn(&play->actorCtx, play, ACTOR_EN_ITEM00, this->actor.world.pos.x, this->actor.world.pos.y, this->actor.world.pos.z, 0x0, 0x0, 0x0, 0x3, true); // recovery heart @@ -209,7 +209,7 @@ void EnHintnuts_SetupLeave(EnHintnuts* this, PlayState* play) { void EnHintnuts_SetupFreeze(EnHintnuts* this) { Animation_PlayLoop(&this->skelAnime, &gHintNutsFreezeAnim); - this->actor.flags &= ~ACTOR_FLAG_TARGETABLE; + this->actor.flags &= ~ACTOR_FLAG_ATTENTION_ENABLED; Actor_SetColorFilter(&this->actor, 0, 0xFF, 0, 100); this->actor.colorFilterTimer = 1; this->animFlagAndTimer = 0; @@ -329,9 +329,9 @@ void EnHintnuts_BeginFreeze(EnHintnuts* this, PlayState* play) { void EnHintnuts_CheckProximity(EnHintnuts* this, PlayState* play) { if (this->actor.category != ACTORCAT_ENEMY) { if ((this->collider.base.ocFlags1 & OC1_HIT) || this->actor.isTargeted) { - this->actor.flags |= ACTOR_FLAG_WILL_TALK; + this->actor.flags |= ACTOR_FLAG_TALK_OFFER_AUTO_ACCEPTED; } else { - this->actor.flags &= ~ACTOR_FLAG_WILL_TALK; + this->actor.flags &= ~ACTOR_FLAG_TALK_OFFER_AUTO_ACCEPTED; } if (this->actor.xzDistToPlayer < 130.0f) { this->actor.textId = this->textIdCopy; @@ -382,8 +382,8 @@ void EnHintnuts_Run(EnHintnuts* this, PlayState* play) { fabsf(this->actor.world.pos.y - this->actor.home.pos.y) < 2.0f) { this->actor.speedXZ = 0.0f; if (this->actor.category == ACTORCAT_BG) { - this->actor.flags &= ~(ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_FRIENDLY | ACTOR_FLAG_WILL_TALK); - this->actor.flags |= ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_HOSTILE; + this->actor.flags &= ~(ACTOR_FLAG_ATTENTION_ENABLED | ACTOR_FLAG_FRIENDLY | ACTOR_FLAG_TALK_OFFER_AUTO_ACCEPTED); + this->actor.flags |= ACTOR_FLAG_ATTENTION_ENABLED | ACTOR_FLAG_HOSTILE; Actor_ChangeCategory(play, &play->actorCtx, &this->actor, ACTORCAT_ENEMY); } EnHintnuts_SetupBurrow(this); @@ -455,8 +455,8 @@ void EnHintnuts_Freeze(EnHintnuts* this, PlayState* play) { if (this->animFlagAndTimer == 1) { Actor_Kill(&this->actor); } else { - this->actor.flags |= ACTOR_FLAG_TARGETABLE; - this->actor.flags &= ~ACTOR_FLAG_UPDATE_WHILE_CULLED; + this->actor.flags |= ACTOR_FLAG_ATTENTION_ENABLED; + this->actor.flags &= ~ACTOR_FLAG_UPDATE_CULLING_DISABLED; this->actor.colChkInfo.health = sColChkInfoInit.health; this->actor.colorFilterTimer = 0; EnHintnuts_SetupWait(this); diff --git a/soh/src/overlays/actors/ovl_En_Holl/z_en_holl.c b/soh/src/overlays/actors/ovl_En_Holl/z_en_holl.c index f40668343..9fb434b7d 100644 --- a/soh/src/overlays/actors/ovl_En_Holl/z_en_holl.c +++ b/soh/src/overlays/actors/ovl_En_Holl/z_en_holl.c @@ -1,6 +1,6 @@ #include "z_en_holl.h" -#define FLAGS ACTOR_FLAG_UPDATE_WHILE_CULLED +#define FLAGS ACTOR_FLAG_UPDATE_CULLING_DISABLED // Horizontal Plane parameters diff --git a/soh/src/overlays/actors/ovl_En_Honotrap/z_en_honotrap.c b/soh/src/overlays/actors/ovl_En_Honotrap/z_en_honotrap.c index 6c3745b62..f65e39cee 100644 --- a/soh/src/overlays/actors/ovl_En_Honotrap/z_en_honotrap.c +++ b/soh/src/overlays/actors/ovl_En_Honotrap/z_en_honotrap.c @@ -8,7 +8,7 @@ #include "objects/gameplay_keep/gameplay_keep.h" #include "objects/gameplay_dangeon_keep/gameplay_dangeon_keep.h" -#define FLAGS ACTOR_FLAG_UPDATE_WHILE_CULLED +#define FLAGS ACTOR_FLAG_UPDATE_CULLING_DISABLED #define HONOTRAP_AT_ACTIVE (1 << 0) #define HONOTRAP_AC_ACTIVE (1 << 1) diff --git a/soh/src/overlays/actors/ovl_En_Horse/z_en_horse.c b/soh/src/overlays/actors/ovl_En_Horse/z_en_horse.c index 73cfd07cc..e94f91200 100644 --- a/soh/src/overlays/actors/ovl_En_Horse/z_en_horse.c +++ b/soh/src/overlays/actors/ovl_En_Horse/z_en_horse.c @@ -11,7 +11,7 @@ #include "scenes/overworld/spot09/spot09_scene.h" #include -#define FLAGS ACTOR_FLAG_UPDATE_WHILE_CULLED +#define FLAGS ACTOR_FLAG_UPDATE_CULLING_DISABLED typedef void (*EnHorseCsFunc)(EnHorse*, PlayState*, CsCmdActorCue*); typedef void (*EnHorseActionFunc)(EnHorse*, PlayState*); @@ -726,7 +726,7 @@ s32 EnHorse_PlayerCanMove(EnHorse* this, PlayState* play) { if ((player->stateFlags1 & PLAYER_STATE1_LOADING) || func_8002DD78(GET_PLAYER(play)) == 1 || (player->stateFlags1 & PLAYER_STATE1_FIRST_PERSON) || ((this->stateFlags & ENHORSE_FLAG_19) && !this->inRace) || this->action == ENHORSE_ACT_HBA || - player->actor.flags & ACTOR_FLAG_PLAYER_TALKED_TO || play->csCtx.state != 0) { + player->actor.flags & ACTOR_FLAG_TALK || play->csCtx.state != 0) { return false; } return true; @@ -1539,7 +1539,7 @@ void EnHorse_Reverse(EnHorse* this, PlayState* play) { } else if (stickMag < 10.0f) { stickAngle = -0x7FFF; } - } else if (player->actor.flags & ACTOR_FLAG_PLAYER_TALKED_TO) { + } else if (player->actor.flags & ACTOR_FLAG_TALK) { EnHorse_StartMountedIdleResetAnim(this); this->actor.speedXZ = 0.0f; return; diff --git a/soh/src/overlays/actors/ovl_En_Horse_Game_Check/z_en_horse_game_check.c b/soh/src/overlays/actors/ovl_En_Horse_Game_Check/z_en_horse_game_check.c index 5ed12cf45..e0c1ba7fc 100644 --- a/soh/src/overlays/actors/ovl_En_Horse_Game_Check/z_en_horse_game_check.c +++ b/soh/src/overlays/actors/ovl_En_Horse_Game_Check/z_en_horse_game_check.c @@ -7,7 +7,7 @@ #include "z_en_horse_game_check.h" #include "overlays/actors/ovl_En_Horse/z_en_horse.h" -#define FLAGS ACTOR_FLAG_UPDATE_WHILE_CULLED +#define FLAGS ACTOR_FLAG_UPDATE_CULLING_DISABLED #define AT_FINISH_LINE(actor) \ (Math3D_PointInSquare2D(sFinishLine[0], sFinishLine[1], sFinishLine[2], sFinishLine[3], (actor)->world.pos.x, \ diff --git a/soh/src/overlays/actors/ovl_En_Horse_Ganon/z_en_horse_ganon.c b/soh/src/overlays/actors/ovl_En_Horse_Ganon/z_en_horse_ganon.c index ac61462d7..98218c7a3 100644 --- a/soh/src/overlays/actors/ovl_En_Horse_Ganon/z_en_horse_ganon.c +++ b/soh/src/overlays/actors/ovl_En_Horse_Ganon/z_en_horse_ganon.c @@ -7,7 +7,7 @@ #include "z_en_horse_ganon.h" #include "objects/object_horse_ganon/object_horse_ganon.h" -#define FLAGS ACTOR_FLAG_UPDATE_WHILE_CULLED +#define FLAGS ACTOR_FLAG_UPDATE_CULLING_DISABLED typedef struct { /* 0x0 */ Vec3s unk_0; diff --git a/soh/src/overlays/actors/ovl_En_Horse_Link_Child/z_en_horse_link_child.c b/soh/src/overlays/actors/ovl_En_Horse_Link_Child/z_en_horse_link_child.c index a4ea35ed5..39b5aac2e 100644 --- a/soh/src/overlays/actors/ovl_En_Horse_Link_Child/z_en_horse_link_child.c +++ b/soh/src/overlays/actors/ovl_En_Horse_Link_Child/z_en_horse_link_child.c @@ -7,7 +7,7 @@ #include "z_en_horse_link_child.h" #include "objects/object_horse_link_child/object_horse_link_child.h" -#define FLAGS (ACTOR_FLAG_UPDATE_WHILE_CULLED | ACTOR_FLAG_NO_FREEZE_OCARINA) +#define FLAGS (ACTOR_FLAG_UPDATE_CULLING_DISABLED | ACTOR_FLAG_UPDATE_DURING_OCARINA) void EnHorseLinkChild_Init(Actor* thisx, PlayState* play); void EnHorseLinkChild_Destroy(Actor* thisx, PlayState* play); diff --git a/soh/src/overlays/actors/ovl_En_Horse_Normal/z_en_horse_normal.c b/soh/src/overlays/actors/ovl_En_Horse_Normal/z_en_horse_normal.c index ead91b06b..2173ca2ac 100644 --- a/soh/src/overlays/actors/ovl_En_Horse_Normal/z_en_horse_normal.c +++ b/soh/src/overlays/actors/ovl_En_Horse_Normal/z_en_horse_normal.c @@ -277,7 +277,7 @@ void EnHorseNormal_Destroy(Actor* thisx, PlayState* play) { } void func_80A6B91C(EnHorseNormal* this, PlayState* play) { - this->actor.flags |= ACTOR_FLAG_UPDATE_WHILE_CULLED; + this->actor.flags |= ACTOR_FLAG_UPDATE_CULLING_DISABLED; this->action = HORSE_FOLLOW_PATH; this->animationIdx = 6; this->waypoint = 0; @@ -511,7 +511,7 @@ void func_80A6C6B0(EnHorseNormal* this) { this->animationIdx = 0; this->unk_21C = 0; this->unk_21E = 0; - this->actor.flags |= ACTOR_FLAG_UPDATE_WHILE_CULLED | ACTOR_FLAG_DRAW_WHILE_CULLED; + this->actor.flags |= ACTOR_FLAG_UPDATE_CULLING_DISABLED | ACTOR_FLAG_DRAW_CULLING_DISABLED; this->actor.speedXZ = 0.0f; this->unk_218 = 0.0f; Animation_Change(&this->skin.skelAnime, sAnimations[this->animationIdx], func_80A6B30C(this), 0.0f, diff --git a/soh/src/overlays/actors/ovl_En_Horse_Zelda/z_en_horse_zelda.c b/soh/src/overlays/actors/ovl_En_Horse_Zelda/z_en_horse_zelda.c index 9eb87644f..df317a829 100644 --- a/soh/src/overlays/actors/ovl_En_Horse_Zelda/z_en_horse_zelda.c +++ b/soh/src/overlays/actors/ovl_En_Horse_Zelda/z_en_horse_zelda.c @@ -7,7 +7,7 @@ #include "z_en_horse_zelda.h" #include "objects/object_horse_zelda/object_horse_zelda.h" -#define FLAGS ACTOR_FLAG_UPDATE_WHILE_CULLED +#define FLAGS ACTOR_FLAG_UPDATE_CULLING_DISABLED void EnHorseZelda_Init(Actor* thisx, PlayState* play); void EnHorseZelda_Destroy(Actor* thisx, PlayState* play); diff --git a/soh/src/overlays/actors/ovl_En_Hs/z_en_hs.c b/soh/src/overlays/actors/ovl_En_Hs/z_en_hs.c index fcf06de4e..468d2124f 100644 --- a/soh/src/overlays/actors/ovl_En_Hs/z_en_hs.c +++ b/soh/src/overlays/actors/ovl_En_Hs/z_en_hs.c @@ -12,7 +12,7 @@ #include "soh/ResourceManagerHelpers.h" #include "soh/Enhancements/game-interactor/GameInteractor_Hooks.h" -#define FLAGS (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_FRIENDLY) +#define FLAGS (ACTOR_FLAG_ATTENTION_ENABLED | ACTOR_FLAG_FRIENDLY) void EnHs_Init(Actor* thisx, PlayState* play); void EnHs_Destroy(Actor* thisx, PlayState* play); diff --git a/soh/src/overlays/actors/ovl_En_Hs2/z_en_hs2.c b/soh/src/overlays/actors/ovl_En_Hs2/z_en_hs2.c index 6801247ec..8b7456350 100644 --- a/soh/src/overlays/actors/ovl_En_Hs2/z_en_hs2.c +++ b/soh/src/overlays/actors/ovl_En_Hs2/z_en_hs2.c @@ -9,7 +9,7 @@ #include "objects/object_hs/object_hs.h" #include "soh/ResourceManagerHelpers.h" -#define FLAGS (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_FRIENDLY) +#define FLAGS (ACTOR_FLAG_ATTENTION_ENABLED | ACTOR_FLAG_FRIENDLY) void EnHs2_Init(Actor* thisx, PlayState* play); void EnHs2_Destroy(Actor* thisx, PlayState* play); diff --git a/soh/src/overlays/actors/ovl_En_Hy/z_en_hy.c b/soh/src/overlays/actors/ovl_En_Hy/z_en_hy.c index 961106225..3a9c05640 100644 --- a/soh/src/overlays/actors/ovl_En_Hy/z_en_hy.c +++ b/soh/src/overlays/actors/ovl_En_Hy/z_en_hy.c @@ -18,7 +18,7 @@ #include "soh/ResourceManagerHelpers.h" #include "soh/Enhancements/game-interactor/GameInteractor_Hooks.h" -#define FLAGS (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_FRIENDLY | ACTOR_FLAG_UPDATE_WHILE_CULLED) +#define FLAGS (ACTOR_FLAG_ATTENTION_ENABLED | ACTOR_FLAG_FRIENDLY | ACTOR_FLAG_UPDATE_CULLING_DISABLED) void EnHy_Init(Actor* thisx, PlayState* play); void EnHy_Destroy(Actor* thisx, PlayState* play); @@ -920,7 +920,7 @@ void EnHy_InitImpl(EnHy* this, PlayState* play) { Animation_ChangeByInfo(&this->skelAnime, sAnimationInfo, sModelInfo[this->actor.params & 0x7F].animInfoIndex); if ((play->sceneNum == SCENE_BACK_ALLEY_DAY) || (play->sceneNum == SCENE_MARKET_DAY)) { - this->actor.flags &= ~ACTOR_FLAG_UPDATE_WHILE_CULLED; + this->actor.flags &= ~ACTOR_FLAG_UPDATE_CULLING_DISABLED; this->actor.uncullZoneScale = 0.0f; } diff --git a/soh/src/overlays/actors/ovl_En_Ice_Hono/z_en_ice_hono.c b/soh/src/overlays/actors/ovl_En_Ice_Hono/z_en_ice_hono.c index 30a24d4a2..d9059ba0b 100644 --- a/soh/src/overlays/actors/ovl_En_Ice_Hono/z_en_ice_hono.c +++ b/soh/src/overlays/actors/ovl_En_Ice_Hono/z_en_ice_hono.c @@ -106,7 +106,7 @@ void EnIceHono_InitCapturableFlame(Actor* thisx, PlayState* play) { Actor_ProcessInitChain(&this->actor, sInitChainCapturableFlame); Actor_SetScale(&this->actor, 0.0074f); - this->actor.flags |= ACTOR_FLAG_TARGETABLE; + this->actor.flags |= ACTOR_FLAG_ATTENTION_ENABLED; Actor_SetFocus(&this->actor, 10.0f); Collider_InitCylinder(play, &this->collider); diff --git a/soh/src/overlays/actors/ovl_En_Ik/z_en_ik.c b/soh/src/overlays/actors/ovl_En_Ik/z_en_ik.c index ea09efa20..e7b0905e9 100644 --- a/soh/src/overlays/actors/ovl_En_Ik/z_en_ik.c +++ b/soh/src/overlays/actors/ovl_En_Ik/z_en_ik.c @@ -11,7 +11,7 @@ #include "soh/Enhancements/game-interactor/GameInteractor_Hooks.h" #include "soh/ResourceManagerHelpers.h" -#define FLAGS ACTOR_FLAG_UPDATE_WHILE_CULLED +#define FLAGS ACTOR_FLAG_UPDATE_CULLING_DISABLED typedef void (*EnIkDrawFunc)(struct EnIk*, PlayState*); @@ -192,7 +192,7 @@ void func_80A74398(Actor* thisx, PlayState* play) { thisx->update = func_80A75FA0; thisx->draw = func_80A76798; - thisx->flags |= ACTOR_FLAG_DRAGGED_BY_HOOKSHOT; + thisx->flags |= ACTOR_FLAG_HOOKSHOT_PULLS_PLAYER; Collider_InitCylinder(play, &this->bodyCollider); Collider_SetCylinder(play, &this->bodyCollider, thisx, &sCylinderInit); @@ -313,7 +313,7 @@ void func_80A747C0(EnIk* this, PlayState* play) { Audio_PlayActorSound2(&this->actor, NA_SE_EN_IRONNACK_WAKEUP); } if (SkelAnime_Update(&this->skelAnime)) { - this->actor.flags |= ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_HOSTILE; + this->actor.flags |= ACTOR_FLAG_ATTENTION_ENABLED | ACTOR_FLAG_HOSTILE; func_80A74AAC(this); } } @@ -321,7 +321,7 @@ void func_80A747C0(EnIk* this, PlayState* play) { void func_80A7489C(EnIk* this) { f32 frames = Animation_GetLastFrame(&object_ik_Anim_00DD50); - this->actor.flags |= ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_HOSTILE; + this->actor.flags |= ACTOR_FLAG_ATTENTION_ENABLED | ACTOR_FLAG_HOSTILE; this->unk_2F8 = 4; this->actor.speedXZ = 0.0f; Animation_Change(&this->skelAnime, &object_ik_Anim_00DD50, 0.0f, 0.0f, frames, ANIMMODE_LOOP, 4.0f); @@ -1430,7 +1430,7 @@ void func_80A780D0(EnIk* this, PlayState* play) { void func_80A78160(EnIk* this, PlayState* play) { this->actor.update = func_80A75FA0; this->actor.draw = func_80A76798; - this->actor.flags |= ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_HOSTILE; + this->actor.flags |= ACTOR_FLAG_ATTENTION_ENABLED | ACTOR_FLAG_HOSTILE; Flags_SetEventChkInf(EVENTCHKINF_BEGAN_NABOORU_BATTLE); Actor_SetScale(&this->actor, 0.012f); func_80A7489C(this); diff --git a/soh/src/overlays/actors/ovl_En_In/z_en_in.c b/soh/src/overlays/actors/ovl_En_In/z_en_in.c index 7bfc68dbe..852f29250 100644 --- a/soh/src/overlays/actors/ovl_En_In/z_en_in.c +++ b/soh/src/overlays/actors/ovl_En_In/z_en_in.c @@ -3,7 +3,7 @@ #include "objects/object_in/object_in.h" #include "soh/ResourceManagerHelpers.h" -#define FLAGS (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_FRIENDLY | ACTOR_FLAG_UPDATE_WHILE_CULLED) +#define FLAGS (ACTOR_FLAG_ATTENTION_ENABLED | ACTOR_FLAG_FRIENDLY | ACTOR_FLAG_UPDATE_CULLING_DISABLED) void EnIn_Init(Actor* thisx, PlayState* play); void EnIn_Destroy(Actor* thisx, PlayState* play); @@ -472,7 +472,7 @@ void func_80A79C78(EnIn* this, PlayState* play) { player->rideActor->freezeTimer = 10; } player->actor.freezeTimer = 10; - this->actor.flags &= ~ACTOR_FLAG_TARGETABLE; + this->actor.flags &= ~ACTOR_FLAG_ATTENTION_ENABLED; ShrinkWindow_SetVal(0x20); Interface_ChangeAlpha(2); } @@ -701,10 +701,10 @@ void func_80A7A568(EnIn* this, PlayState* play) { void func_80A7A770(EnIn* this, PlayState* play) { if (this->interactInfo.talkState == NPC_TALK_STATE_IDLE) { - this->actor.flags |= ACTOR_FLAG_WILL_TALK; + this->actor.flags |= ACTOR_FLAG_TALK_OFFER_AUTO_ACCEPTED; } else if (this->interactInfo.talkState == NPC_TALK_STATE_ACTION) { Rupees_ChangeBy(-50); - this->actor.flags &= ~ACTOR_FLAG_WILL_TALK; + this->actor.flags &= ~ACTOR_FLAG_TALK_OFFER_AUTO_ACCEPTED; EnIn_ChangeAnim(this, ENIN_ANIM_3); this->actionFunc = func_80A7A848; gSaveContext.eventInf[0] = (gSaveContext.eventInf[0] & ~0x0F) | 7; @@ -737,7 +737,7 @@ void func_80A7A848(EnIn* this, PlayState* play) { void func_80A7A940(EnIn* this, PlayState* play) { if (this->interactInfo.talkState == NPC_TALK_STATE_IDLE) { - this->actor.flags |= ACTOR_FLAG_WILL_TALK; + this->actor.flags |= ACTOR_FLAG_TALK_OFFER_AUTO_ACCEPTED; return; } if (this->unk_1EC != 0) { @@ -747,7 +747,7 @@ void func_80A7A940(EnIn* this, PlayState* play) { } } if (this->interactInfo.talkState == NPC_TALK_STATE_ACTION) { - this->actor.flags &= ~ACTOR_FLAG_WILL_TALK; + this->actor.flags &= ~ACTOR_FLAG_TALK_OFFER_AUTO_ACCEPTED; func_80A79BAC(this, play, 2, TRANS_TYPE_CIRCLE(TCA_STARBURST, TCC_BLACK, TCS_FAST)); gSaveContext.eventInf[0] = (gSaveContext.eventInf[0] & ~0x000F) | 0x0002; gSaveContext.eventInf[0] = (gSaveContext.eventInf[0] & ~0x8000) | 0x8000; diff --git a/soh/src/overlays/actors/ovl_En_Insect/z_en_insect.c b/soh/src/overlays/actors/ovl_En_Insect/z_en_insect.c index 21eafc5ac..03003fb03 100644 --- a/soh/src/overlays/actors/ovl_En_Insect/z_en_insect.c +++ b/soh/src/overlays/actors/ovl_En_Insect/z_en_insect.c @@ -190,7 +190,7 @@ void EnInsect_Init(Actor* thisx, PlayState* play2) { if (this->unk_314 & 4) { this->unk_31C = Rand_S16Offset(200, 40); - this->actor.flags |= ACTOR_FLAG_UPDATE_WHILE_CULLED; + this->actor.flags |= ACTOR_FLAG_UPDATE_CULLING_DISABLED; } if (temp_s2 == 2 || temp_s2 == 3) { diff --git a/soh/src/overlays/actors/ovl_En_Ishi/z_en_ishi.c b/soh/src/overlays/actors/ovl_En_Ishi/z_en_ishi.c index 5109e920f..641988bda 100644 --- a/soh/src/overlays/actors/ovl_En_Ishi/z_en_ishi.c +++ b/soh/src/overlays/actors/ovl_En_Ishi/z_en_ishi.c @@ -11,7 +11,7 @@ #include "vt.h" -#define FLAGS ACTOR_FLAG_ALWAYS_THROWN +#define FLAGS ACTOR_FLAG_THROW_ONLY void EnIshi_Init(Actor* thisx, PlayState* play); void EnIshi_Destroy(Actor* thisx, PlayState* play); @@ -392,7 +392,7 @@ void EnIshi_Wait(EnIshi* this, PlayState* play) { void EnIshi_SetupLiftedUp(EnIshi* this) { this->actionFunc = EnIshi_LiftedUp; this->actor.room = -1; - this->actor.flags |= ACTOR_FLAG_UPDATE_WHILE_CULLED; + this->actor.flags |= ACTOR_FLAG_UPDATE_CULLING_DISABLED; } void EnIshi_LiftedUp(EnIshi* this, PlayState* play) { diff --git a/soh/src/overlays/actors/ovl_En_Jj/z_en_jj.c b/soh/src/overlays/actors/ovl_En_Jj/z_en_jj.c index 12863e4c6..d7f4be98f 100644 --- a/soh/src/overlays/actors/ovl_En_Jj/z_en_jj.c +++ b/soh/src/overlays/actors/ovl_En_Jj/z_en_jj.c @@ -9,7 +9,7 @@ #include "overlays/actors/ovl_Eff_Dust/z_eff_dust.h" #include "soh/ResourceManagerHelpers.h" -#define FLAGS (ACTOR_FLAG_UPDATE_WHILE_CULLED | ACTOR_FLAG_DRAW_WHILE_CULLED) +#define FLAGS (ACTOR_FLAG_UPDATE_CULLING_DISABLED | ACTOR_FLAG_DRAW_CULLING_DISABLED) typedef enum { /* 0 */ JABUJABU_EYE_OPEN, diff --git a/soh/src/overlays/actors/ovl_En_Js/z_en_js.c b/soh/src/overlays/actors/ovl_En_Js/z_en_js.c index 26e004f2f..33a7417ee 100644 --- a/soh/src/overlays/actors/ovl_En_Js/z_en_js.c +++ b/soh/src/overlays/actors/ovl_En_Js/z_en_js.c @@ -10,7 +10,7 @@ #include "soh/ResourceManagerHelpers.h" #include "soh/Enhancements/game-interactor/GameInteractor_Hooks.h" -#define FLAGS (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_FRIENDLY) +#define FLAGS (ACTOR_FLAG_ATTENTION_ENABLED | ACTOR_FLAG_FRIENDLY) void EnJs_Init(Actor* thisx, PlayState* play); void EnJs_Destroy(Actor* thisx, PlayState* play); @@ -109,7 +109,7 @@ void func_80A89008(EnJs* this) { void func_80A89078(EnJs* this, PlayState* play) { if (Actor_TextboxIsClosing(&this->actor, play)) { func_80A89008(this); - this->actor.flags &= ~ACTOR_FLAG_WILL_TALK; + this->actor.flags &= ~ACTOR_FLAG_TALK_OFFER_AUTO_ACCEPTED; } } @@ -125,7 +125,7 @@ void func_80A8910C(EnJs* this, PlayState* play) { if (Actor_TextboxIsClosing(&this->actor, play)) { this->actor.textId = 0x6078; En_Js_SetupAction(this, func_80A890C0); - this->actor.flags |= ACTOR_FLAG_WILL_TALK; + this->actor.flags |= ACTOR_FLAG_TALK_OFFER_AUTO_ACCEPTED; } } @@ -135,8 +135,8 @@ void func_80A89160(EnJs* this, PlayState* play) { En_Js_SetupAction(this, func_80A8910C); } else { GetItemEntry itemEntry = ItemTable_Retrieve(GI_BOMBCHUS_10); - gSaveContext.pendingSale = itemEntry.itemId; - gSaveContext.pendingSaleMod = itemEntry.modIndex; + gSaveContext.ship.pendingSale = itemEntry.itemId; + gSaveContext.ship.pendingSaleMod = itemEntry.modIndex; Actor_OfferGetItem(&this->actor, play, GI_BOMBCHUS_10, 10000.0f, 50.0f); } } diff --git a/soh/src/overlays/actors/ovl_En_Jsjutan/z_en_jsjutan.c b/soh/src/overlays/actors/ovl_En_Jsjutan/z_en_jsjutan.c index ffd428f21..3e91679a0 100644 --- a/soh/src/overlays/actors/ovl_En_Jsjutan/z_en_jsjutan.c +++ b/soh/src/overlays/actors/ovl_En_Jsjutan/z_en_jsjutan.c @@ -8,7 +8,7 @@ #include "overlays/actors/ovl_En_Bom/z_en_bom.h" #include "soh/ResourceManagerHelpers.h" -#define FLAGS (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_FRIENDLY) +#define FLAGS (ACTOR_FLAG_ATTENTION_ENABLED | ACTOR_FLAG_FRIENDLY) void EnJsjutan_Init(Actor* thisx, PlayState* play); void EnJsjutan_Destroy(Actor* thisx, PlayState* play); @@ -42,7 +42,7 @@ void EnJsjutan_Init(Actor* thisx, PlayState* play) { s32 pad; CollisionHeader* header = NULL; - this->dyna.actor.flags &= ~ACTOR_FLAG_TARGETABLE; + this->dyna.actor.flags &= ~ACTOR_FLAG_ATTENTION_ENABLED; DynaPolyActor_Init(&this->dyna, DPM_UNK); CollisionHeader_GetVirtual(&sCol, &header); this->dyna.bgId = DynaPoly_SetBgActor(play, &play->colCtx.dyna, thisx, header); diff --git a/soh/src/overlays/actors/ovl_En_Kakasi/z_en_kakasi.c b/soh/src/overlays/actors/ovl_En_Kakasi/z_en_kakasi.c index 3bea92f0d..9e71fff51 100644 --- a/soh/src/overlays/actors/ovl_En_Kakasi/z_en_kakasi.c +++ b/soh/src/overlays/actors/ovl_En_Kakasi/z_en_kakasi.c @@ -8,7 +8,7 @@ #include "vt.h" #include "objects/object_ka/object_ka.h" -#define FLAGS (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_FRIENDLY | ACTOR_FLAG_NO_FREEZE_OCARINA) +#define FLAGS (ACTOR_FLAG_ATTENTION_ENABLED | ACTOR_FLAG_FRIENDLY | ACTOR_FLAG_UPDATE_DURING_OCARINA) void EnKakasi_Init(Actor* thisx, PlayState* play); void EnKakasi_Destroy(Actor* thisx, PlayState* play); @@ -74,7 +74,7 @@ void EnKakasi_Init(Actor* thisx, PlayState* play) { SkelAnime_InitFlex(play, &this->skelanime, &object_ka_Skel_0065B0, &object_ka_Anim_000214, NULL, NULL, 0); this->rot = this->actor.world.rot; - this->actor.flags |= ACTOR_FLAG_DRAGGED_BY_HOOKSHOT; + this->actor.flags |= ACTOR_FLAG_HOOKSHOT_PULLS_PLAYER; this->actor.colChkInfo.mass = MASS_IMMOVABLE; Actor_SetScale(&this->actor, 0.01f); diff --git a/soh/src/overlays/actors/ovl_En_Kakasi2/z_en_kakasi2.c b/soh/src/overlays/actors/ovl_En_Kakasi2/z_en_kakasi2.c index 543564684..e45178f68 100644 --- a/soh/src/overlays/actors/ovl_En_Kakasi2/z_en_kakasi2.c +++ b/soh/src/overlays/actors/ovl_En_Kakasi2/z_en_kakasi2.c @@ -11,7 +11,7 @@ #include "soh/Enhancements/game-interactor/GameInteractor.h" #include "soh/Enhancements/game-interactor/GameInteractor_Hooks.h" -#define FLAGS (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_UPDATE_WHILE_CULLED | ACTOR_FLAG_DRAW_WHILE_CULLED | ACTOR_FLAG_NO_FREEZE_OCARINA | ACTOR_FLAG_NO_LOCKON) +#define FLAGS (ACTOR_FLAG_ATTENTION_ENABLED | ACTOR_FLAG_UPDATE_CULLING_DISABLED | ACTOR_FLAG_DRAW_CULLING_DISABLED | ACTOR_FLAG_UPDATE_DURING_OCARINA | ACTOR_FLAG_LOCK_ON_DISABLED) static ColliderCylinderInit sCylinderInit = { { @@ -93,7 +93,7 @@ void EnKakasi2_Init(Actor* thisx, PlayState* play) { this->actor.colChkInfo.mass = MASS_IMMOVABLE; this->height = 60.0f; Actor_SetScale(&this->actor, 0.01f); - this->actor.flags |= ACTOR_FLAG_DRAGGED_BY_HOOKSHOT; + this->actor.flags |= ACTOR_FLAG_HOOKSHOT_PULLS_PLAYER; this->unk_198 = this->actor.shape.rot.y; if (this->switchFlag >= 0 && Flags_GetSwitch(play, this->switchFlag)) { @@ -127,7 +127,7 @@ void func_80A90264(EnKakasi2* this, PlayState* play) { Collider_SetCylinder(play, &this->collider, &this->actor, &sCylinderInit); SkelAnime_InitFlex(play, &this->skelAnime, &object_ka_Skel_0065B0, &object_ka_Anim_000214, NULL, NULL, 0); OnePointCutscene_Attention(play, &this->actor); - this->actor.flags |= ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_NO_LOCKON; + this->actor.flags |= ACTOR_FLAG_ATTENTION_ENABLED | ACTOR_FLAG_LOCK_ON_DISABLED; Sfx_PlaySfxCentered(NA_SE_SY_CORRECT_CHIME); if (this->switchFlag >= 0) { @@ -155,7 +155,7 @@ void func_80A90264(EnKakasi2* this, PlayState* play) { OnePointCutscene_Attention(play, &this->actor); Sfx_PlaySfxCentered(NA_SE_SY_CORRECT_CHIME); - this->actor.flags |= ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_NO_LOCKON; + this->actor.flags |= ACTOR_FLAG_ATTENTION_ENABLED | ACTOR_FLAG_LOCK_ON_DISABLED; this->actionFunc = func_80A904D8; } } diff --git a/soh/src/overlays/actors/ovl_En_Kakasi3/z_en_kakasi3.c b/soh/src/overlays/actors/ovl_En_Kakasi3/z_en_kakasi3.c index e60551bd0..7dff69142 100644 --- a/soh/src/overlays/actors/ovl_En_Kakasi3/z_en_kakasi3.c +++ b/soh/src/overlays/actors/ovl_En_Kakasi3/z_en_kakasi3.c @@ -8,7 +8,7 @@ #include "vt.h" #include "objects/object_ka/object_ka.h" -#define FLAGS (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_FRIENDLY | ACTOR_FLAG_NO_FREEZE_OCARINA) +#define FLAGS (ACTOR_FLAG_ATTENTION_ENABLED | ACTOR_FLAG_FRIENDLY | ACTOR_FLAG_UPDATE_DURING_OCARINA) void EnKakasi3_Init(Actor* thisx, PlayState* play); void EnKakasi3_Destroy(Actor* thisx, PlayState* play); @@ -77,7 +77,7 @@ void EnKakasi3_Init(Actor* thisx, PlayState* play) { Collider_InitCylinder(play, &this->collider); Collider_SetCylinder(play, &this->collider, &this->actor, &sCylinderInit); SkelAnime_InitFlex(play, &this->skelAnime, &object_ka_Skel_0065B0, &object_ka_Anim_000214, NULL, NULL, 0); - this->actor.flags |= ACTOR_FLAG_DRAGGED_BY_HOOKSHOT; + this->actor.flags |= ACTOR_FLAG_HOOKSHOT_PULLS_PLAYER; this->rot = this->actor.world.rot; this->actor.colChkInfo.mass = MASS_IMMOVABLE; Actor_SetScale(&this->actor, 0.01f); diff --git a/soh/src/overlays/actors/ovl_En_Kanban/z_en_kanban.c b/soh/src/overlays/actors/ovl_En_Kanban/z_en_kanban.c index 6b48d0dd7..c29a7986e 100644 --- a/soh/src/overlays/actors/ovl_En_Kanban/z_en_kanban.c +++ b/soh/src/overlays/actors/ovl_En_Kanban/z_en_kanban.c @@ -9,7 +9,7 @@ #include "objects/object_kanban/object_kanban.h" #include "vt.h" -#define FLAGS (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_FRIENDLY | ACTOR_FLAG_UPDATE_WHILE_CULLED) +#define FLAGS (ACTOR_FLAG_ATTENTION_ENABLED | ACTOR_FLAG_FRIENDLY | ACTOR_FLAG_UPDATE_CULLING_DISABLED) #define PART_UPPER_LEFT (1 << 0) #define PART_LEFT_UPPER (1 << 1) @@ -197,7 +197,7 @@ void EnKanban_Init(Actor* thisx, PlayState* play) { Actor_SetScale(&this->actor, 0.01f); if (this->actor.params != ENKANBAN_PIECE) { this->actor.targetMode = 0; - this->actor.flags |= ACTOR_FLAG_TARGETABLE; + this->actor.flags |= ACTOR_FLAG_ATTENTION_ENABLED; Collider_InitCylinder(play, &this->collider); Collider_SetCylinder(play, &this->collider, &this->actor, &sCylinderInit); osSyncPrintf("KANBAN ARG %x\n", this->actor.params); @@ -269,7 +269,7 @@ void EnKanban_Update(Actor* thisx, PlayState* play2) { this->zTargetTimer--; } if (this->zTargetTimer == 1) { - this->actor.flags &= ~ACTOR_FLAG_TARGETABLE; + this->actor.flags &= ~ACTOR_FLAG_ATTENTION_ENABLED; } if (this->partFlags == 0xFFFF) { EnKanban_Message(this, play); @@ -387,8 +387,8 @@ void EnKanban_Update(Actor* thisx, PlayState* play2) { piece->direction = -1; } piece->airTimer = 100; - piece->actor.flags &= ~ACTOR_FLAG_TARGETABLE; - piece->actor.flags |= ACTOR_FLAG_NO_FREEZE_OCARINA; + piece->actor.flags &= ~ACTOR_FLAG_ATTENTION_ENABLED; + piece->actor.flags |= ACTOR_FLAG_UPDATE_DURING_OCARINA; this->cutMarkTimer = 5; Audio_PlayActorSound2(&this->actor, NA_SE_IT_SWORD_STRIKE); } @@ -399,7 +399,7 @@ void EnKanban_Update(Actor* thisx, PlayState* play2) { CollisionCheck_SetAC(play, &play->colChkCtx, &this->collider.base); CollisionCheck_SetOC(play, &play->colChkCtx, &this->collider.base); if (this->actor.xzDistToPlayer > 500.0f) { - this->actor.flags |= ACTOR_FLAG_TARGETABLE; + this->actor.flags |= ACTOR_FLAG_ATTENTION_ENABLED; this->partFlags = 0xFFFF; } if (this->cutMarkTimer != 0) { @@ -755,7 +755,7 @@ void EnKanban_Update(Actor* thisx, PlayState* play2) { ((pDiff + yDiff + rDiff + this->spinRot.x + this->spinRot.z) == 0) && (this->floorRot.x == 0.0f) && (this->floorRot.z == 0.0f)) { signpost->partFlags |= this->partFlags; - signpost->actor.flags |= ACTOR_FLAG_TARGETABLE; + signpost->actor.flags |= ACTOR_FLAG_ATTENTION_ENABLED; Actor_Kill(&this->actor); } } break; diff --git a/soh/src/overlays/actors/ovl_En_Karebaba/z_en_karebaba.c b/soh/src/overlays/actors/ovl_En_Karebaba/z_en_karebaba.c index 449653b9a..4066255b5 100644 --- a/soh/src/overlays/actors/ovl_En_Karebaba/z_en_karebaba.c +++ b/soh/src/overlays/actors/ovl_En_Karebaba/z_en_karebaba.c @@ -11,7 +11,7 @@ #include "soh/Enhancements/game-interactor/GameInteractor_Hooks.h" #include "soh/ResourceManagerHelpers.h" -#define FLAGS (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_HOSTILE) +#define FLAGS (ACTOR_FLAG_ATTENTION_ENABLED | ACTOR_FLAG_HOSTILE) void EnKarebaba_Init(Actor* thisx, PlayState* play); void EnKarebaba_Destroy(Actor* thisx, PlayState* play); @@ -182,7 +182,7 @@ void EnKarebaba_SetupDying(EnKarebaba* this) { this->actor.world.rot.y = this->actor.shape.rot.y + 0x8000; this->actor.speedXZ = 3.0f; Audio_PlayActorSound2(&this->actor, NA_SE_EN_DEKU_JR_DEAD); - this->actor.flags |= ACTOR_FLAG_UPDATE_WHILE_CULLED | ACTOR_FLAG_DRAW_WHILE_CULLED; + this->actor.flags |= ACTOR_FLAG_UPDATE_CULLING_DISABLED | ACTOR_FLAG_DRAW_CULLING_DISABLED; this->actionFunc = EnKarebaba_Dying; GameInteractor_ExecuteOnEnemyDefeat(&this->actor); } @@ -196,7 +196,7 @@ void EnKarebaba_SetupDeadItemDrop(EnKarebaba* this, PlayState* play) { this->actor.shape.shadowScale = 3.0f; Actor_ChangeCategory(play, &play->actorCtx, &this->actor, ACTORCAT_MISC); this->actor.params = 200; - this->actor.flags &= ~ACTOR_FLAG_DRAW_WHILE_CULLED; + this->actor.flags &= ~ACTOR_FLAG_DRAW_CULLING_DISABLED; this->actionFunc = EnKarebaba_DeadItemDrop; } @@ -333,7 +333,7 @@ void EnKarebaba_Dying(EnKarebaba* this, PlayState* play) { if (this->actor.scale.x > 0.005f && ((this->actor.bgCheckFlags & 2) || (this->actor.bgCheckFlags & 8))) { this->actor.scale.x = this->actor.scale.y = this->actor.scale.z = 0.0f; this->actor.speedXZ = 0.0f; - this->actor.flags &= ~(ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_HOSTILE); + this->actor.flags &= ~(ACTOR_FLAG_ATTENTION_ENABLED | ACTOR_FLAG_HOSTILE); EffectSsHahen_SpawnBurst(play, &this->actor.world.pos, 3.0f, 0, 12, 5, 15, HAHEN_OBJECT_DEFAULT, 10, NULL); } @@ -405,8 +405,8 @@ void EnKarebaba_Regrow(EnKarebaba* this, PlayState* play) { this->actor.world.pos.y = this->actor.home.pos.y + (14.0f * scaleFactor); if (this->actor.params == 20) { - this->actor.flags &= ~ACTOR_FLAG_UPDATE_WHILE_CULLED; - this->actor.flags |= ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_HOSTILE; + this->actor.flags &= ~ACTOR_FLAG_UPDATE_CULLING_DISABLED; + this->actor.flags |= ACTOR_FLAG_ATTENTION_ENABLED | ACTOR_FLAG_HOSTILE; Actor_ChangeCategory(play, &play->actorCtx, &this->actor, ACTORCAT_ENEMY); EnKarebaba_SetupIdle(this); } diff --git a/soh/src/overlays/actors/ovl_En_Ko/z_en_ko.c b/soh/src/overlays/actors/ovl_En_Ko/z_en_ko.c index dc069b7a8..33c86821f 100644 --- a/soh/src/overlays/actors/ovl_En_Ko/z_en_ko.c +++ b/soh/src/overlays/actors/ovl_En_Ko/z_en_ko.c @@ -15,7 +15,7 @@ #include "soh/ResourceManagerHelpers.h" #include "soh/Enhancements/game-interactor/GameInteractor_Hooks.h" -#define FLAGS (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_FRIENDLY | ACTOR_FLAG_UPDATE_WHILE_CULLED) +#define FLAGS (ACTOR_FLAG_ATTENTION_ENABLED | ACTOR_FLAG_FRIENDLY | ACTOR_FLAG_UPDATE_CULLING_DISABLED) #define ENKO_TYPE (this->actor.params & 0xFF) #define ENKO_PATH ((this->actor.params & 0xFF00) >> 8) @@ -1097,9 +1097,9 @@ void func_80A98DB4(EnKo* this, PlayState* play) { } if (this->modelAlpha < 10.0f) { - this->actor.flags &= ~ACTOR_FLAG_TARGETABLE; + this->actor.flags &= ~ACTOR_FLAG_ATTENTION_ENABLED; } else { - this->actor.flags |= ACTOR_FLAG_TARGETABLE; + this->actor.flags |= ACTOR_FLAG_ATTENTION_ENABLED; } } @@ -1143,7 +1143,7 @@ void EnKo_Destroy(Actor* thisx, PlayState* play) { void func_80A99048(EnKo* this, PlayState* play) { if (EnKo_IsOsAnimeLoaded(this, play) && EnKo_AreObjectsLoaded(this, play)) { - this->actor.flags &= ~ACTOR_FLAG_UPDATE_WHILE_CULLED; + this->actor.flags &= ~ACTOR_FLAG_UPDATE_CULLING_DISABLED; this->actor.objBankIndex = this->legsObjectBankIdx; gSegments[6] = VIRTUAL_TO_PHYSICAL(play->objectCtx.status[this->actor.objBankIndex].segment); SkelAnime_InitFlex(play, &this->skelAnime, sSkeleton[sModelInfo[ENKO_TYPE].legsId].flexSkeletonHeader, diff --git a/soh/src/overlays/actors/ovl_En_Kusa/z_en_kusa.c b/soh/src/overlays/actors/ovl_En_Kusa/z_en_kusa.c index 7389db34b..49623c850 100644 --- a/soh/src/overlays/actors/ovl_En_Kusa/z_en_kusa.c +++ b/soh/src/overlays/actors/ovl_En_Kusa/z_en_kusa.c @@ -11,7 +11,7 @@ #include "objects/object_kusa/object_kusa.h" #include "vt.h" -#define FLAGS (ACTOR_FLAG_UPDATE_WHILE_CULLED | ACTOR_FLAG_ALWAYS_THROWN) +#define FLAGS (ACTOR_FLAG_UPDATE_CULLING_DISABLED | ACTOR_FLAG_THROW_ONLY) void EnKusa_Init(Actor* thisx, PlayState* play); void EnKusa_Destroy(Actor* thisx, PlayState* play); @@ -282,7 +282,7 @@ void EnKusa_SetupWaitObject(EnKusa* this) { void EnKusa_WaitObject(EnKusa* this, PlayState* play) { if (Object_IsLoaded(&play->objectCtx, this->objBankIndex)) { - if (this->actor.flags & ACTOR_FLAG_ENKUSA_CUT) { + if (this->actor.flags & ACTOR_FLAG_GRASS_DESTROYED) { EnKusa_SetupCut(this); } else { EnKusa_SetupMain(this); @@ -290,13 +290,13 @@ void EnKusa_WaitObject(EnKusa* this, PlayState* play) { this->actor.draw = EnKusa_Draw; this->actor.objBankIndex = this->objBankIndex; - this->actor.flags &= ~ACTOR_FLAG_UPDATE_WHILE_CULLED; + this->actor.flags &= ~ACTOR_FLAG_UPDATE_CULLING_DISABLED; } } void EnKusa_SetupMain(EnKusa* this) { EnKusa_SetupAction(this, EnKusa_Main); - this->actor.flags &= ~ACTOR_FLAG_UPDATE_WHILE_CULLED; + this->actor.flags &= ~ACTOR_FLAG_UPDATE_CULLING_DISABLED; } void EnKusa_Main(EnKusa* this, PlayState* play) { @@ -310,7 +310,7 @@ void EnKusa_Main(EnKusa* this, PlayState* play) { EnKusa_SpawnFragments(this, play); EnKusa_DropCollectible(this, play); SoundSource_PlaySfxAtFixedWorldPos(play, &this->actor.world.pos, 20, NA_SE_EV_PLANT_BROKEN); - gSaveContext.sohStats.count[COUNT_BUSHES_CUT]++; + gSaveContext.ship.stats.count[COUNT_BUSHES_CUT]++; if ((this->actor.params >> 4) & 1) { EnKusa_SpawnBugs(this, play); @@ -322,7 +322,7 @@ void EnKusa_Main(EnKusa* this, PlayState* play) { } EnKusa_SetupCut(this); - this->actor.flags |= ACTOR_FLAG_ENKUSA_CUT; + this->actor.flags |= ACTOR_FLAG_GRASS_DESTROYED; } else { if (!(this->collider.base.ocFlags1 & OC1_TYPE_PLAYER) && (this->actor.xzDistToPlayer > 12.0f)) { this->collider.base.ocFlags1 |= OC1_TYPE_PLAYER; @@ -345,7 +345,7 @@ void EnKusa_Main(EnKusa* this, PlayState* play) { void EnKusa_SetupLiftedUp(EnKusa* this) { EnKusa_SetupAction(this, EnKusa_LiftedUp); this->actor.room = -1; - this->actor.flags |= ACTOR_FLAG_UPDATE_WHILE_CULLED; + this->actor.flags |= ACTOR_FLAG_UPDATE_CULLING_DISABLED; } void EnKusa_LiftedUp(EnKusa* this, PlayState* play) { @@ -379,7 +379,7 @@ void EnKusa_Fall(EnKusa* this, PlayState* play) { if (this->actor.bgCheckFlags & 0xB) { if (!(this->actor.bgCheckFlags & 0x20)) { SoundSource_PlaySfxAtFixedWorldPos(play, &this->actor.world.pos, 20, NA_SE_EV_PLANT_BROKEN); - gSaveContext.sohStats.count[COUNT_BUSHES_CUT]++; + gSaveContext.ship.stats.count[COUNT_BUSHES_CUT]++; } EnKusa_SpawnFragments(this, play); EnKusa_DropCollectible(this, play); @@ -468,7 +468,7 @@ void EnKusa_SetupRegrow(EnKusa* this) { EnKusa_SetupAction(this, EnKusa_Regrow); EnKusa_SetScaleSmall(this); this->actor.shape.rot = this->actor.home.rot; - this->actor.flags &= ~ACTOR_FLAG_ENKUSA_CUT; + this->actor.flags &= ~ACTOR_FLAG_GRASS_DESTROYED; } void EnKusa_Regrow(EnKusa* this, PlayState* play) { @@ -492,7 +492,7 @@ void EnKusa_Update(Actor* thisx, PlayState* play) { this->actionFunc(this, play); - if (this->actor.flags & ACTOR_FLAG_ENKUSA_CUT) { + if (this->actor.flags & ACTOR_FLAG_GRASS_DESTROYED) { this->actor.shape.yOffset = -6.25f; } else { this->actor.shape.yOffset = 0.0f; @@ -503,7 +503,7 @@ void EnKusa_Draw(Actor* thisx, PlayState* play) { static Gfx* dLists[] = { gFieldBushDL, object_kusa_DL_000140, object_kusa_DL_000140 }; EnKusa* this = (EnKusa*)thisx; - if (this->actor.flags & ACTOR_FLAG_ENKUSA_CUT) { + if (this->actor.flags & ACTOR_FLAG_GRASS_DESTROYED) { Gfx_DrawDListOpa(play, object_kusa_DL_0002E0); } else { Gfx_DrawDListOpa(play, dLists[thisx->params & 3]); diff --git a/soh/src/overlays/actors/ovl_En_Kz/z_en_kz.c b/soh/src/overlays/actors/ovl_En_Kz/z_en_kz.c index 22e0fa413..7e0a3521e 100644 --- a/soh/src/overlays/actors/ovl_En_Kz/z_en_kz.c +++ b/soh/src/overlays/actors/ovl_En_Kz/z_en_kz.c @@ -11,7 +11,7 @@ #include "soh/ResourceManagerHelpers.h" #include "soh/Enhancements/game-interactor/GameInteractor_Hooks.h" -#define FLAGS (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_FRIENDLY) +#define FLAGS (ACTOR_FLAG_ATTENTION_ENABLED | ACTOR_FLAG_FRIENDLY) void EnKz_Init(Actor* thisx, PlayState* play); void EnKz_Destroy(Actor* thisx, PlayState* play); @@ -242,11 +242,11 @@ s32 func_80A9C95C(PlayState* play, EnKz* this, s16* talkState, f32 unkf, NpcGetT yaw = Math_Vec3f_Yaw(&this->actor.home.pos, &player->actor.world.pos); yaw -= this->actor.shape.rot.y; if ((fabsf(yaw) > 1638.0f) || (this->actor.xzDistToPlayer < 265.0f)) { - this->actor.flags &= ~ACTOR_FLAG_TARGETABLE; + this->actor.flags &= ~ACTOR_FLAG_ATTENTION_ENABLED; return 0; } - this->actor.flags |= ACTOR_FLAG_TARGETABLE; + this->actor.flags |= ACTOR_FLAG_ATTENTION_ENABLED; } Actor_GetScreenPos(play, &this->actor, &sp32, &sp30); @@ -281,11 +281,11 @@ void func_80A9CB18(EnKz* this, PlayState* play) { yaw = Math_Vec3f_Yaw(&this->actor.home.pos, &player->actor.world.pos); yaw -= this->actor.shape.rot.y; if ((fabsf(yaw) > 1638.0f) || (this->actor.xzDistToPlayer < 265.0f)) { - this->actor.flags &= ~ACTOR_FLAG_TARGETABLE; + this->actor.flags &= ~ACTOR_FLAG_ATTENTION_ENABLED; return; } - this->actor.flags |= ACTOR_FLAG_TARGETABLE; + this->actor.flags |= ACTOR_FLAG_ATTENTION_ENABLED; } if (func_80A9C95C(play, this, &this->interactInfo.talkState, 340.0f, EnKz_GetText, func_80A9C6C0)) { diff --git a/soh/src/overlays/actors/ovl_En_Lightbox/z_en_lightbox.c b/soh/src/overlays/actors/ovl_En_Lightbox/z_en_lightbox.c index 5f7aae79a..67e33f54f 100644 --- a/soh/src/overlays/actors/ovl_En_Lightbox/z_en_lightbox.c +++ b/soh/src/overlays/actors/ovl_En_Lightbox/z_en_lightbox.c @@ -7,7 +7,7 @@ #include "z_en_lightbox.h" #include "objects/object_lightbox/object_lightbox.h" -#define FLAGS ACTOR_FLAG_UPDATE_WHILE_CULLED +#define FLAGS ACTOR_FLAG_UPDATE_CULLING_DISABLED void EnLightbox_Init(Actor* thisx, PlayState* play); void EnLightbox_Destroy(Actor* thisx, PlayState* play); diff --git a/soh/src/overlays/actors/ovl_En_Ma1/z_en_ma1.c b/soh/src/overlays/actors/ovl_En_Ma1/z_en_ma1.c index e4ceacfb2..029c2548b 100644 --- a/soh/src/overlays/actors/ovl_En_Ma1/z_en_ma1.c +++ b/soh/src/overlays/actors/ovl_En_Ma1/z_en_ma1.c @@ -9,7 +9,7 @@ #include "soh/OTRGlobals.h" #include "soh/Enhancements/game-interactor/GameInteractor_Hooks.h" -#define FLAGS (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_FRIENDLY | ACTOR_FLAG_UPDATE_WHILE_CULLED | ACTOR_FLAG_DRAW_WHILE_CULLED | ACTOR_FLAG_NO_FREEZE_OCARINA) +#define FLAGS (ACTOR_FLAG_ATTENTION_ENABLED | ACTOR_FLAG_FRIENDLY | ACTOR_FLAG_UPDATE_CULLING_DISABLED | ACTOR_FLAG_DRAW_CULLING_DISABLED | ACTOR_FLAG_UPDATE_DURING_OCARINA) void EnMa1_Init(Actor* thisx, PlayState* play); void EnMa1_Destroy(Actor* thisx, PlayState* play); @@ -369,7 +369,7 @@ void func_80AA0F44(EnMa1* this, PlayState* play) { this->actor.textId = 0x2061; Message_StartTextbox(play, this->actor.textId, NULL); this->interactInfo.talkState = NPC_TALK_STATE_TALKING; - this->actor.flags |= ACTOR_FLAG_WILL_TALK; + this->actor.flags |= ACTOR_FLAG_TALK_OFFER_AUTO_ACCEPTED; this->actionFunc = func_80AA106C; } else if (this->actor.xzDistToPlayer < 30.0f + (f32)this->collider.dim.radius) { player->stateFlags2 |= PLAYER_STATE2_NEAR_OCARINA_ACTOR; @@ -382,7 +382,7 @@ void func_80AA106C(EnMa1* this, PlayState* play) { if (this->interactInfo.talkState == NPC_TALK_STATE_ACTION) { Audio_OcaSetInstrument(2); func_8010BD58(play, OCARINA_ACTION_TEACH_EPONA); - this->actor.flags &= ~ACTOR_FLAG_WILL_TALK; + this->actor.flags &= ~ACTOR_FLAG_TALK_OFFER_AUTO_ACCEPTED; this->actionFunc = func_80AA10EC; } } diff --git a/soh/src/overlays/actors/ovl_En_Ma2/z_en_ma2.c b/soh/src/overlays/actors/ovl_En_Ma2/z_en_ma2.c index 248d5a8c4..f1c71ac47 100644 --- a/soh/src/overlays/actors/ovl_En_Ma2/z_en_ma2.c +++ b/soh/src/overlays/actors/ovl_En_Ma2/z_en_ma2.c @@ -1,7 +1,7 @@ #include "z_en_ma2.h" #include "objects/object_ma2/object_ma2.h" -#define FLAGS (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_FRIENDLY | ACTOR_FLAG_UPDATE_WHILE_CULLED | ACTOR_FLAG_DRAW_WHILE_CULLED | ACTOR_FLAG_NO_FREEZE_OCARINA) +#define FLAGS (ACTOR_FLAG_ATTENTION_ENABLED | ACTOR_FLAG_FRIENDLY | ACTOR_FLAG_UPDATE_CULLING_DISABLED | ACTOR_FLAG_DRAW_CULLING_DISABLED | ACTOR_FLAG_UPDATE_DURING_OCARINA) void EnMa2_Init(Actor* thisx, PlayState* play); void EnMa2_Destroy(Actor* thisx, PlayState* play); @@ -257,7 +257,7 @@ void EnMa2_Destroy(Actor* thisx, PlayState* play) { void func_80AA2018(EnMa2* this, PlayState* play) { if (this->interactInfo.talkState == NPC_TALK_STATE_ACTION) { - this->actor.flags &= ~ACTOR_FLAG_WILL_TALK; + this->actor.flags &= ~ACTOR_FLAG_TALK_OFFER_AUTO_ACCEPTED; this->interactInfo.talkState = NPC_TALK_STATE_IDLE; } } @@ -299,10 +299,10 @@ void func_80AA21C8(EnMa2* this, PlayState* play) { player->stateFlags2 |= PLAYER_STATE2_NEAR_OCARINA_ACTOR; } else { if (this->interactInfo.talkState == NPC_TALK_STATE_IDLE) { - this->actor.flags |= ACTOR_FLAG_WILL_TALK; + this->actor.flags |= ACTOR_FLAG_TALK_OFFER_AUTO_ACCEPTED; Message_CloseTextbox(play); } else { - this->actor.flags &= ~ACTOR_FLAG_WILL_TALK; + this->actor.flags &= ~ACTOR_FLAG_TALK_OFFER_AUTO_ACCEPTED; this->actionFunc = func_80AA2018; } } diff --git a/soh/src/overlays/actors/ovl_En_Ma3/z_en_ma3.c b/soh/src/overlays/actors/ovl_En_Ma3/z_en_ma3.c index ad93a3755..d95d2afcd 100644 --- a/soh/src/overlays/actors/ovl_En_Ma3/z_en_ma3.c +++ b/soh/src/overlays/actors/ovl_En_Ma3/z_en_ma3.c @@ -7,7 +7,7 @@ #include "z_en_ma3.h" #include "objects/object_ma2/object_ma2.h" -#define FLAGS (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_FRIENDLY | ACTOR_FLAG_UPDATE_WHILE_CULLED | ACTOR_FLAG_DRAW_WHILE_CULLED) +#define FLAGS (ACTOR_FLAG_ATTENTION_ENABLED | ACTOR_FLAG_FRIENDLY | ACTOR_FLAG_UPDATE_CULLING_DISABLED | ACTOR_FLAG_DRAW_CULLING_DISABLED) void EnMa3_Init(Actor* thisx, PlayState* play); void EnMa3_Destroy(Actor* thisx, PlayState* play); @@ -82,7 +82,7 @@ u16 func_80AA2AA0(PlayState* play, Actor* thisx) { timer1ValuePtr = &gSaveContext.timer1Value; if (gSaveContext.eventInf[0] & 0x400) { gSaveContext.timer1Value = gSaveContext.timer1Value; - thisx->flags |= ACTOR_FLAG_WILL_TALK; + thisx->flags |= ACTOR_FLAG_TALK_OFFER_AUTO_ACCEPTED; if (gSaveContext.timer1Value >= 0xD3) { return 0x208E; } @@ -152,7 +152,7 @@ s16 func_80AA2BD4(PlayState* play, Actor* thisx) { } case 0x208E: gSaveContext.eventInf[0] &= ~0x400; - thisx->flags &= ~ACTOR_FLAG_WILL_TALK; + thisx->flags &= ~ACTOR_FLAG_TALK_OFFER_AUTO_ACCEPTED; ret = NPC_TALK_STATE_IDLE; gSaveContext.timer1State = 0xA; break; @@ -277,7 +277,7 @@ void EnMa3_Destroy(Actor* thisx, PlayState* play) { void func_80AA3200(EnMa3* this, PlayState* play) { if (this->interactInfo.talkState == NPC_TALK_STATE_ACTION) { - this->actor.flags &= ~ACTOR_FLAG_WILL_TALK; + this->actor.flags &= ~ACTOR_FLAG_TALK_OFFER_AUTO_ACCEPTED; this->interactInfo.talkState = NPC_TALK_STATE_IDLE; } } diff --git a/soh/src/overlays/actors/ovl_En_Mag/z_en_mag.c b/soh/src/overlays/actors/ovl_En_Mag/z_en_mag.c index 48710d4a3..558a18796 100644 --- a/soh/src/overlays/actors/ovl_En_Mag/z_en_mag.c +++ b/soh/src/overlays/actors/ovl_En_Mag/z_en_mag.c @@ -9,7 +9,7 @@ #include #include "soh/ResourceManagerHelpers.h" -#define FLAGS (ACTOR_FLAG_UPDATE_WHILE_CULLED | ACTOR_FLAG_DRAW_WHILE_CULLED) +#define FLAGS (ACTOR_FLAG_UPDATE_CULLING_DISABLED | ACTOR_FLAG_DRAW_CULLING_DISABLED) void EnMag_Init(Actor* thisx, PlayState* play); void EnMag_InitMq(Actor* thisx, PlayState* play); diff --git a/soh/src/overlays/actors/ovl_En_Mb/z_en_mb.c b/soh/src/overlays/actors/ovl_En_Mb/z_en_mb.c index 96bcac036..bdd9cb6e8 100644 --- a/soh/src/overlays/actors/ovl_En_Mb/z_en_mb.c +++ b/soh/src/overlays/actors/ovl_En_Mb/z_en_mb.c @@ -16,7 +16,7 @@ * - "Spear Patrol" (variable 0xPP00 PP=pathId): uses a spear, patrols following a path, charges */ -#define FLAGS (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_HOSTILE | ACTOR_FLAG_UPDATE_WHILE_CULLED) +#define FLAGS (ACTOR_FLAG_ATTENTION_ENABLED | ACTOR_FLAG_HOSTILE | ACTOR_FLAG_UPDATE_CULLING_DISABLED) typedef enum { /* -1 */ ENMB_TYPE_SPEAR_GUARD = -1, @@ -310,7 +310,7 @@ void EnMb_Init(Actor* thisx, PlayState* play) { } ActorShape_Init(&this->actor.shape, 0.0f, ActorShadow_DrawFeet, 90.0f); - this->actor.flags &= ~ACTOR_FLAG_TARGETABLE; + this->actor.flags &= ~ACTOR_FLAG_ATTENTION_ENABLED; this->actor.naviEnemyId += 1; EnMb_SetupClubWaitPlayerNear(this); break; @@ -326,7 +326,7 @@ void EnMb_Init(Actor* thisx, PlayState* play) { this->actor.colChkInfo.mass = MASS_HEAVY; this->maxHomeDist = 350.0f; this->playerDetectionRange = 1750.0f; - this->actor.flags &= ~ACTOR_FLAG_TARGETABLE; + this->actor.flags &= ~ACTOR_FLAG_ATTENTION_ENABLED; EnMb_SetupSpearPatrolTurnTowardsWaypoint(this, play); break; } @@ -586,7 +586,7 @@ void EnMb_SetupClubDamagedWhileKneeling(EnMb* this) { void EnMb_SetupClubDead(EnMb* this) { Animation_MorphToPlayOnce(&this->skelAnime, &gEnMbClubFallOnItsBackAnim, -4.0f); this->state = ENMB_STATE_CLUB_DEAD; - this->actor.flags &= ~ACTOR_FLAG_TARGETABLE; + this->actor.flags &= ~ACTOR_FLAG_ATTENTION_ENABLED; this->hitbox.dim.height = 80; this->hitbox.dim.radius = 95; this->timer1 = 30; @@ -1166,12 +1166,12 @@ void EnMb_SpearGuardWalk(EnMb* this, PlayState* play) { if (this->timer3 == 0 && Math_Vec3f_DistXZ(&this->actor.home.pos, &player->actor.world.pos) < this->playerDetectionRange) { Math_SmoothStepToS(&this->actor.world.rot.y, this->actor.yawTowardsPlayer, 1, 0x2EE, 0); - this->actor.flags |= ACTOR_FLAG_TARGETABLE; + this->actor.flags |= ACTOR_FLAG_ATTENTION_ENABLED; if (this->actor.xzDistToPlayer < 500.0f && relYawTowardsPlayer < 0x1388) { EnMb_SetupSpearPrepareAndCharge(this); } } else { - this->actor.flags &= ~ACTOR_FLAG_TARGETABLE; + this->actor.flags &= ~ACTOR_FLAG_ATTENTION_ENABLED; if (Math_Vec3f_DistXZ(&this->actor.world.pos, &this->actor.home.pos) > this->maxHomeDist || this->timer2 != 0) { yawTowardsHome = Math_Vec3f_Yaw(&this->actor.world.pos, &this->actor.home.pos); Math_SmoothStepToS(&this->actor.world.rot.y, yawTowardsHome, 1, 0x2EE, 0); @@ -1331,7 +1331,7 @@ void EnMb_SetupSpearDead(EnMb* this) { this->timer1 = 30; this->state = ENMB_STATE_SPEAR_SPEARPATH_DAMAGED; Audio_PlayActorSound2(&this->actor, NA_SE_EN_MORIBLIN_DEAD); - this->actor.flags &= ~ACTOR_FLAG_TARGETABLE; + this->actor.flags &= ~ACTOR_FLAG_ATTENTION_ENABLED; EnMb_SetupAction(this, EnMb_SpearDead); } diff --git a/soh/src/overlays/actors/ovl_En_Md/z_en_md.c b/soh/src/overlays/actors/ovl_En_Md/z_en_md.c index 27e8fcdf2..ef03f1fb5 100644 --- a/soh/src/overlays/actors/ovl_En_Md/z_en_md.c +++ b/soh/src/overlays/actors/ovl_En_Md/z_en_md.c @@ -10,7 +10,7 @@ #include "soh/ResourceManagerHelpers.h" #include "soh/Enhancements/game-interactor/GameInteractor_Hooks.h" -#define FLAGS (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_FRIENDLY | ACTOR_FLAG_UPDATE_WHILE_CULLED | ACTOR_FLAG_NO_FREEZE_OCARINA) +#define FLAGS (ACTOR_FLAG_ATTENTION_ENABLED | ACTOR_FLAG_FRIENDLY | ACTOR_FLAG_UPDATE_CULLING_DISABLED | ACTOR_FLAG_UPDATE_DURING_OCARINA) void EnMd_Init(Actor* thisx, PlayState* play); void EnMd_Destroy(Actor* thisx, PlayState* play); diff --git a/soh/src/overlays/actors/ovl_En_Mk/z_en_mk.c b/soh/src/overlays/actors/ovl_En_Mk/z_en_mk.c index f742b4671..b1891a296 100644 --- a/soh/src/overlays/actors/ovl_En_Mk/z_en_mk.c +++ b/soh/src/overlays/actors/ovl_En_Mk/z_en_mk.c @@ -11,7 +11,7 @@ #include "soh/ResourceManagerHelpers.h" #include "soh/Enhancements/game-interactor/GameInteractor_Hooks.h" -#define FLAGS (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_FRIENDLY | ACTOR_FLAG_UPDATE_WHILE_CULLED) +#define FLAGS (ACTOR_FLAG_ATTENTION_ENABLED | ACTOR_FLAG_FRIENDLY | ACTOR_FLAG_UPDATE_CULLING_DISABLED) void EnMk_Init(Actor* thisx, PlayState* play); void EnMk_Destroy(Actor* thisx, PlayState* play); @@ -88,7 +88,7 @@ void EnMk_Destroy(Actor* thisx, PlayState* play) { void func_80AACA40(EnMk* this, PlayState* play) { if (Actor_TextboxIsClosing(&this->actor, play)) { - this->actor.flags &= ~ACTOR_FLAG_WILL_TALK; + this->actor.flags &= ~ACTOR_FLAG_TALK_OFFER_AUTO_ACCEPTED; this->actionFunc = EnMk_Wait; } diff --git a/soh/src/overlays/actors/ovl_En_Mm/z_en_mm.c b/soh/src/overlays/actors/ovl_En_Mm/z_en_mm.c index 2b9733f1c..e72a174f8 100644 --- a/soh/src/overlays/actors/ovl_En_Mm/z_en_mm.c +++ b/soh/src/overlays/actors/ovl_En_Mm/z_en_mm.c @@ -9,7 +9,7 @@ #include "objects/object_link_child/object_link_child.h" #include "soh/ResourceManagerHelpers.h" -#define FLAGS (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_FRIENDLY | ACTOR_FLAG_UPDATE_WHILE_CULLED) +#define FLAGS (ACTOR_FLAG_ATTENTION_ENABLED | ACTOR_FLAG_FRIENDLY | ACTOR_FLAG_UPDATE_CULLING_DISABLED) typedef enum { /* 0 */ RM_ANIM_RUN, diff --git a/soh/src/overlays/actors/ovl_En_Mm2/z_en_mm2.c b/soh/src/overlays/actors/ovl_En_Mm2/z_en_mm2.c index 2226dbdea..32cc9e3e0 100644 --- a/soh/src/overlays/actors/ovl_En_Mm2/z_en_mm2.c +++ b/soh/src/overlays/actors/ovl_En_Mm2/z_en_mm2.c @@ -9,7 +9,7 @@ #include "objects/object_mm/object_mm.h" #include "soh/ResourceManagerHelpers.h" -#define FLAGS (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_FRIENDLY | ACTOR_FLAG_UPDATE_WHILE_CULLED) +#define FLAGS (ACTOR_FLAG_ATTENTION_ENABLED | ACTOR_FLAG_FRIENDLY | ACTOR_FLAG_UPDATE_CULLING_DISABLED) typedef enum { /* 0 */ RM2_ANIM_RUN, diff --git a/soh/src/overlays/actors/ovl_En_Ms/z_en_ms.c b/soh/src/overlays/actors/ovl_En_Ms/z_en_ms.c index dc3966357..0eb63c1a0 100644 --- a/soh/src/overlays/actors/ovl_En_Ms/z_en_ms.c +++ b/soh/src/overlays/actors/ovl_En_Ms/z_en_ms.c @@ -10,7 +10,7 @@ #include "soh/ResourceManagerHelpers.h" #include "soh/Enhancements/game-interactor/GameInteractor_Hooks.h" -#define FLAGS (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_FRIENDLY) +#define FLAGS (ACTOR_FLAG_ATTENTION_ENABLED | ACTOR_FLAG_FRIENDLY) void EnMs_Init(Actor* thisx, PlayState* play); void EnMs_Destroy(Actor* thisx, PlayState* play); diff --git a/soh/src/overlays/actors/ovl_En_Mu/z_en_mu.c b/soh/src/overlays/actors/ovl_En_Mu/z_en_mu.c index d37b8d1ff..614b88a70 100644 --- a/soh/src/overlays/actors/ovl_En_Mu/z_en_mu.c +++ b/soh/src/overlays/actors/ovl_En_Mu/z_en_mu.c @@ -7,7 +7,7 @@ #include "z_en_mu.h" #include "objects/object_mu/object_mu.h" -#define FLAGS (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_FRIENDLY) +#define FLAGS (ACTOR_FLAG_ATTENTION_ENABLED | ACTOR_FLAG_FRIENDLY) void EnMu_Init(Actor* thisx, PlayState* play); void EnMu_Destroy(Actor* thisx, PlayState* play); diff --git a/soh/src/overlays/actors/ovl_En_Nb/z_en_nb.c b/soh/src/overlays/actors/ovl_En_Nb/z_en_nb.c index ace23084e..36e9fbd8b 100644 --- a/soh/src/overlays/actors/ovl_En_Nb/z_en_nb.c +++ b/soh/src/overlays/actors/ovl_En_Nb/z_en_nb.c @@ -11,7 +11,7 @@ #include "soh/ResourceManagerHelpers.h" #include "soh/Enhancements/game-interactor/GameInteractor_Hooks.h" -#define FLAGS ACTOR_FLAG_UPDATE_WHILE_CULLED +#define FLAGS ACTOR_FLAG_UPDATE_CULLING_DISABLED typedef enum { /* 0x00 */ NB_CHAMBER_INIT, @@ -1117,7 +1117,7 @@ void EnNb_CrawlspaceSpawnCheck(EnNb* this, PlayState* play) { } else { EnNb_SetCurrentAnim(this, &gNabooruStandingHandsOnHipsAnim, 0, 0.0f, 0); this->headTurnFlag = 1; - this->actor.flags |= ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_FRIENDLY; + this->actor.flags |= ACTOR_FLAG_ATTENTION_ENABLED | ACTOR_FLAG_FRIENDLY; this->actor.world.pos = this->finalPos; this->action = NB_IDLE_AFTER_TALK; this->drawMode = NB_DRAW_DEFAULT; @@ -1196,7 +1196,7 @@ void EnNb_SetupIdleCrawlspace(EnNb* this, s32 animFinished) { if (animFinished) { EnNb_SetCurrentAnim(this, &gNabooruStandingHandsOnHipsAnim, 0, -8.0f, 0); this->headTurnFlag = 1; - this->actor.flags |= ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_FRIENDLY; + this->actor.flags |= ACTOR_FLAG_ATTENTION_ENABLED | ACTOR_FLAG_FRIENDLY; this->action = NB_IDLE_CRAWLSPACE; } } @@ -1205,7 +1205,7 @@ void func_80AB3838(EnNb* this, PlayState* play) { if (Actor_ProcessTalkRequest(&this->actor, play)) { this->action = NB_IN_DIALOG; } else { - this->actor.flags |= ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_FRIENDLY; + this->actor.flags |= ACTOR_FLAG_ATTENTION_ENABLED | ACTOR_FLAG_FRIENDLY; if (!Flags_GetInfTable(INFTABLE_16C)) { this->actor.textId = 0x601D; @@ -1221,7 +1221,7 @@ void EnNb_SetupPathMovement(EnNb* this, PlayState* play) { EnNb_SetCurrentAnim(this, &gNabooruStandingToWalkingTransitionAnim, 2, -8.0f, 0); Flags_SetEventChkInf(EVENTCHKINF_SPOKE_TO_NABOORU_IN_SPIRIT_TEMPLE); this->action = NB_IN_PATH; - this->actor.flags &= ~(ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_FRIENDLY); + this->actor.flags &= ~(ACTOR_FLAG_ATTENTION_ENABLED | ACTOR_FLAG_FRIENDLY); } void EnNb_SetTextIdAsChild(EnNb* this, PlayState* play) { @@ -1241,7 +1241,7 @@ void EnNb_SetTextIdAsChild(EnNb* this, PlayState* play) { } this->action = NB_IDLE_CRAWLSPACE; } - this->actor.flags &= ~(ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_FRIENDLY); + this->actor.flags &= ~(ACTOR_FLAG_ATTENTION_ENABLED | ACTOR_FLAG_FRIENDLY); } else if ((Message_GetState(&play->msgCtx) == TEXT_STATE_CHOICE) && Message_ShouldAdvance(play)) { choiceIndex = play->msgCtx.choiceIndex; @@ -1297,7 +1297,7 @@ void func_80AB3B04(EnNb* this, PlayState* play) { if (Actor_ProcessTalkRequest(&this->actor, play)) { this->action = NB_ACTION_30; } else { - this->actor.flags |= ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_FRIENDLY; + this->actor.flags |= ACTOR_FLAG_ATTENTION_ENABLED | ACTOR_FLAG_FRIENDLY; this->actor.textId = Text_GetFaceReaction(play, 0x23); if ((this->actor.textId) == 0) { @@ -1311,7 +1311,7 @@ void func_80AB3B04(EnNb* this, PlayState* play) { void func_80AB3B7C(EnNb* this, PlayState* play) { if (Message_GetState(&play->msgCtx) == TEXT_STATE_CLOSING) { this->action = NB_IDLE_AFTER_TALK; - this->actor.flags &= ~(ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_FRIENDLY); + this->actor.flags &= ~(ACTOR_FLAG_ATTENTION_ENABLED | ACTOR_FLAG_FRIENDLY); } } diff --git a/soh/src/overlays/actors/ovl_En_Niw/z_en_niw.c b/soh/src/overlays/actors/ovl_En_Niw/z_en_niw.c index 203a7af59..8b88abac5 100644 --- a/soh/src/overlays/actors/ovl_En_Niw/z_en_niw.c +++ b/soh/src/overlays/actors/ovl_En_Niw/z_en_niw.c @@ -11,7 +11,7 @@ #include "soh/frame_interpolation.h" #include "soh/ResourceManagerHelpers.h" -#define FLAGS (ACTOR_FLAG_UPDATE_WHILE_CULLED | ACTOR_FLAG_ALWAYS_THROWN) +#define FLAGS (ACTOR_FLAG_UPDATE_CULLING_DISABLED | ACTOR_FLAG_THROW_ONLY) void EnNiw_Init(Actor* thisx, PlayState* play); void EnNiw_Destroy(Actor* thisx, PlayState* play); @@ -154,7 +154,7 @@ void EnNiw_Init(Actor* thisx, PlayState* play) { } Actor_ProcessInitChain(&this->actor, sInitChain); - this->actor.flags |= ACTOR_FLAG_TARGETABLE; + this->actor.flags |= ACTOR_FLAG_ATTENTION_ENABLED; ActorShape_Init(&this->actor.shape, 0.0f, ActorShadow_DrawCircle, 25.0f); SkelAnime_InitFlex(play, &this->skelAnime, &gCuccoSkel, &gCuccoAnim, this->jointTable, this->morphTable, 16); @@ -214,7 +214,7 @@ void EnNiw_Init(Actor* thisx, PlayState* play) { this->actor.gravity = 0.0f; case 0xE: this->actor.colChkInfo.mass = 0; - this->actor.flags &= ~ACTOR_FLAG_TARGETABLE; + this->actor.flags &= ~ACTOR_FLAG_ATTENTION_ENABLED; break; case 4: this->actor.gravity = 0.0f; @@ -463,7 +463,7 @@ void func_80AB6450(EnNiw* this, PlayState* play) { this->sfxTimer1 = 30; this->path = 0; this->timer4 = 30; - this->actor.flags &= ~ACTOR_FLAG_TARGETABLE; + this->actor.flags &= ~ACTOR_FLAG_ATTENTION_ENABLED; this->actor.speedXZ = 0.0f; this->actionFunc = func_80AB6BF8; } else { @@ -485,7 +485,7 @@ void func_80AB6570(EnNiw* this, PlayState* play) { this->sfxTimer1 = 30; this->path = 0; this->timer4 = 30; - this->actor.flags &= ~ACTOR_FLAG_TARGETABLE; + this->actor.flags &= ~ACTOR_FLAG_ATTENTION_ENABLED; this->actor.speedXZ = 0.0f; this->actionFunc = func_80AB6BF8; return; @@ -642,7 +642,7 @@ void func_80AB6BF8(EnNiw* this, PlayState* play) { this->actor.shape.rot.z = 0; this->actor.shape.rot.y = this->actor.shape.rot.z; this->actor.shape.rot.x = this->actor.shape.rot.z; - this->actor.flags |= ACTOR_FLAG_TARGETABLE; + this->actor.flags |= ACTOR_FLAG_ATTENTION_ENABLED; this->actionFunc = func_80AB6D08; } func_80AB5BF8(this, play, 2); @@ -690,7 +690,7 @@ void func_80AB6D08(EnNiw* this, PlayState* play) { this->sfxTimer1 = 30; this->path = 0; this->timer4 = 30; - this->actor.flags &= ~ACTOR_FLAG_TARGETABLE; + this->actor.flags &= ~ACTOR_FLAG_ATTENTION_ENABLED; this->actor.speedXZ = 0.0f; this->actionFunc = func_80AB6BF8; } else { @@ -803,7 +803,7 @@ void func_80AB714C(EnNiw* this, PlayState* play) { if (this->timer5 == 0) { this->timer7 = 10; this->unk_2E4 = this->actor.yawTowardsPlayer; - this->actor.flags &= ~ACTOR_FLAG_TARGETABLE; + this->actor.flags &= ~ACTOR_FLAG_ATTENTION_ENABLED; this->actionFunc = func_80AB7204; } diff --git a/soh/src/overlays/actors/ovl_En_Niw_Girl/z_en_niw_girl.c b/soh/src/overlays/actors/ovl_En_Niw_Girl/z_en_niw_girl.c index ffb752c6c..a070813ca 100644 --- a/soh/src/overlays/actors/ovl_En_Niw_Girl/z_en_niw_girl.c +++ b/soh/src/overlays/actors/ovl_En_Niw_Girl/z_en_niw_girl.c @@ -9,7 +9,7 @@ #include "vt.h" #include "soh/ResourceManagerHelpers.h" -#define FLAGS (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_FRIENDLY | ACTOR_FLAG_UPDATE_WHILE_CULLED) +#define FLAGS (ACTOR_FLAG_ATTENTION_ENABLED | ACTOR_FLAG_FRIENDLY | ACTOR_FLAG_UPDATE_CULLING_DISABLED) void EnNiwGirl_Init(Actor* thisx, PlayState* play); void EnNiwGirl_Destroy(Actor* thisx, PlayState* play); @@ -102,7 +102,7 @@ void EnNiwGirl_Destroy(Actor* thisx, PlayState* play) { void EnNiwGirl_Jump(EnNiwGirl* this, PlayState* play) { f32 frameCount = Animation_GetLastFrame(&gNiwGirlRunAnim); Animation_Change(&this->skelAnime, &gNiwGirlRunAnim, 1.0f, 0.0f, frameCount, 0, -10.0f); - this->actor.flags &= ~ACTOR_FLAG_TARGETABLE; + this->actor.flags &= ~ACTOR_FLAG_ATTENTION_ENABLED; this->actionFunc = func_80AB9210; } @@ -143,7 +143,7 @@ void func_80AB9210(EnNiwGirl* this, PlayState* play) { void EnNiwGirl_Talk(EnNiwGirl* this, PlayState* play) { Animation_Change(&this->skelAnime, &gNiwGirlJumpAnim, 1.0f, 0.0f, Animation_GetLastFrame(&gNiwGirlJumpAnim), 0, -10.0f); - this->actor.flags |= ACTOR_FLAG_TARGETABLE; + this->actor.flags |= ACTOR_FLAG_ATTENTION_ENABLED; this->actor.textId = 0x7000; if ((Flags_GetEventChkInf(EVENTCHKINF_ZELDA_FLED_HYRULE_CASTLE)) && (this->unk_27A == 0)) { this->actor.textId = 0x70EA; diff --git a/soh/src/overlays/actors/ovl_En_Niw_Lady/z_en_niw_lady.c b/soh/src/overlays/actors/ovl_En_Niw_Lady/z_en_niw_lady.c index 31d5230ae..2c3b2bbe5 100644 --- a/soh/src/overlays/actors/ovl_En_Niw_Lady/z_en_niw_lady.c +++ b/soh/src/overlays/actors/ovl_En_Niw_Lady/z_en_niw_lady.c @@ -8,7 +8,7 @@ #include "soh/ResourceManagerHelpers.h" #include "soh/Enhancements/game-interactor/GameInteractor_Hooks.h" -#define FLAGS (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_FRIENDLY | ACTOR_FLAG_UPDATE_WHILE_CULLED) +#define FLAGS (ACTOR_FLAG_ATTENTION_ENABLED | ACTOR_FLAG_FRIENDLY | ACTOR_FLAG_UPDATE_CULLING_DISABLED) void EnNiwLady_Init(Actor* thisx, PlayState* play); void EnNiwLady_Destroy(Actor* thisx, PlayState* play); diff --git a/soh/src/overlays/actors/ovl_En_Nutsball/z_en_nutsball.c b/soh/src/overlays/actors/ovl_En_Nutsball/z_en_nutsball.c index 34afa674f..4bdedbb7e 100644 --- a/soh/src/overlays/actors/ovl_En_Nutsball/z_en_nutsball.c +++ b/soh/src/overlays/actors/ovl_En_Nutsball/z_en_nutsball.c @@ -13,7 +13,7 @@ #include "objects/object_dns/object_dns.h" #include "objects/object_dnk/object_dnk.h" -#define FLAGS ACTOR_FLAG_UPDATE_WHILE_CULLED +#define FLAGS ACTOR_FLAG_UPDATE_CULLING_DISABLED void EnNutsball_Init(Actor* thisx, PlayState* play); void EnNutsball_Destroy(Actor* thisx, PlayState* play); @@ -163,7 +163,7 @@ void EnNutsball_Update(Actor* thisx, PlayState* play) { Actor_UpdateBgCheckInfo(play, &this->actor, 10, sCylinderInit.dim.radius, sCylinderInit.dim.height, 5); Collider_UpdateCylinder(&this->actor, &this->collider); - this->actor.flags |= ACTOR_FLAG_PLAY_HIT_SFX; + this->actor.flags |= ACTOR_FLAG_SFX_FOR_PLAYER_BODY_HIT; CollisionCheck_SetAT(play, &play->colChkCtx, &this->collider.base); CollisionCheck_SetAC(play, &play->colChkCtx, &this->collider.base); diff --git a/soh/src/overlays/actors/ovl_En_Nwc/z_en_nwc.c b/soh/src/overlays/actors/ovl_En_Nwc/z_en_nwc.c index 963f54b96..fb430cbbf 100644 --- a/soh/src/overlays/actors/ovl_En_Nwc/z_en_nwc.c +++ b/soh/src/overlays/actors/ovl_En_Nwc/z_en_nwc.c @@ -8,7 +8,7 @@ #include "objects/object_nwc/object_nwc.h" #include "soh/frame_interpolation.h" -#define FLAGS (ACTOR_FLAG_UPDATE_WHILE_CULLED | ACTOR_FLAG_DRAW_WHILE_CULLED) +#define FLAGS (ACTOR_FLAG_UPDATE_CULLING_DISABLED | ACTOR_FLAG_DRAW_CULLING_DISABLED) void EnNwc_Init(Actor* thisx, PlayState* play); void EnNwc_Destroy(Actor* thisx, PlayState* play); diff --git a/soh/src/overlays/actors/ovl_En_Ny/z_en_ny.c b/soh/src/overlays/actors/ovl_En_Ny/z_en_ny.c index 5ce3f9380..0a1f28136 100644 --- a/soh/src/overlays/actors/ovl_En_Ny/z_en_ny.c +++ b/soh/src/overlays/actors/ovl_En_Ny/z_en_ny.c @@ -3,7 +3,7 @@ #include "soh/frame_interpolation.h" #include "soh/Enhancements/game-interactor/GameInteractor_Hooks.h" -#define FLAGS (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_HOSTILE) +#define FLAGS (ACTOR_FLAG_ATTENTION_ENABLED | ACTOR_FLAG_HOSTILE) void EnNy_Init(Actor* thisx, PlayState* play); void EnNy_Destroy(Actor* thisx, PlayState* play); @@ -334,7 +334,7 @@ s32 EnNy_CollisionCheck(EnNy* this, PlayState* play) { this->stoneTimer = 0; if (this->actor.colChkInfo.health == 0) { this->actor.shape.shadowAlpha = 0; - this->actor.flags &= ~ACTOR_FLAG_TARGETABLE; + this->actor.flags &= ~ACTOR_FLAG_ATTENTION_ENABLED; this->unk_1D0 = sp3F; Enemy_StartFinishingBlow(play, &this->actor); return 1; diff --git a/soh/src/overlays/actors/ovl_En_OE2/z_en_oe2.c b/soh/src/overlays/actors/ovl_En_OE2/z_en_oe2.c index b8ea6092e..521750871 100644 --- a/soh/src/overlays/actors/ovl_En_OE2/z_en_oe2.c +++ b/soh/src/overlays/actors/ovl_En_OE2/z_en_oe2.c @@ -6,7 +6,7 @@ #include "z_en_oe2.h" -#define FLAGS (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_FRIENDLY) +#define FLAGS (ACTOR_FLAG_ATTENTION_ENABLED | ACTOR_FLAG_FRIENDLY) void EnOE2_Init(Actor* thisx, PlayState* play); void EnOE2_Destroy(Actor* thisx, PlayState* play); diff --git a/soh/src/overlays/actors/ovl_En_Okarina_Effect/z_en_okarina_effect.c b/soh/src/overlays/actors/ovl_En_Okarina_Effect/z_en_okarina_effect.c index 9daa4f501..0d3519e3d 100644 --- a/soh/src/overlays/actors/ovl_En_Okarina_Effect/z_en_okarina_effect.c +++ b/soh/src/overlays/actors/ovl_En_Okarina_Effect/z_en_okarina_effect.c @@ -7,7 +7,7 @@ #include "z_en_okarina_effect.h" #include "vt.h" -#define FLAGS (ACTOR_FLAG_UPDATE_WHILE_CULLED | ACTOR_FLAG_NO_FREEZE_OCARINA) +#define FLAGS (ACTOR_FLAG_UPDATE_CULLING_DISABLED | ACTOR_FLAG_UPDATE_DURING_OCARINA) void EnOkarinaEffect_Init(Actor* thisx, PlayState* play); void EnOkarinaEffect_Destroy(Actor* thisx, PlayState* play); diff --git a/soh/src/overlays/actors/ovl_En_Okarina_Tag/z_en_okarina_tag.c b/soh/src/overlays/actors/ovl_En_Okarina_Tag/z_en_okarina_tag.c index b0d9ecda4..10f6a5207 100644 --- a/soh/src/overlays/actors/ovl_En_Okarina_Tag/z_en_okarina_tag.c +++ b/soh/src/overlays/actors/ovl_En_Okarina_Tag/z_en_okarina_tag.c @@ -11,7 +11,7 @@ #include "soh/OTRGlobals.h" #include "soh/Enhancements/game-interactor/GameInteractor_Hooks.h" -#define FLAGS (ACTOR_FLAG_UPDATE_WHILE_CULLED | ACTOR_FLAG_NO_FREEZE_OCARINA) +#define FLAGS (ACTOR_FLAG_UPDATE_CULLING_DISABLED | ACTOR_FLAG_UPDATE_DURING_OCARINA) void EnOkarinaTag_Init(Actor* thisx, PlayState* play); void EnOkarinaTag_Destroy(Actor* thisx, PlayState* play); @@ -49,7 +49,7 @@ void EnOkarinaTag_Init(Actor* thisx, PlayState* play) { osSyncPrintf("\n\n"); // "Ocarina tag outbreak" osSyncPrintf(VT_FGCOL(GREEN) "☆☆☆☆☆ オカリナタグ発生 ☆☆☆☆☆ %x\n" VT_RST, this->actor.params); - this->actor.flags &= ~ACTOR_FLAG_TARGETABLE; + this->actor.flags &= ~ACTOR_FLAG_ATTENTION_ENABLED; this->type = (this->actor.params >> 0xA) & 0x3F; this->ocarinaSong = (this->actor.params >> 6) & 0xF; this->switchFlag = this->actor.params & 0x3F; @@ -114,7 +114,7 @@ void func_80ABEF2C(EnOkarinaTag* this, PlayState* play) { player = GET_PLAYER(play); this->unk_15A++; if ((this->switchFlag >= 0) && (Flags_GetSwitch(play, this->switchFlag))) { - this->actor.flags &= ~ACTOR_FLAG_TARGETABLE; + this->actor.flags &= ~ACTOR_FLAG_ATTENTION_ENABLED; } else { if ((this->ocarinaSong != 6) || (gSaveContext.scarecrowSpawnSongSet)) { if (player->stateFlags2 & PLAYER_STATE2_ATTEMPT_PLAY_FOR_ACTOR) { @@ -193,7 +193,7 @@ void func_80ABF28C(EnOkarinaTag* this, PlayState* play) { this->unk_15A++; if ((this->ocarinaSong != 6) || (gSaveContext.scarecrowSpawnSongSet)) { if ((this->switchFlag >= 0) && Flags_GetSwitch(play, this->switchFlag)) { - this->actor.flags &= ~ACTOR_FLAG_TARGETABLE; + this->actor.flags &= ~ACTOR_FLAG_ATTENTION_ENABLED; } else if (((this->type != 4) || GameInteractor_Should(VB_BE_ELIGIBLE_TO_OPEN_DOT, !Flags_GetEventChkInf(EVENTCHKINF_OPENED_THE_DOOR_OF_TIME), this)) && ((this->type != 6) || !Flags_GetEventChkInf(EVENTCHKINF_DESTROYED_ROYAL_FAMILY_TOMB)) && (this->actor.xzDistToPlayer < (90.0f + this->interactRange)) && diff --git a/soh/src/overlays/actors/ovl_En_Okuta/z_en_okuta.c b/soh/src/overlays/actors/ovl_En_Okuta/z_en_okuta.c index 60a3452a0..a01ceb350 100644 --- a/soh/src/overlays/actors/ovl_En_Okuta/z_en_okuta.c +++ b/soh/src/overlays/actors/ovl_En_Okuta/z_en_okuta.c @@ -4,7 +4,7 @@ #include "soh/Enhancements/game-interactor/GameInteractor_Hooks.h" #include "soh/ResourceManagerHelpers.h" -#define FLAGS (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_HOSTILE) +#define FLAGS (ACTOR_FLAG_ATTENTION_ENABLED | ACTOR_FLAG_HOSTILE) void EnOkuta_Init(Actor* thisx, PlayState* play); void EnOkuta_Destroy(Actor* thisx, PlayState* play); @@ -149,8 +149,8 @@ void EnOkuta_Init(Actor* thisx, PlayState* play) { EnOkuta_SetupWaitToAppear(this); } else { ActorShape_Init(&thisx->shape, 1100.0f, ActorShadow_DrawCircle, 18.0f); - thisx->flags &= ~ACTOR_FLAG_TARGETABLE; - thisx->flags |= ACTOR_FLAG_UPDATE_WHILE_CULLED; + thisx->flags &= ~ACTOR_FLAG_ATTENTION_ENABLED; + thisx->flags |= ACTOR_FLAG_UPDATE_CULLING_DISABLED; Collider_InitCylinder(play, &this->collider); Collider_SetCylinder(play, &this->collider, thisx, &sProjectileColliderInit); Actor_ChangeCategory(play, &play->actorCtx, thisx, ACTORCAT_PROP); @@ -205,7 +205,7 @@ void EnOkuta_SpawnRipple(EnOkuta* this, PlayState* play) { void EnOkuta_SetupWaitToAppear(EnOkuta* this) { this->actor.draw = NULL; - this->actor.flags &= ~ACTOR_FLAG_TARGETABLE; + this->actor.flags &= ~ACTOR_FLAG_ATTENTION_ENABLED; this->actionFunc = EnOkuta_WaitToAppear; this->actor.world.pos.y = this->actor.home.pos.y; } @@ -213,7 +213,7 @@ void EnOkuta_SetupWaitToAppear(EnOkuta* this) { void EnOkuta_SetupAppear(EnOkuta* this, PlayState* play) { this->actor.draw = EnOkuta_Draw; this->actor.shape.rot.y = this->actor.yawTowardsPlayer; - this->actor.flags |= ACTOR_FLAG_TARGETABLE; + this->actor.flags |= ACTOR_FLAG_ATTENTION_ENABLED; Animation_PlayOnce(&this->skelAnime, &gOctorokAppearAnim); EnOkuta_SpawnBubbles(this, play); this->actionFunc = EnOkuta_Appear; @@ -611,7 +611,7 @@ void EnOkuta_ColliderCheck(EnOkuta* this, PlayState* play) { if ((this->actor.colChkInfo.damageEffect != 0) || (this->actor.colChkInfo.damage != 0)) { Enemy_StartFinishingBlow(play, &this->actor); this->actor.colChkInfo.health = 0; - this->actor.flags &= ~ACTOR_FLAG_TARGETABLE; + this->actor.flags &= ~ACTOR_FLAG_ATTENTION_ENABLED; if (this->actor.colChkInfo.damageEffect == 3) { EnOkuta_SetupFreeze(this); } else { @@ -675,7 +675,7 @@ void EnOkuta_Update(Actor* thisx, PlayState* play2) { this->collider.dim.radius = sOctorockColliderInit.dim.radius * this->actor.scale.x * 100.0f; } if (this->actor.params == 0x10) { - this->actor.flags |= ACTOR_FLAG_PLAY_HIT_SFX; + this->actor.flags |= ACTOR_FLAG_SFX_FOR_PLAYER_BODY_HIT; CollisionCheck_SetAT(play, &play->colChkCtx, &this->collider.base); } if (this->actionFunc != EnOkuta_WaitToAppear) { diff --git a/soh/src/overlays/actors/ovl_En_Ossan/z_en_ossan.c b/soh/src/overlays/actors/ovl_En_Ossan/z_en_ossan.c index 3eaa944b0..bcb3ed449 100644 --- a/soh/src/overlays/actors/ovl_En_Ossan/z_en_ossan.c +++ b/soh/src/overlays/actors/ovl_En_Ossan/z_en_ossan.c @@ -19,7 +19,7 @@ #include #include "soh/OTRGlobals.h" -#define FLAGS (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_FRIENDLY | ACTOR_FLAG_UPDATE_WHILE_CULLED) +#define FLAGS (ACTOR_FLAG_ATTENTION_ENABLED | ACTOR_FLAG_FRIENDLY | ACTOR_FLAG_UPDATE_CULLING_DISABLED) void EnOssan_Init(Actor* thisx, PlayState* play); void EnOssan_Destroy(Actor* thisx, PlayState* play); @@ -2182,7 +2182,7 @@ void EnOssan_InitActionFunc(EnOssan* this, PlayState* play) { ShopItem* items; if (EnOssan_AreShopkeeperObjectsLoaded(this, play)) { - this->actor.flags &= ~ACTOR_FLAG_UPDATE_WHILE_CULLED; + this->actor.flags &= ~ACTOR_FLAG_UPDATE_CULLING_DISABLED; this->actor.objBankIndex = this->objBankIndex1; Actor_SetObjectDependency(play, &this->actor); @@ -2267,7 +2267,7 @@ void EnOssan_InitActionFunc(EnOssan* this, PlayState* play) { this->blinkTimer = 20; this->eyeTextureIdx = 0; this->blinkFunc = EnOssan_WaitForBlink; - this->actor.flags &= ~ACTOR_FLAG_TARGETABLE; + this->actor.flags &= ~ACTOR_FLAG_ATTENTION_ENABLED; EnOssan_SetupAction(this, EnOssan_MainActionFunc); } } diff --git a/soh/src/overlays/actors/ovl_En_Owl/z_en_owl.c b/soh/src/overlays/actors/ovl_En_Owl/z_en_owl.c index 72aa6e9a2..7701f9a2c 100644 --- a/soh/src/overlays/actors/ovl_En_Owl/z_en_owl.c +++ b/soh/src/overlays/actors/ovl_En_Owl/z_en_owl.c @@ -14,7 +14,7 @@ #include "soh/ResourceManagerHelpers.h" #include "soh/Enhancements/game-interactor/GameInteractor_Hooks.h" -#define FLAGS (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_FRIENDLY | ACTOR_FLAG_UPDATE_WHILE_CULLED) +#define FLAGS (ACTOR_FLAG_ATTENTION_ENABLED | ACTOR_FLAG_FRIENDLY | ACTOR_FLAG_UPDATE_CULLING_DISABLED) void EnOwl_Init(Actor* thisx, PlayState* play); void EnOwl_Destroy(Actor* thisx, PlayState* play); @@ -286,7 +286,7 @@ s32 EnOwl_CheckInitTalk(EnOwl* this, PlayState* play, u16 textId, f32 targetDist this->actor.textId = textId; distCheck = (flags & 2) ? 200.0f : 1000.0f; if (GameInteractor_Should(VB_OWL_INTERACTION, this->actor.xzDistToPlayer < targetDist, this)) { - this->actor.flags |= ACTOR_FLAG_WILL_TALK; + this->actor.flags |= ACTOR_FLAG_TALK_OFFER_AUTO_ACCEPTED; func_8002F1C4(&this->actor, play, targetDist, distCheck, 0); } return false; @@ -352,7 +352,7 @@ void func_80ACA76C(EnOwl* this, PlayState* play) { if (Actor_TextboxIsClosing(&this->actor, play)) { Audio_QueueSeqCmd(0x1 << 28 | SEQ_PLAYER_FANFARE << 24 | 0xFF); func_80ACA62C(this, play); - this->actor.flags &= ~ACTOR_FLAG_WILL_TALK; + this->actor.flags &= ~ACTOR_FLAG_TALK_OFFER_AUTO_ACCEPTED; } } @@ -368,7 +368,7 @@ void func_80ACA7E0(EnOwl* this, PlayState* play) { func_80ACA71C(this); this->actionFunc = func_80ACA690; } - this->actor.flags &= ~ACTOR_FLAG_WILL_TALK; + this->actor.flags &= ~ACTOR_FLAG_TALK_OFFER_AUTO_ACCEPTED; } } @@ -572,7 +572,7 @@ void func_80ACB03C(EnOwl* this, PlayState* play) { if (Actor_TextboxIsClosing(&this->actor, play)) { Audio_QueueSeqCmd(0x1 << 28 | SEQ_PLAYER_FANFARE << 24 | 0xFF); func_80ACA62C(this, play); - this->actor.flags &= ~ACTOR_FLAG_WILL_TALK; + this->actor.flags &= ~ACTOR_FLAG_TALK_OFFER_AUTO_ACCEPTED; } } @@ -861,7 +861,7 @@ void func_80ACBAB8(EnOwl* this, PlayState* play) { } void func_80ACBC0C(EnOwl* this, PlayState* play) { - this->actor.flags |= ACTOR_FLAG_DRAW_WHILE_CULLED; + this->actor.flags |= ACTOR_FLAG_DRAW_CULLING_DISABLED; if (this->actor.xzDistToPlayer > 6000.0f && !(this->actionFlags & 0x80)) { Actor_Kill(&this->actor); diff --git a/soh/src/overlays/actors/ovl_En_Part/z_en_part.c b/soh/src/overlays/actors/ovl_En_Part/z_en_part.c index 0539e980b..0a91e0e88 100644 --- a/soh/src/overlays/actors/ovl_En_Part/z_en_part.c +++ b/soh/src/overlays/actors/ovl_En_Part/z_en_part.c @@ -10,7 +10,7 @@ #include // strcmp -#define FLAGS ACTOR_FLAG_UPDATE_WHILE_CULLED +#define FLAGS ACTOR_FLAG_UPDATE_CULLING_DISABLED void EnPart_Init(Actor* thisx, PlayState* play); void EnPart_Destroy(Actor* thisx, PlayState* play); diff --git a/soh/src/overlays/actors/ovl_En_Partner/z_en_partner.c b/soh/src/overlays/actors/ovl_En_Partner/z_en_partner.c index 20db2a510..11621e4ca 100644 --- a/soh/src/overlays/actors/ovl_En_Partner/z_en_partner.c +++ b/soh/src/overlays/actors/ovl_En_Partner/z_en_partner.c @@ -14,7 +14,7 @@ #include "soh/OTRGlobals.h" #include "soh/ResourceManagerHelpers.h" -#define FLAGS (ACTOR_FLAG_UPDATE_WHILE_CULLED | ACTOR_FLAG_DRAW_WHILE_CULLED | ACTOR_FLAG_DRAGGED_BY_HOOKSHOT | ACTOR_FLAG_CAN_PRESS_SWITCH) +#define FLAGS (ACTOR_FLAG_UPDATE_CULLING_DISABLED | ACTOR_FLAG_DRAW_CULLING_DISABLED | ACTOR_FLAG_HOOKSHOT_PULLS_PLAYER | ACTOR_FLAG_CAN_PRESS_SWITCHES) void EnPartner_Init(Actor* thisx, PlayState* play); void EnPartner_Destroy(Actor* thisx, PlayState* play); diff --git a/soh/src/overlays/actors/ovl_En_Peehat/z_en_peehat.c b/soh/src/overlays/actors/ovl_En_Peehat/z_en_peehat.c index 2667bb099..30191cfed 100644 --- a/soh/src/overlays/actors/ovl_En_Peehat/z_en_peehat.c +++ b/soh/src/overlays/actors/ovl_En_Peehat/z_en_peehat.c @@ -5,7 +5,7 @@ #include "soh/Enhancements/game-interactor/GameInteractor_Hooks.h" #include "soh/ResourceManagerHelpers.h" -#define FLAGS (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_HOSTILE | ACTOR_FLAG_UPDATE_WHILE_CULLED | ACTOR_FLAG_PLAY_HIT_SFX) +#define FLAGS (ACTOR_FLAG_ATTENTION_ENABLED | ACTOR_FLAG_HOSTILE | ACTOR_FLAG_UPDATE_CULLING_DISABLED | ACTOR_FLAG_SFX_FOR_PLAYER_BODY_HIT) #define GROUND_HOVER_HEIGHT 75.0f #define MAX_LARVA 3 @@ -227,7 +227,7 @@ void EnPeehat_Init(Actor* thisx, PlayState* play) { this->xzDistToRise = 2800.0f; this->xzDistMax = 1400.0f; EnPeehat_Flying_SetStateGround(this); - this->actor.flags &= ~ACTOR_FLAG_TARGETABLE; + this->actor.flags &= ~ACTOR_FLAG_ATTENTION_ENABLED; break; case PEAHAT_TYPE_LARVA: this->actor.scale.x = this->actor.scale.z = 0.006f; @@ -330,7 +330,7 @@ void EnPeehat_Ground_StateGround(EnPeehat* this, PlayState* play) { // Keep the peahat as the version that doesn't spawn extra enemies and can actually be killed // when Enemy Randomizer is on. if (IS_DAY || CVarGetInteger(CVAR_ENHANCEMENT("RandomizedEnemies"), 0)) { - this->actor.flags |= ACTOR_FLAG_TARGETABLE; + this->actor.flags |= ACTOR_FLAG_ATTENTION_ENABLED; if (this->riseDelayTimer == 0) { if (this->actor.xzDistToPlayer < this->xzDistToRise) { EnPeehat_Ground_SetStateRise(this); @@ -340,7 +340,7 @@ void EnPeehat_Ground_StateGround(EnPeehat* this, PlayState* play) { this->riseDelayTimer--; } } else { - this->actor.flags &= ~ACTOR_FLAG_TARGETABLE; + this->actor.flags &= ~ACTOR_FLAG_ATTENTION_ENABLED; Math_SmoothStepToF(&this->actor.shape.yOffset, -1000.0f, 1.0f, 50.0f, 0.0f); if (this->unk_2D4 != 0) { this->unk_2D4--; @@ -990,7 +990,7 @@ void EnPeehat_Update(Actor* thisx, PlayState* play) { CollisionCheck_SetAC(play, &play->colChkCtx, &this->colQuad.base); } // if PEAHAT_TYPE_GROUNDED - if (thisx->params < 0 && (thisx->flags & ACTOR_FLAG_ACTIVE)) { + if (thisx->params < 0 && (thisx->flags & ACTOR_FLAG_INSIDE_CULLING_VOLUME)) { for (i = 1; i >= 0; i--) { Vec3f posResult; CollisionPoly* poly = NULL; diff --git a/soh/src/overlays/actors/ovl_En_Po_Desert/z_en_po_desert.c b/soh/src/overlays/actors/ovl_En_Po_Desert/z_en_po_desert.c index 7b0bdcee5..18222850d 100644 --- a/soh/src/overlays/actors/ovl_En_Po_Desert/z_en_po_desert.c +++ b/soh/src/overlays/actors/ovl_En_Po_Desert/z_en_po_desert.c @@ -8,7 +8,7 @@ #include "objects/object_po_field/object_po_field.h" #include "soh/ResourceManagerHelpers.h" -#define FLAGS (ACTOR_FLAG_UPDATE_WHILE_CULLED | ACTOR_FLAG_LENS | ACTOR_FLAG_IGNORE_QUAKE) +#define FLAGS (ACTOR_FLAG_UPDATE_CULLING_DISABLED | ACTOR_FLAG_REACT_TO_LENS | ACTOR_FLAG_IGNORE_QUAKE) void EnPoDesert_Init(Actor* thisx, PlayState* play); void EnPoDesert_Destroy(Actor* thisx, PlayState* play); @@ -202,11 +202,11 @@ void EnPoDesert_Update(Actor* thisx, PlayState* play) { Collider_UpdateCylinder(&this->actor, &this->collider); CollisionCheck_SetOC(play, &play->colChkCtx, &this->collider.base); if (play->actorCtx.lensActive) { - this->actor.flags |= ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_LENS; + this->actor.flags |= ACTOR_FLAG_ATTENTION_ENABLED | ACTOR_FLAG_REACT_TO_LENS; this->actor.shape.shadowDraw = ActorShadow_DrawCircle; } else { this->actor.shape.shadowDraw = NULL; - this->actor.flags &= ~(ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_LENS); + this->actor.flags &= ~(ACTOR_FLAG_ATTENTION_ENABLED | ACTOR_FLAG_REACT_TO_LENS); } } @@ -219,7 +219,7 @@ s32 EnPoDesert_OverrideLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec mtxScale = this->actionTimer / 16.0f; Matrix_Scale(mtxScale, mtxScale, mtxScale, MTXMODE_APPLY); } - if (!CHECK_FLAG_ALL(this->actor.flags, ACTOR_FLAG_LENS)) { + if (!CHECK_FLAG_ALL(this->actor.flags, ACTOR_FLAG_REACT_TO_LENS)) { *dList = NULL; } return false; @@ -240,7 +240,7 @@ void EnPoDesert_PostLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3s* color.r = (s16)(rand * 30.0f) + 225; color.g = (s16)(rand * 100.0f) + 155; color.b = (s16)(rand * 160.0f) + 95; - if (CHECK_FLAG_ALL(this->actor.flags, ACTOR_FLAG_LENS)) { + if (CHECK_FLAG_ALL(this->actor.flags, ACTOR_FLAG_REACT_TO_LENS)) { gDPPipeSync((*gfxP)++); gDPSetEnvColor((*gfxP)++, color.r, color.g, color.b, 255); gSPMatrix((*gfxP)++, MATRIX_NEWMTX(play->state.gfxCtx), diff --git a/soh/src/overlays/actors/ovl_En_Po_Field/z_en_po_field.c b/soh/src/overlays/actors/ovl_En_Po_Field/z_en_po_field.c index ca0e7b3ba..ef8517a09 100644 --- a/soh/src/overlays/actors/ovl_En_Po_Field/z_en_po_field.c +++ b/soh/src/overlays/actors/ovl_En_Po_Field/z_en_po_field.c @@ -12,7 +12,7 @@ #include -#define FLAGS (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_HOSTILE | ACTOR_FLAG_UPDATE_WHILE_CULLED | ACTOR_FLAG_DRAW_WHILE_CULLED | ACTOR_FLAG_IGNORE_QUAKE) +#define FLAGS (ACTOR_FLAG_ATTENTION_ENABLED | ACTOR_FLAG_HOSTILE | ACTOR_FLAG_UPDATE_CULLING_DISABLED | ACTOR_FLAG_DRAW_CULLING_DISABLED | ACTOR_FLAG_IGNORE_QUAKE) void EnPoField_Init(Actor* thisx, PlayState* play); void EnPoField_Destroy(Actor* thisx, PlayState* play); @@ -201,7 +201,7 @@ void EnPoField_SetupWaitForSpawn(EnPoField* this, PlayState* play) { Lights_PointSetColorAndRadius(&this->lightInfo, 0, 0, 0, 0); this->actionTimer = 200; Actor_SetScale(&this->actor, 0.0f); - this->actor.flags &= ~(ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_WILL_TALK); + this->actor.flags &= ~(ACTOR_FLAG_ATTENTION_ENABLED | ACTOR_FLAG_TALK_OFFER_AUTO_ACCEPTED); this->collider.base.acFlags &= ~AC_ON; this->collider.base.ocFlags1 = OC1_ON | OC1_TYPE_ALL; this->actor.colChkInfo.health = D_80AD70D8.health; @@ -250,7 +250,7 @@ void EnPoField_SetupCirclePlayer(EnPoField* this, PlayState* play) { Math_Vec3f_Copy(&this->actor.home.pos, &player->actor.world.pos); this->actor.world.rot.y = this->actor.yawTowardsPlayer; if (this->actionFunc != EnPoField_Damage) { - this->actor.flags |= ACTOR_FLAG_TARGETABLE; + this->actor.flags |= ACTOR_FLAG_ATTENTION_ENABLED; this->actionTimer = 600; this->unk_194 = 32; } @@ -263,7 +263,7 @@ void EnPoField_SetupFlee(EnPoField* this) { this->actionFunc = EnPoField_Flee; this->actor.speedXZ = 12.0f; if (this->actionFunc != EnPoField_Damage) { - this->actor.flags |= ACTOR_FLAG_TARGETABLE; + this->actor.flags |= ACTOR_FLAG_ATTENTION_ENABLED; this->actor.world.rot.y = this->actor.shape.rot.y + 0x8000; this->actionTimer = 2000; this->unk_194 = 32; @@ -285,7 +285,7 @@ void EnPoField_SetupDamage(EnPoField* this) { void EnPoField_SetupDeath(EnPoField* this) { this->actionTimer = 0; - this->actor.flags &= ~ACTOR_FLAG_TARGETABLE; + this->actor.flags &= ~ACTOR_FLAG_ATTENTION_ENABLED; this->actor.speedXZ = 0.0f; this->actor.world.rot.y = this->actor.shape.rot.y; this->actor.naviEnemyId = 0xFF; @@ -351,7 +351,7 @@ void func_80AD4384(EnPoField* this) { this->actor.textId = 0x5005; this->actionTimer = 400; this->unk_194 = 32; - this->actor.flags |= ACTOR_FLAG_TARGETABLE; + this->actor.flags |= ACTOR_FLAG_ATTENTION_ENABLED; this->actionFunc = func_80AD58D4; } @@ -665,15 +665,15 @@ void func_80AD58D4(EnPoField* this, PlayState* play) { } if (this->actionTimer == 0) { Audio_PlayActorSound2(&this->actor, NA_SE_EN_PO_LAUGH); - this->actor.flags &= ~ACTOR_FLAG_WILL_TALK; + this->actor.flags &= ~ACTOR_FLAG_TALK_OFFER_AUTO_ACCEPTED; EnPoField_SetupSoulDisappear(this); return; } if (this->collider.base.ocFlags1 & OC1_HIT) { - this->actor.flags |= ACTOR_FLAG_WILL_TALK; + this->actor.flags |= ACTOR_FLAG_TALK_OFFER_AUTO_ACCEPTED; func_8002F2F4(&this->actor, play); } else { - this->actor.flags &= ~ACTOR_FLAG_WILL_TALK; + this->actor.flags &= ~ACTOR_FLAG_TALK_OFFER_AUTO_ACCEPTED; CollisionCheck_SetOC(play, &play->colChkCtx, &this->collider.base); } this->actor.world.pos.y = Math_SinS(this->unk_194 * 0x800) * 5.0f + this->actor.home.pos.y; diff --git a/soh/src/overlays/actors/ovl_En_Po_Relay/z_en_po_relay.c b/soh/src/overlays/actors/ovl_En_Po_Relay/z_en_po_relay.c index 7ce6cc8df..067960019 100644 --- a/soh/src/overlays/actors/ovl_En_Po_Relay/z_en_po_relay.c +++ b/soh/src/overlays/actors/ovl_En_Po_Relay/z_en_po_relay.c @@ -9,7 +9,7 @@ #include "objects/object_tk/object_tk.h" #include "soh/ResourceManagerHelpers.h" -#define FLAGS (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_FRIENDLY | ACTOR_FLAG_UPDATE_WHILE_CULLED | ACTOR_FLAG_IGNORE_QUAKE | ACTOR_FLAG_WILL_TALK) +#define FLAGS (ACTOR_FLAG_ATTENTION_ENABLED | ACTOR_FLAG_FRIENDLY | ACTOR_FLAG_UPDATE_CULLING_DISABLED | ACTOR_FLAG_IGNORE_QUAKE | ACTOR_FLAG_TALK_OFFER_AUTO_ACCEPTED) void EnPoRelay_Init(Actor* thisx, PlayState* play); void EnPoRelay_Destroy(Actor* thisx, PlayState* play); @@ -147,14 +147,14 @@ void EnPoRelay_SetupRace(EnPoRelay* this) { this->hookshotSlotFull = (INV_CONTENT(ITEM_HOOKSHOT) != ITEM_NONE && !IS_RANDO) || (IS_RANDO && Flags_GetTreasure(gPlayState, 0x1E)); this->unk_19A = Actor_WorldYawTowardPoint(&this->actor, &vec); - this->actor.flags |= ACTOR_FLAG_NO_LOCKON; + this->actor.flags |= ACTOR_FLAG_LOCK_ON_DISABLED; Audio_PlayActorSound2(&this->actor, NA_SE_EN_PO_LAUGH); this->actionFunc = EnPoRelay_Race; } void EnPoRelay_SetupEndRace(EnPoRelay* this) { this->actor.world.rot.y = this->actor.home.rot.y + 0xC000; - this->actor.flags &= ~ACTOR_FLAG_NO_LOCKON; + this->actor.flags &= ~ACTOR_FLAG_LOCK_ON_DISABLED; this->actor.speedXZ = 0.0f; this->actionFunc = EnPoRelay_EndRace; } @@ -167,10 +167,10 @@ void EnPoRelay_CorrectY(EnPoRelay* this) { void EnPoRelay_Idle(EnPoRelay* this, PlayState* play) { Math_ScaledStepToS(&this->actor.shape.rot.y, this->actor.yawTowardsPlayer, 0x100); if (Actor_ProcessTalkRequest(&this->actor, play)) { - this->actor.flags &= ~ACTOR_FLAG_WILL_TALK; + this->actor.flags &= ~ACTOR_FLAG_TALK_OFFER_AUTO_ACCEPTED; this->actionFunc = EnPoRelay_Talk; } else if (this->actor.xzDistToPlayer < 250.0f) { - this->actor.flags |= ACTOR_FLAG_WILL_TALK; + this->actor.flags |= ACTOR_FLAG_TALK_OFFER_AUTO_ACCEPTED; this->actor.textId = this->textId; func_8002F2CC(&this->actor, play, 250.0f); } diff --git a/soh/src/overlays/actors/ovl_En_Po_Sisters/z_en_po_sisters.c b/soh/src/overlays/actors/ovl_En_Po_Sisters/z_en_po_sisters.c index 6014aebbe..31006b878 100644 --- a/soh/src/overlays/actors/ovl_En_Po_Sisters/z_en_po_sisters.c +++ b/soh/src/overlays/actors/ovl_En_Po_Sisters/z_en_po_sisters.c @@ -12,7 +12,7 @@ #include "soh/OTRGlobals.h" #include "soh/ResourceManagerHelpers.h" -#define FLAGS (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_HOSTILE | ACTOR_FLAG_UPDATE_WHILE_CULLED | ACTOR_FLAG_HOOKSHOT_DRAGS | ACTOR_FLAG_IGNORE_QUAKE | ACTOR_FLAG_ARROW_DRAGGABLE) +#define FLAGS (ACTOR_FLAG_ATTENTION_ENABLED | ACTOR_FLAG_HOSTILE | ACTOR_FLAG_UPDATE_CULLING_DISABLED | ACTOR_FLAG_HOOKSHOT_PULLS_ACTOR | ACTOR_FLAG_IGNORE_QUAKE | ACTOR_FLAG_CAN_ATTACH_TO_ARROW) void EnPoSisters_Init(Actor* thisx, PlayState* play); void EnPoSisters_Destroy(Actor* thisx, PlayState* play); @@ -207,7 +207,7 @@ void EnPoSisters_Init(Actor* thisx, PlayState* play) { this->unk_198 = 1; this->unk_199 = 32; this->unk_294 = 110.0f; - this->actor.flags &= ~ACTOR_FLAG_TARGETABLE; + this->actor.flags &= ~ACTOR_FLAG_ATTENTION_ENABLED; if (this->actor.params & 0x1000) { func_80ADA094(this, play); } else if (this->unk_194 == 0) { @@ -215,7 +215,7 @@ void EnPoSisters_Init(Actor* thisx, PlayState* play) { this->collider.base.ocFlags1 = OC1_ON | OC1_TYPE_PLAYER; func_80AD9AA8(this, play); } else { - this->actor.flags &= ~(ACTOR_FLAG_HOOKSHOT_DRAGS | ACTOR_FLAG_ARROW_DRAGGABLE); + this->actor.flags &= ~(ACTOR_FLAG_HOOKSHOT_PULLS_ACTOR | ACTOR_FLAG_CAN_ATTACH_TO_ARROW); this->collider.info.elemType = ELEMTYPE_UNK4; this->collider.info.bumper.dmgFlags |= 1; this->collider.base.ocFlags1 = OC1_NONE; @@ -385,7 +385,7 @@ void func_80AD99D4(EnPoSisters* this, PlayState* play) { this->actor.speedXZ = 0.0f; this->actor.world.pos.y += 42.0f; this->actor.shape.yOffset = -6000.0f; - this->actor.flags &= ~ACTOR_FLAG_TARGETABLE; + this->actor.flags &= ~ACTOR_FLAG_ATTENTION_ENABLED; this->unk_199 = 0; this->actionFunc = func_80ADAFC0; OnePointCutscene_Init(play, 3190, 999, &this->actor, MAIN_CAM); @@ -435,7 +435,7 @@ void func_80AD9C24(EnPoSisters* this, PlayState* play) { Vec3f vec; this->actor.draw = NULL; - this->actor.flags &= ~ACTOR_FLAG_TARGETABLE; + this->actor.flags &= ~ACTOR_FLAG_ATTENTION_ENABLED; this->unk_19C = 100; this->unk_199 = 32; this->collider.base.colType = COLTYPE_HIT3; @@ -494,7 +494,7 @@ void func_80AD9F1C(EnPoSisters* this) { this->unk_19A = 300; this->unk_19C = 3; this->unk_199 |= 9; - this->actor.flags |= ACTOR_FLAG_TARGETABLE; + this->actor.flags |= ACTOR_FLAG_ATTENTION_ENABLED; this->actionFunc = func_80ADB770; } @@ -516,7 +516,7 @@ void func_80ADA028(EnPoSisters* this) { Animation_MorphToLoop(&this->skelAnime, &gPoeSistersSwayAnim, -3.0f); this->unk_22E.a = 255; this->unk_199 |= 0x15; - this->actor.flags |= ACTOR_FLAG_TARGETABLE; + this->actor.flags |= ACTOR_FLAG_ATTENTION_ENABLED; this->actionFunc = func_80ADBBF4; this->actor.speedXZ = 0.0f; } @@ -708,7 +708,7 @@ void func_80ADA9E8(EnPoSisters* this, PlayState* play) { } void func_80ADAAA4(EnPoSisters* this, PlayState* play) { - if (SkelAnime_Update(&this->skelAnime) && !(this->actor.flags & ACTOR_FLAG_DRAGGED_BY_ARROW)) { + if (SkelAnime_Update(&this->skelAnime) && !(this->actor.flags & ACTOR_FLAG_ATTACHED_TO_ARROW)) { if (this->actor.colChkInfo.health != 0) { if (this->unk_194 != 0) { func_80AD96A4(this); @@ -1005,7 +1005,7 @@ void func_80ADB9F0(EnPoSisters* this, PlayState* play) { if (SkelAnime_Update(&this->skelAnime)) { this->unk_22E.a = 255; if (this->unk_194 == 3) { - this->actor.flags |= ACTOR_FLAG_TARGETABLE; + this->actor.flags |= ACTOR_FLAG_ATTENTION_ENABLED; this->actor.home.pos.x = 1992.0f; this->actor.home.pos.z = -1440.0f; this->unk_199 |= 0x18; @@ -1222,7 +1222,7 @@ void EnPoSisters_Update(Actor* thisx, PlayState* play) { this->unk_198 = CLAMP_MIN(temp, 1); } if (this->actionFunc == func_80ADA8C0) { - this->actor.flags |= ACTOR_FLAG_PLAY_HIT_SFX; + this->actor.flags |= ACTOR_FLAG_SFX_FOR_PLAYER_BODY_HIT; CollisionCheck_SetAT(play, &play->colChkCtx, &this->collider.base); } if (this->unk_199 & 1) { diff --git a/soh/src/overlays/actors/ovl_En_Poh/z_en_poh.c b/soh/src/overlays/actors/ovl_En_Poh/z_en_poh.c index 0d5e1e2cc..3dfba28fb 100644 --- a/soh/src/overlays/actors/ovl_En_Poh/z_en_poh.c +++ b/soh/src/overlays/actors/ovl_En_Poh/z_en_poh.c @@ -10,7 +10,7 @@ #include "soh/Enhancements/game-interactor/GameInteractor_Hooks.h" #include "soh/ResourceManagerHelpers.h" -#define FLAGS (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_HOSTILE | ACTOR_FLAG_UPDATE_WHILE_CULLED | ACTOR_FLAG_IGNORE_QUAKE) +#define FLAGS (ACTOR_FLAG_ATTENTION_ENABLED | ACTOR_FLAG_HOSTILE | ACTOR_FLAG_UPDATE_CULLING_DISABLED | ACTOR_FLAG_IGNORE_QUAKE) void EnPoh_Init(Actor* thisx, PlayState* play); void EnPoh_Destroy(Actor* thisx, PlayState* play); @@ -320,7 +320,7 @@ void func_80ADE368(EnPoh* this) { void EnPoh_SetupInitialAction(EnPoh* this) { this->lightColor.a = 0; - this->actor.flags &= ~ACTOR_FLAG_TARGETABLE; + this->actor.flags &= ~ACTOR_FLAG_ATTENTION_ENABLED; if (this->infoIdx == EN_POH_INFO_NORMAL) { Animation_PlayOnceSetSpeed(&this->skelAnime, &gPoeAppearAnim, 0.0f); this->actionFunc = func_80ADEF38; @@ -338,7 +338,7 @@ void func_80ADE48C(EnPoh* this) { this->actor.world.rot.y = this->actor.shape.rot.y; this->unk_198 = 0; this->actor.naviEnemyId = 0xFF; - this->actor.flags &= ~ACTOR_FLAG_TARGETABLE; + this->actor.flags &= ~ACTOR_FLAG_ATTENTION_ENABLED; this->actionFunc = func_80ADF15C; } @@ -377,7 +377,7 @@ void EnPoh_SetupDeath(EnPoh* this, PlayState* play) { this->actor.draw = EnPoh_DrawSoul; this->actor.shape.shadowDraw = NULL; Actor_SetScale(&this->actor, 0.01f); - this->actor.flags |= ACTOR_FLAG_UPDATE_WHILE_CULLED; + this->actor.flags |= ACTOR_FLAG_UPDATE_CULLING_DISABLED; this->actor.gravity = -1.0f; this->actor.shape.yOffset = 1500.0f; this->actor.world.pos.y -= 15.0f; @@ -440,7 +440,7 @@ void EnPoh_Talk(EnPoh* this, PlayState* play) { } this->unk_198 = 200; this->unk_195 = 32; - this->actor.flags |= ACTOR_FLAG_TARGETABLE; + this->actor.flags |= ACTOR_FLAG_ATTENTION_ENABLED; this->actionFunc = func_80ADFE80; } @@ -583,7 +583,7 @@ void func_80ADEF38(EnPoh* this, PlayState* play) { if (SkelAnime_Update(&this->skelAnime)) { this->lightColor.a = 255; this->visibilityTimer = Rand_S16Offset(700, 300); - this->actor.flags |= ACTOR_FLAG_TARGETABLE; + this->actor.flags |= ACTOR_FLAG_ATTENTION_ENABLED; EnPoh_SetupIdle(this); } else if (this->skelAnime.curFrame > 10.0f) { this->lightColor.a = ((this->skelAnime.curFrame - 10.0f) * 0.05f) * 255.0f; @@ -598,7 +598,7 @@ void EnPoh_ComposerAppear(EnPoh* this, PlayState* play) { if (SkelAnime_Update(&this->skelAnime)) { this->lightColor.a = 255; this->visibilityTimer = Rand_S16Offset(700, 300); - this->actor.flags |= ACTOR_FLAG_TARGETABLE; + this->actor.flags |= ACTOR_FLAG_ATTENTION_ENABLED; EnPoh_SetupIdle(this); } else { this->lightColor.a = CLAMP_MAX((s32)(this->skelAnime.curFrame * 25.5f), 255); @@ -781,14 +781,14 @@ void func_80ADFE80(EnPoh* this, PlayState* play) { } if (this->unk_198 == 0) { func_80ADE950(this, 1); - this->actor.flags &= ~ACTOR_FLAG_WILL_TALK; + this->actor.flags &= ~ACTOR_FLAG_TALK_OFFER_AUTO_ACCEPTED; return; } if (this->colliderCyl.base.ocFlags1 & OC1_HIT) { - this->actor.flags |= ACTOR_FLAG_WILL_TALK; + this->actor.flags |= ACTOR_FLAG_TALK_OFFER_AUTO_ACCEPTED; func_8002F2F4(&this->actor, play); } else { - this->actor.flags &= ~ACTOR_FLAG_WILL_TALK; + this->actor.flags &= ~ACTOR_FLAG_TALK_OFFER_AUTO_ACCEPTED; CollisionCheck_SetOC(play, &play->colChkCtx, &this->colliderCyl.base); } this->actor.world.pos.y = Math_SinS(this->unk_195 * 0x800) * 5.0f + this->actor.home.pos.y; @@ -933,7 +933,7 @@ void EnPoh_Update(Actor* thisx, PlayState* play) { this->colliderCyl.dim.height = 55; this->colliderCyl.dim.yShift = 15; } - this->actor.flags &= ~ACTOR_FLAG_UPDATE_WHILE_CULLED; + this->actor.flags &= ~ACTOR_FLAG_UPDATE_CULLING_DISABLED; EnPoh_SetupInitialAction(this); } } @@ -1005,7 +1005,7 @@ void EnPoh_UpdateLiving(Actor* thisx, PlayState* play) { this->actionFunc(this, play); Actor_MoveXZGravity(&this->actor); if (this->actionFunc == EnPoh_Attack && this->unk_198 < 10) { - this->actor.flags |= ACTOR_FLAG_PLAY_HIT_SFX; + this->actor.flags |= ACTOR_FLAG_SFX_FOR_PLAYER_BODY_HIT; CollisionCheck_SetAT(play, &play->colChkCtx, &this->colliderSph.base); } Collider_UpdateCylinder(&this->actor, &this->colliderCyl); diff --git a/soh/src/overlays/actors/ovl_En_Pu_box/z_en_pu_box.c b/soh/src/overlays/actors/ovl_En_Pu_box/z_en_pu_box.c index 536032a8d..de0f8d0f0 100644 --- a/soh/src/overlays/actors/ovl_En_Pu_box/z_en_pu_box.c +++ b/soh/src/overlays/actors/ovl_En_Pu_box/z_en_pu_box.c @@ -7,7 +7,7 @@ #include "z_en_pu_box.h" #include "objects/object_pu_box/object_pu_box.h" -#define FLAGS ACTOR_FLAG_UPDATE_WHILE_CULLED +#define FLAGS ACTOR_FLAG_UPDATE_CULLING_DISABLED void EnPubox_Init(Actor* thisx, PlayState* play); void EnPubox_Destroy(Actor* thisx, PlayState* play); diff --git a/soh/src/overlays/actors/ovl_En_Rd/z_en_rd.c b/soh/src/overlays/actors/ovl_En_Rd/z_en_rd.c index a5fd7872c..b65a5dd8e 100644 --- a/soh/src/overlays/actors/ovl_En_Rd/z_en_rd.c +++ b/soh/src/overlays/actors/ovl_En_Rd/z_en_rd.c @@ -3,7 +3,7 @@ #include "soh/Enhancements/game-interactor/GameInteractor_Hooks.h" #include "soh/ResourceManagerHelpers.h" -#define FLAGS (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_HOSTILE | ACTOR_FLAG_UPDATE_WHILE_CULLED | ACTOR_FLAG_DRAGGED_BY_HOOKSHOT) +#define FLAGS (ACTOR_FLAG_ATTENTION_ENABLED | ACTOR_FLAG_HOSTILE | ACTOR_FLAG_UPDATE_CULLING_DISABLED | ACTOR_FLAG_HOOKSHOT_PULLS_PLAYER) void EnRd_Init(Actor* thisx, PlayState* play); void EnRd_Destroy(Actor* thisx, PlayState* play); @@ -166,7 +166,7 @@ void EnRd_Init(Actor* thisx, PlayState* play) { SkelAnime_Update(&this->skelAnime); if (thisx->params == 3) { - thisx->flags |= ACTOR_FLAG_LENS; + thisx->flags |= ACTOR_FLAG_REACT_TO_LENS; } } @@ -361,7 +361,7 @@ void func_80AE2C1C(EnRd* this, PlayState* play) { Actor_IsFacingPlayer(&this->actor, 0x38E3)) { player->actor.freezeTimer = 0; if (play->grabPlayer(play, player)) { - this->actor.flags &= ~ACTOR_FLAG_TARGETABLE; + this->actor.flags &= ~ACTOR_FLAG_ATTENTION_ENABLED; func_80AE33F0(this); } } else if (this->actor.params > 0) { @@ -548,7 +548,7 @@ void func_80AE3454(EnRd* this, PlayState* play) { Math_SmoothStepToF(&this->actor.shape.yOffset, 0, 1.0f, 400.0f, 0.0f); } this->actor.targetMode = 0; - this->actor.flags |= ACTOR_FLAG_TARGETABLE; + this->actor.flags |= ACTOR_FLAG_ATTENTION_ENABLED; this->unk_306 = 0xA; this->unk_307 = 0xF; func_80AE2B90(this, play); @@ -617,7 +617,7 @@ void func_80AE3A8C(EnRd* this) { this->actor.speedXZ = -2.0f; } - this->actor.flags |= ACTOR_FLAG_TARGETABLE; + this->actor.flags |= ACTOR_FLAG_ATTENTION_ENABLED; Audio_PlayActorSound2(&this->actor, NA_SE_EN_REDEAD_DAMAGE); this->unk_31B = 9; EnRd_SetupAction(this, func_80AE3B18); @@ -652,7 +652,7 @@ void func_80AE3C20(EnRd* this) { Animation_MorphToPlayOnce(&this->skelAnime, &gGibdoRedeadDeathAnim, -1.0f); this->unk_31B = 10; this->unk_30C = 300; - this->actor.flags &= ~ACTOR_FLAG_TARGETABLE; + this->actor.flags &= ~ACTOR_FLAG_ATTENTION_ENABLED; this->actor.speedXZ = 0.0f; Audio_PlayActorSound2(&this->actor, NA_SE_EN_REDEAD_DEAD); EnRd_SetupAction(this, func_80AE3C98); diff --git a/soh/src/overlays/actors/ovl_En_Reeba/z_en_reeba.c b/soh/src/overlays/actors/ovl_En_Reeba/z_en_reeba.c index bab1bf046..be23bfb9d 100644 --- a/soh/src/overlays/actors/ovl_En_Reeba/z_en_reeba.c +++ b/soh/src/overlays/actors/ovl_En_Reeba/z_en_reeba.c @@ -12,7 +12,7 @@ #include "soh/Enhancements/game-interactor/GameInteractor_Hooks.h" #include "soh/ResourceManagerHelpers.h" -#define FLAGS (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_HOSTILE | ACTOR_FLAG_UPDATE_WHILE_CULLED | ACTOR_FLAG_NO_LOCKON) +#define FLAGS (ACTOR_FLAG_ATTENTION_ENABLED | ACTOR_FLAG_HOSTILE | ACTOR_FLAG_UPDATE_CULLING_DISABLED | ACTOR_FLAG_LOCK_ON_DISABLED) void EnReeba_Init(Actor* thisx, PlayState* play); void EnReeba_Destroy(Actor* thisx, PlayState* play); @@ -183,7 +183,7 @@ void func_80AE4F40(EnReeba* this, PlayState* play) { this->unk_278 = 20; } - this->actor.flags &= ~ACTOR_FLAG_NO_LOCKON; + this->actor.flags &= ~ACTOR_FLAG_LOCK_ON_DISABLED; this->actor.world.pos.y = this->actor.floorHeight; if (this->isBig) { @@ -269,7 +269,7 @@ void func_80AE5270(EnReeba* this, PlayState* play) { } void func_80AE538C(EnReeba* this, PlayState* play) { - this->actor.flags |= ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_HOSTILE; + this->actor.flags |= ACTOR_FLAG_ATTENTION_ENABLED | ACTOR_FLAG_HOSTILE; this->actionfunc = func_80AE53AC; } @@ -331,8 +331,8 @@ void func_80AE561C(EnReeba* this, PlayState* play) { void func_80AE5688(EnReeba* this, PlayState* play) { this->unk_27E = 0; Audio_PlayActorSound2(&this->actor, NA_SE_EN_AKINDONUTS_HIDE); - this->actor.flags |= ACTOR_FLAG_NO_LOCKON; - this->actor.flags &= ~(ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_HOSTILE); + this->actor.flags |= ACTOR_FLAG_LOCK_ON_DISABLED; + this->actor.flags &= ~(ACTOR_FLAG_ATTENTION_ENABLED | ACTOR_FLAG_HOSTILE); this->actionfunc = func_80AE56E0; } @@ -383,8 +383,8 @@ void func_80AE58EC(EnReeba* this, PlayState* play) { this->unk_278 = 14; this->actor.world.rot.y = this->actor.yawTowardsPlayer; this->actor.speedXZ = -8.0f; - this->actor.flags |= ACTOR_FLAG_NO_LOCKON; - this->actor.flags &= ~(ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_HOSTILE); + this->actor.flags |= ACTOR_FLAG_LOCK_ON_DISABLED; + this->actor.flags &= ~(ACTOR_FLAG_ATTENTION_ENABLED | ACTOR_FLAG_HOSTILE); this->actionfunc = func_80AE5938; } @@ -452,7 +452,7 @@ void func_80AE5BC4(EnReeba* this, PlayState* play) { this->actor.world.rot.y = this->actor.yawTowardsPlayer; Actor_SetColorFilter(&this->actor, 0x4000, 0xFF, 0, 8); this->unk_278 = 14; - this->actor.flags &= ~ACTOR_FLAG_TARGETABLE; + this->actor.flags &= ~ACTOR_FLAG_ATTENTION_ENABLED; this->actionfunc = func_80AE5C38; } diff --git a/soh/src/overlays/actors/ovl_En_River_Sound/z_en_river_sound.c b/soh/src/overlays/actors/ovl_En_River_Sound/z_en_river_sound.c index 2885e6cdf..640889c21 100644 --- a/soh/src/overlays/actors/ovl_En_River_Sound/z_en_river_sound.c +++ b/soh/src/overlays/actors/ovl_En_River_Sound/z_en_river_sound.c @@ -6,7 +6,7 @@ #include "z_en_river_sound.h" -#define FLAGS (ACTOR_FLAG_UPDATE_WHILE_CULLED | ACTOR_FLAG_DRAW_WHILE_CULLED) +#define FLAGS (ACTOR_FLAG_UPDATE_CULLING_DISABLED | ACTOR_FLAG_DRAW_CULLING_DISABLED) void EnRiverSound_Init(Actor* thisx, PlayState* play); void EnRiverSound_Destroy(Actor* thisx, PlayState* play); diff --git a/soh/src/overlays/actors/ovl_En_Rl/z_en_rl.c b/soh/src/overlays/actors/ovl_En_Rl/z_en_rl.c index 1aa5ccee1..73c2d3298 100644 --- a/soh/src/overlays/actors/ovl_En_Rl/z_en_rl.c +++ b/soh/src/overlays/actors/ovl_En_Rl/z_en_rl.c @@ -9,7 +9,7 @@ #include "objects/object_rl/object_rl.h" #include "soh/Enhancements/game-interactor/GameInteractor_Hooks.h" -#define FLAGS ACTOR_FLAG_UPDATE_WHILE_CULLED +#define FLAGS ACTOR_FLAG_UPDATE_CULLING_DISABLED void EnRl_Init(Actor* thisx, PlayState* play); void EnRl_Destroy(Actor* thisx, PlayState* play); diff --git a/soh/src/overlays/actors/ovl_En_Rr/z_en_rr.c b/soh/src/overlays/actors/ovl_En_Rr/z_en_rr.c index a748bd380..ba935364e 100644 --- a/soh/src/overlays/actors/ovl_En_Rr/z_en_rr.c +++ b/soh/src/overlays/actors/ovl_En_Rr/z_en_rr.c @@ -10,7 +10,7 @@ #include "soh/Enhancements/game-interactor/GameInteractor_Hooks.h" #include -#define FLAGS (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_HOSTILE | ACTOR_FLAG_UPDATE_WHILE_CULLED | ACTOR_FLAG_DRAW_WHILE_CULLED | ACTOR_FLAG_DRAGGED_BY_HOOKSHOT) +#define FLAGS (ACTOR_FLAG_ATTENTION_ENABLED | ACTOR_FLAG_HOSTILE | ACTOR_FLAG_UPDATE_CULLING_DISABLED | ACTOR_FLAG_DRAW_CULLING_DISABLED | ACTOR_FLAG_HOOKSHOT_PULLS_PLAYER) #define RR_MESSAGE_SHIELD (1 << 0) #define RR_MESSAGE_TUNIC (1 << 1) @@ -255,7 +255,7 @@ void EnRr_SetupGrabPlayer(EnRr* this, Player* player) { s32 i; this->grabTimer = 100; - this->actor.flags &= ~ACTOR_FLAG_TARGETABLE; + this->actor.flags &= ~ACTOR_FLAG_ATTENTION_ENABLED; this->ocTimer = 8; this->hasPlayer = true; this->reachState = 0; @@ -290,7 +290,7 @@ void EnRr_SetupReleasePlayer(EnRr* this, PlayState* play) { u8 shield; u8 tunic; - this->actor.flags |= ACTOR_FLAG_TARGETABLE; + this->actor.flags |= ACTOR_FLAG_ATTENTION_ENABLED; this->hasPlayer = false; this->ocTimer = 110; this->segMoveRate = 0.0f; @@ -382,7 +382,7 @@ void EnRr_SetupDeath(EnRr* this) { } this->actionFunc = EnRr_Death; Audio_PlayActorSound2(&this->actor, NA_SE_EN_LIKE_DEAD); - this->actor.flags &= ~ACTOR_FLAG_TARGETABLE; + this->actor.flags &= ~ACTOR_FLAG_ATTENTION_ENABLED; GameInteractor_ExecuteOnEnemyDefeat(&this->actor); } diff --git a/soh/src/overlays/actors/ovl_En_Ru1/z_en_ru1.c b/soh/src/overlays/actors/ovl_En_Ru1/z_en_ru1.c index b6bb1a725..2913f464d 100644 --- a/soh/src/overlays/actors/ovl_En_Ru1/z_en_ru1.c +++ b/soh/src/overlays/actors/ovl_En_Ru1/z_en_ru1.c @@ -10,7 +10,7 @@ #include "soh/ResourceManagerHelpers.h" #include "soh/Enhancements/game-interactor/GameInteractor_Hooks.h" -#define FLAGS (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_UPDATE_WHILE_CULLED | ACTOR_FLAG_CAN_PRESS_SWITCH) +#define FLAGS (ACTOR_FLAG_ATTENTION_ENABLED | ACTOR_FLAG_UPDATE_CULLING_DISABLED | ACTOR_FLAG_CAN_PRESS_SWITCHES) void EnRu1_Init(Actor* thisx, PlayState* play); void EnRu1_Destroy(Actor* thisx, PlayState* play); @@ -1506,7 +1506,7 @@ void func_80AEE050(EnRu1* this) { s32 func_80AEE264(EnRu1* this, PlayState* play) { if (!Actor_ProcessTalkRequest(&this->actor, play)) { - this->actor.flags |= ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_FRIENDLY; + this->actor.flags |= ACTOR_FLAG_ATTENTION_ENABLED | ACTOR_FLAG_FRIENDLY; if ((Flags_GetInfTable(INFTABLE_143))) { this->actor.textId = 0x404E; func_8002F2F4(&this->actor, play); @@ -1827,7 +1827,7 @@ s32 func_80AEF0BC(EnRu1* this, PlayState* play) { Animation_Change(&this->skelAnime, &gRutoChildSitAnim, 1.0f, 0, frameCount, ANIMMODE_ONCE, -8.0f); play->msgCtx.msgMode = MSGMODE_PAUSED; this->action = 26; - this->actor.flags &= ~(ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_FRIENDLY); + this->actor.flags &= ~(ACTOR_FLAG_ATTENTION_ENABLED | ACTOR_FLAG_FRIENDLY); return true; } return false; @@ -1867,7 +1867,7 @@ void func_80AEF29C(EnRu1* this, PlayState* play) { void func_80AEF2AC(EnRu1* this, PlayState* play) { this->action = 24; this->drawConfig = 1; - this->actor.flags |= ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_FRIENDLY; + this->actor.flags |= ACTOR_FLAG_ATTENTION_ENABLED | ACTOR_FLAG_FRIENDLY; } void func_80AEF2D0(EnRu1* this, PlayState* play) { @@ -2024,7 +2024,7 @@ void func_80AEF890(EnRu1* this, PlayState* play) { void func_80AEF930(EnRu1* this, PlayState* play) { if (func_80AEB104(this) == 3) { - this->actor.flags |= ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_FRIENDLY; + this->actor.flags |= ACTOR_FLAG_ATTENTION_ENABLED | ACTOR_FLAG_FRIENDLY; this->actor.textId = 0x4048; Message_ContinueTextbox(play, this->actor.textId); func_80AEF4A8(this, play); @@ -2110,7 +2110,7 @@ void func_80AEFC54(EnRu1* this, PlayState* play) { this->action = 41; this->unk_28C = EnRu1_FindSwitch(play); func_80AEB0EC(this, 1); - this->actor.flags &= ~(ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_FRIENDLY); + this->actor.flags &= ~(ACTOR_FLAG_ATTENTION_ENABLED | ACTOR_FLAG_FRIENDLY); } else { Actor_Kill(&this->actor); } @@ -2128,7 +2128,7 @@ void func_80AEFCE8(EnRu1* this, PlayState* play) { void func_80AEFD38(EnRu1* this, PlayState* play) { if ((Flags_GetEventChkInf(EVENTCHKINF_USED_JABU_JABUS_BELLY_BLUE_WARP)) && LINK_IS_CHILD) { func_80AEB264(this, &gRutoChildWait2Anim, 0, 0, 0); - this->actor.flags &= ~ACTOR_FLAG_UPDATE_WHILE_CULLED; + this->actor.flags &= ~ACTOR_FLAG_UPDATE_CULLING_DISABLED; this->action = 44; this->drawConfig = 1; } else { @@ -2138,7 +2138,7 @@ void func_80AEFD38(EnRu1* this, PlayState* play) { s32 func_80AEFDC0(EnRu1* this, PlayState* play) { if (!Actor_ProcessTalkRequest(&this->actor, play)) { - this->actor.flags |= ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_FRIENDLY; + this->actor.flags |= ACTOR_FLAG_ATTENTION_ENABLED | ACTOR_FLAG_FRIENDLY; this->actor.textId = Text_GetFaceReaction(play, 0x1F); if (this->actor.textId == 0) { this->actor.textId = 0x402C; @@ -2151,7 +2151,7 @@ s32 func_80AEFDC0(EnRu1* this, PlayState* play) { s32 func_80AEFE38(EnRu1* this, PlayState* play) { if (Message_GetState(&play->msgCtx) == TEXT_STATE_CLOSING) { - this->actor.flags &= ~(ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_FRIENDLY); + this->actor.flags &= ~(ACTOR_FLAG_ATTENTION_ENABLED | ACTOR_FLAG_FRIENDLY); return true; } return false; diff --git a/soh/src/overlays/actors/ovl_En_Ru2/z_en_ru2.c b/soh/src/overlays/actors/ovl_En_Ru2/z_en_ru2.c index b4c4d9053..fabce50e8 100644 --- a/soh/src/overlays/actors/ovl_En_Ru2/z_en_ru2.c +++ b/soh/src/overlays/actors/ovl_En_Ru2/z_en_ru2.c @@ -11,7 +11,7 @@ #include "soh/ResourceManagerHelpers.h" #include "soh/Enhancements/game-interactor/GameInteractor_Hooks.h" -#define FLAGS ACTOR_FLAG_UPDATE_WHILE_CULLED +#define FLAGS ACTOR_FLAG_UPDATE_CULLING_DISABLED void EnRu2_Init(Actor* thisx, PlayState* play); void EnRu2_Destroy(Actor* thisx, PlayState* play); diff --git a/soh/src/overlays/actors/ovl_En_Sa/z_en_sa.c b/soh/src/overlays/actors/ovl_En_Sa/z_en_sa.c index c350fe0bd..454046cc9 100644 --- a/soh/src/overlays/actors/ovl_En_Sa/z_en_sa.c +++ b/soh/src/overlays/actors/ovl_En_Sa/z_en_sa.c @@ -7,7 +7,7 @@ #include "soh/ResourceManagerHelpers.h" #include "soh/Enhancements/game-interactor/GameInteractor_Hooks.h" -#define FLAGS (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_FRIENDLY | ACTOR_FLAG_UPDATE_WHILE_CULLED | ACTOR_FLAG_NO_FREEZE_OCARINA) +#define FLAGS (ACTOR_FLAG_ATTENTION_ENABLED | ACTOR_FLAG_FRIENDLY | ACTOR_FLAG_UPDATE_CULLING_DISABLED | ACTOR_FLAG_UPDATE_DURING_OCARINA) void EnSa_Init(Actor* thisx, PlayState* play); void EnSa_Destroy(Actor* thisx, PlayState* play); diff --git a/soh/src/overlays/actors/ovl_En_Sb/z_en_sb.c b/soh/src/overlays/actors/ovl_En_Sb/z_en_sb.c index 24b4632fa..04a3ff4ae 100644 --- a/soh/src/overlays/actors/ovl_En_Sb/z_en_sb.c +++ b/soh/src/overlays/actors/ovl_En_Sb/z_en_sb.c @@ -9,7 +9,7 @@ #include "objects/object_sb/object_sb.h" #include "soh/Enhancements/game-interactor/GameInteractor_Hooks.h" -#define FLAGS (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_HOSTILE) +#define FLAGS (ACTOR_FLAG_ATTENTION_ENABLED | ACTOR_FLAG_HOSTILE) void EnSb_Init(Actor* thisx, PlayState* play); void EnSb_Destroy(Actor* thisx, PlayState* play); diff --git a/soh/src/overlays/actors/ovl_En_Sda/z_en_sda.c b/soh/src/overlays/actors/ovl_En_Sda/z_en_sda.c index 836a2a66a..89f9662f7 100644 --- a/soh/src/overlays/actors/ovl_En_Sda/z_en_sda.c +++ b/soh/src/overlays/actors/ovl_En_Sda/z_en_sda.c @@ -6,7 +6,7 @@ #include "z_en_sda.h" -#define FLAGS (ACTOR_FLAG_UPDATE_WHILE_CULLED | ACTOR_FLAG_DRAW_WHILE_CULLED) +#define FLAGS (ACTOR_FLAG_UPDATE_CULLING_DISABLED | ACTOR_FLAG_DRAW_CULLING_DISABLED) void EnSda_Init(Actor* thisx, PlayState* play); void EnSda_Destroy(Actor* thisx, PlayState* play); diff --git a/soh/src/overlays/actors/ovl_En_Shopnuts/z_en_shopnuts.c b/soh/src/overlays/actors/ovl_En_Shopnuts/z_en_shopnuts.c index e099480b5..9b83cbfdf 100644 --- a/soh/src/overlays/actors/ovl_En_Shopnuts/z_en_shopnuts.c +++ b/soh/src/overlays/actors/ovl_En_Shopnuts/z_en_shopnuts.c @@ -1,10 +1,11 @@ #include "z_en_shopnuts.h" #include "objects/object_shopnuts/object_shopnuts.h" +#include "overlays/actors/ovl_En_Dns/z_en_dns.h" #include "soh/OTRGlobals.h" #include "soh/ResourceManagerHelpers.h" #include "soh/Enhancements/game-interactor/GameInteractor_Hooks.h" -#define FLAGS (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_HOSTILE) +#define FLAGS (ACTOR_FLAG_ATTENTION_ENABLED | ACTOR_FLAG_HOSTILE) void EnShopnuts_Init(Actor* thisx, PlayState* play); void EnShopnuts_Destroy(Actor* thisx, PlayState* play); @@ -73,9 +74,9 @@ void EnShopnuts_Init(Actor* thisx, PlayState* play) { Collider_UpdateCylinder(&this->actor, &this->collider); if (GameInteractor_Should(VB_BUSINESS_SCRUB_DESPAWN, - ((this->actor.params == 0x0002) && (Flags_GetItemGetInf(ITEMGETINF_0B))) || - ((this->actor.params == 0x0009) && (Flags_GetInfTable(INFTABLE_192))) || - ((this->actor.params == 0x000A) && (Flags_GetInfTable(INFTABLE_193))), + ((this->actor.params == DNS_TYPE_HEART_PIECE) && (Flags_GetItemGetInf(ITEMGETINF_DEKU_SCRUB_HEART_PIECE))) || + ((this->actor.params == DNS_TYPE_DEKU_STICK_UPGRADE) && (Flags_GetInfTable(INFTABLE_BOUGHT_STICK_UPGRADE))) || + ((this->actor.params == DNS_TYPE_DEKU_NUT_UPGRADE) && (Flags_GetInfTable(INFTABLE_BOUGHT_NUT_UPGRADE))), this)) { Actor_Kill(&this->actor); } else { diff --git a/soh/src/overlays/actors/ovl_En_Si/z_en_si.c b/soh/src/overlays/actors/ovl_En_Si/z_en_si.c index 338dfaf12..742042689 100644 --- a/soh/src/overlays/actors/ovl_En_Si/z_en_si.c +++ b/soh/src/overlays/actors/ovl_En_Si/z_en_si.c @@ -9,7 +9,7 @@ #include "soh/Enhancements/game-interactor/GameInteractor_Hooks.h" #include "soh/OTRGlobals.h" -#define FLAGS (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_HOOKSHOT_DRAGS) +#define FLAGS (ACTOR_FLAG_ATTENTION_ENABLED | ACTOR_FLAG_HOOKSHOT_PULLS_ACTOR) void EnSi_Init(Actor* thisx, PlayState* play); void EnSi_Destroy(Actor* thisx, PlayState* play); diff --git a/soh/src/overlays/actors/ovl_En_Siofuki/z_en_siofuki.c b/soh/src/overlays/actors/ovl_En_Siofuki/z_en_siofuki.c index 8e4596ff3..c32c69066 100644 --- a/soh/src/overlays/actors/ovl_En_Siofuki/z_en_siofuki.c +++ b/soh/src/overlays/actors/ovl_En_Siofuki/z_en_siofuki.c @@ -7,7 +7,7 @@ #include "z_en_siofuki.h" #include "objects/object_siofuki/object_siofuki.h" -#define FLAGS (ACTOR_FLAG_UPDATE_WHILE_CULLED | ACTOR_FLAG_DRAW_WHILE_CULLED) +#define FLAGS (ACTOR_FLAG_UPDATE_CULLING_DISABLED | ACTOR_FLAG_DRAW_CULLING_DISABLED) void EnSiofuki_Init(Actor* thisx, PlayState* play); void EnSiofuki_Destroy(Actor* thisx, PlayState* play); diff --git a/soh/src/overlays/actors/ovl_En_Skb/z_en_skb.c b/soh/src/overlays/actors/ovl_En_Skb/z_en_skb.c index 1fcb2708a..f06af3219 100644 --- a/soh/src/overlays/actors/ovl_En_Skb/z_en_skb.c +++ b/soh/src/overlays/actors/ovl_En_Skb/z_en_skb.c @@ -4,7 +4,7 @@ #include "soh/Enhancements/game-interactor/GameInteractor_Hooks.h" #include "soh/ResourceManagerHelpers.h" -#define FLAGS (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_HOSTILE | ACTOR_FLAG_UPDATE_WHILE_CULLED) +#define FLAGS (ACTOR_FLAG_ATTENTION_ENABLED | ACTOR_FLAG_HOSTILE | ACTOR_FLAG_UPDATE_CULLING_DISABLED) void EnSkb_Init(Actor* thisx, PlayState* play); void EnSkb_Destroy(Actor* thisx, PlayState* play); @@ -206,7 +206,7 @@ void func_80AFCD60(EnSkb* this) { void func_80AFCDF8(EnSkb* this) { Animation_PlayOnceSetSpeed(&this->skelAnime, &gStalchildUncurlingAnim, 1.0f); this->unk_280 = 0; - this->actor.flags &= ~ACTOR_FLAG_TARGETABLE; + this->actor.flags &= ~ACTOR_FLAG_ATTENTION_ENABLED; Audio_PlayActorSound2(&this->actor, NA_SE_EN_RIVA_APPEAR); EnSkb_SetupAction(this, func_80AFCE5C); } @@ -216,7 +216,7 @@ void func_80AFCE5C(EnSkb* this, PlayState* play) { this->actor.world.rot.y = this->actor.yawTowardsPlayer; this->actor.shape.rot.y = this->actor.yawTowardsPlayer; } else { - this->actor.flags |= ACTOR_FLAG_TARGETABLE; + this->actor.flags |= ACTOR_FLAG_ATTENTION_ENABLED; } Math_SmoothStepToF(&this->actor.shape.yOffset, 0.0f, 1.0f, 800.0f, 0.0f); Math_SmoothStepToF(&this->actor.shape.shadowScale, 25.0f, 1.0f, 2.5f, 0.0f); @@ -233,7 +233,7 @@ void func_80AFCF48(EnSkb* this) { Animation_GetLastFrame(&gStalchildUncurlingAnim), 0.0f, ANIMMODE_ONCE, -4.0f); this->unk_280 = 0; this->unk_281 = 0; - this->actor.flags &= ~ACTOR_FLAG_TARGETABLE; + this->actor.flags &= ~ACTOR_FLAG_ATTENTION_ENABLED; this->actor.speedXZ = 0.0f; Audio_PlayActorSound2(&this->actor, NA_SE_EN_AKINDONUTS_HIDE); EnSkb_SetupAction(this, func_80AFCFF0); @@ -413,7 +413,7 @@ void func_80AFD7B4(EnSkb* this, PlayState* play) { this->actor.speedXZ = -6.0f; } this->unk_280 = 1; - this->actor.flags &= ~ACTOR_FLAG_TARGETABLE; + this->actor.flags &= ~ACTOR_FLAG_ATTENTION_ENABLED; BodyBreak_Alloc(&this->bodyBreak, 18, play); this->unk_283 |= 4; EffectSsDeadSound_SpawnStationary(play, &this->actor.projectedPos, NA_SE_EN_STALKID_DEAD, 1, 1, 0x28); diff --git a/soh/src/overlays/actors/ovl_En_Skj/z_en_skj.c b/soh/src/overlays/actors/ovl_En_Skj/z_en_skj.c index de42b24bf..d5954221c 100644 --- a/soh/src/overlays/actors/ovl_En_Skj/z_en_skj.c +++ b/soh/src/overlays/actors/ovl_En_Skj/z_en_skj.c @@ -5,7 +5,7 @@ #include "soh/OTRGlobals.h" #include "soh/ResourceManagerHelpers.h" -#define FLAGS (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_HOSTILE | ACTOR_FLAG_UPDATE_WHILE_CULLED | ACTOR_FLAG_NO_FREEZE_OCARINA) +#define FLAGS (ACTOR_FLAG_ATTENTION_ENABLED | ACTOR_FLAG_HOSTILE | ACTOR_FLAG_UPDATE_CULLING_DISABLED | ACTOR_FLAG_UPDATE_DURING_OCARINA) void EnSkj_Init(Actor* thisx, PlayState* play); void EnSkj_Destroy(Actor* thisx, PlayState* play); @@ -287,7 +287,7 @@ static InitChainEntry sInitChain[] = { ICHAIN_F32(targetArrowOffset, 30, ICHAIN_STOP), }; -static s32 D_80B01EA0; // gets set if ACTOR_FLAG_PLAYER_TALKED_TO is set +static s32 D_80B01EA0; // gets set if ACTOR_FLAG_TALK is set void EnSkj_ChangeAnim(EnSkj* this, u8 index) { f32 endFrame = Animation_GetLastFrame(sAnimationInfo[index].animation); @@ -379,7 +379,7 @@ void EnSkj_Init(Actor* thisx, PlayState* play2) { this->actor.destroy = NULL; this->actor.draw = NULL; this->actor.update = EnSkj_SariasSongShortStumpUpdate; - this->actor.flags &= ~(ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_HOSTILE); + this->actor.flags &= ~(ACTOR_FLAG_ATTENTION_ENABLED | ACTOR_FLAG_HOSTILE); this->actor.flags |= 0; Actor_ChangeCategory(play, &play->actorCtx, thisx, ACTORCAT_PROP); break; @@ -390,7 +390,7 @@ void EnSkj_Init(Actor* thisx, PlayState* play2) { this->actor.destroy = NULL; this->actor.draw = NULL; this->actor.update = EnSkj_OcarinaMinigameShortStumpUpdate; - this->actor.flags &= ~(ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_HOSTILE); + this->actor.flags &= ~(ACTOR_FLAG_ATTENTION_ENABLED | ACTOR_FLAG_HOSTILE); this->actor.flags |= 0; Actor_ChangeCategory(play, &play->actorCtx, thisx, ACTORCAT_PROP); this->actor.focus.pos.x = 1230.0f; @@ -412,13 +412,13 @@ void EnSkj_Init(Actor* thisx, PlayState* play2) { SkelAnime_InitFlex(play, &this->skelAnime, &gSkullKidSkel, &gSkullKidPlayFluteAnim, this->jointTable, this->morphTable, 19); if ((type >= 0) && (type < 3)) { - this->actor.flags &= ~(ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_HOSTILE); - this->actor.flags |= ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_FRIENDLY; + this->actor.flags &= ~(ACTOR_FLAG_ATTENTION_ENABLED | ACTOR_FLAG_HOSTILE); + this->actor.flags |= ACTOR_FLAG_ATTENTION_ENABLED | ACTOR_FLAG_FRIENDLY; Actor_ChangeCategory(play, &play->actorCtx, &this->actor, ACTORCAT_NPC); } if ((type < 0) || (type >= 7)) { - this->actor.flags &= ~ACTOR_FLAG_NO_FREEZE_OCARINA; + this->actor.flags &= ~ACTOR_FLAG_UPDATE_DURING_OCARINA; } if ((type > 0) && (type < 3)) { @@ -1216,14 +1216,14 @@ void EnSkj_SariasSongWaitForTextClear(EnSkj* this, PlayState* play) { } void EnSkj_OcarinaGameSetupWaitForPlayer(EnSkj* this) { - this->actor.flags &= ~ACTOR_FLAG_TARGETABLE; + this->actor.flags &= ~ACTOR_FLAG_ATTENTION_ENABLED; EnSkj_ChangeAnim(this, SKJ_ANIM_WAIT); EnSkj_SetupAction(this, SKJ_ACTION_OCARINA_GAME_WAIT_FOR_PLAYER); } void EnSkj_OcarinaGameWaitForPlayer(EnSkj* this, PlayState* play) { if (this->playerInRange) { - this->actor.flags |= ACTOR_FLAG_TARGETABLE; + this->actor.flags |= ACTOR_FLAG_ATTENTION_ENABLED; EnSkj_SetupAction(this, SKJ_ACTION_OCARINA_GAME_IDLE); } } diff --git a/soh/src/overlays/actors/ovl_En_Skjneedle/z_en_skjneedle.c b/soh/src/overlays/actors/ovl_En_Skjneedle/z_en_skjneedle.c index 228bd9c5e..fc744981d 100644 --- a/soh/src/overlays/actors/ovl_En_Skjneedle/z_en_skjneedle.c +++ b/soh/src/overlays/actors/ovl_En_Skjneedle/z_en_skjneedle.c @@ -7,7 +7,7 @@ #include "z_en_skjneedle.h" #include "objects/object_skj/object_skj.h" -#define FLAGS (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_HOSTILE | ACTOR_FLAG_HOOKSHOT_DRAGS) +#define FLAGS (ACTOR_FLAG_ATTENTION_ENABLED | ACTOR_FLAG_HOSTILE | ACTOR_FLAG_HOOKSHOT_PULLS_ACTOR) void EnSkjneedle_Init(Actor* thisx, PlayState* play); void EnSkjneedle_Destroy(Actor* thisx, PlayState* play); @@ -60,7 +60,7 @@ void EnSkjneedle_Init(Actor* thisx, PlayState* play) { Collider_InitCylinder(play, &this->collider); Collider_SetCylinderType1(play, &this->collider, &this->actor, &sCylinderInit); ActorShape_Init(&this->actor.shape, 0, ActorShadow_DrawCircle, 20.0f); - thisx->flags &= ~ACTOR_FLAG_TARGETABLE; + thisx->flags &= ~ACTOR_FLAG_ATTENTION_ENABLED; Actor_SetScale(&this->actor, 0.01f); } diff --git a/soh/src/overlays/actors/ovl_En_Ssh/z_en_ssh.c b/soh/src/overlays/actors/ovl_En_Ssh/z_en_ssh.c index b7d69b40a..2b112e2bd 100644 --- a/soh/src/overlays/actors/ovl_En_Ssh/z_en_ssh.c +++ b/soh/src/overlays/actors/ovl_En_Ssh/z_en_ssh.c @@ -3,7 +3,7 @@ #include "soh/OTRGlobals.h" #include "soh/ResourceManagerHelpers.h" -#define FLAGS (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_HOSTILE | ACTOR_FLAG_UPDATE_WHILE_CULLED | ACTOR_FLAG_DRAW_WHILE_CULLED) +#define FLAGS (ACTOR_FLAG_ATTENTION_ENABLED | ACTOR_FLAG_HOSTILE | ACTOR_FLAG_UPDATE_CULLING_DISABLED | ACTOR_FLAG_DRAW_CULLING_DISABLED) #define SSH_STATE_STUNNED (1 << 0) #define SSH_STATE_GROUND_START (1 << 2) diff --git a/soh/src/overlays/actors/ovl_En_St/z_en_st.c b/soh/src/overlays/actors/ovl_En_St/z_en_st.c index cbc701cee..c7c8d0865 100644 --- a/soh/src/overlays/actors/ovl_En_St/z_en_st.c +++ b/soh/src/overlays/actors/ovl_En_St/z_en_st.c @@ -9,7 +9,7 @@ #include "soh/Enhancements/game-interactor/GameInteractor_Hooks.h" #include "soh/ResourceManagerHelpers.h" -#define FLAGS (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_HOSTILE | ACTOR_FLAG_UPDATE_WHILE_CULLED | ACTOR_FLAG_DRAW_WHILE_CULLED) +#define FLAGS (ACTOR_FLAG_ATTENTION_ENABLED | ACTOR_FLAG_HOSTILE | ACTOR_FLAG_UPDATE_CULLING_DISABLED | ACTOR_FLAG_DRAW_CULLING_DISABLED) void EnSt_Init(Actor* thisx, PlayState* play); void EnSt_Destroy(Actor* thisx, PlayState* play); @@ -462,7 +462,7 @@ s32 EnSt_CheckHitBackside(EnSt* this, PlayState* play) { return false; } Enemy_StartFinishingBlow(play, &this->actor); - this->actor.flags &= ~ACTOR_FLAG_TARGETABLE; + this->actor.flags &= ~ACTOR_FLAG_ATTENTION_ENABLED; this->groundBounces = 3; this->deathTimer = 20; this->actor.gravity = -1.0f; @@ -788,7 +788,7 @@ void EnSt_Init(Actor* thisx, PlayState* play) { this->blureIdx = EnSt_CreateBlureEffect(play); EnSt_InitColliders(this, play); if (thisx->params == 2) { - this->actor.flags |= ACTOR_FLAG_LENS; + this->actor.flags |= ACTOR_FLAG_REACT_TO_LENS; } if (this->actor.params == 1) { this->actor.naviEnemyId = 0x05; @@ -796,8 +796,8 @@ void EnSt_Init(Actor* thisx, PlayState* play) { this->actor.naviEnemyId = 0x04; } EnSt_CheckCeilingPos(this, play); - this->actor.flags |= ACTOR_FLAG_ARROW_DRAGGABLE; - this->actor.flags |= ACTOR_FLAG_PLAY_HIT_SFX; + this->actor.flags |= ACTOR_FLAG_CAN_ATTACH_TO_ARROW; + this->actor.flags |= ACTOR_FLAG_SFX_FOR_PLAYER_BODY_HIT; EnSt_SetColliderScale(this); this->actor.gravity = 0.0f; this->initalYaw = this->actor.world.rot.y; @@ -1013,7 +1013,7 @@ void EnSt_Update(Actor* thisx, PlayState* play) { s32 pad; Color_RGBA8 color = { 0, 0, 0, 0 }; - if (this->actor.flags & ACTOR_FLAG_DRAGGED_BY_ARROW) { + if (this->actor.flags & ACTOR_FLAG_ATTACHED_TO_ARROW) { SkelAnime_Update(&this->skelAnime); } else if (!EnSt_CheckColliders(this, play)) { // no collision has been detected. diff --git a/soh/src/overlays/actors/ovl_En_Sth/z_en_sth.c b/soh/src/overlays/actors/ovl_En_Sth/z_en_sth.c index cc3dd3eb0..82a98a35b 100644 --- a/soh/src/overlays/actors/ovl_En_Sth/z_en_sth.c +++ b/soh/src/overlays/actors/ovl_En_Sth/z_en_sth.c @@ -13,7 +13,7 @@ #include "soh/OTRGlobals.h" #include "soh/ResourceManagerHelpers.h" -#define FLAGS (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_FRIENDLY | ACTOR_FLAG_UPDATE_WHILE_CULLED) +#define FLAGS (ACTOR_FLAG_ATTENTION_ENABLED | ACTOR_FLAG_FRIENDLY | ACTOR_FLAG_UPDATE_CULLING_DISABLED) void EnSth_Init(Actor* thisx, PlayState* play); void EnSth_Destroy(Actor* thisx, PlayState* play); diff --git a/soh/src/overlays/actors/ovl_En_Stream/z_en_stream.c b/soh/src/overlays/actors/ovl_En_Stream/z_en_stream.c index 34db1a005..d5d8c6d8b 100644 --- a/soh/src/overlays/actors/ovl_En_Stream/z_en_stream.c +++ b/soh/src/overlays/actors/ovl_En_Stream/z_en_stream.c @@ -7,7 +7,7 @@ #include "z_en_stream.h" #include "objects/object_stream/object_stream.h" -#define FLAGS ACTOR_FLAG_UPDATE_WHILE_CULLED +#define FLAGS ACTOR_FLAG_UPDATE_CULLING_DISABLED void EnStream_Init(Actor* thisx, PlayState* play); void EnStream_Destroy(Actor* thisx, PlayState* play); diff --git a/soh/src/overlays/actors/ovl_En_Sw/z_en_sw.c b/soh/src/overlays/actors/ovl_En_Sw/z_en_sw.c index c0bc087bd..79adaaa96 100644 --- a/soh/src/overlays/actors/ovl_En_Sw/z_en_sw.c +++ b/soh/src/overlays/actors/ovl_En_Sw/z_en_sw.c @@ -3,7 +3,7 @@ #include "soh/Enhancements/game-interactor/GameInteractor_Hooks.h" #include "soh/ResourceManagerHelpers.h" -#define FLAGS (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_HOSTILE | ACTOR_FLAG_UPDATE_WHILE_CULLED) +#define FLAGS (ACTOR_FLAG_ATTENTION_ENABLED | ACTOR_FLAG_HOSTILE | ACTOR_FLAG_UPDATE_CULLING_DISABLED) void EnSw_Init(Actor* thisx, PlayState* play); void EnSw_Destroy(Actor* thisx, PlayState* play); @@ -284,7 +284,7 @@ void EnSw_Init(Actor* thisx, PlayState* play) { this->collider.elements[0].info.toucher.damage *= 2; this->actor.naviEnemyId = 0x20; this->actor.colChkInfo.health *= 2; - this->actor.flags &= ~ACTOR_FLAG_TARGETABLE; + this->actor.flags &= ~ACTOR_FLAG_ATTENTION_ENABLED; break; default: Actor_ChangeCategory(play, &play->actorCtx, &this->actor, ACTORCAT_ENEMY); @@ -356,7 +356,7 @@ s32 func_80B0C9F0(EnSw* this, PlayState* play) { this->unk_38A = 2; this->actor.shape.shadowScale = 16.0f; this->actor.gravity = -1.0f; - this->actor.flags &= ~ACTOR_FLAG_TARGETABLE; + this->actor.flags &= ~ACTOR_FLAG_ATTENTION_ENABLED; this->actionFunc = func_80B0DB00; } diff --git a/soh/src/overlays/actors/ovl_En_Syateki_Itm/z_en_syateki_itm.c b/soh/src/overlays/actors/ovl_En_Syateki_Itm/z_en_syateki_itm.c index 4122cef6b..06f679bbc 100644 --- a/soh/src/overlays/actors/ovl_En_Syateki_Itm/z_en_syateki_itm.c +++ b/soh/src/overlays/actors/ovl_En_Syateki_Itm/z_en_syateki_itm.c @@ -4,7 +4,7 @@ #include "overlays/actors/ovl_En_Ex_Ruppy/z_en_ex_ruppy.h" #include "overlays/actors/ovl_En_G_Switch/z_en_g_switch.h" -#define FLAGS ACTOR_FLAG_UPDATE_WHILE_CULLED +#define FLAGS ACTOR_FLAG_UPDATE_CULLING_DISABLED typedef enum { SYATEKI_ROUND_GREEN_APPEAR, diff --git a/soh/src/overlays/actors/ovl_En_Syateki_Man/z_en_syateki_man.c b/soh/src/overlays/actors/ovl_En_Syateki_Man/z_en_syateki_man.c index 60955727b..63e3f8e6d 100644 --- a/soh/src/overlays/actors/ovl_En_Syateki_Man/z_en_syateki_man.c +++ b/soh/src/overlays/actors/ovl_En_Syateki_Man/z_en_syateki_man.c @@ -8,7 +8,7 @@ #include "soh/ResourceManagerHelpers.h" #include "soh/Enhancements/game-interactor/GameInteractor_Hooks.h" -#define FLAGS (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_FRIENDLY | ACTOR_FLAG_UPDATE_WHILE_CULLED | ACTOR_FLAG_NO_LOCKON) +#define FLAGS (ACTOR_FLAG_ATTENTION_ENABLED | ACTOR_FLAG_FRIENDLY | ACTOR_FLAG_UPDATE_CULLING_DISABLED | ACTOR_FLAG_LOCK_ON_DISABLED) typedef enum { /* 0 */ SYATEKI_RESULT_NONE, @@ -430,7 +430,7 @@ void EnSyatekiMan_FinishPrize(EnSyatekiMan* this, PlayState* play) { } this->gameResult = SYATEKI_RESULT_NONE; this->actor.parent = this->tempGallery; - this->actor.flags |= ACTOR_FLAG_TARGETABLE; + this->actor.flags |= ACTOR_FLAG_ATTENTION_ENABLED; this->actionFunc = EnSyatekiMan_SetupIdle; } } diff --git a/soh/src/overlays/actors/ovl_En_Syateki_Niw/z_en_syateki_niw.c b/soh/src/overlays/actors/ovl_En_Syateki_Niw/z_en_syateki_niw.c index 9ffe7080d..29fda2421 100644 --- a/soh/src/overlays/actors/ovl_En_Syateki_Niw/z_en_syateki_niw.c +++ b/soh/src/overlays/actors/ovl_En_Syateki_Niw/z_en_syateki_niw.c @@ -10,7 +10,7 @@ #include "soh/frame_interpolation.h" #include "soh/ResourceManagerHelpers.h" -#define FLAGS ACTOR_FLAG_UPDATE_WHILE_CULLED +#define FLAGS ACTOR_FLAG_UPDATE_CULLING_DISABLED void EnSyatekiNiw_Init(Actor* thisx, PlayState* play); void EnSyatekiNiw_Destroy(Actor* thisx, PlayState* play); @@ -71,7 +71,7 @@ void EnSyatekiNiw_Init(Actor* thisx, PlayState* play) { EnSyatekiNiw* this = (EnSyatekiNiw*)thisx; Actor_ProcessInitChain(&this->actor, sInitChain); - this->actor.flags &= ~ACTOR_FLAG_TARGETABLE; + this->actor.flags &= ~ACTOR_FLAG_ATTENTION_ENABLED; ActorShape_Init(&this->actor.shape, 0.0f, ActorShadow_DrawCircle, 25.0f); SkelAnime_InitFlex(play, &this->skelAnime, &gCuccoSkel, &gCuccoAnim, this->jointTable, this->morphTable, 16); diff --git a/soh/src/overlays/actors/ovl_En_Ta/z_en_ta.c b/soh/src/overlays/actors/ovl_En_Ta/z_en_ta.c index 1e923335b..049812303 100644 --- a/soh/src/overlays/actors/ovl_En_Ta/z_en_ta.c +++ b/soh/src/overlays/actors/ovl_En_Ta/z_en_ta.c @@ -11,7 +11,7 @@ #include "soh/ResourceManagerHelpers.h" #include "soh/Enhancements/game-interactor/GameInteractor_Hooks.h" -#define FLAGS (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_FRIENDLY) +#define FLAGS (ACTOR_FLAG_ATTENTION_ENABLED | ACTOR_FLAG_FRIENDLY) void EnTa_Init(Actor* thisx, PlayState* play); void EnTa_Destroy(Actor* thisx, PlayState* play); @@ -184,7 +184,7 @@ void EnTa_Init(Actor* thisx, PlayState* play2) { Actor_Kill(&this->actor); } else { if (IS_DAY) { - this->actor.flags |= ACTOR_FLAG_UPDATE_WHILE_CULLED; + this->actor.flags |= ACTOR_FLAG_UPDATE_CULLING_DISABLED; this->unk_2C4[0] = this->unk_2C4[1] = this->unk_2C4[2] = 7; this->superCuccos[0] = (EnNiw*)Actor_Spawn( &play->actorCtx, play, ACTOR_EN_NIW, this->actor.world.pos.x + 5.0f, @@ -459,7 +459,7 @@ void func_80B14AF4(EnTa* this, PlayState* play) { Audio_PlayActorSound2(&this->actor, NA_SE_VO_TA_CRY_1); EnTa_SetupAction(this, func_80B14A54, EnTa_AnimRepeatCurrent); this->unk_2CC = 65; - this->actor.flags |= ACTOR_FLAG_UPDATE_WHILE_CULLED; + this->actor.flags |= ACTOR_FLAG_UPDATE_CULLING_DISABLED; } } @@ -625,7 +625,7 @@ void func_80B15100(EnTa* this, PlayState* play) { void func_80B15260(EnTa* this, PlayState* play) { if (Actor_ProcessTalkRequest(&this->actor, play)) { this->actionFunc = func_80B15100; - this->actor.flags &= ~ACTOR_FLAG_WILL_TALK; + this->actor.flags &= ~ACTOR_FLAG_TALK_OFFER_AUTO_ACCEPTED; } else { func_8002F2CC(&this->actor, play, 1000.0f); } @@ -732,7 +732,7 @@ void EnTa_RunCuccoGame(EnTa* this, PlayState* play) { break; } this->actionFunc = func_80B15260; - this->actor.flags |= ACTOR_FLAG_WILL_TALK; + this->actor.flags |= ACTOR_FLAG_TALK_OFFER_AUTO_ACCEPTED; func_8002F2CC(&this->actor, play, 1000.0f); return; } @@ -917,8 +917,8 @@ void func_80B15FE8(EnTa* this, PlayState* play) { EnTa_SetupAction(this, EnTa_GiveItemInLonLonHouse, EnTa_AnimRunToEnd); Rupees_ChangeBy(-30); GetItemEntry itemEntry = ItemTable_Retrieve(GI_MILK); - gSaveContext.pendingSale = itemEntry.itemId; - gSaveContext.pendingSaleMod = itemEntry.modIndex; + gSaveContext.ship.pendingSale = itemEntry.itemId; + gSaveContext.ship.pendingSaleMod = itemEntry.modIndex; Actor_OfferGetItem(&this->actor, play, GI_MILK, 10000.0f, 50.0f); break; } @@ -1061,9 +1061,9 @@ void EnTa_IdleAfterCuccoGameFinished(EnTa* this, PlayState* play) { this->actionFunc = func_80B1642C; break; } - this->actor.flags &= ~ACTOR_FLAG_WILL_TALK; + this->actor.flags &= ~ACTOR_FLAG_TALK_OFFER_AUTO_ACCEPTED; } else { - this->actor.flags |= ACTOR_FLAG_WILL_TALK; + this->actor.flags |= ACTOR_FLAG_TALK_OFFER_AUTO_ACCEPTED; func_8002F2CC(&this->actor, play, 1000.0f); } this->unk_2E0 |= 1; diff --git a/soh/src/overlays/actors/ovl_En_Takara_Man/z_en_takara_man.c b/soh/src/overlays/actors/ovl_En_Takara_Man/z_en_takara_man.c index 3afae38cf..7a450ae8a 100644 --- a/soh/src/overlays/actors/ovl_En_Takara_Man/z_en_takara_man.c +++ b/soh/src/overlays/actors/ovl_En_Takara_Man/z_en_takara_man.c @@ -10,7 +10,7 @@ #include "soh/OTRGlobals.h" #include "soh/ResourceManagerHelpers.h" -#define FLAGS (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_FRIENDLY | ACTOR_FLAG_UPDATE_WHILE_CULLED | ACTOR_FLAG_DRAW_WHILE_CULLED | ACTOR_FLAG_NO_LOCKON) +#define FLAGS (ACTOR_FLAG_ATTENTION_ENABLED | ACTOR_FLAG_FRIENDLY | ACTOR_FLAG_UPDATE_CULLING_DISABLED | ACTOR_FLAG_DRAW_CULLING_DISABLED | ACTOR_FLAG_LOCK_ON_DISABLED) void EnTakaraMan_Init(Actor* thisx, PlayState* play); void EnTakaraMan_Reset(Actor* thisx, PlayState* play); @@ -127,11 +127,11 @@ void func_80B1778C(EnTakaraMan* this, PlayState* play) { absYawDiff = ABS(yawDiff); if (absYawDiff < 0x4300) { if (play->roomCtx.curRoom.num != this->originalRoomNum) { - this->actor.flags &= ~ACTOR_FLAG_TARGETABLE; + this->actor.flags &= ~ACTOR_FLAG_ATTENTION_ENABLED; this->unk_218 = 0; } else { if (!this->unk_218) { - this->actor.flags |= ACTOR_FLAG_TARGETABLE; + this->actor.flags |= ACTOR_FLAG_ATTENTION_ENABLED; this->unk_218 = 1; } func_8002F2CC(&this->actor, play, 100.0f); diff --git a/soh/src/overlays/actors/ovl_En_Tana/z_en_tana.c b/soh/src/overlays/actors/ovl_En_Tana/z_en_tana.c index 779b15473..1b4ab41c4 100644 --- a/soh/src/overlays/actors/ovl_En_Tana/z_en_tana.c +++ b/soh/src/overlays/actors/ovl_En_Tana/z_en_tana.c @@ -7,7 +7,7 @@ #include "z_en_tana.h" #include "objects/object_shop_dungen/object_shop_dungen.h" -#define FLAGS (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_FRIENDLY) +#define FLAGS (ACTOR_FLAG_ATTENTION_ENABLED | ACTOR_FLAG_FRIENDLY) void EnTana_Init(Actor* thisx, PlayState* play); void EnTana_Destroy(Actor* thisx, PlayState* play); @@ -60,7 +60,7 @@ void EnTana_Init(Actor* thisx, PlayState* play) { osSyncPrintf("☆☆☆ %s ☆☆☆\n", sShelfTypes[thisx->params]); Actor_SetScale(thisx, 1.0f); - thisx->flags &= ~ACTOR_FLAG_TARGETABLE; + thisx->flags &= ~ACTOR_FLAG_ATTENTION_ENABLED; thisx->draw = sDrawFuncs[thisx->params]; } diff --git a/soh/src/overlays/actors/ovl_En_Test/z_en_test.c b/soh/src/overlays/actors/ovl_En_Test/z_en_test.c index 5accba57a..9f1b67520 100644 --- a/soh/src/overlays/actors/ovl_En_Test/z_en_test.c +++ b/soh/src/overlays/actors/ovl_En_Test/z_en_test.c @@ -9,7 +9,7 @@ #include "soh/Enhancements/game-interactor/GameInteractor_Hooks.h" #include "soh/ResourceManagerHelpers.h" -#define FLAGS (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_HOSTILE | ACTOR_FLAG_UPDATE_WHILE_CULLED) +#define FLAGS (ACTOR_FLAG_ATTENTION_ENABLED | ACTOR_FLAG_HOSTILE | ACTOR_FLAG_UPDATE_CULLING_DISABLED) void EnTest_Init(Actor* thisx, PlayState* play); void EnTest_Destroy(Actor* thisx, PlayState* play); @@ -307,7 +307,7 @@ void EnTest_Init(Actor* thisx, PlayState* play) { } if (this->actor.params == STALFOS_TYPE_INVISIBLE) { - this->actor.flags |= ACTOR_FLAG_LENS; + this->actor.flags |= ACTOR_FLAG_REACT_TO_LENS; } } @@ -433,7 +433,7 @@ void EnTest_SetupWaitGround(EnTest* this) { this->timer = 15; this->actor.scale.y = 0.0f; this->actor.world.pos.y = this->actor.home.pos.y - 3.5f; - this->actor.flags &= ~ACTOR_FLAG_TARGETABLE; + this->actor.flags &= ~ACTOR_FLAG_ATTENTION_ENABLED; EnTest_SetupAction(this, EnTest_WaitGround); } @@ -463,7 +463,7 @@ void EnTest_SetupWaitAbove(EnTest* this) { this->unk_7C8 = 0; this->actor.world.pos.y = this->actor.home.pos.y + 150.0f; Actor_SetScale(&this->actor, 0.0f); - this->actor.flags &= ~ACTOR_FLAG_TARGETABLE; + this->actor.flags &= ~ACTOR_FLAG_ATTENTION_ENABLED; EnTest_SetupAction(this, EnTest_WaitAbove); } @@ -473,7 +473,7 @@ void EnTest_WaitAbove(EnTest* this, PlayState* play) { if ((this->actor.xzDistToPlayer < 200.0f) && (ABS(this->actor.yDistToPlayer) < 450.0f)) { EnTest_SetupAction(this, EnTest_Fall); - this->actor.flags |= ACTOR_FLAG_TARGETABLE; + this->actor.flags |= ACTOR_FLAG_ATTENTION_ENABLED; this->actor.shape.rot.y = this->actor.world.rot.y = this->actor.yawTowardsPlayer; Actor_SetScale(&this->actor, 0.015f); } @@ -1071,7 +1071,7 @@ void EnTest_JumpBack(EnTest* this, PlayState* play) { this->timer = (Rand_ZeroOne() * 5.0f) + 5.0f; } } - this->actor.flags |= ACTOR_FLAG_TARGETABLE; + this->actor.flags |= ACTOR_FLAG_ATTENTION_ENABLED; } } else if (this->skelAnime.curFrame == (this->skelAnime.endFrame - 4.0f)) { Audio_PlayActorSound2(&this->actor, NA_SE_EN_DODO_M_GND); @@ -1490,7 +1490,7 @@ void func_80862DBC(EnTest* this, PlayState* play) { this->meleeWeaponState = -1; } - this->actor.flags &= ~ACTOR_FLAG_TARGETABLE; + this->actor.flags &= ~ACTOR_FLAG_ATTENTION_ENABLED; if (this->actor.params == STALFOS_TYPE_5) { Actor_ChangeCategory(play, &play->actorCtx, &this->actor, ACTORCAT_PROP); @@ -1519,7 +1519,7 @@ void func_80862E6C(EnTest* this, PlayState* play) { } this->actor.child = NULL; - this->actor.flags |= ACTOR_FLAG_TARGETABLE; + this->actor.flags |= ACTOR_FLAG_ATTENTION_ENABLED; EnTest_SetupJumpBack(this); } else if ((this->actor.params == STALFOS_TYPE_5) && !Actor_FindNearby(play, &this->actor, ACTOR_EN_TEST, ACTORCAT_ENEMY, 8000.0f)) { @@ -1539,7 +1539,7 @@ void func_80862FA8(EnTest* this, PlayState* play) { Animation_PlayOnce(&this->skelAnime, &gStalfosFallOverBackwardsAnim); Audio_PlayActorSound2(&this->actor, NA_SE_EN_STAL_DEAD); this->unk_7DE = 0; - this->actor.flags &= ~ACTOR_FLAG_TARGETABLE; + this->actor.flags &= ~ACTOR_FLAG_ATTENTION_ENABLED; this->actor.colorFilterTimer = 0; this->actor.speedXZ = 0.0f; @@ -1573,7 +1573,7 @@ void func_808630F0(EnTest* this, PlayState* play) { this->actor.speedXZ = 0.0f; if (this->actor.params <= STALFOS_TYPE_CEILING) { - this->actor.flags &= ~ACTOR_FLAG_TARGETABLE; + this->actor.flags &= ~ACTOR_FLAG_ATTENTION_ENABLED; EnTest_SetupAction(this, func_8086318C); } else { func_80862DBC(this, play); @@ -1813,10 +1813,10 @@ void EnTest_Update(Actor* thisx, PlayState* play) { if (this->actor.params == STALFOS_TYPE_INVISIBLE) { if (play->actorCtx.lensActive) { - this->actor.flags |= ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_LENS; + this->actor.flags |= ACTOR_FLAG_ATTENTION_ENABLED | ACTOR_FLAG_REACT_TO_LENS; this->actor.shape.shadowDraw = ActorShadow_DrawFeet; } else { - this->actor.flags &= ~(ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_LENS); + this->actor.flags &= ~(ACTOR_FLAG_ATTENTION_ENABLED | ACTOR_FLAG_REACT_TO_LENS); this->actor.shape.shadowDraw = NULL; } } @@ -1840,7 +1840,7 @@ s32 EnTest_OverrideLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3f* CLOSE_DISPS(play->state.gfxCtx); } - if ((this->actor.params == STALFOS_TYPE_INVISIBLE) && !CHECK_FLAG_ALL(this->actor.flags, ACTOR_FLAG_LENS)) { + if ((this->actor.params == STALFOS_TYPE_INVISIBLE) && !CHECK_FLAG_ALL(this->actor.flags, ACTOR_FLAG_REACT_TO_LENS)) { *dList = NULL; } diff --git a/soh/src/overlays/actors/ovl_En_Tg/z_en_tg.c b/soh/src/overlays/actors/ovl_En_Tg/z_en_tg.c index 247db92f3..40015812a 100644 --- a/soh/src/overlays/actors/ovl_En_Tg/z_en_tg.c +++ b/soh/src/overlays/actors/ovl_En_Tg/z_en_tg.c @@ -7,7 +7,7 @@ #include "z_en_tg.h" #include "objects/object_mu/object_mu.h" -#define FLAGS (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_FRIENDLY) +#define FLAGS (ACTOR_FLAG_ATTENTION_ENABLED | ACTOR_FLAG_FRIENDLY) void EnTg_Init(Actor* thisx, PlayState* play); void EnTg_Destroy(Actor* thisx, PlayState* play); diff --git a/soh/src/overlays/actors/ovl_En_Tite/z_en_tite.c b/soh/src/overlays/actors/ovl_En_Tite/z_en_tite.c index 1fa105ef3..834ec5823 100644 --- a/soh/src/overlays/actors/ovl_En_Tite/z_en_tite.c +++ b/soh/src/overlays/actors/ovl_En_Tite/z_en_tite.c @@ -12,7 +12,7 @@ #include "soh/Enhancements/game-interactor/GameInteractor_Hooks.h" #include "soh/ResourceManagerHelpers.h" -#define FLAGS (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_HOSTILE | ACTOR_FLAG_UPDATE_WHILE_CULLED) +#define FLAGS (ACTOR_FLAG_ATTENTION_ENABLED | ACTOR_FLAG_HOSTILE | ACTOR_FLAG_UPDATE_CULLING_DISABLED) // EnTite_Idle #define vIdleTimer actionVar1 @@ -293,7 +293,7 @@ void EnTite_Attack(EnTite* this, PlayState* play) { case TEKTITE_MID_LUNGE: // Continue trajectory until tektite has negative velocity and has landed on ground/water surface // Snap to ground/water surface, or if falling fast dip into the water and slow fall speed - this->actor.flags |= ACTOR_FLAG_PLAY_HIT_SFX; + this->actor.flags |= ACTOR_FLAG_SFX_FOR_PLAYER_BODY_HIT; if ((this->actor.bgCheckFlags & 3) || ((this->actor.params == TEKTITE_BLUE) && (this->actor.bgCheckFlags & 0x20))) { if (this->actor.velocity.y <= 0.0f) { @@ -368,7 +368,7 @@ void EnTite_Attack(EnTite* this, PlayState* play) { func_800355B8(play, &this->backLeftFootPos); } } - if (!(this->collider.base.atFlags & AT_HIT) && (this->actor.flags & ACTOR_FLAG_ACTIVE)) { + if (!(this->collider.base.atFlags & AT_HIT) && (this->actor.flags & ACTOR_FLAG_INSIDE_CULLING_VOLUME)) { CollisionCheck_SetAT(play, &play->colChkCtx, &this->collider.base); } else { Player* player = GET_PLAYER(play); @@ -571,7 +571,7 @@ void EnTite_MoveTowardPlayer(EnTite* this, PlayState* play) { } else { this->actor.velocity.y = 10.0f; this->actor.speedXZ = 4.0f; - this->actor.flags |= ACTOR_FLAG_PLAY_HIT_SFX; + this->actor.flags |= ACTOR_FLAG_SFX_FOR_PLAYER_BODY_HIT; this->actor.gravity = -1.0f; if ((this->actor.params == TEKTITE_BLUE) && (this->actor.bgCheckFlags & 0x20)) { Audio_PlayActorSound2(&this->actor, NA_SE_EN_TEKU_JUMP_WATER); @@ -582,7 +582,7 @@ void EnTite_MoveTowardPlayer(EnTite* this, PlayState* play) { } else { this->actor.velocity.y = 10.0f; this->actor.speedXZ = 4.0f; - this->actor.flags |= ACTOR_FLAG_PLAY_HIT_SFX; + this->actor.flags |= ACTOR_FLAG_SFX_FOR_PLAYER_BODY_HIT; this->actor.gravity = -1.0f; if ((this->actor.params == TEKTITE_BLUE) && (this->actor.bgCheckFlags & 0x20)) { Audio_PlayActorSound2(&this->actor, NA_SE_EN_TEKU_JUMP_WATER); @@ -593,7 +593,7 @@ void EnTite_MoveTowardPlayer(EnTite* this, PlayState* play) { // If in midair: } else { // Turn slowly toward player - this->actor.flags |= ACTOR_FLAG_PLAY_HIT_SFX; + this->actor.flags |= ACTOR_FLAG_SFX_FOR_PLAYER_BODY_HIT; Math_SmoothStepToS(&this->actor.shape.rot.y, this->actor.yawTowardsPlayer, 1, 1000, 0); if (this->actor.velocity.y >= 6.0f) { if (this->actor.bgCheckFlags & 1) { diff --git a/soh/src/overlays/actors/ovl_En_Tk/z_en_tk.c b/soh/src/overlays/actors/ovl_En_Tk/z_en_tk.c index e9535c3b5..e9a89a550 100644 --- a/soh/src/overlays/actors/ovl_En_Tk/z_en_tk.c +++ b/soh/src/overlays/actors/ovl_En_Tk/z_en_tk.c @@ -11,7 +11,7 @@ #include "soh/ResourceManagerHelpers.h" #include "soh/Enhancements/game-interactor/GameInteractor_Hooks.h" -#define FLAGS (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_FRIENDLY) +#define FLAGS (ACTOR_FLAG_ATTENTION_ENABLED | ACTOR_FLAG_FRIENDLY) void EnTk_Init(Actor* thisx, PlayState* play); void EnTk_Destroy(Actor* thisx, PlayState* play); diff --git a/soh/src/overlays/actors/ovl_En_Torch2/z_en_torch2.c b/soh/src/overlays/actors/ovl_En_Torch2/z_en_torch2.c index 28bc936c5..0b6f16c59 100644 --- a/soh/src/overlays/actors/ovl_En_Torch2/z_en_torch2.c +++ b/soh/src/overlays/actors/ovl_En_Torch2/z_en_torch2.c @@ -8,7 +8,7 @@ #include "objects/object_torch2/object_torch2.h" #include "soh/Enhancements/game-interactor/GameInteractor_Hooks.h" -#define FLAGS (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_HOSTILE | ACTOR_FLAG_UPDATE_WHILE_CULLED | ACTOR_FLAG_DRAW_WHILE_CULLED) +#define FLAGS (ACTOR_FLAG_ATTENTION_ENABLED | ACTOR_FLAG_HOSTILE | ACTOR_FLAG_UPDATE_CULLING_DISABLED | ACTOR_FLAG_DRAW_CULLING_DISABLED) typedef enum { /* 0 */ ENTORCH2_WAIT, @@ -374,7 +374,7 @@ void EnTorch2_Update(Actor* thisx, PlayState* play2) { player->skelAnime.curFrame = 3.0f; sStickAngle = this->actor.yawTowardsPlayer + 0x8000; sSwordJumpTimer = sSwordJumpState = 0; - this->actor.flags |= ACTOR_FLAG_TARGETABLE; + this->actor.flags |= ACTOR_FLAG_ATTENTION_ENABLED; } else if (sSwordJumpState == 1) { if (sSwordJumpTimer < 16) { EnTorch2_SwingSword(play, input, this); @@ -405,7 +405,7 @@ void EnTorch2_Update(Actor* thisx, PlayState* play2) { sStickTilt = 0.0f; sSwordJumpState = 1; player->stateFlags3 |= PLAYER_STATE3_PAUSE_ACTION_FUNC; - this->actor.flags &= ~ACTOR_FLAG_TARGETABLE; + this->actor.flags &= ~ACTOR_FLAG_ATTENTION_ENABLED; sSwordJumpTimer = 27; player->meleeWeaponState = 0; player->linearVelocity = 0.0f; @@ -524,7 +524,7 @@ void EnTorch2_Update(Actor* thisx, PlayState* play2) { input->cur.stick_x = input->cur.stick_y = 0; if ((this->invincibilityTimer > 0) && (this->actor.world.pos.y < (this->actor.floorHeight - 160.0f))) { this->stateFlags3 &= ~PLAYER_STATE3_IGNORE_CEILING_FLOOR_WATER; - this->actor.flags |= ACTOR_FLAG_TARGETABLE; + this->actor.flags |= ACTOR_FLAG_ATTENTION_ENABLED; this->invincibilityTimer = 0; this->actor.velocity.y = 0.0f; this->actor.world.pos.y = sSpawnPoint.y + 40.0f; @@ -613,7 +613,7 @@ void EnTorch2_Update(Actor* thisx, PlayState* play2) { if (!Actor_ApplyDamage(&this->actor)) { func_800F5B58(); - this->actor.flags &= ~(ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_HOSTILE); + this->actor.flags &= ~(ACTOR_FLAG_ATTENTION_ENABLED | ACTOR_FLAG_HOSTILE); this->knockbackType = 2; this->knockbackSpeed = 6.0f; this->knockbackYVelocity = 6.0f; @@ -633,7 +633,7 @@ void EnTorch2_Update(Actor* thisx, PlayState* play2) { Actor_SetColorFilter(&this->actor, 0, 0xFF, 0x2000, 0x50); } } else { - this->actor.flags &= ~ACTOR_FLAG_TARGETABLE; + this->actor.flags &= ~ACTOR_FLAG_ATTENTION_ENABLED; this->knockbackDamage = this->actor.colChkInfo.damage; this->knockbackType = 1; this->knockbackYVelocity = 6.0f; diff --git a/soh/src/overlays/actors/ovl_En_Toryo/z_en_toryo.c b/soh/src/overlays/actors/ovl_En_Toryo/z_en_toryo.c index f0abb973f..d13309059 100644 --- a/soh/src/overlays/actors/ovl_En_Toryo/z_en_toryo.c +++ b/soh/src/overlays/actors/ovl_En_Toryo/z_en_toryo.c @@ -11,7 +11,7 @@ #include "soh/ResourceManagerHelpers.h" #include "soh/Enhancements/game-interactor/GameInteractor_Hooks.h" -#define FLAGS (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_FRIENDLY) +#define FLAGS (ACTOR_FLAG_ATTENTION_ENABLED | ACTOR_FLAG_FRIENDLY) void EnToryo_Init(Actor* thisx, PlayState* play); void EnToryo_Destroy(Actor* thisx, PlayState* play); diff --git a/soh/src/overlays/actors/ovl_En_Tp/z_en_tp.c b/soh/src/overlays/actors/ovl_En_Tp/z_en_tp.c index 6f849948a..20966eac4 100644 --- a/soh/src/overlays/actors/ovl_En_Tp/z_en_tp.c +++ b/soh/src/overlays/actors/ovl_En_Tp/z_en_tp.c @@ -155,7 +155,7 @@ void EnTp_Init(Actor* thisx, PlayState* play2) { this->collider.elements->dim.modelSphere.radius = this->collider.elements->dim.worldSphere.radius = 8; EnTp_Head_SetupWait(this); this->actor.focus.pos = this->actor.world.pos; - this->actor.flags |= ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_HOSTILE | ACTOR_FLAG_UPDATE_WHILE_CULLED; + this->actor.flags |= ACTOR_FLAG_ATTENTION_ENABLED | ACTOR_FLAG_HOSTILE | ACTOR_FLAG_UPDATE_CULLING_DISABLED; Actor_SetScale(&this->actor, 1.5f); for (i = 0; i <= 6; i++) { @@ -171,7 +171,7 @@ void EnTp_Init(Actor* thisx, PlayState* play2) { Actor_SetScale(&next->actor, 0.3f); if (i == 2) { - next->actor.flags |= ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_HOSTILE | ACTOR_FLAG_UPDATE_WHILE_CULLED; + next->actor.flags |= ACTOR_FLAG_ATTENTION_ENABLED | ACTOR_FLAG_HOSTILE | ACTOR_FLAG_UPDATE_CULLING_DISABLED; next->unk_150 = 1; // Why? } @@ -211,13 +211,13 @@ void EnTp_Tail_FollowHead(EnTp* this, PlayState* play) { } } else { if (this->unk_150 != 0) { - this->actor.flags |= ACTOR_FLAG_TARGETABLE; + this->actor.flags |= ACTOR_FLAG_ATTENTION_ENABLED; } if (this->head->unk_150 != 0) { this->actor.speedXZ = this->red = this->actor.velocity.y = this->heightPhase = 0.0f; if (this->actor.world.pos.y < this->head->actor.home.pos.y) { - this->actor.flags &= ~ACTOR_FLAG_TARGETABLE; + this->actor.flags &= ~ACTOR_FLAG_ATTENTION_ENABLED; } this->actor.world.pos = this->actor.parent->prevPos; @@ -351,7 +351,7 @@ void EnTp_Fragment_SetupFade(EnTp* this) { this->actor.velocity.x = (Rand_ZeroOne() - 0.5f) * 1.5f; this->actor.velocity.y = (Rand_ZeroOne() - 0.5f) * 1.5f; this->actor.velocity.z = (Rand_ZeroOne() - 0.5f) * 1.5f; - this->actor.flags &= ~ACTOR_FLAG_TARGETABLE; + this->actor.flags &= ~ACTOR_FLAG_ATTENTION_ENABLED; EnTp_SetupAction(this, EnTp_Fragment_Fade); } @@ -595,7 +595,7 @@ void EnTp_UpdateDamage(EnTp* this, PlayState* play) { } if (this->actor.colChkInfo.health == 0) { - this->actor.flags &= ~ACTOR_FLAG_TARGETABLE; + this->actor.flags &= ~ACTOR_FLAG_ATTENTION_ENABLED; head = this->head; if (head->actor.params <= TAILPASARAN_HEAD) { diff --git a/soh/src/overlays/actors/ovl_En_Tr/z_en_tr.c b/soh/src/overlays/actors/ovl_En_Tr/z_en_tr.c index eded6eda6..3469435db 100644 --- a/soh/src/overlays/actors/ovl_En_Tr/z_en_tr.c +++ b/soh/src/overlays/actors/ovl_En_Tr/z_en_tr.c @@ -9,7 +9,7 @@ #include #include "soh/ResourceManagerHelpers.h" -#define FLAGS ACTOR_FLAG_UPDATE_WHILE_CULLED +#define FLAGS ACTOR_FLAG_UPDATE_CULLING_DISABLED void EnTr_Init(Actor* thisx, PlayState* play); void EnTr_Destroy(Actor* thisx, PlayState* play); diff --git a/soh/src/overlays/actors/ovl_En_Trap/z_en_trap.c b/soh/src/overlays/actors/ovl_En_Trap/z_en_trap.c index bdfb475cd..7ef4c6a4c 100644 --- a/soh/src/overlays/actors/ovl_En_Trap/z_en_trap.c +++ b/soh/src/overlays/actors/ovl_En_Trap/z_en_trap.c @@ -7,7 +7,7 @@ #include "z_en_trap.h" #include "objects/object_trap/object_trap.h" -#define FLAGS ACTOR_FLAG_UPDATE_WHILE_CULLED +#define FLAGS ACTOR_FLAG_UPDATE_CULLING_DISABLED #define BEGIN_MOVE_OUT 65535.0f diff --git a/soh/src/overlays/actors/ovl_En_Tubo_Trap/z_en_tubo_trap.c b/soh/src/overlays/actors/ovl_En_Tubo_Trap/z_en_tubo_trap.c index a9ce7232b..c88b2acf9 100644 --- a/soh/src/overlays/actors/ovl_En_Tubo_Trap/z_en_tubo_trap.c +++ b/soh/src/overlays/actors/ovl_En_Tubo_Trap/z_en_tubo_trap.c @@ -10,7 +10,7 @@ #include "vt.h" #include "soh/Enhancements/game-interactor/GameInteractor_Hooks.h" -#define FLAGS ACTOR_FLAG_UPDATE_WHILE_CULLED +#define FLAGS ACTOR_FLAG_UPDATE_CULLING_DISABLED void EnTuboTrap_Init(Actor* thisx, PlayState* play); void EnTuboTrap_Destroy(Actor* thisx, PlayState* play); @@ -238,7 +238,7 @@ void EnTuboTrap_WaitForProximity(EnTuboTrap* this, PlayState* play) { if (this->actor.xzDistToPlayer < 200.0f && this->actor.world.pos.y <= player->actor.world.pos.y) { Actor_ChangeCategory(play, &play->actorCtx, &this->actor, ACTORCAT_ENEMY); - this->actor.flags |= ACTOR_FLAG_TARGETABLE; + this->actor.flags |= ACTOR_FLAG_ATTENTION_ENABLED; targetHeight = 40.0f + -10.0f * gSaveContext.linkAge; this->targetY = player->actor.world.pos.y + targetHeight; diff --git a/soh/src/overlays/actors/ovl_En_Vali/z_en_vali.c b/soh/src/overlays/actors/ovl_En_Vali/z_en_vali.c index e6c62d961..696c804cd 100644 --- a/soh/src/overlays/actors/ovl_En_Vali/z_en_vali.c +++ b/soh/src/overlays/actors/ovl_En_Vali/z_en_vali.c @@ -10,7 +10,7 @@ #include #include "soh/ResourceManagerHelpers.h" -#define FLAGS (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_HOSTILE | ACTOR_FLAG_UPDATE_WHILE_CULLED | ACTOR_FLAG_IGNORE_QUAKE) +#define FLAGS (ACTOR_FLAG_ATTENTION_ENABLED | ACTOR_FLAG_HOSTILE | ACTOR_FLAG_UPDATE_CULLING_DISABLED | ACTOR_FLAG_IGNORE_QUAKE) void EnVali_Init(Actor* thisx, PlayState* play); void EnVali_Destroy(Actor* thisx, PlayState* play); @@ -158,7 +158,7 @@ void EnVali_Init(Actor* thisx, PlayState* play) { EnVali_SetupLurk(this); - this->actor.flags &= ~ACTOR_FLAG_TARGETABLE; + this->actor.flags &= ~ACTOR_FLAG_ATTENTION_ENABLED; this->actor.floorHeight = BgCheck_EntityRaycastFloor4(&play->colCtx, &this->actor.floorPoly, &bgId, &this->actor, &this->actor.world.pos); this->actor.params = BARI_TYPE_NORMAL; @@ -187,7 +187,7 @@ void EnVali_SetupLurk(EnVali* this) { void EnVali_SetupDropAppear(EnVali* this) { this->actor.draw = EnVali_Draw; - this->actor.flags |= ACTOR_FLAG_TARGETABLE; + this->actor.flags |= ACTOR_FLAG_ATTENTION_ENABLED; this->actor.velocity.y = 1.0f; this->actionFunc = EnVali_DropAppear; } @@ -203,7 +203,7 @@ void EnVali_SetupFloatIdle(EnVali* this) { this->leftArmCollider.dim.quad[1].y = this->rightArmCollider.dim.quad[0].y = this->rightArmCollider.dim.quad[1].y = this->actor.world.pos.y - 10.0f; - this->actor.flags &= ~ACTOR_FLAG_UPDATE_WHILE_CULLED; + this->actor.flags &= ~ACTOR_FLAG_UPDATE_CULLING_DISABLED; this->bodyCollider.base.acFlags |= AC_ON; this->slingshotReactionTimer = 0; this->floatHomeHeight = this->actor.world.pos.y; @@ -215,7 +215,7 @@ void EnVali_SetupFloatIdle(EnVali* this) { */ void EnVali_SetupAttacked(EnVali* this) { this->lightningTimer = 20; - this->actor.flags &= ~ACTOR_FLAG_TARGETABLE; + this->actor.flags &= ~ACTOR_FLAG_ATTENTION_ENABLED; this->bodyCollider.base.acFlags &= ~AC_ON; this->actionFunc = EnVali_Attacked; } @@ -261,7 +261,7 @@ void EnVali_SetupDivideAndDie(EnVali* this, PlayState* play) { this->timer = Rand_S16Offset(10, 10); this->bodyCollider.base.acFlags &= ~AC_ON; SoundSource_PlaySfxAtFixedWorldPos(play, &this->actor.world.pos, 40, NA_SE_EN_BARI_SPLIT); - this->actor.flags &= ~ACTOR_FLAG_TARGETABLE; + this->actor.flags &= ~ACTOR_FLAG_ATTENTION_ENABLED; this->actor.draw = NULL; this->actionFunc = EnVali_DivideAndDie; GameInteractor_ExecuteOnEnemyDefeat(&this->actor); @@ -288,8 +288,8 @@ void EnVali_SetupFrozen(EnVali* this) { void EnVali_SetupReturnToLurk(EnVali* this) { Animation_MorphToPlayOnce(&this->skelAnime, &gBariLurkingAnim, 10.0f); - this->actor.flags |= ACTOR_FLAG_UPDATE_WHILE_CULLED; - this->actor.flags &= ~ACTOR_FLAG_TARGETABLE; + this->actor.flags |= ACTOR_FLAG_UPDATE_CULLING_DISABLED; + this->actor.flags &= ~ACTOR_FLAG_ATTENTION_ENABLED; this->actionFunc = EnVali_ReturnToLurk; } @@ -375,7 +375,7 @@ void EnVali_Attacked(EnVali* this, PlayState* play) { EnVali_DischargeLightning(this, play); if (this->lightningTimer == 0) { - this->actor.flags |= ACTOR_FLAG_TARGETABLE; + this->actor.flags |= ACTOR_FLAG_ATTENTION_ENABLED; this->bodyCollider.base.acFlags |= AC_ON; if (this->actor.params == BARI_TYPE_SWORD_DAMAGE) { EnVali_SetupRetaliate(this); @@ -516,7 +516,7 @@ void EnVali_UpdateDamage(EnVali* this, PlayState* play) { if (Actor_ApplyDamage(&this->actor) == 0) { Audio_PlayActorSound2(&this->actor, NA_SE_EN_BARI_DEAD); Enemy_StartFinishingBlow(play, &this->actor); - this->actor.flags &= ~ACTOR_FLAG_TARGETABLE; + this->actor.flags &= ~ACTOR_FLAG_ATTENTION_ENABLED; } else if ((this->actor.colChkInfo.damageEffect != BARI_DMGEFF_STUN) && (this->actor.colChkInfo.damageEffect != BARI_DMGEFF_SLINGSHOT)) { Audio_PlayActorSound2(&this->actor, NA_SE_EN_BARI_DAMAGE); diff --git a/soh/src/overlays/actors/ovl_En_Vase/z_en_vase.c b/soh/src/overlays/actors/ovl_En_Vase/z_en_vase.c index 5ecb21ef7..4bc53b2bc 100644 --- a/soh/src/overlays/actors/ovl_En_Vase/z_en_vase.c +++ b/soh/src/overlays/actors/ovl_En_Vase/z_en_vase.c @@ -7,7 +7,7 @@ #include "z_en_vase.h" #include "objects/object_vase/object_vase.h" -#define FLAGS ACTOR_FLAG_UPDATE_WHILE_CULLED +#define FLAGS ACTOR_FLAG_UPDATE_CULLING_DISABLED void EnVase_Init(Actor* thisx, PlayState* play); void EnVase_Destroy(Actor* thisx, PlayState* play); diff --git a/soh/src/overlays/actors/ovl_En_Vb_Ball/z_en_vb_ball.c b/soh/src/overlays/actors/ovl_En_Vb_Ball/z_en_vb_ball.c index dce0ad448..dce137052 100644 --- a/soh/src/overlays/actors/ovl_En_Vb_Ball/z_en_vb_ball.c +++ b/soh/src/overlays/actors/ovl_En_Vb_Ball/z_en_vb_ball.c @@ -9,7 +9,7 @@ #include "objects/gameplay_keep/gameplay_keep.h" #include "overlays/actors/ovl_Boss_Fd/z_boss_fd.h" -#define FLAGS (ACTOR_FLAG_UPDATE_WHILE_CULLED | ACTOR_FLAG_DRAW_WHILE_CULLED) +#define FLAGS (ACTOR_FLAG_UPDATE_CULLING_DISABLED | ACTOR_FLAG_DRAW_CULLING_DISABLED) void EnVbBall_Init(Actor* thisx, PlayState* play); void EnVbBall_Destroy(Actor* thisx, PlayState* play); diff --git a/soh/src/overlays/actors/ovl_En_Viewer/z_en_viewer.c b/soh/src/overlays/actors/ovl_En_Viewer/z_en_viewer.c index 2b34ffde7..6e6e38787 100644 --- a/soh/src/overlays/actors/ovl_En_Viewer/z_en_viewer.c +++ b/soh/src/overlays/actors/ovl_En_Viewer/z_en_viewer.c @@ -17,7 +17,7 @@ #include "soh/frame_interpolation.h" #include -#define FLAGS ACTOR_FLAG_UPDATE_WHILE_CULLED +#define FLAGS ACTOR_FLAG_UPDATE_CULLING_DISABLED void EnViewer_Init(Actor* thisx, PlayState* play); void EnViewer_Destroy(Actor* thisx, PlayState* play); @@ -178,7 +178,7 @@ void EnViewer_InitImpl(EnViewer* this, PlayState* play) { if (!Object_IsLoaded(&play->objectCtx, skelObjBankIndex) || !Object_IsLoaded(&play->objectCtx, this->animObjBankIndex)) { - this->actor.flags &= ~ACTOR_FLAG_ACTIVE; + this->actor.flags &= ~ACTOR_FLAG_INSIDE_CULLING_VOLUME; return; } diff --git a/soh/src/overlays/actors/ovl_En_Vm/z_en_vm.c b/soh/src/overlays/actors/ovl_En_Vm/z_en_vm.c index 2f6241ef8..69bbf154d 100644 --- a/soh/src/overlays/actors/ovl_En_Vm/z_en_vm.c +++ b/soh/src/overlays/actors/ovl_En_Vm/z_en_vm.c @@ -11,7 +11,7 @@ #include "soh/Enhancements/game-interactor/GameInteractor_Hooks.h" #include "soh/ResourceManagerHelpers.h" -#define FLAGS (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_UPDATE_WHILE_CULLED) +#define FLAGS (ACTOR_FLAG_ATTENTION_ENABLED | ACTOR_FLAG_UPDATE_CULLING_DISABLED) void EnVm_Init(Actor* thisx, PlayState* play); void EnVm_Destroy(Actor* thisx, PlayState* play); diff --git a/soh/src/overlays/actors/ovl_En_Wall_Tubo/z_en_wall_tubo.c b/soh/src/overlays/actors/ovl_En_Wall_Tubo/z_en_wall_tubo.c index f3e602981..5e6265dcc 100644 --- a/soh/src/overlays/actors/ovl_En_Wall_Tubo/z_en_wall_tubo.c +++ b/soh/src/overlays/actors/ovl_En_Wall_Tubo/z_en_wall_tubo.c @@ -10,7 +10,7 @@ #include "overlays/actors/ovl_Bg_Bowl_Wall/z_bg_bowl_wall.h" #include "overlays/effects/ovl_Effect_Ss_Hahen/z_eff_ss_hahen.h" -#define FLAGS ACTOR_FLAG_UPDATE_WHILE_CULLED +#define FLAGS ACTOR_FLAG_UPDATE_CULLING_DISABLED void EnWallTubo_Init(Actor* thisx, PlayState* play); void EnWallTubo_Destroy(Actor* thisx, PlayState* play); diff --git a/soh/src/overlays/actors/ovl_En_Wallmas/z_en_wallmas.c b/soh/src/overlays/actors/ovl_En_Wallmas/z_en_wallmas.c index 3590f620d..573011482 100644 --- a/soh/src/overlays/actors/ovl_En_Wallmas/z_en_wallmas.c +++ b/soh/src/overlays/actors/ovl_En_Wallmas/z_en_wallmas.c @@ -10,7 +10,7 @@ #include "soh/Enhancements/game-interactor/GameInteractor_Hooks.h" #include "soh/ResourceManagerHelpers.h" -#define FLAGS (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_HOSTILE | ACTOR_FLAG_UPDATE_WHILE_CULLED) +#define FLAGS (ACTOR_FLAG_ATTENTION_ENABLED | ACTOR_FLAG_HOSTILE | ACTOR_FLAG_UPDATE_CULLING_DISABLED) #define TIMER_SCALE ((f32)OS_CLOCK_RATE / 10000000000) #define DEGREE_60_RAD (60.0f * M_PI / 180.0f) @@ -161,8 +161,8 @@ void EnWallmas_Destroy(Actor* thisx, PlayState* play) { void EnWallmas_TimerInit(EnWallmas* this, PlayState* play) { Player* player = GET_PLAYER(play); - this->actor.flags &= ~ACTOR_FLAG_TARGETABLE; - this->actor.flags |= ACTOR_FLAG_DRAW_WHILE_CULLED; + this->actor.flags &= ~ACTOR_FLAG_ATTENTION_ENABLED; + this->actor.flags |= ACTOR_FLAG_DRAW_CULLING_DISABLED; this->timer = 0x82; this->actor.velocity.y = 0.0f; this->actor.world.pos.y = player->actor.world.pos.y; @@ -182,8 +182,8 @@ void EnWallmas_SetupDrop(EnWallmas* this, PlayState* play) { this->actor.world.pos.y = player->actor.world.pos.y + 300.0f; this->actor.world.rot.y = player->actor.shape.rot.y + 0x8000; this->actor.floorHeight = player->actor.floorHeight; - this->actor.flags |= ACTOR_FLAG_TARGETABLE; - this->actor.flags &= ~ACTOR_FLAG_DRAW_WHILE_CULLED; + this->actor.flags |= ACTOR_FLAG_ATTENTION_ENABLED; + this->actor.flags &= ~ACTOR_FLAG_DRAW_CULLING_DISABLED; this->actionFunc = EnWallmas_Drop; } @@ -278,7 +278,7 @@ void EnWallmas_SetupTakePlayer(EnWallmas* this, PlayState* play) { void EnWallmas_ProximityOrSwitchInit(EnWallmas* this) { this->timer = 0; this->actor.draw = NULL; - this->actor.flags &= ~ACTOR_FLAG_TARGETABLE; + this->actor.flags &= ~ACTOR_FLAG_ATTENTION_ENABLED; if (this->actor.params == WMT_PROXIMITY || this->actor.params == WMT_SHADOWTAG) { this->actionFunc = EnWallmas_WaitForProximity; } else { @@ -541,7 +541,7 @@ void EnWallmas_ColUpdate(EnWallmas* this, PlayState* play) { if (Actor_ApplyDamage(&this->actor) == 0) { Enemy_StartFinishingBlow(play, &this->actor); Audio_PlayActorSound2(&this->actor, NA_SE_EN_FALL_DEAD); - this->actor.flags &= ~ACTOR_FLAG_TARGETABLE; + this->actor.flags &= ~ACTOR_FLAG_ATTENTION_ENABLED; } else { if (this->actor.colChkInfo.damage != 0) { Audio_PlayActorSound2(&this->actor, NA_SE_EN_FALL_DAMAGE); diff --git a/soh/src/overlays/actors/ovl_En_Weather_Tag/z_en_weather_tag.c b/soh/src/overlays/actors/ovl_En_Weather_Tag/z_en_weather_tag.c index f8b1cfd10..123384e63 100644 --- a/soh/src/overlays/actors/ovl_En_Weather_Tag/z_en_weather_tag.c +++ b/soh/src/overlays/actors/ovl_En_Weather_Tag/z_en_weather_tag.c @@ -7,7 +7,7 @@ #include "z_en_weather_tag.h" #include "vt.h" -#define FLAGS ACTOR_FLAG_UPDATE_WHILE_CULLED +#define FLAGS ACTOR_FLAG_UPDATE_CULLING_DISABLED void EnWeatherTag_Init(Actor* thisx, PlayState* play); void EnWeatherTag_Destroy(Actor* thisx, PlayState* play); @@ -54,7 +54,7 @@ void EnWeatherTag_Destroy(Actor* thisx, PlayState* play) { void EnWeatherTag_Init(Actor* thisx, PlayState* play) { EnWeatherTag* this = (EnWeatherTag*)thisx; - this->actor.flags &= ~ACTOR_FLAG_TARGETABLE; + this->actor.flags &= ~ACTOR_FLAG_ATTENTION_ENABLED; switch (this->actor.params & 0xF) { case EN_WEATHER_TAG_TYPE_CLOUDY_MARKET: diff --git a/soh/src/overlays/actors/ovl_En_Weiyer/z_en_weiyer.c b/soh/src/overlays/actors/ovl_En_Weiyer/z_en_weiyer.c index 80d82f702..daff8bc46 100644 --- a/soh/src/overlays/actors/ovl_En_Weiyer/z_en_weiyer.c +++ b/soh/src/overlays/actors/ovl_En_Weiyer/z_en_weiyer.c @@ -9,7 +9,7 @@ #include "soh/Enhancements/game-interactor/GameInteractor_Hooks.h" #include "soh/ResourceManagerHelpers.h" -#define FLAGS (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_HOSTILE) +#define FLAGS (ACTOR_FLAG_ATTENTION_ENABLED | ACTOR_FLAG_HOSTILE) void EnWeiyer_Init(Actor* thisx, PlayState* play); void EnWeiyer_Destroy(Actor* thisx, PlayState* play); @@ -576,7 +576,7 @@ void func_80B3368C(EnWeiyer* this, PlayState* play) { } else if (Actor_ApplyDamage(&this->actor) == 0) { Enemy_StartFinishingBlow(play, &this->actor); Audio_PlayActorSound2(&this->actor, NA_SE_EN_EIER_DEAD); - this->actor.flags &= ~ACTOR_FLAG_TARGETABLE; + this->actor.flags &= ~ACTOR_FLAG_ATTENTION_ENABLED; func_80B32724(this); GameInteractor_ExecuteOnEnemyDefeat(&this->actor); } else { diff --git a/soh/src/overlays/actors/ovl_En_Wf/z_en_wf.c b/soh/src/overlays/actors/ovl_En_Wf/z_en_wf.c index 91a23dc79..155bfa357 100644 --- a/soh/src/overlays/actors/ovl_En_Wf/z_en_wf.c +++ b/soh/src/overlays/actors/ovl_En_Wf/z_en_wf.c @@ -11,7 +11,7 @@ #include "soh/Enhancements/game-interactor/GameInteractor_Hooks.h" #include "soh/ResourceManagerHelpers.h" -#define FLAGS (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_HOSTILE | ACTOR_FLAG_UPDATE_WHILE_CULLED) +#define FLAGS (ACTOR_FLAG_ATTENTION_ENABLED | ACTOR_FLAG_HOSTILE | ACTOR_FLAG_UPDATE_CULLING_DISABLED) void EnWf_Init(Actor* thisx, PlayState* play); void EnWf_Destroy(Actor* thisx, PlayState* play); @@ -375,7 +375,7 @@ void EnWf_SetupWaitToAppear(EnWf* this) { this->actionTimer = 20; this->unk_300 = false; this->action = WOLFOS_ACTION_WAIT_TO_APPEAR; - this->actor.flags &= ~ACTOR_FLAG_TARGETABLE; + this->actor.flags &= ~ACTOR_FLAG_ATTENTION_ENABLED; this->actor.scale.y = 0.0f; this->actor.gravity = 0.0f; EnWf_SetupAction(this, EnWf_WaitToAppear); @@ -387,7 +387,7 @@ void EnWf_WaitToAppear(EnWf* this, PlayState* play) { if (this->actor.xzDistToPlayer < 240.0f) { this->actionTimer = 5; - this->actor.flags |= ACTOR_FLAG_TARGETABLE; + this->actor.flags |= ACTOR_FLAG_ATTENTION_ENABLED; // Disable miniboss music with Enemy Randomizer because the music would keep // playing if the enemy was never defeated, which is common with Enemy Randomizer. @@ -1195,7 +1195,7 @@ void EnWf_SetupDie(EnWf* this) { } this->action = WOLFOS_ACTION_DIE; - this->actor.flags &= ~ACTOR_FLAG_TARGETABLE; + this->actor.flags &= ~ACTOR_FLAG_ATTENTION_ENABLED; this->actionTimer = this->skelAnime.animLength; Audio_PlayActorSound2(&this->actor, NA_SE_EN_WOLFOS_DEAD); EnWf_SetupAction(this, EnWf_Die); diff --git a/soh/src/overlays/actors/ovl_En_Wonder_Item/z_en_wonder_item.c b/soh/src/overlays/actors/ovl_En_Wonder_Item/z_en_wonder_item.c index a18adafcf..8f140ae57 100644 --- a/soh/src/overlays/actors/ovl_En_Wonder_Item/z_en_wonder_item.c +++ b/soh/src/overlays/actors/ovl_En_Wonder_Item/z_en_wonder_item.c @@ -116,7 +116,7 @@ void EnWonderItem_Init(Actor* thisx, PlayState* play) { osSyncPrintf("\n\n"); // "Mysterious mystery, very mysterious" osSyncPrintf(VT_FGCOL(GREEN) "☆☆☆☆☆ 不思議不思議まか不思議 \t ☆☆☆☆☆ %x\n" VT_RST, this->actor.params); - this->actor.flags &= ~ACTOR_FLAG_TARGETABLE; + this->actor.flags &= ~ACTOR_FLAG_ATTENTION_ENABLED; this->wonderMode = (this->actor.params >> 0xB) & 0x1F; this->itemDrop = (this->actor.params >> 6) & 0x1F; diff --git a/soh/src/overlays/actors/ovl_En_Wonder_Talk/z_en_wonder_talk.c b/soh/src/overlays/actors/ovl_En_Wonder_Talk/z_en_wonder_talk.c index 930db68d4..a72eb3930 100644 --- a/soh/src/overlays/actors/ovl_En_Wonder_Talk/z_en_wonder_talk.c +++ b/soh/src/overlays/actors/ovl_En_Wonder_Talk/z_en_wonder_talk.c @@ -7,7 +7,7 @@ #include "z_en_wonder_talk.h" #include "vt.h" -#define FLAGS (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_FRIENDLY | ACTOR_FLAG_NO_LOCKON) +#define FLAGS (ACTOR_FLAG_ATTENTION_ENABLED | ACTOR_FLAG_FRIENDLY | ACTOR_FLAG_LOCK_ON_DISABLED) void EnWonderTalk_Init(Actor* thisx, PlayState* play); void EnWonderTalk_Destroy(Actor* thisx, PlayState* play); @@ -147,7 +147,7 @@ void func_80B3943C(EnWonderTalk* this, PlayState* play) { } } else { if (this->switchFlag >= 0) { - this->actor.flags &= ~ACTOR_FLAG_TARGETABLE; + this->actor.flags &= ~ACTOR_FLAG_ATTENTION_ENABLED; Flags_SetSwitch(play, this->switchFlag); } this->actionFunc = func_80B391CC; @@ -179,7 +179,7 @@ void func_80B3943C(EnWonderTalk* this, PlayState* play) { void func_80B395F0(EnWonderTalk* this, PlayState* play) { if (this->unk_156 == Message_GetState(&play->msgCtx) && Message_ShouldAdvance(play)) { if (this->switchFlag >= 0) { - this->actor.flags &= ~ACTOR_FLAG_TARGETABLE; + this->actor.flags &= ~ACTOR_FLAG_ATTENTION_ENABLED; Flags_SetSwitch(play, this->switchFlag); } switch (this->unk_150) { diff --git a/soh/src/overlays/actors/ovl_En_Wonder_Talk2/z_en_wonder_talk2.c b/soh/src/overlays/actors/ovl_En_Wonder_Talk2/z_en_wonder_talk2.c index ffc5062e7..33daf2692 100644 --- a/soh/src/overlays/actors/ovl_En_Wonder_Talk2/z_en_wonder_talk2.c +++ b/soh/src/overlays/actors/ovl_En_Wonder_Talk2/z_en_wonder_talk2.c @@ -8,7 +8,7 @@ #include "vt.h" #include "soh/Enhancements/game-interactor/GameInteractor_Hooks.h" -#define FLAGS (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_FRIENDLY | ACTOR_FLAG_NO_LOCKON) +#define FLAGS (ACTOR_FLAG_ATTENTION_ENABLED | ACTOR_FLAG_FRIENDLY | ACTOR_FLAG_LOCK_ON_DISABLED) void EnWonderTalk2_Init(Actor* thisx, PlayState* play); void EnWonderTalk2_Destroy(Actor* thisx, PlayState* play); @@ -93,7 +93,7 @@ void EnWonderTalk2_Init(Actor* thisx, PlayState* play) { this->talkMode = 4; } if (this->talkMode == 3) { - this->actor.flags &= ~ACTOR_FLAG_NO_LOCKON; + this->actor.flags &= ~ACTOR_FLAG_LOCK_ON_DISABLED; this->actionFunc = EnWonderTalk2_DoNothing; } else { this->actionFunc = func_80B3A10C; @@ -116,7 +116,7 @@ void func_80B3A15C(EnWonderTalk2* this, PlayState* play) { this->unk_158++; if ((this->switchFlag >= 0) && Flags_GetSwitch(play, this->switchFlag)) { if (!this->unk_15A) { - this->actor.flags &= ~ACTOR_FLAG_TARGETABLE; + this->actor.flags &= ~ACTOR_FLAG_ATTENTION_ENABLED; this->unk_15A = true; } } else if (Actor_ProcessTalkRequest(&this->actor, play)) { @@ -194,7 +194,7 @@ void func_80B3A3D4(EnWonderTalk2* this, PlayState* play) { if (this->talkMode == 4) { this->unk_15A = true; } - this->actor.flags &= ~(ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_UPDATE_WHILE_CULLED); + this->actor.flags &= ~(ACTOR_FLAG_ATTENTION_ENABLED | ACTOR_FLAG_UPDATE_CULLING_DISABLED); if (GameInteractor_Should(VB_WONDER_TALK, true, this)) { Player_SetCsActionWithHaltedActors(play, NULL, 7); } @@ -211,7 +211,7 @@ void func_80B3A4F8(EnWonderTalk2* this, PlayState* play) { this->unk_158++; if (this->switchFlag >= 0 && Flags_GetSwitch(play, this->switchFlag)) { if (!this->unk_15A) { - this->actor.flags &= ~ACTOR_FLAG_TARGETABLE; + this->actor.flags &= ~ACTOR_FLAG_ATTENTION_ENABLED; this->unk_15A = true; } } else if ((this->talkMode != 4) || !this->unk_15A) { @@ -259,7 +259,7 @@ void func_80B3A4F8(EnWonderTalk2* this, PlayState* play) { Message_StartTextbox(play, this->actor.textId, NULL); Player_SetCsActionWithHaltedActors(play, NULL, 8); } - this->actor.flags |= ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_UPDATE_WHILE_CULLED; + this->actor.flags |= ACTOR_FLAG_ATTENTION_ENABLED | ACTOR_FLAG_UPDATE_CULLING_DISABLED; this->actionFunc = func_80B3A3D4; } diff --git a/soh/src/overlays/actors/ovl_En_Wood02/z_en_wood02.c b/soh/src/overlays/actors/ovl_En_Wood02/z_en_wood02.c index fc25db9af..6f753af03 100644 --- a/soh/src/overlays/actors/ovl_En_Wood02/z_en_wood02.c +++ b/soh/src/overlays/actors/ovl_En_Wood02/z_en_wood02.c @@ -291,7 +291,7 @@ void EnWood02_Init(Actor* thisx, PlayState* play2) { this->actor.world.pos.x += (sSpawnSin * sSpawnDistance[5]); this->actor.world.pos.z += (sSpawnCos * sSpawnDistance[5]); } else { - this->actor.flags |= ACTOR_FLAG_UPDATE_WHILE_CULLED; + this->actor.flags |= ACTOR_FLAG_UPDATE_CULLING_DISABLED; } // Snap to floor, or remove if over void @@ -332,7 +332,7 @@ void EnWood02_Update(Actor* thisx, PlayState* play2) { // Despawn extra trees in a group if out of range if ((this->spawnType == WOOD_SPAWN_SPAWNED) && (this->actor.parent != NULL)) { - if (!(this->actor.flags & ACTOR_FLAG_ACTIVE)) { + if (!(this->actor.flags & ACTOR_FLAG_INSIDE_CULLING_VOLUME)) { new_var = this->unk_14E[0]; phi_v0 = 0; diff --git a/soh/src/overlays/actors/ovl_En_Xc/z_en_xc.c b/soh/src/overlays/actors/ovl_En_Xc/z_en_xc.c index a5d582db2..89d889a38 100644 --- a/soh/src/overlays/actors/ovl_En_Xc/z_en_xc.c +++ b/soh/src/overlays/actors/ovl_En_Xc/z_en_xc.c @@ -17,7 +17,7 @@ #include "soh/ResourceManagerHelpers.h" #include "soh/Enhancements/game-interactor/GameInteractor_Hooks.h" -#define FLAGS ACTOR_FLAG_UPDATE_WHILE_CULLED +#define FLAGS ACTOR_FLAG_UPDATE_CULLING_DISABLED void EnXc_Init(Actor* thisx, PlayState* play); void EnXc_Destroy(Actor* thisx, PlayState* play); @@ -2216,7 +2216,7 @@ void EnXc_SetupDialogueAction(EnXc* this, PlayState* play) { if (Actor_ProcessTalkRequest(&this->actor, play)) { this->action = SHEIK_ACTION_IN_DIALOGUE; } else { - this->actor.flags |= ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_FRIENDLY; //this arrangment is cute but I would rather handle all message selection in ship code + this->actor.flags |= ACTOR_FLAG_ATTENTION_ENABLED | ACTOR_FLAG_FRIENDLY; //this arrangment is cute but I would rather handle all message selection in ship code if (INV_CONTENT(ITEM_HOOKSHOT) != ITEM_NONE) { this->actor.textId = 0x7010; //"You have what you need" } else { @@ -2229,7 +2229,7 @@ void EnXc_SetupDialogueAction(EnXc* this, PlayState* play) { void func_80B41798(EnXc* this, PlayState* play) { if (Message_GetState(&play->msgCtx) == TEXT_STATE_CLOSING) { this->action = SHEIK_ACTION_BLOCK_PEDESTAL; - this->actor.flags &= ~(ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_FRIENDLY); + this->actor.flags &= ~(ACTOR_FLAG_ATTENTION_ENABLED | ACTOR_FLAG_FRIENDLY); } } diff --git a/soh/src/overlays/actors/ovl_En_Yabusame_Mark/z_en_yabusame_mark.c b/soh/src/overlays/actors/ovl_En_Yabusame_Mark/z_en_yabusame_mark.c index be77887db..683e601a0 100644 --- a/soh/src/overlays/actors/ovl_En_Yabusame_Mark/z_en_yabusame_mark.c +++ b/soh/src/overlays/actors/ovl_En_Yabusame_Mark/z_en_yabusame_mark.c @@ -81,7 +81,7 @@ void EnYabusameMark_Init(Actor* thisx, PlayState* play) { osSyncPrintf("\n\n"); osSyncPrintf(VT_FGCOL(GREEN) "☆☆☆☆☆ やぶさめまと ☆☆☆☆☆ %x\n" VT_RST, this->actor.params); - this->actor.flags &= ~ACTOR_FLAG_TARGETABLE; + this->actor.flags &= ~ACTOR_FLAG_ATTENTION_ENABLED; this->typeIndex = this->actor.params; this->actor.targetMode = 5; osSyncPrintf(VT_FGCOL(GREEN) "☆☆☆☆☆ 種類インデックス \t ☆☆☆☆☆ %d\n" VT_RST, this->typeIndex); @@ -105,7 +105,7 @@ void EnYabusameMark_Init(Actor* thisx, PlayState* play) { Collider_InitQuad(play, &this->collider); Collider_SetQuad(play, &this->collider, &this->actor, &sQuadInit); this->worldPos = this->actor.world.pos; - this->actor.flags |= ACTOR_FLAG_UPDATE_WHILE_CULLED; + this->actor.flags |= ACTOR_FLAG_UPDATE_CULLING_DISABLED; if (gSaveContext.sceneSetupIndex != 4) { Actor_Kill(&this->actor); return; diff --git a/soh/src/overlays/actors/ovl_En_Yukabyun/z_en_yukabyun.c b/soh/src/overlays/actors/ovl_En_Yukabyun/z_en_yukabyun.c index 96cda6951..cccfe2414 100644 --- a/soh/src/overlays/actors/ovl_En_Yukabyun/z_en_yukabyun.c +++ b/soh/src/overlays/actors/ovl_En_Yukabyun/z_en_yukabyun.c @@ -8,7 +8,7 @@ #include "objects/object_yukabyun/object_yukabyun.h" #include "soh/Enhancements/game-interactor/GameInteractor_Hooks.h" -#define FLAGS ACTOR_FLAG_UPDATE_WHILE_CULLED +#define FLAGS ACTOR_FLAG_UPDATE_CULLING_DISABLED void EnYukabyun_Init(Actor* thisx, PlayState* play); void EnYukabyun_Destroy(Actor* thisx, PlayState* play); @@ -82,7 +82,7 @@ void func_80B43A94(EnYukabyun* this, PlayState* play) { this->unk_150--; } if (this->unk_150 == 0) { - this->actor.flags |= ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_HOSTILE | ACTOR_FLAG_IGNORE_QUAKE; + this->actor.flags |= ACTOR_FLAG_ATTENTION_ENABLED | ACTOR_FLAG_HOSTILE | ACTOR_FLAG_IGNORE_QUAKE; this->actionfunc = func_80B43AD4; } } @@ -125,7 +125,7 @@ void EnYukabyun_Update(Actor* thisx, PlayState* play) { this->collider.base.atFlags &= ~AT_HIT; this->collider.base.acFlags &= ~AC_HIT; this->collider.base.ocFlags1 &= ~OC1_HIT; - this->actor.flags &= ~(ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_HOSTILE); + this->actor.flags &= ~(ACTOR_FLAG_ATTENTION_ENABLED | ACTOR_FLAG_HOSTILE); SoundSource_PlaySfxAtFixedWorldPos(play, &this->actor.world.pos, 30, NA_SE_EN_OCTAROCK_ROCK); this->actionfunc = EnYukabyun_Break; } @@ -137,7 +137,7 @@ void EnYukabyun_Update(Actor* thisx, PlayState* play) { Actor_UpdateBgCheckInfo(play, &this->actor, 5.0f, 20.0f, 8.0f, 5); Collider_UpdateCylinder(&this->actor, &this->collider); - this->actor.flags |= ACTOR_FLAG_PLAY_HIT_SFX; + this->actor.flags |= ACTOR_FLAG_SFX_FOR_PLAYER_BODY_HIT; CollisionCheck_SetAT(play, &play->colChkCtx, &this->collider.base); CollisionCheck_SetAC(play, &play->colChkCtx, &this->collider.base); diff --git a/soh/src/overlays/actors/ovl_En_Zf/z_en_zf.c b/soh/src/overlays/actors/ovl_En_Zf/z_en_zf.c index 85a878cc6..97254cd46 100644 --- a/soh/src/overlays/actors/ovl_En_Zf/z_en_zf.c +++ b/soh/src/overlays/actors/ovl_En_Zf/z_en_zf.c @@ -9,7 +9,7 @@ #include "soh/Enhancements/game-interactor/GameInteractor_Hooks.h" #include "soh/ResourceManagerHelpers.h" -#define FLAGS (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_HOSTILE | ACTOR_FLAG_UPDATE_WHILE_CULLED) +#define FLAGS (ACTOR_FLAG_ATTENTION_ENABLED | ACTOR_FLAG_HOSTILE | ACTOR_FLAG_UPDATE_CULLING_DISABLED) void EnZf_Init(Actor* thisx, PlayState* play); void EnZf_Destroy(Actor* thisx, PlayState* play); @@ -636,7 +636,7 @@ void EnZf_SetupDropIn(EnZf* this) { this->hopAnimIndex = 1; this->action = ENZF_ACTION_DROP_IN; this->actor.bgCheckFlags &= ~2; - this->actor.flags &= ~ACTOR_FLAG_TARGETABLE; + this->actor.flags &= ~ACTOR_FLAG_ATTENTION_ENABLED; this->actor.shape.rot.y = this->actor.world.rot.y = this->actor.yawTowardsPlayer; EnZf_SetupAction(this, EnZf_DropIn); } @@ -644,7 +644,7 @@ void EnZf_SetupDropIn(EnZf* this) { void EnZf_DropIn(EnZf* this, PlayState* play) { if (this->unk_3F0 == 1) { Audio_PlayActorSound2(&this->actor, NA_SE_EN_RIZA_CRY); - this->actor.flags |= ACTOR_FLAG_TARGETABLE; + this->actor.flags |= ACTOR_FLAG_ATTENTION_ENABLED; if (this->actor.params == ENZF_TYPE_LIZALFOS_MINIBOSS_A) { func_800F5ACC(NA_BGM_MINI_BOSS); @@ -656,7 +656,7 @@ void EnZf_DropIn(EnZf* this, PlayState* play) { this->unk_3F0--; } else if (this->actor.xzDistToPlayer <= 160.0f) { this->unk_3F0 = 0; - this->actor.flags |= ACTOR_FLAG_TARGETABLE; + this->actor.flags |= ACTOR_FLAG_ATTENTION_ENABLED; Audio_PlayActorSound2(&this->actor, NA_SE_EN_RIZA_CRY); } @@ -1904,7 +1904,7 @@ void EnZf_SetupDie(EnZf* this) { } this->action = ENZF_ACTION_DIE; - this->actor.flags &= ~ACTOR_FLAG_TARGETABLE; + this->actor.flags &= ~ACTOR_FLAG_ATTENTION_ENABLED; if (D_80B4A1B4 != -1) { if (this->actor.prev != NULL) { diff --git a/soh/src/overlays/actors/ovl_En_Zl1/z_en_zl1.c b/soh/src/overlays/actors/ovl_En_Zl1/z_en_zl1.c index 584ab5686..c334944ef 100644 --- a/soh/src/overlays/actors/ovl_En_Zl1/z_en_zl1.c +++ b/soh/src/overlays/actors/ovl_En_Zl1/z_en_zl1.c @@ -7,7 +7,7 @@ #include "z_en_zl1.h" #include "objects/object_zl1/object_zl1.h" -#define FLAGS (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_FRIENDLY | ACTOR_FLAG_UPDATE_WHILE_CULLED) +#define FLAGS (ACTOR_FLAG_ATTENTION_ENABLED | ACTOR_FLAG_FRIENDLY | ACTOR_FLAG_UPDATE_CULLING_DISABLED) void EnZl1_Init(Actor* thisx, PlayState* play); void EnZl1_Destroy(Actor* thisx, PlayState* play); @@ -556,7 +556,7 @@ void func_80B4BF2C(EnZl1* this, PlayState* play) { if (Actor_TextboxIsClosing(&this->actor, play)) { Player_SetCsActionWithHaltedActors(play, &this->actor, 7); Interface_ChangeAlpha(50); - this->actor.flags &= ~ACTOR_FLAG_PLAYER_TALKED_TO; + this->actor.flags &= ~ACTOR_FLAG_TALK; this->unk_1E2 = 4; } break; diff --git a/soh/src/overlays/actors/ovl_En_Zl2/z_en_zl2.c b/soh/src/overlays/actors/ovl_En_Zl2/z_en_zl2.c index 672f8a63b..6f2a816f6 100644 --- a/soh/src/overlays/actors/ovl_En_Zl2/z_en_zl2.c +++ b/soh/src/overlays/actors/ovl_En_Zl2/z_en_zl2.c @@ -12,7 +12,7 @@ #include "objects/object_zl2_anime1/object_zl2_anime1.h" #include "soh/Enhancements/game-interactor/GameInteractor_Hooks.h" -#define FLAGS ACTOR_FLAG_UPDATE_WHILE_CULLED +#define FLAGS ACTOR_FLAG_UPDATE_CULLING_DISABLED void EnZl2_Init(Actor* thisx, PlayState* play); void EnZl2_Destroy(Actor* thisx, PlayState* play); diff --git a/soh/src/overlays/actors/ovl_En_Zl3/z_en_zl3.c b/soh/src/overlays/actors/ovl_En_Zl3/z_en_zl3.c index 125b7351a..d01fc77d4 100644 --- a/soh/src/overlays/actors/ovl_En_Zl3/z_en_zl3.c +++ b/soh/src/overlays/actors/ovl_En_Zl3/z_en_zl3.c @@ -13,7 +13,7 @@ #include "objects/object_zl2_anime2/object_zl2_anime2.h" #include "soh/ResourceManagerHelpers.h" -#define FLAGS ACTOR_FLAG_UPDATE_WHILE_CULLED +#define FLAGS ACTOR_FLAG_UPDATE_CULLING_DISABLED void EnZl3_Init(Actor* thisx, PlayState* play); void EnZl3_Destroy(Actor* thisx, PlayState* play); @@ -1009,7 +1009,7 @@ void func_80B55780(EnZl3* this, PlayState* play) { this->drawConfig = 1; osSyncPrintf("ゼルダ姫のEn_Zl3_Actor_inFinal2_Initは通った!!!!!!!!!!!!!!!!!!!!!!!!!\n"); EnZl3_setMouthIndex(this, 1); - this->actor.flags &= ~ACTOR_FLAG_TARGETABLE; + this->actor.flags &= ~ACTOR_FLAG_ATTENTION_ENABLED; } void func_80B55808(EnZl3* this) { @@ -1106,8 +1106,8 @@ void func_80B55C4C(EnZl3* this, s32 arg1) { void func_80B55C70(EnZl3* this) { func_80B54E14(this, &gZelda2Anime2Anim_008684, 2, -8.0f, 0); this->action = 12; - this->actor.flags &= ~(ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_FRIENDLY); - this->actor.flags &= ~ACTOR_FLAG_TARGETABLE; + this->actor.flags &= ~(ACTOR_FLAG_ATTENTION_ENABLED | ACTOR_FLAG_FRIENDLY); + this->actor.flags &= ~ACTOR_FLAG_ATTENTION_ENABLED; } void func_80B55CCC(EnZl3* this, s32 arg1) { @@ -1120,20 +1120,20 @@ void func_80B55D00(EnZl3* this, PlayState* play) { if (Actor_ProcessTalkRequest(&this->actor, play)) { this->action = 13; } else if (ABS((s16)(this->actor.yawTowardsPlayer - this->actor.shape.rot.y)) <= 0x4300) { - this->actor.flags |= ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_FRIENDLY; - this->actor.flags |= ACTOR_FLAG_TARGETABLE; + this->actor.flags |= ACTOR_FLAG_ATTENTION_ENABLED | ACTOR_FLAG_FRIENDLY; + this->actor.flags |= ACTOR_FLAG_ATTENTION_ENABLED; this->actor.textId = 0x70D5; func_8002F2F4(&this->actor, play); } else { - this->actor.flags &= ~(ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_FRIENDLY); - this->actor.flags &= ~ACTOR_FLAG_TARGETABLE; + this->actor.flags &= ~(ACTOR_FLAG_ATTENTION_ENABLED | ACTOR_FLAG_FRIENDLY); + this->actor.flags &= ~ACTOR_FLAG_ATTENTION_ENABLED; } } void func_80B55DB0(EnZl3* this, PlayState* play) { if (Message_GetState(&play->msgCtx) == TEXT_STATE_CLOSING) { - this->actor.flags &= ~(ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_FRIENDLY); - this->actor.flags &= ~ACTOR_FLAG_TARGETABLE; + this->actor.flags &= ~(ACTOR_FLAG_ATTENTION_ENABLED | ACTOR_FLAG_FRIENDLY); + this->actor.flags &= ~ACTOR_FLAG_ATTENTION_ENABLED; this->action = 12; } } @@ -1179,14 +1179,14 @@ void func_80B55F6C(EnZl3* this, PlayState* play) { BossGanon2* bossGanon2 = func_80B53488(this, play); if ((bossGanon2 != NULL) && (bossGanon2->unk_324 <= (10.0f / 81.0f))) { - this->actor.flags |= ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_FRIENDLY; - this->actor.flags |= ACTOR_FLAG_TARGETABLE; + this->actor.flags |= ACTOR_FLAG_ATTENTION_ENABLED | ACTOR_FLAG_FRIENDLY; + this->actor.flags |= ACTOR_FLAG_ATTENTION_ENABLED; this->actor.textId = 0x7059; func_8002F2F4(&this->actor, play); } } else { - this->actor.flags &= ~(ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_FRIENDLY); - this->actor.flags &= ~ACTOR_FLAG_TARGETABLE; + this->actor.flags &= ~(ACTOR_FLAG_ATTENTION_ENABLED | ACTOR_FLAG_FRIENDLY); + this->actor.flags &= ~ACTOR_FLAG_ATTENTION_ENABLED; } } @@ -1211,8 +1211,8 @@ void func_80B56090(EnZl3* this, s32 arg1) { void func_80B56108(EnZl3* this, PlayState* play) { if (Message_GetState(&play->msgCtx) == TEXT_STATE_CLOSING) { - this->actor.flags &= ~(ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_FRIENDLY); - this->actor.flags &= ~ACTOR_FLAG_TARGETABLE; + this->actor.flags &= ~(ACTOR_FLAG_ATTENTION_ENABLED | ACTOR_FLAG_FRIENDLY); + this->actor.flags &= ~ACTOR_FLAG_ATTENTION_ENABLED; this->action = 16; } } @@ -1241,22 +1241,22 @@ void func_80B56214(EnZl3* this, PlayState* play) { if (bossGanon2 != NULL) { if (bossGanon2->unk_324 <= (10.0f / 81.0f)) { - this->actor.flags |= ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_FRIENDLY; - this->actor.flags |= ACTOR_FLAG_TARGETABLE; + this->actor.flags |= ACTOR_FLAG_ATTENTION_ENABLED | ACTOR_FLAG_FRIENDLY; + this->actor.flags |= ACTOR_FLAG_ATTENTION_ENABLED; this->actor.textId = 0x7059; func_8002F2F4(&this->actor, play); } } } else { - this->actor.flags &= ~(ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_FRIENDLY); - this->actor.flags &= ~ACTOR_FLAG_TARGETABLE; + this->actor.flags &= ~(ACTOR_FLAG_ATTENTION_ENABLED | ACTOR_FLAG_FRIENDLY); + this->actor.flags &= ~ACTOR_FLAG_ATTENTION_ENABLED; } } void func_80B562F4(EnZl3* this, PlayState* play) { if (Message_GetState(&play->msgCtx) == TEXT_STATE_CLOSING) { - this->actor.flags &= ~(ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_FRIENDLY); - this->actor.flags &= ~ACTOR_FLAG_TARGETABLE; + this->actor.flags &= ~(ACTOR_FLAG_ATTENTION_ENABLED | ACTOR_FLAG_FRIENDLY); + this->actor.flags &= ~ACTOR_FLAG_ATTENTION_ENABLED; this->action = 20; } } @@ -1696,7 +1696,7 @@ void func_80B57350(EnZl3* this, PlayState* play) { s16 temp_v0 = this->actor.yawTowardsPlayer - this->actor.shape.rot.y; if (ABS(temp_v0) <= 0x4300) { - this->actor.flags |= ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_FRIENDLY; + this->actor.flags |= ACTOR_FLAG_ATTENTION_ENABLED | ACTOR_FLAG_FRIENDLY; this->actor.textId = func_80B572F0(play); func_8002F2F4(&this->actor, play); } @@ -2519,7 +2519,7 @@ void func_80B59828(EnZl3* this, PlayState* play) { s16 newRotY; func_80B54E14(this, &gZelda2Anime2Anim_009FBC, 0, 0.0f, 0); - this->actor.flags |= ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_FRIENDLY; + this->actor.flags |= ACTOR_FLAG_ATTENTION_ENABLED | ACTOR_FLAG_FRIENDLY; func_80B56F10(this, play); newRotY = func_80B571A8(this); this->actor.shape.rot.y = newRotY; diff --git a/soh/src/overlays/actors/ovl_En_Zl4/z_en_zl4.c b/soh/src/overlays/actors/ovl_En_Zl4/z_en_zl4.c index a50d64766..01c119c89 100644 --- a/soh/src/overlays/actors/ovl_En_Zl4/z_en_zl4.c +++ b/soh/src/overlays/actors/ovl_En_Zl4/z_en_zl4.c @@ -11,7 +11,7 @@ #include "soh/ResourceManagerHelpers.h" #include "soh/Enhancements/game-interactor/GameInteractor_Hooks.h" -#define FLAGS (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_FRIENDLY | ACTOR_FLAG_UPDATE_WHILE_CULLED) +#define FLAGS (ACTOR_FLAG_ATTENTION_ENABLED | ACTOR_FLAG_FRIENDLY | ACTOR_FLAG_UPDATE_CULLING_DISABLED) typedef enum { /* 0 */ ZL4_CS_WAIT, diff --git a/soh/src/overlays/actors/ovl_En_Zo/z_en_zo.c b/soh/src/overlays/actors/ovl_En_Zo/z_en_zo.c index bae52cd47..474830bbd 100644 --- a/soh/src/overlays/actors/ovl_En_Zo/z_en_zo.c +++ b/soh/src/overlays/actors/ovl_En_Zo/z_en_zo.c @@ -10,7 +10,7 @@ #include "soh/frame_interpolation.h" #include "soh/ResourceManagerHelpers.h" -#define FLAGS (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_FRIENDLY) +#define FLAGS (ACTOR_FLAG_ATTENTION_ENABLED | ACTOR_FLAG_FRIENDLY) typedef enum { /* 0 */ ENZO_EFFECT_NONE, @@ -612,7 +612,7 @@ void EnZo_Init(Actor* thisx, PlayState* play) { this->alpha = 255.0f; this->actionFunc = EnZo_Standing; } else { - this->actor.flags &= ~ACTOR_FLAG_TARGETABLE; + this->actor.flags &= ~ACTOR_FLAG_ATTENTION_ENABLED; this->actionFunc = EnZo_Submerged; } } @@ -657,7 +657,7 @@ void EnZo_Surface(EnZo* this, PlayState* play) { Audio_PlayActorSound2(&this->actor, NA_SE_EV_OUT_OF_WATER); EnZo_SpawnSplashes(this); Animation_ChangeByInfo(&this->skelAnime, sAnimationInfo, ENZO_ANIM_3); - this->actor.flags |= ACTOR_FLAG_TARGETABLE; + this->actor.flags |= ACTOR_FLAG_ATTENTION_ENABLED; this->actionFunc = EnZo_TreadWater; this->actor.velocity.y = 0.0f; this->alpha = 255.0f; @@ -707,7 +707,7 @@ void EnZo_Dive(EnZo* this, PlayState* play) { if (Animation_OnFrame(&this->skelAnime, this->skelAnime.endFrame)) { Audio_PlayActorSound2(&this->actor, NA_SE_EV_DIVE_WATER); EnZo_SpawnSplashes(this); - this->actor.flags &= ~ACTOR_FLAG_TARGETABLE; + this->actor.flags &= ~ACTOR_FLAG_ATTENTION_ENABLED; this->actor.velocity.y = -4.0f; this->skelAnime.playSpeed = 0.0f; } diff --git a/soh/src/overlays/actors/ovl_En_fHG/z_en_fhg.c b/soh/src/overlays/actors/ovl_En_fHG/z_en_fhg.c index 986f60c02..5c94617d4 100644 --- a/soh/src/overlays/actors/ovl_En_fHG/z_en_fhg.c +++ b/soh/src/overlays/actors/ovl_En_fHG/z_en_fhg.c @@ -11,7 +11,7 @@ #include "overlays/actors/ovl_Boss_Ganondrof/z_boss_ganondrof.h" #include "overlays/actors/ovl_En_Fhg_Fire/z_en_fhg_fire.h" -#define FLAGS ACTOR_FLAG_UPDATE_WHILE_CULLED +#define FLAGS ACTOR_FLAG_UPDATE_CULLING_DISABLED typedef struct { /* 0x00 */ Vec3f pos; diff --git a/soh/src/overlays/actors/ovl_End_Title/z_end_title.c b/soh/src/overlays/actors/ovl_End_Title/z_end_title.c index 3e83e5ae3..5a8e06d43 100644 --- a/soh/src/overlays/actors/ovl_End_Title/z_end_title.c +++ b/soh/src/overlays/actors/ovl_End_Title/z_end_title.c @@ -6,7 +6,7 @@ #include "z_end_title.h" -#define FLAGS (ACTOR_FLAG_UPDATE_WHILE_CULLED | ACTOR_FLAG_DRAW_WHILE_CULLED) +#define FLAGS (ACTOR_FLAG_UPDATE_CULLING_DISABLED | ACTOR_FLAG_DRAW_CULLING_DISABLED) void EndTitle_Init(Actor* thisx, PlayState* play); void EndTitle_Destroy(Actor* thisx, PlayState* play); diff --git a/soh/src/overlays/actors/ovl_Fishing/z_fishing.c b/soh/src/overlays/actors/ovl_Fishing/z_fishing.c index 01d63248f..a98f98502 100644 --- a/soh/src/overlays/actors/ovl_Fishing/z_fishing.c +++ b/soh/src/overlays/actors/ovl_Fishing/z_fishing.c @@ -14,7 +14,7 @@ #include "soh/OTRGlobals.h" #include "soh/Enhancements/game-interactor/GameInteractor_Hooks.h" -#define FLAGS ACTOR_FLAG_UPDATE_WHILE_CULLED +#define FLAGS ACTOR_FLAG_UPDATE_CULLING_DISABLED #define WATER_SURFACE_Y(play) play->colCtx.colHeader->waterBoxes->ySurface bool getShouldSpawnLoaches(); @@ -881,7 +881,7 @@ void Fishing_Init(Actor* thisx, PlayState* play2) { thisx->focus.pos = thisx->world.pos; thisx->focus.pos.y += 75.0f; - thisx->flags |= ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_FRIENDLY; + thisx->flags |= ACTOR_FLAG_ATTENTION_ENABLED | ACTOR_FLAG_FRIENDLY; if (sLinkAge != LINK_AGE_CHILD) { if (HIGH_SCORE(HS_FISHING) & HS_FISH_STOLE_HAT) { @@ -1016,7 +1016,7 @@ void Fishing_Init(Actor* thisx, PlayState* play2) { this->fishState = 100; Actor_ChangeCategory(play, &play->actorCtx, thisx, ACTORCAT_PROP); thisx->targetMode = 0; - thisx->flags |= ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_FRIENDLY; + thisx->flags |= ACTOR_FLAG_ATTENTION_ENABLED | ACTOR_FLAG_FRIENDLY; this->lightNode = LightContext_InsertLight(play, &play->lightCtx, &this->lightInfo); } else { this->fishState = 10; @@ -2900,7 +2900,7 @@ void Fishing_HandleAquariumDialog(Fishing* this, PlayState* play) { if (!this->isAquariumMessage) { if (this->aquariumWaitTimer == 0) { - this->actor.flags |= ACTOR_FLAG_TARGETABLE; + this->actor.flags |= ACTOR_FLAG_ATTENTION_ENABLED; if (Actor_ProcessTalkRequest(&this->actor, play)) { sFishLengthToWeigh = sFishingRecordLength; @@ -2910,7 +2910,7 @@ void Fishing_HandleAquariumDialog(Fishing* this, PlayState* play) { } } else { this->aquariumWaitTimer--; - this->actor.flags &= ~ACTOR_FLAG_TARGETABLE; + this->actor.flags &= ~ACTOR_FLAG_ATTENTION_ENABLED; } } else if (Actor_TextboxIsClosing(&this->actor, play)) { this->isAquariumMessage = false; @@ -3000,9 +3000,9 @@ void Fishing_UpdateFish(Actor* thisx, PlayState* play2) { } if ((D_80B7E0B0 != 0) || (sSubCamId != 0) || ((player->actor.world.pos.z > 1150.0f) && (this->fishState != 100))) { - this->actor.flags &= ~ACTOR_FLAG_TARGETABLE; + this->actor.flags &= ~ACTOR_FLAG_ATTENTION_ENABLED; } else { - this->actor.flags |= ACTOR_FLAG_TARGETABLE; + this->actor.flags |= ACTOR_FLAG_ATTENTION_ENABLED; if (sRodCastState != 0) { if (D_80B7E0B2 == 0) { this->actor.focus.pos = sLurePos; @@ -3219,7 +3219,7 @@ void Fishing_UpdateFish(Actor* thisx, PlayState* play2) { if (sLureEquipped == FS_LURE_SINKING) { func_80B70ED4(this, input); } else { - this->actor.flags &= ~ACTOR_FLAG_TARGETABLE; + this->actor.flags &= ~ACTOR_FLAG_ATTENTION_ENABLED; } break; @@ -3256,7 +3256,7 @@ void Fishing_UpdateFish(Actor* thisx, PlayState* play2) { if (sLureEquipped == FS_LURE_SINKING) { func_80B70ED4(this, input); } else { - this->actor.flags &= ~ACTOR_FLAG_TARGETABLE; + this->actor.flags &= ~ACTOR_FLAG_ATTENTION_ENABLED; } } break; @@ -3300,7 +3300,7 @@ void Fishing_UpdateFish(Actor* thisx, PlayState* play2) { this->fishTargetPos.z = Rand_ZeroFloat(50.0f); } - this->actor.flags &= ~ACTOR_FLAG_TARGETABLE; + this->actor.flags &= ~ACTOR_FLAG_ATTENTION_ENABLED; break; case -2: @@ -3339,7 +3339,7 @@ void Fishing_UpdateFish(Actor* thisx, PlayState* play2) { } Math_ApproachF(&this->rotationStep, 2048.0f, 1.0f, 128.0f); - this->actor.flags &= ~ACTOR_FLAG_TARGETABLE; + this->actor.flags &= ~ACTOR_FLAG_ATTENTION_ENABLED; } break; @@ -5262,9 +5262,9 @@ void Fishing_UpdateOwner(Actor* thisx, PlayState* play2) { SkelAnime_Update(&this->skelAnime); if ((sOwnerTheftTimer != 0) || (Message_GetState(&play->msgCtx) != TEXT_STATE_NONE)) { - this->actor.flags &= ~ACTOR_FLAG_TARGETABLE; + this->actor.flags &= ~ACTOR_FLAG_ATTENTION_ENABLED; } else { - this->actor.flags |= ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_DRAW_WHILE_CULLED; + this->actor.flags |= ACTOR_FLAG_ATTENTION_ENABLED | ACTOR_FLAG_DRAW_CULLING_DISABLED; } if ((this->actor.xzDistToPlayer < 120.0f) || (Message_GetState(&play->msgCtx) != TEXT_STATE_NONE)) { diff --git a/soh/src/overlays/actors/ovl_Item_Etcetera/z_item_etcetera.c b/soh/src/overlays/actors/ovl_Item_Etcetera/z_item_etcetera.c index 8088c6262..c724cf7d5 100644 --- a/soh/src/overlays/actors/ovl_Item_Etcetera/z_item_etcetera.c +++ b/soh/src/overlays/actors/ovl_Item_Etcetera/z_item_etcetera.c @@ -8,7 +8,7 @@ #include #include "soh/OTRGlobals.h" -#define FLAGS ACTOR_FLAG_UPDATE_WHILE_CULLED +#define FLAGS ACTOR_FLAG_UPDATE_CULLING_DISABLED void ItemEtcetera_Init(Actor* thisx, PlayState* play); void ItemEtcetera_Destroy(Actor* thisx, PlayState* play); diff --git a/soh/src/overlays/actors/ovl_Item_Inbox/z_item_inbox.c b/soh/src/overlays/actors/ovl_Item_Inbox/z_item_inbox.c index 04ed7582c..204358af1 100644 --- a/soh/src/overlays/actors/ovl_Item_Inbox/z_item_inbox.c +++ b/soh/src/overlays/actors/ovl_Item_Inbox/z_item_inbox.c @@ -6,7 +6,7 @@ #include "z_item_inbox.h" -#define FLAGS (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_FRIENDLY) +#define FLAGS (ACTOR_FLAG_ATTENTION_ENABLED | ACTOR_FLAG_FRIENDLY) void ItemInbox_Init(Actor* thisx, PlayState* play); void ItemInbox_Destroy(Actor* thisx, PlayState* play); diff --git a/soh/src/overlays/actors/ovl_Item_Ocarina/z_item_ocarina.c b/soh/src/overlays/actors/ovl_Item_Ocarina/z_item_ocarina.c index 99cde87d6..ba9d3851b 100644 --- a/soh/src/overlays/actors/ovl_Item_Ocarina/z_item_ocarina.c +++ b/soh/src/overlays/actors/ovl_Item_Ocarina/z_item_ocarina.c @@ -9,7 +9,7 @@ #include "soh/OTRGlobals.h" #include "soh/Enhancements/game-interactor/GameInteractor_Hooks.h" -#define FLAGS ACTOR_FLAG_UPDATE_WHILE_CULLED +#define FLAGS ACTOR_FLAG_UPDATE_CULLING_DISABLED void ItemOcarina_Init(Actor* thisx, PlayState* play); void ItemOcarina_Destroy(Actor* thisx, PlayState* play); diff --git a/soh/src/overlays/actors/ovl_Item_Shield/z_item_shield.c b/soh/src/overlays/actors/ovl_Item_Shield/z_item_shield.c index 8c40e346e..065c60c68 100644 --- a/soh/src/overlays/actors/ovl_Item_Shield/z_item_shield.c +++ b/soh/src/overlays/actors/ovl_Item_Shield/z_item_shield.c @@ -8,7 +8,7 @@ #include "z_item_shield.h" #include "objects/object_link_child/object_link_child.h" -#define FLAGS ACTOR_FLAG_UPDATE_WHILE_CULLED +#define FLAGS ACTOR_FLAG_UPDATE_CULLING_DISABLED void ItemShield_Init(Actor* thisx, PlayState* play); void ItemShield_Destroy(Actor* thisx, PlayState* play); diff --git a/soh/src/overlays/actors/ovl_Magic_Dark/z_magic_dark.c b/soh/src/overlays/actors/ovl_Magic_Dark/z_magic_dark.c index 069e7ddbe..0e3ca8a2d 100644 --- a/soh/src/overlays/actors/ovl_Magic_Dark/z_magic_dark.c +++ b/soh/src/overlays/actors/ovl_Magic_Dark/z_magic_dark.c @@ -7,7 +7,7 @@ #include "z_magic_dark.h" #include "objects/gameplay_keep/gameplay_keep.h" -#define FLAGS (ACTOR_FLAG_UPDATE_WHILE_CULLED | ACTOR_FLAG_NO_FREEZE_OCARINA) +#define FLAGS (ACTOR_FLAG_UPDATE_CULLING_DISABLED | ACTOR_FLAG_UPDATE_DURING_OCARINA) void MagicDark_Init(Actor* thisx, PlayState* play); void MagicDark_Destroy(Actor* thisx, PlayState* play); diff --git a/soh/src/overlays/actors/ovl_Magic_Fire/z_magic_fire.c b/soh/src/overlays/actors/ovl_Magic_Fire/z_magic_fire.c index da0fb02e5..b6060af74 100644 --- a/soh/src/overlays/actors/ovl_Magic_Fire/z_magic_fire.c +++ b/soh/src/overlays/actors/ovl_Magic_Fire/z_magic_fire.c @@ -7,7 +7,7 @@ #include "z_magic_fire.h" #include "soh/ResourceManagerHelpers.h" -#define FLAGS (ACTOR_FLAG_UPDATE_WHILE_CULLED | ACTOR_FLAG_NO_FREEZE_OCARINA) +#define FLAGS (ACTOR_FLAG_UPDATE_CULLING_DISABLED | ACTOR_FLAG_UPDATE_DURING_OCARINA) void MagicFire_Init(Actor* thisx, PlayState* play); void MagicFire_Destroy(Actor* thisx, PlayState* play); diff --git a/soh/src/overlays/actors/ovl_Magic_Wind/z_magic_wind.c b/soh/src/overlays/actors/ovl_Magic_Wind/z_magic_wind.c index 3d8d0cff0..e4afe9e47 100644 --- a/soh/src/overlays/actors/ovl_Magic_Wind/z_magic_wind.c +++ b/soh/src/overlays/actors/ovl_Magic_Wind/z_magic_wind.c @@ -7,7 +7,7 @@ #include "z_magic_wind.h" #include "soh/ResourceManagerHelpers.h" -#define FLAGS (ACTOR_FLAG_UPDATE_WHILE_CULLED | ACTOR_FLAG_NO_FREEZE_OCARINA) +#define FLAGS (ACTOR_FLAG_UPDATE_CULLING_DISABLED | ACTOR_FLAG_UPDATE_DURING_OCARINA) void MagicWind_Init(Actor* thisx, PlayState* play); void MagicWind_Destroy(Actor* thisx, PlayState* play); diff --git a/soh/src/overlays/actors/ovl_Mir_Ray/z_mir_ray.c b/soh/src/overlays/actors/ovl_Mir_Ray/z_mir_ray.c index 0391d39d7..70abe25ec 100644 --- a/soh/src/overlays/actors/ovl_Mir_Ray/z_mir_ray.c +++ b/soh/src/overlays/actors/ovl_Mir_Ray/z_mir_ray.c @@ -8,7 +8,7 @@ #include "objects/object_mir_ray/object_mir_ray.h" #include "soh/frame_interpolation.h" -#define FLAGS (ACTOR_FLAG_UPDATE_WHILE_CULLED | ACTOR_FLAG_DRAW_WHILE_CULLED) +#define FLAGS (ACTOR_FLAG_UPDATE_CULLING_DISABLED | ACTOR_FLAG_DRAW_CULLING_DISABLED) void MirRay_Init(Actor* thisx, PlayState* play); void MirRay_Destroy(Actor* thisx, PlayState* play); diff --git a/soh/src/overlays/actors/ovl_Obj_Bean/z_obj_bean.c b/soh/src/overlays/actors/ovl_Obj_Bean/z_obj_bean.c index 968a6a3fc..214487e8d 100644 --- a/soh/src/overlays/actors/ovl_Obj_Bean/z_obj_bean.c +++ b/soh/src/overlays/actors/ovl_Obj_Bean/z_obj_bean.c @@ -640,7 +640,7 @@ void ObjBean_WaitForWater(ObjBean* this, PlayState* play) { ObjBean_SetupGrowWaterPhase1(this); D_80B90E30 = this; OnePointCutscene_Init(play, 2210, -99, &this->dyna.actor, MAIN_CAM); - this->dyna.actor.flags |= ACTOR_FLAG_UPDATE_WHILE_CULLED; + this->dyna.actor.flags |= ACTOR_FLAG_UPDATE_CULLING_DISABLED; return; } @@ -745,7 +745,7 @@ void ObjBean_GrowWaterPhase5(ObjBean* this, PlayState* play) { this->transformFunc(this); if (this->timer <= 0) { func_80B8FF50(this); - this->dyna.actor.flags &= ~ACTOR_FLAG_UPDATE_WHILE_CULLED; + this->dyna.actor.flags &= ~ACTOR_FLAG_UPDATE_CULLING_DISABLED; } } @@ -770,7 +770,7 @@ void ObjBean_SetupFly(ObjBean* this) { this->actionFunc = ObjBean_Fly; ObjBean_SetDrawMode(this, BEAN_STATE_DRAW_PLANT); this->dyna.actor.speedXZ = 0.0f; - this->dyna.actor.flags |= ACTOR_FLAG_UPDATE_WHILE_CULLED; // Never stop updating + this->dyna.actor.flags |= ACTOR_FLAG_UPDATE_CULLING_DISABLED; // Never stop updating } void ObjBean_Fly(ObjBean* this, PlayState* play) { @@ -782,7 +782,7 @@ void ObjBean_Fly(ObjBean* this, PlayState* play) { ObjBean_SetupPath(this, play); ObjBean_SetupWaitForStepOff(this); - this->dyna.actor.flags &= ~ACTOR_FLAG_UPDATE_WHILE_CULLED; // Never stop updating (disable) + this->dyna.actor.flags &= ~ACTOR_FLAG_UPDATE_CULLING_DISABLED; // Never stop updating (disable) camera = play->cameraPtrs[MAIN_CAM]; if ((camera->setting == CAM_SET_BEAN_LOST_WOODS) || (camera->setting == CAM_SET_BEAN_GENERIC)) { diff --git a/soh/src/overlays/actors/ovl_Obj_Dekujr/z_obj_dekujr.c b/soh/src/overlays/actors/ovl_Obj_Dekujr/z_obj_dekujr.c index 0a1736dc4..0ae7ce195 100644 --- a/soh/src/overlays/actors/ovl_Obj_Dekujr/z_obj_dekujr.c +++ b/soh/src/overlays/actors/ovl_Obj_Dekujr/z_obj_dekujr.c @@ -8,7 +8,7 @@ #include "objects/object_dekujr/object_dekujr.h" #include "soh/Enhancements/game-interactor/GameInteractor_Hooks.h" -#define FLAGS (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_FRIENDLY) +#define FLAGS (ACTOR_FLAG_ATTENTION_ENABLED | ACTOR_FLAG_FRIENDLY) void ObjDekujr_Init(Actor* thisx, PlayState* play); void ObjDekujr_Destroy(Actor* thisx, PlayState* play); diff --git a/soh/src/overlays/actors/ovl_Obj_Hsblock/z_obj_hsblock.c b/soh/src/overlays/actors/ovl_Obj_Hsblock/z_obj_hsblock.c index 952b7082f..f22e7b5b4 100644 --- a/soh/src/overlays/actors/ovl_Obj_Hsblock/z_obj_hsblock.c +++ b/soh/src/overlays/actors/ovl_Obj_Hsblock/z_obj_hsblock.c @@ -111,7 +111,7 @@ void func_80B93D90(ObjHsblock* this) { } void func_80B93DB0(ObjHsblock* this) { - this->dyna.actor.flags |= ACTOR_FLAG_UPDATE_WHILE_CULLED; + this->dyna.actor.flags |= ACTOR_FLAG_UPDATE_CULLING_DISABLED; this->dyna.actor.world.pos.y = this->dyna.actor.home.pos.y - 105.0f; ObjHsblock_SetupAction(this, func_80B93DF4); } @@ -132,7 +132,7 @@ void func_80B93E5C(ObjHsblock* this, PlayState* play) { this->dyna.actor.velocity.y, 0.3f)) < 0.001f) { this->dyna.actor.world.pos.y = this->dyna.actor.home.pos.y; func_80B93D90(this); - this->dyna.actor.flags &= ~ACTOR_FLAG_UPDATE_WHILE_CULLED; + this->dyna.actor.flags &= ~ACTOR_FLAG_UPDATE_CULLING_DISABLED; } } diff --git a/soh/src/overlays/actors/ovl_Obj_Ice_Poly/z_obj_ice_poly.c b/soh/src/overlays/actors/ovl_Obj_Ice_Poly/z_obj_ice_poly.c index 699ae6e7d..01ec2c393 100644 --- a/soh/src/overlays/actors/ovl_Obj_Ice_Poly/z_obj_ice_poly.c +++ b/soh/src/overlays/actors/ovl_Obj_Ice_Poly/z_obj_ice_poly.c @@ -7,7 +7,7 @@ #include "z_obj_ice_poly.h" #include "objects/gameplay_keep/gameplay_keep.h" -#define FLAGS ACTOR_FLAG_UPDATE_WHILE_CULLED +#define FLAGS ACTOR_FLAG_UPDATE_CULLING_DISABLED void ObjIcePoly_Init(Actor* thisx, PlayState* play); void ObjIcePoly_Destroy(Actor* thisx, PlayState* play); diff --git a/soh/src/overlays/actors/ovl_Obj_Kibako/z_obj_kibako.c b/soh/src/overlays/actors/ovl_Obj_Kibako/z_obj_kibako.c index eaeaaef07..16e27e39e 100644 --- a/soh/src/overlays/actors/ovl_Obj_Kibako/z_obj_kibako.c +++ b/soh/src/overlays/actors/ovl_Obj_Kibako/z_obj_kibako.c @@ -8,7 +8,7 @@ #include "objects/gameplay_dangeon_keep/gameplay_dangeon_keep.h" #include "overlays/effects/ovl_Effect_Ss_Kakera/z_eff_ss_kakera.h" -#define FLAGS (ACTOR_FLAG_UPDATE_WHILE_CULLED | ACTOR_FLAG_CAN_PRESS_SWITCH) +#define FLAGS (ACTOR_FLAG_UPDATE_CULLING_DISABLED | ACTOR_FLAG_CAN_PRESS_SWITCHES) void ObjKibako_Init(Actor* thisx, PlayState* play); void ObjKibako_Destroy(Actor* thisx, PlayState* play); diff --git a/soh/src/overlays/actors/ovl_Obj_Kibako2/z_obj_kibako2.c b/soh/src/overlays/actors/ovl_Obj_Kibako2/z_obj_kibako2.c index fdb376027..d6452d253 100644 --- a/soh/src/overlays/actors/ovl_Obj_Kibako2/z_obj_kibako2.c +++ b/soh/src/overlays/actors/ovl_Obj_Kibako2/z_obj_kibako2.c @@ -148,7 +148,7 @@ void ObjKibako2_Idle(ObjKibako2* this, PlayState* play) { func_80033684(play, &this->dyna.actor) != NULL) { ObjKibako2_Break(this, play); SoundSource_PlaySfxAtFixedWorldPos(play, &this->dyna.actor.world.pos, 20, NA_SE_EV_WOODBOX_BREAK); - this->dyna.actor.flags |= ACTOR_FLAG_UPDATE_WHILE_CULLED; + this->dyna.actor.flags |= ACTOR_FLAG_UPDATE_CULLING_DISABLED; func_8003EBF8(play, &play->colCtx.dyna, this->dyna.bgId); this->dyna.actor.draw = NULL; this->actionFunc = ObjKibako2_Kill; diff --git a/soh/src/overlays/actors/ovl_Obj_Lift/z_obj_lift.c b/soh/src/overlays/actors/ovl_Obj_Lift/z_obj_lift.c index 166dd4c36..424d669a2 100644 --- a/soh/src/overlays/actors/ovl_Obj_Lift/z_obj_lift.c +++ b/soh/src/overlays/actors/ovl_Obj_Lift/z_obj_lift.c @@ -8,7 +8,7 @@ #include "objects/object_d_lift/object_d_lift.h" #include "overlays/effects/ovl_Effect_Ss_Kakera/z_eff_ss_kakera.h" -#define FLAGS ACTOR_FLAG_UPDATE_WHILE_CULLED +#define FLAGS ACTOR_FLAG_UPDATE_CULLING_DISABLED void ObjLift_Init(Actor* thisx, PlayState* play); void ObjLift_Destroy(Actor* thisx, PlayState* play); diff --git a/soh/src/overlays/actors/ovl_Obj_Lightswitch/z_obj_lightswitch.c b/soh/src/overlays/actors/ovl_Obj_Lightswitch/z_obj_lightswitch.c index 59d1b6203..87534982b 100644 --- a/soh/src/overlays/actors/ovl_Obj_Lightswitch/z_obj_lightswitch.c +++ b/soh/src/overlays/actors/ovl_Obj_Lightswitch/z_obj_lightswitch.c @@ -10,7 +10,7 @@ #include "objects/object_lightswitch/object_lightswitch.h" #include "soh/OTRGlobals.h" -#define FLAGS ACTOR_FLAG_UPDATE_WHILE_CULLED +#define FLAGS ACTOR_FLAG_UPDATE_CULLING_DISABLED typedef enum { /* 0x00 */ FACE_EYES_CLOSED, @@ -225,7 +225,7 @@ void ObjLightswitch_Init(Actor* thisx, PlayState* play) { this->actor.shape.rot.z = 0; this->actor.world.rot.x = this->actor.home.rot.x = this->actor.shape.rot.x; this->actor.world.rot.z = this->actor.home.rot.z = this->actor.shape.rot.z; - this->actor.flags |= ACTOR_FLAG_DRAW_WHILE_CULLED; + this->actor.flags |= ACTOR_FLAG_DRAW_CULLING_DISABLED; if (Actor_SpawnAsChild(&play->actorCtx, &this->actor, play, ACTOR_OBJ_OSHIHIKI, this->actor.home.pos.x, this->actor.home.pos.y, this->actor.home.pos.z, 0, this->actor.home.rot.y, 0, (0xFF << 8) | PUSHBLOCK_SMALL_START_ON) == NULL) { diff --git a/soh/src/overlays/actors/ovl_Obj_Makekinsuta/z_obj_makekinsuta.c b/soh/src/overlays/actors/ovl_Obj_Makekinsuta/z_obj_makekinsuta.c index 82048ffe9..1fb3effc1 100644 --- a/soh/src/overlays/actors/ovl_Obj_Makekinsuta/z_obj_makekinsuta.c +++ b/soh/src/overlays/actors/ovl_Obj_Makekinsuta/z_obj_makekinsuta.c @@ -7,7 +7,7 @@ #include "z_obj_makekinsuta.h" #include "vt.h" -#define FLAGS ACTOR_FLAG_UPDATE_WHILE_CULLED +#define FLAGS ACTOR_FLAG_UPDATE_CULLING_DISABLED void ObjMakekinsuta_Init(Actor* thisx, PlayState* play); void ObjMakekinsuta_Update(Actor* thisx, PlayState* play); diff --git a/soh/src/overlays/actors/ovl_Obj_Makeoshihiki/z_obj_makeoshihiki.c b/soh/src/overlays/actors/ovl_Obj_Makeoshihiki/z_obj_makeoshihiki.c index 133abc310..873d41e8a 100644 --- a/soh/src/overlays/actors/ovl_Obj_Makeoshihiki/z_obj_makeoshihiki.c +++ b/soh/src/overlays/actors/ovl_Obj_Makeoshihiki/z_obj_makeoshihiki.c @@ -8,7 +8,7 @@ #include "overlays/actors/ovl_Obj_Oshihiki/z_obj_oshihiki.h" #include "vt.h" -#define FLAGS ACTOR_FLAG_DRAW_WHILE_CULLED +#define FLAGS ACTOR_FLAG_DRAW_CULLING_DISABLED void ObjMakeoshihiki_Init(Actor* thisx, PlayState* play); void ObjMakeoshihiki_Draw(Actor* thisx, PlayState* play); diff --git a/soh/src/overlays/actors/ovl_Obj_Mure/z_obj_mure.c b/soh/src/overlays/actors/ovl_Obj_Mure/z_obj_mure.c index 94c1d468b..1bf6595b5 100644 --- a/soh/src/overlays/actors/ovl_Obj_Mure/z_obj_mure.c +++ b/soh/src/overlays/actors/ovl_Obj_Mure/z_obj_mure.c @@ -155,7 +155,7 @@ void ObjMure_SpawnActors0(ObjMure* this, PlayState* play) { Actor_Spawn(ac, play, sSpawnActorIds[this->type], pos.x, pos.y, pos.z, this->actor.world.rot.x, this->actor.world.rot.y, this->actor.world.rot.z, sSpawnParams[this->type], true); if (this->children[i] != NULL) { - this->children[i]->flags |= ACTOR_FLAG_ENKUSA_CUT; + this->children[i]->flags |= ACTOR_FLAG_GRASS_DESTROYED; this->children[i]->room = this->actor.room; } else { osSyncPrintf("warning 発生失敗 (%s %d)\n", __FILE__, __LINE__); @@ -255,7 +255,7 @@ void ObjMure_CheckChildren(ObjMure* this, PlayState* play) { if (this->children[i] != NULL) { if (this->childrenStates[i] == OBJMURE_CHILD_STATE_0) { if (this->children[i]->update != NULL) { - if (this->children[i]->flags & ACTOR_FLAG_ENKUSA_CUT) { + if (this->children[i]->flags & ACTOR_FLAG_GRASS_DESTROYED) { this->childrenStates[i] = OBJMURE_CHILD_STATE_2; } } else { @@ -282,7 +282,7 @@ void ObjMure_CulledState(ObjMure* this, PlayState* play) { if (fabsf(this->actor.projectedPos.z) < sZClip[this->type] * distanceMultiplier) { // #endregion this->actionFunc = ObjMure_ActiveState; - this->actor.flags |= ACTOR_FLAG_UPDATE_WHILE_CULLED; + this->actor.flags |= ACTOR_FLAG_UPDATE_CULLING_DISABLED; ObjMure_SpawnActors(this, play); } } @@ -411,7 +411,7 @@ void ObjMure_ActiveState(ObjMure* this, PlayState* play) { if ((sZClip[this->type] + 40.0f) * distanceMultiplier <= fabsf(this->actor.projectedPos.z)) { // #endregion this->actionFunc = ObjMure_CulledState; - this->actor.flags &= ~ACTOR_FLAG_UPDATE_WHILE_CULLED; + this->actor.flags &= ~ACTOR_FLAG_UPDATE_CULLING_DISABLED; ObjMure_KillActors(this, play); } else if (sTypeGroupBehaviorFunc[this->type] != NULL) { sTypeGroupBehaviorFunc[this->type](this, play); diff --git a/soh/src/overlays/actors/ovl_Obj_Mure2/z_obj_mure2.c b/soh/src/overlays/actors/ovl_Obj_Mure2/z_obj_mure2.c index 2be6ea478..49d75d735 100644 --- a/soh/src/overlays/actors/ovl_Obj_Mure2/z_obj_mure2.c +++ b/soh/src/overlays/actors/ovl_Obj_Mure2/z_obj_mure2.c @@ -192,7 +192,7 @@ void func_80B9A658(ObjMure2* this) { void func_80B9A668(ObjMure2* this, PlayState* play) { if (Math3D_Dist1DSq(this->actor.projectedPos.x, this->actor.projectedPos.z) < (sDistSquared1[this->actor.params & 3] * this->unk_184)) { - this->actor.flags |= ACTOR_FLAG_UPDATE_WHILE_CULLED; + this->actor.flags |= ACTOR_FLAG_UPDATE_CULLING_DISABLED; ObjMure2_SpawnActors(this, play); func_80B9A6E8(this); } @@ -207,7 +207,7 @@ void func_80B9A6F8(ObjMure2* this, PlayState* play) { if ((sDistSquared2[this->actor.params & 3] * this->unk_184) <= Math3D_Dist1DSq(this->actor.projectedPos.x, this->actor.projectedPos.z)) { - this->actor.flags &= ~ACTOR_FLAG_UPDATE_WHILE_CULLED; + this->actor.flags &= ~ACTOR_FLAG_UPDATE_CULLING_DISABLED; ObjMure2_CleanupAndDie(this, play); func_80B9A658(this); } diff --git a/soh/src/overlays/actors/ovl_Obj_Mure3/z_obj_mure3.c b/soh/src/overlays/actors/ovl_Obj_Mure3/z_obj_mure3.c index 35d425ea4..ba9b43830 100644 --- a/soh/src/overlays/actors/ovl_Obj_Mure3/z_obj_mure3.c +++ b/soh/src/overlays/actors/ovl_Obj_Mure3/z_obj_mure3.c @@ -172,7 +172,7 @@ void func_80B9AF64(ObjMure3* this, PlayState* play) { static ObjMure3SpawnFunc spawnFuncs[] = { func_80B9A9D0, func_80B9AA90, func_80B9ABA0 }; if (Math3D_Dist1DSq(this->actor.projectedPos.x, this->actor.projectedPos.z) < SQ(1150.0f)) { - this->actor.flags |= ACTOR_FLAG_UPDATE_WHILE_CULLED; + this->actor.flags |= ACTOR_FLAG_UPDATE_CULLING_DISABLED; spawnFuncs[(this->actor.params >> 13) & 7](this, play); func_80B9AFEC(this); } @@ -185,7 +185,7 @@ void func_80B9AFEC(ObjMure3* this) { void func_80B9AFFC(ObjMure3* this, PlayState* play) { func_80B9ADCC(this, play); if (Math3D_Dist1DSq(this->actor.projectedPos.x, this->actor.projectedPos.z) >= SQ(1450.0f)) { - this->actor.flags &= ~ACTOR_FLAG_UPDATE_WHILE_CULLED; + this->actor.flags &= ~ACTOR_FLAG_UPDATE_CULLING_DISABLED; func_80B9ACE4(this, play); func_80B9AF54(this); } diff --git a/soh/src/overlays/actors/ovl_Obj_Oshihiki/z_obj_oshihiki.c b/soh/src/overlays/actors/ovl_Obj_Oshihiki/z_obj_oshihiki.c index c69417461..df076327d 100644 --- a/soh/src/overlays/actors/ovl_Obj_Oshihiki/z_obj_oshihiki.c +++ b/soh/src/overlays/actors/ovl_Obj_Oshihiki/z_obj_oshihiki.c @@ -9,7 +9,7 @@ #include "objects/gameplay_dangeon_keep/gameplay_dangeon_keep.h" #include "soh/ResourceManagerHelpers.h" -#define FLAGS ACTOR_FLAG_UPDATE_WHILE_CULLED +#define FLAGS ACTOR_FLAG_UPDATE_CULLING_DISABLED void ObjOshihiki_Init(Actor* thisx, PlayState* play); void ObjOshihiki_Destroy(Actor* thisx, PlayState* play); diff --git a/soh/src/overlays/actors/ovl_Obj_Roomtimer/z_obj_roomtimer.c b/soh/src/overlays/actors/ovl_Obj_Roomtimer/z_obj_roomtimer.c index 21ec649f9..5bef60ef9 100644 --- a/soh/src/overlays/actors/ovl_Obj_Roomtimer/z_obj_roomtimer.c +++ b/soh/src/overlays/actors/ovl_Obj_Roomtimer/z_obj_roomtimer.c @@ -6,7 +6,7 @@ #include "z_obj_roomtimer.h" -#define FLAGS ACTOR_FLAG_UPDATE_WHILE_CULLED +#define FLAGS ACTOR_FLAG_UPDATE_CULLING_DISABLED void ObjRoomtimer_Init(Actor* thisx, PlayState* play); void ObjRoomtimer_Destroy(Actor* thisx, PlayState* play); diff --git a/soh/src/overlays/actors/ovl_Obj_Switch/z_obj_switch.c b/soh/src/overlays/actors/ovl_Obj_Switch/z_obj_switch.c index 05e3577c0..82c9f2cc6 100644 --- a/soh/src/overlays/actors/ovl_Obj_Switch/z_obj_switch.c +++ b/soh/src/overlays/actors/ovl_Obj_Switch/z_obj_switch.c @@ -9,7 +9,7 @@ #include "vt.h" #include "soh/Enhancements/game-interactor/GameInteractor_Hooks.h" -#define FLAGS ACTOR_FLAG_UPDATE_WHILE_CULLED +#define FLAGS ACTOR_FLAG_UPDATE_CULLING_DISABLED // type: (this->dyna.actor.params & 7) // subtype: (this->dyna.actor.params >> 4 & 7) @@ -313,7 +313,7 @@ void ObjSwitch_Init(Actor* thisx, PlayState* play) { } if (type == OBJSWITCH_TYPE_CRYSTAL_TARGETABLE) { - this->dyna.actor.flags |= ACTOR_FLAG_TARGETABLE; + this->dyna.actor.flags |= ACTOR_FLAG_ATTENTION_ENABLED; this->dyna.actor.targetMode = 4; } diff --git a/soh/src/overlays/actors/ovl_Obj_Syokudai/z_obj_syokudai.c b/soh/src/overlays/actors/ovl_Obj_Syokudai/z_obj_syokudai.c index bf9300798..c1a4c72f9 100644 --- a/soh/src/overlays/actors/ovl_Obj_Syokudai/z_obj_syokudai.c +++ b/soh/src/overlays/actors/ovl_Obj_Syokudai/z_obj_syokudai.c @@ -9,7 +9,7 @@ #include "objects/gameplay_keep/gameplay_keep.h" #include "objects/object_syokudai/object_syokudai.h" -#define FLAGS (ACTOR_FLAG_UPDATE_WHILE_CULLED | ACTOR_FLAG_DRAGGED_BY_HOOKSHOT) +#define FLAGS (ACTOR_FLAG_UPDATE_CULLING_DISABLED | ACTOR_FLAG_HOOKSHOT_PULLS_PLAYER) void ObjSyokudai_Init(Actor* thisx, PlayState* play); void ObjSyokudai_Destroy(Actor* thisx, PlayState* play); diff --git a/soh/src/overlays/actors/ovl_Obj_Timeblock/z_obj_timeblock.c b/soh/src/overlays/actors/ovl_Obj_Timeblock/z_obj_timeblock.c index 1701eb60d..3191fa036 100644 --- a/soh/src/overlays/actors/ovl_Obj_Timeblock/z_obj_timeblock.c +++ b/soh/src/overlays/actors/ovl_Obj_Timeblock/z_obj_timeblock.c @@ -7,7 +7,7 @@ #include "z_obj_timeblock.h" #include "objects/object_timeblock/object_timeblock.h" -#define FLAGS (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_UPDATE_WHILE_CULLED | ACTOR_FLAG_NO_FREEZE_OCARINA | ACTOR_FLAG_NO_LOCKON) +#define FLAGS (ACTOR_FLAG_ATTENTION_ENABLED | ACTOR_FLAG_UPDATE_CULLING_DISABLED | ACTOR_FLAG_UPDATE_DURING_OCARINA | ACTOR_FLAG_LOCK_ON_DISABLED) void ObjTimeblock_Init(Actor* thisx, PlayState* play); void ObjTimeblock_Destroy(Actor* thisx, PlayState* play); diff --git a/soh/src/overlays/actors/ovl_Obj_Tsubo/z_obj_tsubo.c b/soh/src/overlays/actors/ovl_Obj_Tsubo/z_obj_tsubo.c index 4cdc67e44..c4d8c65f4 100644 --- a/soh/src/overlays/actors/ovl_Obj_Tsubo/z_obj_tsubo.c +++ b/soh/src/overlays/actors/ovl_Obj_Tsubo/z_obj_tsubo.c @@ -10,7 +10,7 @@ #include "objects/object_tsubo/object_tsubo.h" #include "soh/Enhancements/game-interactor/GameInteractor_Hooks.h" -#define FLAGS (ACTOR_FLAG_UPDATE_WHILE_CULLED | ACTOR_FLAG_ALWAYS_THROWN) +#define FLAGS (ACTOR_FLAG_UPDATE_CULLING_DISABLED | ACTOR_FLAG_THROW_ONLY) void ObjTsubo_Init(Actor* thisx, PlayState* play); void ObjTsubo_Destroy(Actor* thisx, PlayState* play); @@ -189,7 +189,7 @@ void ObjTsubo_AirBreak(ObjTsubo* this, PlayState* play) { sObjectIds[(this->actor.params >> 8) & 1], D_80BA1B8C[(this->actor.params >> 8) & 1]); } func_80033480(play, &this->actor.world.pos, 30.0f, 4, 20, 50, 1); - gSaveContext.sohStats.count[COUNT_POTS_BROKEN]++; + gSaveContext.ship.stats.count[COUNT_POTS_BROKEN]++; } void ObjTsubo_WaterBreak(ObjTsubo* this, PlayState* play) { @@ -218,7 +218,7 @@ void ObjTsubo_WaterBreak(ObjTsubo* this, PlayState* play) { (Rand_ZeroOne() * 95.0f) + 15.0f, 0, 32, 70, KAKERA_COLOR_NONE, sObjectIds[(this->actor.params >> 8) & 1], D_80BA1B8C[(this->actor.params >> 8) & 1]); } - gSaveContext.sohStats.count[COUNT_POTS_BROKEN]++; + gSaveContext.ship.stats.count[COUNT_POTS_BROKEN]++; } void ObjTsubo_SetupWaitForObject(ObjTsubo* this) { @@ -232,7 +232,7 @@ void ObjTsubo_WaitForObject(ObjTsubo* this, PlayState* play) { } this->actor.objBankIndex = this->objTsuboBankIndex; ObjTsubo_SetupIdle(this); - this->actor.flags &= ~ACTOR_FLAG_UPDATE_WHILE_CULLED; + this->actor.flags &= ~ACTOR_FLAG_UPDATE_CULLING_DISABLED; } } @@ -282,7 +282,7 @@ void ObjTsubo_SetupLiftedUp(ObjTsubo* this) { this->actionFunc = ObjTsubo_LiftedUp; this->actor.room = -1; Player_PlaySfx(&this->actor, NA_SE_PL_PULL_UP_POT); - this->actor.flags |= ACTOR_FLAG_UPDATE_WHILE_CULLED; + this->actor.flags |= ACTOR_FLAG_UPDATE_CULLING_DISABLED; } void ObjTsubo_LiftedUp(ObjTsubo* this, PlayState* play) { diff --git a/soh/src/overlays/actors/ovl_Obj_Warp2block/z_obj_warp2block.c b/soh/src/overlays/actors/ovl_Obj_Warp2block/z_obj_warp2block.c index f4c77c73f..52e916e4b 100644 --- a/soh/src/overlays/actors/ovl_Obj_Warp2block/z_obj_warp2block.c +++ b/soh/src/overlays/actors/ovl_Obj_Warp2block/z_obj_warp2block.c @@ -8,7 +8,7 @@ #include "objects/object_timeblock/object_timeblock.h" #include "vt.h" -#define FLAGS (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_UPDATE_WHILE_CULLED | ACTOR_FLAG_NO_FREEZE_OCARINA | ACTOR_FLAG_NO_LOCKON) +#define FLAGS (ACTOR_FLAG_ATTENTION_ENABLED | ACTOR_FLAG_UPDATE_CULLING_DISABLED | ACTOR_FLAG_UPDATE_DURING_OCARINA | ACTOR_FLAG_LOCK_ON_DISABLED) void ObjWarp2block_Init(Actor* thisx, PlayState* play); void ObjWarp2block_Destroy(Actor* thisx, PlayState* play); diff --git a/soh/src/overlays/actors/ovl_Object_Kankyo/z_object_kankyo.c b/soh/src/overlays/actors/ovl_Object_Kankyo/z_object_kankyo.c index a318cf759..26815fb32 100644 --- a/soh/src/overlays/actors/ovl_Object_Kankyo/z_object_kankyo.c +++ b/soh/src/overlays/actors/ovl_Object_Kankyo/z_object_kankyo.c @@ -12,7 +12,7 @@ #include "soh/frame_interpolation.h" #include -#define FLAGS (ACTOR_FLAG_UPDATE_WHILE_CULLED | ACTOR_FLAG_DRAW_WHILE_CULLED | ACTOR_FLAG_NO_FREEZE_OCARINA) +#define FLAGS (ACTOR_FLAG_UPDATE_CULLING_DISABLED | ACTOR_FLAG_DRAW_CULLING_DISABLED | ACTOR_FLAG_UPDATE_DURING_OCARINA) void ObjectKankyo_Init(Actor* thisx, PlayState* play); void ObjectKankyo_Destroy(Actor* thisx, PlayState* play); diff --git a/soh/src/overlays/actors/ovl_Oceff_Spot/z_oceff_spot.c b/soh/src/overlays/actors/ovl_Oceff_Spot/z_oceff_spot.c index 8aa68b160..72ece6769 100644 --- a/soh/src/overlays/actors/ovl_Oceff_Spot/z_oceff_spot.c +++ b/soh/src/overlays/actors/ovl_Oceff_Spot/z_oceff_spot.c @@ -7,7 +7,7 @@ #include "z_oceff_spot.h" #include "vt.h" -#define FLAGS (ACTOR_FLAG_UPDATE_WHILE_CULLED | ACTOR_FLAG_NO_FREEZE_OCARINA) +#define FLAGS (ACTOR_FLAG_UPDATE_CULLING_DISABLED | ACTOR_FLAG_UPDATE_DURING_OCARINA) void OceffSpot_Init(Actor* thisx, PlayState* play); void OceffSpot_Destroy(Actor* thisx, PlayState* play); diff --git a/soh/src/overlays/actors/ovl_Oceff_Storm/z_oceff_storm.c b/soh/src/overlays/actors/ovl_Oceff_Storm/z_oceff_storm.c index 228e13d21..fe3876df3 100644 --- a/soh/src/overlays/actors/ovl_Oceff_Storm/z_oceff_storm.c +++ b/soh/src/overlays/actors/ovl_Oceff_Storm/z_oceff_storm.c @@ -8,7 +8,7 @@ #include "soh/OTRGlobals.h" #include "soh/ResourceManagerHelpers.h" -#define FLAGS (ACTOR_FLAG_UPDATE_WHILE_CULLED | ACTOR_FLAG_DRAW_WHILE_CULLED | ACTOR_FLAG_NO_FREEZE_OCARINA) +#define FLAGS (ACTOR_FLAG_UPDATE_CULLING_DISABLED | ACTOR_FLAG_DRAW_CULLING_DISABLED | ACTOR_FLAG_UPDATE_DURING_OCARINA) void OceffStorm_Init(Actor* thisx, PlayState* play); void OceffStorm_Destroy(Actor* thisx, PlayState* play); diff --git a/soh/src/overlays/actors/ovl_Oceff_Wipe/z_oceff_wipe.c b/soh/src/overlays/actors/ovl_Oceff_Wipe/z_oceff_wipe.c index 052de7f0d..14b60a8b4 100644 --- a/soh/src/overlays/actors/ovl_Oceff_Wipe/z_oceff_wipe.c +++ b/soh/src/overlays/actors/ovl_Oceff_Wipe/z_oceff_wipe.c @@ -8,7 +8,7 @@ #include "vt.h" #include "soh/ResourceManagerHelpers.h" -#define FLAGS (ACTOR_FLAG_UPDATE_WHILE_CULLED | ACTOR_FLAG_NO_FREEZE_OCARINA) +#define FLAGS (ACTOR_FLAG_UPDATE_CULLING_DISABLED | ACTOR_FLAG_UPDATE_DURING_OCARINA) void OceffWipe_Init(Actor* thisx, PlayState* play); void OceffWipe_Destroy(Actor* thisx, PlayState* play); diff --git a/soh/src/overlays/actors/ovl_Oceff_Wipe2/z_oceff_wipe2.c b/soh/src/overlays/actors/ovl_Oceff_Wipe2/z_oceff_wipe2.c index a9eabca24..0936b0605 100644 --- a/soh/src/overlays/actors/ovl_Oceff_Wipe2/z_oceff_wipe2.c +++ b/soh/src/overlays/actors/ovl_Oceff_Wipe2/z_oceff_wipe2.c @@ -8,7 +8,7 @@ #include "vt.h" #include "soh/ResourceManagerHelpers.h" -#define FLAGS (ACTOR_FLAG_UPDATE_WHILE_CULLED | ACTOR_FLAG_NO_FREEZE_OCARINA) +#define FLAGS (ACTOR_FLAG_UPDATE_CULLING_DISABLED | ACTOR_FLAG_UPDATE_DURING_OCARINA) void OceffWipe2_Init(Actor* thisx, PlayState* play); void OceffWipe2_Destroy(Actor* thisx, PlayState* play); diff --git a/soh/src/overlays/actors/ovl_Oceff_Wipe3/z_oceff_wipe3.c b/soh/src/overlays/actors/ovl_Oceff_Wipe3/z_oceff_wipe3.c index e0ceadeb4..4b9f53d54 100644 --- a/soh/src/overlays/actors/ovl_Oceff_Wipe3/z_oceff_wipe3.c +++ b/soh/src/overlays/actors/ovl_Oceff_Wipe3/z_oceff_wipe3.c @@ -8,7 +8,7 @@ #include "vt.h" #include "soh/ResourceManagerHelpers.h" -#define FLAGS (ACTOR_FLAG_UPDATE_WHILE_CULLED | ACTOR_FLAG_NO_FREEZE_OCARINA) +#define FLAGS (ACTOR_FLAG_UPDATE_CULLING_DISABLED | ACTOR_FLAG_UPDATE_DURING_OCARINA) void OceffWipe3_Init(Actor* thisx, PlayState* play); void OceffWipe3_Destroy(Actor* thisx, PlayState* play); diff --git a/soh/src/overlays/actors/ovl_Oceff_Wipe4/z_oceff_wipe4.c b/soh/src/overlays/actors/ovl_Oceff_Wipe4/z_oceff_wipe4.c index 6067ed361..37ccdb531 100644 --- a/soh/src/overlays/actors/ovl_Oceff_Wipe4/z_oceff_wipe4.c +++ b/soh/src/overlays/actors/ovl_Oceff_Wipe4/z_oceff_wipe4.c @@ -8,7 +8,7 @@ #include "vt.h" #include "soh/ResourceManagerHelpers.h" -#define FLAGS (ACTOR_FLAG_UPDATE_WHILE_CULLED | ACTOR_FLAG_NO_FREEZE_OCARINA) +#define FLAGS (ACTOR_FLAG_UPDATE_CULLING_DISABLED | ACTOR_FLAG_UPDATE_DURING_OCARINA) void OceffWipe4_Init(Actor* thisx, PlayState* play); void OceffWipe4_Destroy(Actor* thisx, PlayState* play); diff --git a/soh/src/overlays/actors/ovl_Shot_Sun/z_shot_sun.c b/soh/src/overlays/actors/ovl_Shot_Sun/z_shot_sun.c index 5b426e709..03da64049 100644 --- a/soh/src/overlays/actors/ovl_Shot_Sun/z_shot_sun.c +++ b/soh/src/overlays/actors/ovl_Shot_Sun/z_shot_sun.c @@ -10,7 +10,7 @@ #include "soh/Enhancements/game-interactor/GameInteractor_Hooks.h" #include "vt.h" -#define FLAGS (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_FRIENDLY) +#define FLAGS (ACTOR_FLAG_ATTENTION_ENABLED | ACTOR_FLAG_FRIENDLY) void ShotSun_Init(Actor* thisx, PlayState* play); void ShotSun_Destroy(Actor* thisx, PlayState* play); @@ -63,15 +63,15 @@ void ShotSun_Init(Actor* thisx, PlayState* play) { params = this->actor.params & 0xFF; if (params == 0x40 || params == 0x41) { this->unk_1A4 = 0; - this->actor.flags |= ACTOR_FLAG_UPDATE_WHILE_CULLED; - this->actor.flags |= ACTOR_FLAG_NO_FREEZE_OCARINA; + this->actor.flags |= ACTOR_FLAG_UPDATE_CULLING_DISABLED; + this->actor.flags |= ACTOR_FLAG_UPDATE_DURING_OCARINA; this->actionFunc = func_80BADF0C; - this->actor.flags |= ACTOR_FLAG_NO_LOCKON; + this->actor.flags |= ACTOR_FLAG_LOCK_ON_DISABLED; } else { Collider_InitCylinder(play, &this->collider); Collider_SetCylinder(play, &this->collider, &this->actor, &sCylinderInit); this->actionFunc = ShotSun_UpdateHyliaSun; - this->actor.flags &= ~ACTOR_FLAG_TARGETABLE; + this->actor.flags &= ~ACTOR_FLAG_ATTENTION_ENABLED; } } diff --git a/soh/src/overlays/actors/ovl_player_actor/z_player.c b/soh/src/overlays/actors/ovl_player_actor/z_player.c index 8d229178b..762814076 100644 --- a/soh/src/overlays/actors/ovl_player_actor/z_player.c +++ b/soh/src/overlays/actors/ovl_player_actor/z_player.c @@ -1612,7 +1612,7 @@ BAD_RETURN(s32) func_80832224(Player* this) { s32 Player_IsTalking(PlayState* play) { Player* this = GET_PLAYER(play); - return CHECK_FLAG_ALL(this->actor.flags, ACTOR_FLAG_PLAYER_TALKED_TO); + return CHECK_FLAG_ALL(this->actor.flags, ACTOR_FLAG_TALK); } void Player_AnimPlayOnce(PlayState* play, Player* this, LinkAnimationHeader* anim) { @@ -1789,9 +1789,9 @@ void Player_PlaySteppingSfx(Player* this, f32 pitchAdjustment) { func_800F4010(&this->actor.projectedPos, sfxId, pitchAdjustment); // Gameplay stats: Count footsteps // Only count while game isn't complete and don't count Link's idle animations or crawling in crawlspaces - if (!gSaveContext.sohStats.gameComplete && !(this->stateFlags2 & PLAYER_STATE2_IDLE_FIDGET) && + if (!gSaveContext.ship.stats.gameComplete && !(this->stateFlags2 & PLAYER_STATE2_IDLE_FIDGET) && !(this->stateFlags2 & PLAYER_STATE2_CRAWLING)) { - gSaveContext.sohStats.count[COUNT_STEPS]++; + gSaveContext.ship.stats.count[COUNT_STEPS]++; } } @@ -2379,7 +2379,7 @@ void func_80833A20(Player* this, s32 newMeleeWeaponState) { } if (this->heldItemAction >= PLAYER_IA_SWORD_MASTER && this->heldItemAction <= PLAYER_IA_SWORD_BIGGORON) { - gSaveContext.sohStats.count[COUNT_SWORD_SWINGS]++; + gSaveContext.ship.stats.count[COUNT_SWORD_SWINGS]++; } } @@ -2424,7 +2424,7 @@ s32 Player_FriendlyLockOnOrParallel(Player* this) { */ s32 Player_UpdateHostileLockOn(Player* this) { if ((this->focusActor != NULL) && - CHECK_FLAG_ALL(this->focusActor->flags, ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_HOSTILE)) { + CHECK_FLAG_ALL(this->focusActor->flags, ACTOR_FLAG_ATTENTION_ENABLED | ACTOR_FLAG_HOSTILE)) { this->stateFlags1 |= PLAYER_STATE1_HOSTILE_LOCK_ON; return true; } else { @@ -3484,7 +3484,7 @@ void Player_UseItem(PlayState* play, Player* this, s32 item) { this->currentMask = itemAction - PLAYER_IA_MASK_KEATON + 1; } - gSaveContext.maskMemory = this->currentMask; + gSaveContext.ship.maskMemory = this->currentMask; func_808328EC(this, NA_SE_PL_CHANGE_ARMS); } else if (((itemAction >= PLAYER_IA_OCARINA_FAIRY) && (itemAction <= PLAYER_IA_OCARINA_OF_TIME)) || @@ -3841,7 +3841,7 @@ void Player_UpdateZTargeting(Player* this, PlayState* play) { this->stateFlags1 |= PLAYER_STATE1_Z_TARGETING; - if ((nextLockOnActor != NULL) && !(nextLockOnActor->flags & ACTOR_FLAG_NO_LOCKON)) { + if ((nextLockOnActor != NULL) && !(nextLockOnActor->flags & ACTOR_FLAG_LOCK_ON_DISABLED)) { // Navi hovers over the current lock-on actor, so `nextLockOnActor` and `focusActor` // will be the same if already locked on. @@ -3901,7 +3901,7 @@ void Player_UpdateZTargeting(Player* this, PlayState* play) { // is hostile. This is a special case to allow Player to have more freedom of movement and be able // to throw a carried actor at the lock-on actor, even if it is hostile. if ((this->stateFlags1 & PLAYER_STATE1_CARRYING_ACTOR) || - !CHECK_FLAG_ALL(this->focusActor->flags, ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_HOSTILE)) { + !CHECK_FLAG_ALL(this->focusActor->flags, ACTOR_FLAG_ATTENTION_ENABLED | ACTOR_FLAG_HOSTILE)) { this->stateFlags1 |= PLAYER_STATE1_FRIENDLY_ACTOR_FOCUS; } } else { @@ -4845,7 +4845,7 @@ s32 func_808382DC(Player* this, PlayState* play) { Actor* ac = this->cylinder.base.ac; s32 sp4C; - if (ac->flags & ACTOR_FLAG_PLAY_HIT_SFX) { + if (ac->flags & ACTOR_FLAG_SFX_FOR_PLAYER_BODY_HIT) { Player_PlaySfx(this, NA_SE_PL_BODY_HIT); } @@ -5418,7 +5418,7 @@ s32 Player_ActionHandler_1(Player* this, PlayState* play) { this->stateFlags1 |= PLAYER_STATE1_IN_CUTSCENE; Actor_DisableLens(play); - if (((doorActor->params >> 7) & 7) == 3) { + if (GameInteractor_Should(VB_DOOR_PLAY_SCENE_TRANSITION, ((doorActor->params >> 7) & 7) == 3, doorActor)) { checkPos.x = doorActor->world.pos.x - (sp6C * sp74); checkPos.y = doorActor->world.pos.y + 10.0f; checkPos.z = doorActor->world.pos.z - (sp6C * sp78); @@ -5538,7 +5538,7 @@ void func_8083A0F4(PlayState* play, Player* this) { Player_SetupAction(play, this, Player_Action_8084F608, 0); this->stateFlags1 |= PLAYER_STATE1_IN_CUTSCENE; if (!CVarGetInteger(CVAR_ENHANCEMENT("PersistentMasks"), 0) || !CVarGetInteger(CVAR_ENHANCEMENT("AdultMasks"), 0)) { - gSaveContext.maskMemory = PLAYER_MASK_NONE; + gSaveContext.ship.maskMemory = PLAYER_MASK_NONE; } } else { LinkAnimationHeader* anim; @@ -6029,7 +6029,7 @@ s32 Player_ActionHandler_13(Player* this, PlayState* play) { this->av2.actionVar2 = 0x50; this->av1.actionVar1 = -1; } - talkActor->flags |= ACTOR_FLAG_PLAYER_TALKED_TO; + talkActor->flags |= ACTOR_FLAG_TALK; this->focusActor = this->talkActor; } else if (sp2C == EXCH_ITEM_LETTER_RUTO) { this->av1.actionVar1 = 1; @@ -6041,7 +6041,7 @@ s32 Player_ActionHandler_13(Player* this, PlayState* play) { func_80835EA4(play, 4); } - this->actor.flags |= ACTOR_FLAG_PLAYER_TALKED_TO; + this->actor.flags |= ACTOR_FLAG_TALK; this->exchangeItemId = sp2C; if (this->av1.actionVar1 < 0) { @@ -6115,7 +6115,7 @@ s32 Player_ActionHandler_Talk(Player* this, PlayState* play) { canTalkToLockOnWithCUp = (lockOnActor != NULL) && - (CHECK_FLAG_ALL(lockOnActor->flags, ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_NAVI_HAS_INFO) || + (CHECK_FLAG_ALL(lockOnActor->flags, ACTOR_FLAG_ATTENTION_ENABLED | ACTOR_FLAG_TALK_WITH_C_UP) || (lockOnActor->naviEnemyId != 0xFF)); if (canTalkToLockOnWithCUp || (this->naviTextId != 0)) { @@ -6142,13 +6142,13 @@ s32 Player_ActionHandler_Talk(Player* this, PlayState* play) { if ((lockOnActor == NULL) || (lockOnActor == talkOfferActor) || (lockOnActor == cUpTalkActor)) { if (!(this->stateFlags1 & PLAYER_STATE1_CARRYING_ACTOR) || ((this->heldActor != NULL) && (forceTalkToNavi || (talkOfferActor == this->heldActor) || (cUpTalkActor == this->heldActor) || - ((talkOfferActor != NULL) && (talkOfferActor->flags & ACTOR_FLAG_WILL_TALK))))) { + ((talkOfferActor != NULL) && (talkOfferActor->flags & ACTOR_FLAG_TALK_OFFER_AUTO_ACCEPTED))))) { if ((this->actor.bgCheckFlags & 1) || (this->stateFlags1 & PLAYER_STATE1_ON_HORSE) || (func_808332B8(this) && !(this->stateFlags2 & PLAYER_STATE2_UNDERWATER))) { if (talkOfferActor != NULL) { this->stateFlags2 |= PLAYER_STATE2_CAN_ACCEPT_TALK_OFFER; - if (CHECK_BTN_ALL(sControlInput->press.button, BTN_A) || (talkOfferActor->flags & ACTOR_FLAG_WILL_TALK)) { + if (CHECK_BTN_ALL(sControlInput->press.button, BTN_A) || (talkOfferActor->flags & ACTOR_FLAG_TALK_OFFER_AUTO_ACCEPTED)) { cUpTalkActor = NULL; } else if (cUpTalkActor == NULL) { return 0; @@ -6213,7 +6213,7 @@ s32 Player_ActionHandler_0(Player* this, PlayState* play) { return 1; } - if ((this->focusActor != NULL) && (CHECK_FLAG_ALL(this->focusActor->flags, ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_NAVI_HAS_INFO) || + if ((this->focusActor != NULL) && (CHECK_FLAG_ALL(this->focusActor->flags, ACTOR_FLAG_ATTENTION_ENABLED | ACTOR_FLAG_TALK_WITH_C_UP) || (this->focusActor->naviEnemyId != 0xFF))) { this->stateFlags2 |= PLAYER_STATE2_NAVI_ALERT; } else if ((this->naviTextId == 0 || CVarGetInteger(CVAR_ENHANCEMENT("NaviOnL"), 0)) && !Player_CheckHostileLockOn(this) && CHECK_BTN_ALL(sControlInput->press.button, BTN_CUP) && @@ -6267,7 +6267,7 @@ void Player_SetupRoll(Player* this, PlayState* play) { LinkAnimation_PlayOnceSetSpeed(play, &this->skelAnime, GET_PLAYER_ANIM(PLAYER_ANIMGROUP_landing_roll, this->modelAnimType), 1.25f * sWaterSpeedFactor); - gSaveContext.sohStats.count[COUNT_ROLLS]++; + gSaveContext.ship.stats.count[COUNT_ROLLS]++; } s32 Player_TryRoll(Player* this, PlayState* play) { @@ -6326,10 +6326,10 @@ s32 Player_ActionHandler_10(Player* this, PlayState* play) { func_8083BCD0(this, play, controlStickDirection); if (controlStickDirection == 1 || controlStickDirection == 3) { - gSaveContext.sohStats.count[COUNT_SIDEHOPS]++; + gSaveContext.ship.stats.count[COUNT_SIDEHOPS]++; } if (controlStickDirection == 2) { - gSaveContext.sohStats.count[COUNT_BACKFLIPS]++; + gSaveContext.ship.stats.count[COUNT_BACKFLIPS]++; } return 1; @@ -7254,19 +7254,9 @@ void func_8083E4C4(PlayState* play, Player* this, GetItemEntry* giEntry) { s32 Player_ActionHandler_2(Player* this, PlayState* play) { Actor* interactedActor; - if(gSaveContext.pendingIceTrapCount) { - gSaveContext.pendingIceTrapCount--; - GameInteractor_ExecuteOnItemReceiveHooks(ItemTable_RetrieveEntry(MOD_RANDOMIZER, RG_ICE_TRAP)); - if (CVarGetInteger(CVAR_ENHANCEMENT("ExtraTraps.Enabled"), 0)) { - return 1; - } - this->stateFlags1 &= ~(PLAYER_STATE1_GETTING_ITEM | PLAYER_STATE1_CARRYING_ACTOR); - this->actor.colChkInfo.damage = 0; - func_80837C0C(play, this, 3, 0.0f, 0.0f, 0, 20); + if (GameInteractor_Should(VB_SHORT_CIRCUIT_GIVE_ITEM_PROCESS, false)) { this->getItemId = GI_NONE; - this->getItemEntry = (GetItemEntry) GET_ITEM_NONE; - // Gameplay stats: Increment Ice Trap count - gSaveContext.sohStats.count[COUNT_ICE_TRAPS]++; + this->getItemEntry = (GetItemEntry)GET_ITEM_NONE; return 1; } @@ -7295,7 +7285,7 @@ s32 Player_ActionHandler_2(Player* this, PlayState* play) { Player_SetPendingFlag(this, play); Message_StartTextbox(play, 0xF8, NULL); Audio_PlayFanfare(NA_BGM_SMALL_ITEM_GET); - gSaveContext.pendingIceTrapCount++; + gSaveContext.ship.pendingIceTrapCount++; return 1; } @@ -7436,7 +7426,7 @@ void func_8083EA94(Player* this, PlayState* play) { } s32 func_8083EAF0(Player* this, Actor* actor) { - if ((actor != NULL) && !(actor->flags & ACTOR_FLAG_ALWAYS_THROWN) && + if ((actor != NULL) && !(actor->flags & ACTOR_FLAG_THROW_ONLY) && ((this->linearVelocity < 1.1f) || (actor->id == ACTOR_EN_BOM_CHU))) { return 0; } @@ -9011,7 +9001,7 @@ void Player_Action_8084279C(Player* this, PlayState* play) { func_8083A098(this, GET_PLAYER_ANIM(PLAYER_ANIMGROUP_check_end, this->modelAnimType), play); } - this->actor.flags &= ~ACTOR_FLAG_PLAYER_TALKED_TO; + this->actor.flags &= ~ACTOR_FLAG_TALK; func_8005B1A4(Play_GetCamera(play, 0)); } } @@ -9513,7 +9503,7 @@ void func_80843AE8(PlayState* play, Player* this) { } else if (play->gameOverCtx.state == GAMEOVER_DEATH_WAIT_GROUND) { play->gameOverCtx.state = GAMEOVER_DEATH_DELAY_MENU; if (!CVarGetInteger(CVAR_ENHANCEMENT("PersistentMasks"), 0)) { - gSaveContext.maskMemory = PLAYER_MASK_NONE; + gSaveContext.ship.maskMemory = PLAYER_MASK_NONE; } } } @@ -9818,7 +9808,7 @@ void Player_Action_Roll(Player* this, PlayState* play) { Player_PlayVoiceSfx(this, NA_SE_VO_LI_CLIMB_END); this->av2.bonked = 1; - gSaveContext.sohStats.count[COUNT_BONKS]++; + gSaveContext.ship.stats.count[COUNT_BONKS]++; GameInteractor_ExecuteOnPlayerBonk(); return; @@ -10806,9 +10796,9 @@ void Player_Init(Actor* thisx, PlayState* play2) { //keep masks thru loading zones if (CVarGetInteger(CVAR_ENHANCEMENT("PersistentMasks"), 0)) { if (INV_CONTENT(ITEM_TRADE_CHILD) == ITEM_SOLD_OUT) { - gSaveContext.maskMemory = PLAYER_MASK_NONE; + gSaveContext.ship.maskMemory = PLAYER_MASK_NONE; } - this->currentMask = gSaveContext.maskMemory; + this->currentMask = gSaveContext.ship.maskMemory; } Player_InitCommon(this, play, gPlayerSkelHeaders[((void)0, gSaveContext.linkAge)]); // `giObjectSegment` is used for both "get item" objects and title cards. The maximum size for @@ -11492,7 +11482,7 @@ void Player_UpdateCamAndSeqModes(PlayState* play, Player* this) { } else if (this->stateFlags2 & PLAYER_STATE2_GRABBING_DYNAPOLY) { camMode = CAM_MODE_PUSHPULL; } else if ((focusActor = this->focusActor) != NULL) { - if (CHECK_FLAG_ALL(this->actor.flags, ACTOR_FLAG_PLAYER_TALKED_TO)) { + if (CHECK_FLAG_ALL(this->actor.flags, ACTOR_FLAG_TALK)) { camMode = CAM_MODE_TALK; } else if (this->stateFlags1 & PLAYER_STATE1_FRIENDLY_ACTOR_FOCUS) { if (this->stateFlags1 & PLAYER_STATE1_BOOMERANG_THROWN) { @@ -12241,7 +12231,7 @@ void Player_UpdateCommon(Player* this, PlayState* play, Input* input) { Player_UpdateShapeYaw(this, play); - if (CHECK_FLAG_ALL(this->actor.flags, ACTOR_FLAG_PLAYER_TALKED_TO)) { + if (CHECK_FLAG_ALL(this->actor.flags, ACTOR_FLAG_TALK)) { this->talkActorDistance = 0.0f; } else { this->talkActor = NULL; @@ -13050,9 +13040,9 @@ void Player_Action_Talk(Player* this, PlayState* play) { Player_UpdateUpperBody(this, play); if (Message_GetState(&play->msgCtx) == TEXT_STATE_CLOSING) { - this->actor.flags &= ~ACTOR_FLAG_PLAYER_TALKED_TO; + this->actor.flags &= ~ACTOR_FLAG_TALK; - if (!CHECK_FLAG_ALL(this->talkActor->flags, ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_HOSTILE)) { + if (!CHECK_FLAG_ALL(this->talkActor->flags, ACTOR_FLAG_ATTENTION_ENABLED | ACTOR_FLAG_HOSTILE)) { this->stateFlags2 &= ~PLAYER_STATE2_LOCK_ON_WITH_SWITCH; } @@ -14282,7 +14272,7 @@ s32 func_8084DFF4(PlayState* play, Player* this) { // #region SOH [Randomizer] TODO Better Ice trap handling? if (this->getItemEntry.itemId == RG_ICE_TRAP && this->getItemEntry.modIndex == MOD_RANDOMIZER) { this->unk_862 = 0; - gSaveContext.pendingIceTrapCount++; + gSaveContext.ship.pendingIceTrapCount++; Player_SetPendingFlag(this, play); } // #endregion @@ -14460,7 +14450,7 @@ void Player_Action_8084E6D4(Player* this, PlayState* play) { this->actor.world.pos.y + 100.0f, this->actor.world.pos.z, 0, 0, 0, 0, true); func_8083C0E8(this, play); } else if (IS_RANDO) { - gSaveContext.pendingIceTrapCount++; + gSaveContext.ship.pendingIceTrapCount++; Player_SetPendingFlag(this, play); func_8083C0E8(this, play); } else { @@ -14840,7 +14830,7 @@ void Player_Action_ExchangeItem(Player* this, PlayState* play) { this->unk_862 = 0; if (talkActor->textId != 0xFFFF) { - this->actor.flags |= ACTOR_FLAG_PLAYER_TALKED_TO; + this->actor.flags |= ACTOR_FLAG_TALK; } Player_StartTalking(play, talkActor); @@ -14866,7 +14856,7 @@ void Player_Action_ExchangeItem(Player* this, PlayState* play) { this->av2.actionVar2 = 1; } else if (Message_GetState(&play->msgCtx) == TEXT_STATE_CLOSING) { - this->actor.flags &= ~ACTOR_FLAG_PLAYER_TALKED_TO; + this->actor.flags &= ~ACTOR_FLAG_TALK; this->unk_862 = 0; if (this->av1.actionVar1 == 1) { @@ -16631,7 +16621,7 @@ void func_80852C50(PlayState* play, Player* this, CsCmdActorCue* cue) { } if (linkCsAction == NULL) { - this->actor.flags &= ~ACTOR_FLAG_ACTIVE; + this->actor.flags &= ~ACTOR_FLAG_INSIDE_CULLING_VOLUME; return; } @@ -16763,8 +16753,8 @@ void Player_StartTalking(PlayState* play, Actor* actor) { s32 pad; if ((this->talkActor != NULL) || (actor == this->naviActor) || - CHECK_FLAG_ALL(actor->flags, ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_NAVI_HAS_INFO)) { - actor->flags |= ACTOR_FLAG_PLAYER_TALKED_TO; + CHECK_FLAG_ALL(actor->flags, ACTOR_FLAG_ATTENTION_ENABLED | ACTOR_FLAG_TALK_WITH_C_UP)) { + actor->flags |= ACTOR_FLAG_TALK; } this->talkActor = actor; @@ -16774,13 +16764,13 @@ void Player_StartTalking(PlayState* play, Actor* actor) { // Player will stand and look at the actor with no text appearing. // This can be used to delay text from appearing, for example. Player_SetCsActionWithHaltedActors(play, actor, 1); - actor->flags |= ACTOR_FLAG_PLAYER_TALKED_TO; + actor->flags |= ACTOR_FLAG_TALK; Player_PutAwayHeldItem(play, this); } else { - if (this->actor.flags & ACTOR_FLAG_PLAYER_TALKED_TO) { + if (this->actor.flags & ACTOR_FLAG_TALK) { this->actor.textId = 0; } else { - this->actor.flags |= ACTOR_FLAG_PLAYER_TALKED_TO; + this->actor.flags |= ACTOR_FLAG_TALK; this->actor.textId = actor->textId; } @@ -16823,7 +16813,7 @@ void Player_StartTalking(PlayState* play, Actor* actor) { } if ((this->naviActor == this->talkActor) && ((this->talkActor->textId & 0xFF00) != 0x200)) { - this->naviActor->flags |= ACTOR_FLAG_PLAYER_TALKED_TO; + this->naviActor->flags |= ACTOR_FLAG_TALK; func_80835EA4(play, 0xB); } } diff --git a/soh/src/overlays/gamestates/ovl_file_choose/z_file_choose.c b/soh/src/overlays/gamestates/ovl_file_choose/z_file_choose.c index 9b964054e..6b2d0546f 100644 --- a/soh/src/overlays/gamestates/ovl_file_choose/z_file_choose.c +++ b/soh/src/overlays/gamestates/ovl_file_choose/z_file_choose.c @@ -752,8 +752,6 @@ static s16 sUnused = 106; static s16 sScreenFillAlpha = 255; -static u8 isFastFileIdIncompatible = 0; - static Gfx sScreenFillSetupDL[] = { gsDPPipeSync(), gsSPClearGeometryMode(G_ZBUFFER | G_SHADE | G_CULL_BOTH | G_FOG | G_LIGHTING | G_TEXTURE_GEN | @@ -989,7 +987,7 @@ void DrawSeedHashSprites(FileChooseContext* this) { this->configMode == CM_NAME_ENTRY_TO_RANDOMIZER_SETTINGS_MENU || this->configMode == CM_START_NAME_ENTRY || this->configMode == CM_START_RANDOMIZER_SETTINGS_MENU) || this->configMode == CM_RANDOMIZER_SETTINGS_MENU) && - gSaveContext.questId == QUEST_RANDOMIZER)) { + gSaveContext.ship.quest.id == QUEST_RANDOMIZER)) { gDPSetPrimColor(POLY_OPA_DISP++, 0, 0, 0xFF, 0xFF, 0xFF, 0xFF); u16 xStart = 64; @@ -1035,6 +1033,7 @@ void FileChoose_UpdateRandomizer() { SpoilerFileExists(CVarGetString(CVAR_GENERAL("SpoilerLog"), "")) && !fileSelectSpoilerFileLoaded) { if (CVarGetInteger(CVAR_GENERAL("RandomizerNewFileDropped"), 0) != 0) { CVarSetString(CVAR_GENERAL("SpoilerLog"), CVarGetString(CVAR_GENERAL("RandomizerDroppedFile"), "")); + Audio_PlayFanfare(NA_BGM_HORSE_GOAL); } const char* fileLoc = CVarGetString(CVAR_GENERAL("SpoilerLog"), ""); CVarSetInteger(CVAR_GENERAL("RandomizerNewFileDropped"), 0); @@ -1298,7 +1297,7 @@ void FileChoose_UpdateQuestMenu(GameState* thisx) { } if (CHECK_BTN_ALL(input->press.button, BTN_A)) { - gSaveContext.questId = this->questType[this->buttonIndex]; + gSaveContext.ship.quest.id = this->questType[this->buttonIndex]; if (this->questType[this->buttonIndex] == QUEST_BOSSRUSH) { Audio_PlaySoundGeneral(NA_SE_SY_FSEL_DECIDE_L, &gSfxDefaultPos, 4, &gSfxDefaultFreqAndVolScale, &gSfxDefaultFreqAndVolScale, &gSfxDefaultReverb); @@ -1393,17 +1392,17 @@ void FileChoose_UpdateBossRushMenu(GameState* thisx) { if (ABS(this->stickRelX) > 30 || (dpad && CHECK_BTN_ANY(input->press.button, BTN_DLEFT | BTN_DRIGHT))) { if (this->stickRelX > 30 || (dpad && CHECK_BTN_ANY(input->press.button, BTN_DRIGHT))) { // If exceeding the amount of choices for the selected option, cycle back to the first. - if ((gSaveContext.bossRushOptions[this->bossRushIndex] + 1) == BossRush_GetSettingOptionsAmount(this->bossRushIndex)) { - gSaveContext.bossRushOptions[this->bossRushIndex] = 0; + if ((gSaveContext.ship.quest.data.bossRush.options[this->bossRushIndex] + 1) == BossRush_GetSettingOptionsAmount(this->bossRushIndex)) { + gSaveContext.ship.quest.data.bossRush.options[this->bossRushIndex] = 0; } else { - gSaveContext.bossRushOptions[this->bossRushIndex]++; + gSaveContext.ship.quest.data.bossRush.options[this->bossRushIndex]++; } } else if (this->stickRelX < -30 || (dpad && CHECK_BTN_ANY(input->press.button, BTN_DLEFT))) { // If cycling back when already at the first choice for the selected option, cycle back to the last choice. - if ((gSaveContext.bossRushOptions[this->bossRushIndex] - 1) < 0) { - gSaveContext.bossRushOptions[this->bossRushIndex] = BossRush_GetSettingOptionsAmount(this->bossRushIndex) - 1; + if ((gSaveContext.ship.quest.data.bossRush.options[this->bossRushIndex] - 1) < 0) { + gSaveContext.ship.quest.data.bossRush.options[this->bossRushIndex] = BossRush_GetSettingOptionsAmount(this->bossRushIndex) - 1; } else { - gSaveContext.bossRushOptions[this->bossRushIndex]--; + gSaveContext.ship.quest.data.bossRush.options[this->bossRushIndex]--; } } @@ -1411,10 +1410,10 @@ void FileChoose_UpdateBossRushMenu(GameState* thisx) { } if (sLastBossRushOptionIndex != this->bossRushIndex || - sLastBossRushOptionValue != gSaveContext.bossRushOptions[this->bossRushIndex]) { - GameInteractor_ExecuteOnUpdateFileBossRushOptionSelection(this->bossRushIndex, gSaveContext.bossRushOptions[this->bossRushIndex]); + sLastBossRushOptionValue != gSaveContext.ship.quest.data.bossRush.options[this->bossRushIndex]) { + GameInteractor_ExecuteOnUpdateFileBossRushOptionSelection(this->bossRushIndex, gSaveContext.ship.quest.data.bossRush.options[this->bossRushIndex]); sLastBossRushOptionIndex = this->bossRushIndex; - sLastBossRushOptionValue = gSaveContext.bossRushOptions[this->bossRushIndex]; + sLastBossRushOptionValue = gSaveContext.ship.quest.data.bossRush.options[this->bossRushIndex]; } if (CHECK_BTN_ALL(input->press.button, BTN_B)) { @@ -2408,7 +2407,7 @@ void FileChoose_DrawWindowContents(GameState* thisx) { 65, (87 + textYOffset), 255, 255, 80, textAlpha, 0.8f, true); // Selected choice for option. - uint16_t finalKerning = Interface_DrawTextLine(this->state.gfxCtx, BossRush_GetSettingChoiceName(i, gSaveContext.bossRushOptions[i], gSaveContext.language), + uint16_t finalKerning = Interface_DrawTextLine(this->state.gfxCtx, BossRush_GetSettingChoiceName(i, gSaveContext.ship.quest.data.bossRush.options[i], gSaveContext.language), 165, (87 + textYOffset), 255, 255, 255, textAlpha, 0.8f, true); // Draw arrows around selected option. @@ -3353,20 +3352,6 @@ void FileChoose_Main(GameState* thisx) { gSaveContext.skyboxTime += 0x10; } - if (CVarGetInteger(CVAR_DEVELOPER_TOOLS("SkipLogoTitle"), 0) && CVarGetInteger(CVAR_DEVELOPER_TOOLS("SaveFileID"), FASTFILE_1) <= FASTFILE_3 && !isFastFileIdIncompatible) { - if (Save_Exist(CVarGetInteger(CVAR_DEVELOPER_TOOLS("SaveFileID"), FASTFILE_1)) && FileChoose_IsSaveCompatible(Save_GetSaveMetaInfo(CVarGetInteger(CVAR_DEVELOPER_TOOLS("SaveFileID"), FASTFILE_1)))) { - this->buttonIndex = CVarGetInteger(CVAR_DEVELOPER_TOOLS("SaveFileID"), FASTFILE_1); - this->menuMode = FS_MENU_MODE_SELECT; - this->selectMode = SM_LOAD_GAME; - } else { - isFastFileIdIncompatible = 1; - } - } else if (CVarGetInteger(CVAR_DEVELOPER_TOOLS("SkipLogoTitle"), 0) && CVarGetInteger(CVAR_DEVELOPER_TOOLS("SaveFileID"), FASTFILE_1) == FASTFILE_MAP_SELECT) { - this->buttonIndex = 0xFF; - this->menuMode = FS_MENU_MODE_SELECT; - this->selectMode = SM_LOAD_GAME; - } - OPEN_DISPS(this->state.gfxCtx); this->n64ddFlag = 0; @@ -3725,7 +3710,7 @@ void FileChoose_Init(GameState* thisx) { this->questType[0] = MIN_QUEST; this->questType[1] = MIN_QUEST; this->questType[2] = MIN_QUEST; - isFastFileIdIncompatible = 0; + fileSelectSpoilerFileLoaded = false; CVarSetInteger(CVAR_GENERAL("OnFileSelectNameEntry"), 0); SREG(30) = 1; diff --git a/soh/src/overlays/gamestates/ovl_title/z_title.c b/soh/src/overlays/gamestates/ovl_title/z_title.c index f8561166f..544fb6884 100644 --- a/soh/src/overlays/gamestates/ovl_title/z_title.c +++ b/soh/src/overlays/gamestates/ovl_title/z_title.c @@ -4,8 +4,6 @@ * Description: Displays the Nintendo Logo */ -#define NORMAL_GAMEPLAY - #include "global.h" #include "alloca.h" #include "textures/nintendo_rogo_static/nintendo_rogo_static.h" @@ -14,92 +12,14 @@ #include #include #include "soh/ResourceManagerHelpers.h" +#include "soh/Enhancements/game-interactor/GameInteractor_Hooks.h" #include #include "time.h" -const char* GetGameVersionString(s32 index); -char* quote; - -void Title_PrintBuildInfo(Gfx** gfxp) { - Gfx* g; - GfxPrint printer; - - g = *gfxp; - g = Gfx_SetupDL_28(g); - - GfxPrint_Init(&printer); - GfxPrint_Open(&printer, g); - GfxPrint_SetColor(&printer, 131, 154, 255, 255); - - //if tag is empty (not a release build) - bool showGitInfo = gGitCommitTag[0] == 0; - - if (showGitInfo) { - GfxPrint_SetPos(&printer, 1, 24); - GfxPrint_Printf(&printer, "Git Branch: %s", gGitBranch); - - //truncate the commit to 7 characters - char gGitCommitHashTruncated[8]; - strncpy(gGitCommitHashTruncated, gGitCommitHash, 7); - gGitCommitHashTruncated[7] = 0; - - GfxPrint_SetPos(&printer, 1, 25); - GfxPrint_Printf(&printer, "Git Commit: %s", gGitCommitHashTruncated); - } else { - GfxPrint_SetPos(&printer, 1, 25); - GfxPrint_Printf(&printer, "%s", gBuildVersion); - } - GfxPrint_SetPos(&printer, 1, 26); - GfxPrint_Printf(&printer, "%s", gBuildDate); - - u32 numVersions = ResourceMgr_GetNumGameVersions(); - s32 pos = 27 - numVersions; - for (u32 i = 0; i < numVersions; i++) { - GfxPrint_SetPos(&printer, 29, pos++); - GfxPrint_Printf(&printer, "%s", GetGameVersionString(i)); - } - - g = GfxPrint_Close(&printer); - GfxPrint_Destroy(&printer); - *gfxp = g; -} - -const char* GetGameVersionString(s32 index) { - uint32_t gameVersion = ResourceMgr_GetGameVersion(index); - switch (gameVersion) { - case OOT_NTSC_US_10: - return "NTSC-U 1.0"; - case OOT_NTSC_US_11: - return "NTSC-U 1.1"; - case OOT_NTSC_US_12: - return "NTSC-U 1.2"; - case OOT_PAL_10: - return "PAL 1.0"; - case OOT_PAL_11: - return "PAL 1.1"; - case OOT_PAL_GC: - return "PAL GC"; - case OOT_PAL_MQ: - return "PAL MQ"; - case OOT_PAL_GC_DBG1: - case OOT_PAL_GC_DBG2: - return "PAL GC-D"; - case OOT_PAL_GC_MQ_DBG: - return "PAL MQ-D"; - case OOT_IQUE_CN: - return "IQUE CN"; - case OOT_IQUE_TW: - return "IQUE TW"; - default: - return "UNKNOWN"; - } -} - // Note: In other rom versions this function also updates unk_1D4, coverAlpha, addAlpha, visibleDuration to calculate // the fade-in/fade-out + the duration of the n64 logo animation void Title_Calc(TitleContext* this) { -#ifdef NORMAL_GAMEPLAY if ((this->coverAlpha == 0) && (this->visibleDuration != 0)) { this->visibleDuration--; this->unk_1D4--; @@ -118,14 +38,6 @@ void Title_Calc(TitleContext* this) { } this->uls = this->ult & 0x7F; this->ult++; - - if (gSkipLogoTest || gLoadFileSelect) { - this->exit = true; - } - -#else - this->exit = true; -#endif } void Title_SetupView(TitleContext* this, f32 x, f32 y, f32 z) { @@ -146,12 +58,6 @@ void Title_SetupView(TitleContext* this, f32 x, f32 y, f32 z) { func_800AAA50(view, 0xF); } -#define dgShipLogoDL "__OTR__textures/nintendo_rogo_static/gShipLogoDL" -static const ALIGN_ASSET(2) char gShipLogoDL[] = dgShipLogoDL; - -#define dnintendo_rogo_static_Tex_LUS_000000 "__OTR__textures/nintendo_rogo_static/nintendo_rogo_static_Tex_LUS_000000" -static const ALIGN_ASSET(2) char nintendo_rogo_static_Tex_LUS_000000[] = dnintendo_rogo_static_Tex_LUS_000000; - void Title_Draw(TitleContext* this) { static s16 sTitleRotY = 0; static Lights1 sTitleLights = gdSPDefLights1(0x64, 0x64, 0x64, 0xFF, 0xFF, 0xFF, 0x45, 0x45, 0x45); @@ -185,32 +91,21 @@ void Title_Draw(TitleContext* this) { Matrix_RotateZYX(0, sTitleRotY, 0, MTXMODE_APPLY); gSPMatrix(POLY_OPA_DISP++, MATRIX_NEWMTX(this->state.gfxCtx), G_MTX_LOAD); - if (CVarGetInteger(CVAR_ENHANCEMENT("AuthenticLogo"), 0)) { - gSPDisplayList(POLY_OPA_DISP++, gNintendo64LogoDL); - } else { - gSPDisplayList(POLY_OPA_DISP++, gShipLogoDL); - } + gSPDisplayList(POLY_OPA_DISP++, gNintendo64LogoDL); Gfx_SetupDL_39Opa(this->state.gfxCtx); gDPPipeSync(POLY_OPA_DISP++); gDPSetCycleType(POLY_OPA_DISP++, G_CYC_2CYCLE); gDPSetRenderMode(POLY_OPA_DISP++, G_RM_XLU_SURF2, G_RM_OPA_CI | CVG_DST_WRAP); gDPSetCombineLERP(POLY_OPA_DISP++, TEXEL1, PRIMITIVE, ENV_ALPHA, TEXEL0, 0, 0, 0, TEXEL0, PRIMITIVE, ENVIRONMENT, COMBINED, ENVIRONMENT, COMBINED, 0, PRIMITIVE, 0); - if (CVarGetInteger(CVAR_COSMETIC("Title.NintendoLogo.Changed"), 0)) { - Color_RGB8 nintendoLogoColor = CVarGetColor24(CVAR_COSMETIC("Title.NintendoLogo.Value"), (Color_RGB8){0, 0, 255}); - gDPSetPrimColor(POLY_OPA_DISP++, 0, 0, 255, 255, 255, 255); - gDPSetEnvColor(POLY_OPA_DISP++, nintendoLogoColor.r, nintendoLogoColor.g, nintendoLogoColor.b, 128); - } else { - gDPSetPrimColor(POLY_OPA_DISP++, 0, 0, 170, 255, 255, 255); - gDPSetEnvColor(POLY_OPA_DISP++, 0, 0, 255, 128); - } + gDPSetPrimColor(POLY_OPA_DISP++, 0, 0, 255, 255, 255, 255); + gDPSetEnvColor(POLY_OPA_DISP++, 0, 0, 255, 128); gDPLoadMultiBlock(POLY_OPA_DISP++, nintendo_rogo_static_Tex_001800, 0x100, 1, G_IM_FMT_I, G_IM_SIZ_8b, 32, 32, 0, G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMIRROR | G_TX_WRAP, 5, 5, 2, 11); - for (idx = 0, y = 94; idx < 16; idx++, y += 2) - { - gDPLoadMultiTile(POLY_OPA_DISP++, CVarGetInteger(CVAR_ENHANCEMENT("AuthenticLogo"), 0) ? nintendo_rogo_static_Tex_000000 : nintendo_rogo_static_Tex_LUS_000000, 0, G_TX_RENDERTILE, G_IM_FMT_I, G_IM_SIZ_8b, 192, 32, + for (idx = 0, y = 94; idx < 16; idx++, y += 2) { + gDPLoadMultiTile(POLY_OPA_DISP++, nintendo_rogo_static_Tex_000000, 0, G_TX_RENDERTILE, G_IM_FMT_I, G_IM_SIZ_8b, 192, 32, 0, idx * 2, 192 - 1, (idx + 1) * 2 - 1, 0, G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMASK, G_TX_NOMASK, G_TX_NOLOD, G_TX_NOLOD); @@ -221,25 +116,9 @@ void Title_Draw(TitleContext* this) { gSPTextureRectangle(POLY_OPA_DISP++, 388, y << 2, 1156, (y + 2) << 2, G_TX_RENDERTILE, 0, 0, 1 << 10, 1 << 10); } - // Draw ice cube around N64 logo. - if (CVarGetInteger(CVAR_GENERAL("LetItSnow"), 0)) { - f32 scale = 0.4f; - - gSPSegment(POLY_OPA_DISP++, 0x08, - Gfx_TwoTexScroll(this->state.gfxCtx, 0, 0, (0 - 1) % 128, 32, 32, 1, - 0, (1 * -2) % 128, 32, 32)); - - Matrix_Translate(0.0f, -10.0f, 0.0f, MTXMODE_APPLY); - Matrix_Scale(scale, scale, scale, MTXMODE_APPLY); - gSPMatrix(POLY_OPA_DISP++, MATRIX_NEWMTX(this->state.gfxCtx), - G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW); - gDPSetEnvColor(POLY_OPA_DISP++, 0, 50, 100, 255); - gSPDisplayList(POLY_OPA_DISP++, gEffIceFragment3DL); - } - Environment_FillScreen(this->state.gfxCtx, 0, 0, 0, (s16)this->coverAlpha, FILL_SCREEN_XLU); - sTitleRotY += (300 * CVarGetFloat(CVAR_COSMETIC("N64Logo.SpinSpeed"), 1.0f)); + sTitleRotY += 300; CLOSE_DISPS(this->state.gfxCtx); } @@ -255,24 +134,12 @@ void Title_Main(GameState* thisx) { Title_Calc(this); Title_Draw(this); - if (!CVarGetInteger(CVAR_ENHANCEMENT("AuthenticLogo"), 0)) { - Gfx* gfx = POLY_OPA_DISP; - s32 pad; - - Title_PrintBuildInfo(&gfx); - POLY_OPA_DISP = gfx; - } - - if (this->exit || CVarGetInteger(CVAR_DEVELOPER_TOOLS("SkipLogoTitle"), 0)) { + if (this->exit) { gSaveContext.seqId = (u8)NA_BGM_DISABLED; gSaveContext.natureAmbienceId = 0xFF; gSaveContext.gameMode = 1; this->state.running = false; - - if (gLoadFileSelect || CVarGetInteger(CVAR_DEVELOPER_TOOLS("SkipLogoTitle"), 0)) - SET_NEXT_GAMESTATE(&this->state, FileChoose_Init, FileChooseContext); - else - SET_NEXT_GAMESTATE(&this->state, Opening_Init, OpeningContext); + SET_NEXT_GAMESTATE(&this->state, Opening_Init, OpeningContext); } CLOSE_DISPS(this->state.gfxCtx); @@ -285,15 +152,11 @@ void Title_Destroy(GameState* thisx) { } void Title_Init(GameState* thisx) { - //u32 size = 0; TitleContext* this = (TitleContext*)thisx; this->staticSegment = NULL; - //this->staticSegment = GAMESTATE_ALLOC_MC(&this->state, size); osSyncPrintf("z_title.c\n"); - //ResourceMgr_LoadDirectory("nintendo_rogo_static*"); - R_UPDATE_RATE = 1; Matrix_Init(&this->state); View_Init(&this->view, this->state.gfxCtx); @@ -306,4 +169,6 @@ void Title_Init(GameState* thisx) { this->coverAlpha = 255; this->addAlpha = -3; this->visibleDuration = 0x3C; + + GameInteractor_ExecuteOnZTitleInit(this); } diff --git a/soh/src/overlays/misc/ovl_kaleido_scope/z_kaleido_scope_PAL.c b/soh/src/overlays/misc/ovl_kaleido_scope/z_kaleido_scope_PAL.c index 217ec24e3..e76576f85 100644 --- a/soh/src/overlays/misc/ovl_kaleido_scope/z_kaleido_scope_PAL.c +++ b/soh/src/overlays/misc/ovl_kaleido_scope/z_kaleido_scope_PAL.c @@ -3992,10 +3992,6 @@ void KaleidoScope_Update(PlayState* play) switch (pauseCtx->unk_1E4) { case 0: if (GameInteractor_Should(VB_CLOSE_PAUSE_MENU, CHECK_BTN_ALL(input->press.button, BTN_START))) { - if (CVarGetInteger(CVAR_CHEAT("EasyPauseBuffer"), 0) || CVarGetInteger(CVAR_CHEAT("EasyInputBuffer"), 0)) { - // Easy pause buffer is 13 frames, 12 for kaledio to end, and one more to advance a single frame - CVarSetInteger(CVAR_GENERAL("CheatEasyPauseBufferTimer"), 13); - } Interface_SetDoAction(play, DO_ACTION_NONE); pauseCtx->state = 0x12; WREG(2) = -6240; @@ -4546,6 +4542,10 @@ void KaleidoScope_Update(PlayState* play) break; case 0x13: + if (!GameInteractor_Should(VB_KALEIDO_UNPAUSE_CLOSE, true)) { + break; + } + pauseCtx->state = 0; R_UPDATE_RATE = 3; R_PAUSE_MENU_MODE = 0;